diff options
Diffstat (limited to 'main/src')
-rw-r--r-- | main/src/main/AndroidManifest.xml | 13 | ||||
-rw-r--r-- | main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java | 143 | ||||
-rw-r--r-- | main/src/main/java/de/blinkt/openvpn/activities/CreateShortcuts.java | 2 | ||||
-rw-r--r-- | main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java | 3 | ||||
-rw-r--r-- | main/src/main/res/drawable-hdpi/ic_quick.png | bin | 0 -> 1236 bytes | |||
-rw-r--r-- | main/src/main/res/drawable-mdpi/ic_quick.png | bin | 0 -> 973 bytes | |||
-rw-r--r-- | main/src/main/res/drawable-xhdpi/ic_quick.png | bin | 0 -> 1671 bytes | |||
-rw-r--r-- | main/src/main/res/drawable-xxhdpi/ic_quick.png | bin | 0 -> 2375 bytes | |||
-rw-r--r-- | main/src/main/res/drawable-xxhdpi/icon.png | bin | 14248 -> 0 bytes | |||
-rwxr-xr-x | main/src/main/res/values/strings.xml | 3 |
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 Binary files differnew file mode 100644 index 00000000..343d6c5a --- /dev/null +++ b/main/src/main/res/drawable-hdpi/ic_quick.png diff --git a/main/src/main/res/drawable-mdpi/ic_quick.png b/main/src/main/res/drawable-mdpi/ic_quick.png Binary files differnew file mode 100644 index 00000000..83285eeb --- /dev/null +++ b/main/src/main/res/drawable-mdpi/ic_quick.png diff --git a/main/src/main/res/drawable-xhdpi/ic_quick.png b/main/src/main/res/drawable-xhdpi/ic_quick.png Binary files differnew file mode 100644 index 00000000..70dc3593 --- /dev/null +++ b/main/src/main/res/drawable-xhdpi/ic_quick.png diff --git a/main/src/main/res/drawable-xxhdpi/ic_quick.png b/main/src/main/res/drawable-xxhdpi/ic_quick.png Binary files differnew file mode 100644 index 00000000..5adc85c1 --- /dev/null +++ b/main/src/main/res/drawable-xxhdpi/ic_quick.png diff --git a/main/src/main/res/drawable-xxhdpi/icon.png b/main/src/main/res/drawable-xxhdpi/icon.png Binary files differdeleted file mode 100644 index 16afb418..00000000 --- a/main/src/main/res/drawable-xxhdpi/icon.png +++ /dev/null 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> |