diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e4450fe..d61e4f8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,10 @@ + + DNS_SERVERS = new ArrayList() {{ add(new DnsServer("0", "113.107.249.56", R.string.server_north_china)); add(new DnsServer("1", "120.27.103.230", R.string.server_east_china)); @@ -47,6 +60,31 @@ public class Daedalus extends Application { instance = null; } + public static void updateShortcut(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + Log.d("Daedalus", "Updating shortcut"); + //shortcut! + String notice = context.getString(R.string.button_text_activate); + boolean activate = true; + ActivityManager manager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE); + for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (DaedalusVpnService.class.getName().equals(service.service.getClassName())) { + notice = context.getString(R.string.button_text_deactivate); + activate = false; + } + } + ShortcutInfo info = new ShortcutInfo.Builder(context, Daedalus.SHORTCUT_ID_ACTIVATE) + .setLongLabel(notice) + .setShortLabel(notice) + .setIcon(Icon.createWithResource(context, R.mipmap.ic_launcher)) + .setIntent(new Intent(context, MainActivity.class).setAction(Intent.ACTION_VIEW).putExtra(MainActivity.LAUNCH_ACTION, activate ? MainActivity.LAUNCH_ACTION_ACTIVATE : MainActivity.LAUNCH_ACTION_DEACTIVATE)) + .build(); + + ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(SHORTCUT_SERVICE); + shortcutManager.addDynamicShortcuts(Arrays.asList(info)); + } + } + public static Daedalus getInstance() { return instance; } diff --git a/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java b/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java index 921c06b..2c78f49 100644 --- a/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java +++ b/app/src/main/java/org/itxtech/daedalus/activity/MainActivity.java @@ -1,7 +1,6 @@ package org.itxtech.daedalus.activity; import android.app.ActivityManager; -import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -14,10 +13,13 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; +import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.R; import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.util.DnsServer; +import java.util.List; + /** * Daedalus Project * @@ -29,6 +31,11 @@ import org.itxtech.daedalus.util.DnsServer; * the Free Software Foundation, version 3. */ public class MainActivity extends AppCompatActivity { + public static final String LAUNCH_ACTION = "org.itxtech.daedalus.activity.MainActivity.LAUNCH_ACTION"; + public static final int LAUNCH_ACTION_NONE = 0; + public static final int LAUNCH_ACTION_ACTIVATE = 1; + public static final int LAUNCH_ACTION_DEACTIVATE = 2; + private static MainActivity instance = null; private SharedPreferences prefs; @@ -67,13 +74,14 @@ public class MainActivity extends AppCompatActivity { @Override public void onClick(View v) { if (isServiceActivated()) { - but.setText(R.string.button_text_activate); deactivateService(); } else { activateService(); } } }); + + updateUserInterface(getIntent()); } @Override @@ -84,17 +92,62 @@ public class MainActivity extends AppCompatActivity { } @Override - protected void onRestart() { - super.onRestart(); + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); - final Button but = (Button) findViewById(R.id.button_activate); + updateUserInterface(intent); + } + + private void updateUserInterface(Intent intent) { + int launchAction = intent.getIntExtra(LAUNCH_ACTION, LAUNCH_ACTION_NONE); + if (launchAction == LAUNCH_ACTION_ACTIVATE) { + Daedalus.updateShortcut(this); + activateService(); + } else if (launchAction == LAUNCH_ACTION_DEACTIVATE) { + deactivateService(); + } else { + updateUserInterface(); + Daedalus.updateShortcut(this); + } + } + + public boolean isAppOnForeground() { + // Returns a list of application processes that are running on the + // device + + ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); + String packageName = getApplicationContext().getPackageName(); + + List appProcesses = activityManager + .getRunningAppProcesses(); + if (appProcesses == null) + return false; + + for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { + // The name of the process that this object is associated with. + if (appProcess.processName.equals(packageName) + && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { + return true; + } + } + return false; + } + + private void updateUserInterface() { + Button but = (Button) findViewById(R.id.button_activate); if (isServiceActivated()) { but.setText(R.string.button_text_deactivate); } else { but.setText(R.string.button_text_activate); - NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancelAll(); } + + } + + @Override + protected void onRestart() { + super.onRestart(); + + updateUserInterface(); } private void initConfig() { diff --git a/app/src/main/java/org/itxtech/daedalus/receiver/BootBroadcastReceiver.java b/app/src/main/java/org/itxtech/daedalus/receiver/BootBroadcastReceiver.java index 7e46660..de9f343 100644 --- a/app/src/main/java/org/itxtech/daedalus/receiver/BootBroadcastReceiver.java +++ b/app/src/main/java/org/itxtech/daedalus/receiver/BootBroadcastReceiver.java @@ -7,6 +7,7 @@ import android.content.SharedPreferences; import android.net.VpnService; import android.preference.PreferenceManager; import android.util.Log; +import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.R; import org.itxtech.daedalus.service.DaedalusVpnService; import org.itxtech.daedalus.util.DnsServer; @@ -40,5 +41,7 @@ public class BootBroadcastReceiver extends BroadcastReceiver { Log.d("DBootRecv", "Triggered boot receiver"); } + + Daedalus.updateShortcut(context); } } diff --git a/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java b/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java index 5377128..4a5297d 100644 --- a/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java +++ b/app/src/main/java/org/itxtech/daedalus/service/DaedalusVpnService.java @@ -18,6 +18,7 @@ import android.system.StructPollfd; import android.util.Log; import de.measite.minidns.DNSMessage; import de.measite.minidns.util.InetAddressUtil; +import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.R; import org.itxtech.daedalus.activity.MainActivity; import org.itxtech.daedalus.activity.SettingsActivity; @@ -122,6 +123,7 @@ public class DaedalusVpnService extends VpnService implements Runnable { this.running = true; this.mThread.start(); } + Daedalus.updateShortcut(this); return START_STICKY; case ACTION_DEACTIVATE: stopThread(); @@ -163,8 +165,15 @@ public class DaedalusVpnService extends VpnService implements Runnable { Log.d(TAG, e.toString()); } stopSelf(); + + if (MainActivity.getInstance() != null && MainActivity.getInstance().isAppOnForeground()) { + startActivity(new Intent(this, MainActivity.class).putExtra(MainActivity.LAUNCH_ACTION, MainActivity.LAUNCH_ACTION_NONE)); + } else { + Daedalus.updateShortcut(this); + } } + @Override public void onRevoke() { stopThread(); diff --git a/app/src/main/res/mipmap-hdpi/ic_security_black_18dp.png b/app/src/main/res/mipmap-hdpi/ic_security_black_18dp.png new file mode 100644 index 0000000..2c9cbff Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_security_black_18dp.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_security_black_18dp.png b/app/src/main/res/mipmap-mdpi/ic_security_black_18dp.png new file mode 100644 index 0000000..8d6692b Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_security_black_18dp.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_security_black_18dp.png b/app/src/main/res/mipmap-xhdpi/ic_security_black_18dp.png new file mode 100644 index 0000000..3928538 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_security_black_18dp.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_security_black_18dp.png b/app/src/main/res/mipmap-xxhdpi/ic_security_black_18dp.png new file mode 100644 index 0000000..2ec5e4f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_security_black_18dp.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_security_black_18dp.png b/app/src/main/res/mipmap-xxxhdpi/ic_security_black_18dp.png new file mode 100644 index 0000000..bb93968 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_security_black_18dp.png differ diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 0000000..ac28bfc --- /dev/null +++ b/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file