summaryrefslogtreecommitdiff
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/main/AndroidManifest.xml13
-rw-r--r--main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java143
-rw-r--r--main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java2
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java3
-rw-r--r--main/src/main/res/drawable-hdpi/ic_quick.pngbin0 -> 1236 bytes
-rw-r--r--main/src/main/res/drawable-mdpi/ic_quick.pngbin0 -> 973 bytes
-rw-r--r--main/src/main/res/drawable-xhdpi/ic_quick.pngbin0 -> 1671 bytes
-rw-r--r--main/src/main/res/drawable-xxhdpi/ic_quick.pngbin0 -> 2375 bytes
-rw-r--r--main/src/main/res/drawable-xxhdpi/icon.pngbin14248 -> 0 bytes
-rwxr-xr-xmain/src/main/res/values/strings.xml3
10 files changed, 163 insertions, 1 deletions
diff --git a/main/src/main/AndroidManifest.xml b/main/src/main/AndroidManifest.xml
index 08ed2388..da2c6ab2 100644
--- a/main/src/main/AndroidManifest.xml
+++ b/main/src/main/AndroidManifest.xml
@@ -82,6 +82,19 @@
</intent-filter>
</service>
+ <service
+ android:name=".OpenVPNTileService"
+ android:value="true"
+ android:label="@string/qs_title"
+ android:icon="@drawable/ic_quick"
+ android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
+ <intent-filter>
+ <action android:name="android.service.quicksettings.action.QS_TILE" />
+ </intent-filter>
+ <meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
+ android:value="false" />
+ </service>
+
<activity android:name=".api.GrantPermissionsActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java b/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java
new file mode 100644
index 00000000..7d954894
--- /dev/null
+++ b/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2012-2016 Arne Schwabe
+ * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
+ */
+
+package de.blinkt.openvpn;
+
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Build;
+import android.os.IBinder;
+import android.service.quicksettings.Tile;
+import android.service.quicksettings.TileService;
+import android.widget.Toast;
+
+import java.util.Locale;
+
+import de.blinkt.openvpn.core.OpenVPNManagement;
+import de.blinkt.openvpn.core.OpenVPNService;
+import de.blinkt.openvpn.core.ProfileManager;
+import de.blinkt.openvpn.core.VpnStatus;
+
+
+/**
+ * Created by arne on 22.04.16.
+ */
+@TargetApi(Build.VERSION_CODES.N)
+public class OpenVPNTileService extends TileService implements VpnStatus.StateListener {
+
+ @SuppressLint("Override")
+ @TargetApi(Build.VERSION_CODES.N)
+ @Override
+ public void onClick() {
+ super.onClick();
+ final VpnProfile bootProfile = getQSVPN();
+ if (bootProfile == null) {
+ Toast.makeText(this, R.string.novpn_selected, Toast.LENGTH_SHORT).show();
+ } else {
+ if (!isLocked())
+ clickAction(bootProfile);
+ else
+ unlockAndRun(new Runnable() {
+ @Override
+ public void run() {
+ clickAction(bootProfile);
+ }
+ });
+ }
+ }
+
+ private void clickAction(VpnProfile bootProfile) {
+ if (VpnStatus.isVPNActive()) {
+ Intent intent = new Intent(this, OpenVPNService.class);
+ intent.setAction(OpenVPNService.START_SERVICE);
+ bindService(intent, new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName componentName, IBinder binder) {
+ OpenVPNService service = ((OpenVPNService.LocalBinder) binder).getService();
+
+ if (service != null && service.getManagement() != null)
+ service.getManagement().stopVPN(false);
+
+ unbindService(this);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName componentName) {
+
+ }
+ }, Context.BIND_AUTO_CREATE);
+ } else
+ launchVPN(bootProfile, this);
+ }
+
+
+ @SuppressLint("Override")
+ @TargetApi(Build.VERSION_CODES.N)
+ void launchVPN(VpnProfile profile, Context context) {
+ Intent startVpnIntent = new Intent(Intent.ACTION_MAIN);
+ startVpnIntent.setClass(context, LaunchVPN.class);
+ startVpnIntent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString());
+ startVpnIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startVpnIntent.putExtra(LaunchVPN.EXTRA_HIDELOG, true);
+
+ context.startActivity(startVpnIntent);
+ }
+
+ @TargetApi(Build.VERSION_CODES.N)
+ @Override
+ public void onTileAdded() {
+ }
+
+ @Override
+ public void onStartListening() {
+ super.onStartListening();
+ VpnStatus.addStateListener(this);
+ }
+
+
+ @TargetApi(Build.VERSION_CODES.N)
+ public VpnProfile getQSVPN() {
+ return ProfileManager.getAlwaysOnVPN(this);
+ }
+
+ @Override
+ public void updateState(String state, String logmessage, int localizedResId, VpnStatus.ConnectionStatus level) {
+ VpnProfile vpn;
+ Tile t = getQsTile();
+ if (level == VpnStatus.ConnectionStatus.LEVEL_AUTH_FAILED || level == VpnStatus.ConnectionStatus.LEVEL_NOTCONNECTED) {
+ // No VPN connected, use stadnard VPN
+ vpn = getQSVPN();
+ if (vpn == null) {
+ t.setLabel(getString(R.string.novpn_selected));
+ t.setState(Tile.STATE_UNAVAILABLE);
+ } else {
+ t.setLabel(getString(R.string.qs_connect, vpn.getName()));
+ t.setState(Tile.STATE_INACTIVE);
+ }
+ } else {
+ vpn = ProfileManager.getLastConnectedVpn();
+ String name;
+ if (vpn == null)
+ name = "null?!";
+ else
+ name = vpn.getName();
+ t.setLabel(getString(R.string.qs_disconnect, name));
+ t.setState(Tile.STATE_ACTIVE);
+ }
+
+
+ t.updateTile();
+ }
+
+ @Override
+ public void onStopListening() {
+ VpnStatus.removeStateListener(this);
+ super.onStopListening();
+ }
+}
diff --git a/main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java b/main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java
index e7af25c7..e1cb8862 100644
--- a/main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java
+++ b/main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java
@@ -136,7 +136,7 @@ public class CreateShortcuts extends ListActivity implements OnItemClickListener
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, profile.getName());
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
- this, R.drawable.icon);
+ this, R.mipmap.ic_launcher);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
// Now, return the result to the launcher
diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
index 3885dfa3..321140fd 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
@@ -11,6 +11,7 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.UiModeManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -27,6 +28,7 @@ import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
+import android.service.quicksettings.TileService;
import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
@@ -44,6 +46,7 @@ import java.util.Locale;
import java.util.Vector;
import de.blinkt.openvpn.BuildConfig;
+import de.blinkt.openvpn.OpenVPNTileService;
import de.blinkt.openvpn.R;
import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.activities.DisconnectVPN;
diff --git a/main/src/main/res/drawable-hdpi/ic_quick.png b/main/src/main/res/drawable-hdpi/ic_quick.png
new file mode 100644
index 00000000..343d6c5a
--- /dev/null
+++ b/main/src/main/res/drawable-hdpi/ic_quick.png
Binary files differ
diff --git a/main/src/main/res/drawable-mdpi/ic_quick.png b/main/src/main/res/drawable-mdpi/ic_quick.png
new file mode 100644
index 00000000..83285eeb
--- /dev/null
+++ b/main/src/main/res/drawable-mdpi/ic_quick.png
Binary files differ
diff --git a/main/src/main/res/drawable-xhdpi/ic_quick.png b/main/src/main/res/drawable-xhdpi/ic_quick.png
new file mode 100644
index 00000000..70dc3593
--- /dev/null
+++ b/main/src/main/res/drawable-xhdpi/ic_quick.png
Binary files differ
diff --git a/main/src/main/res/drawable-xxhdpi/ic_quick.png b/main/src/main/res/drawable-xxhdpi/ic_quick.png
new file mode 100644
index 00000000..5adc85c1
--- /dev/null
+++ b/main/src/main/res/drawable-xxhdpi/ic_quick.png
Binary files differ
diff --git a/main/src/main/res/drawable-xxhdpi/icon.png b/main/src/main/res/drawable-xxhdpi/icon.png
deleted file mode 100644
index 16afb418..00000000
--- a/main/src/main/res/drawable-xxhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/main/src/main/res/values/strings.xml b/main/src/main/res/values/strings.xml
index aca6c317..262ecf00 100755
--- a/main/src/main/res/values/strings.xml
+++ b/main/src/main/res/values/strings.xml
@@ -409,4 +409,7 @@
<string name="novpn_selected">No VPN selected.</string>
<string name="alwaysonvpn">VPN used on boot and for Always-On</string>
<string name="reconnect">Reconnect</string>
+ <string name="qs_title">Toggle VPN</string>
+ <string name="qs_connect">Connect to %s</string>
+ <string name="qs_disconnect">Disconnect %s</string>
</resources>