From 139ed2d77ab3f47c4d6e8650b1201b82cb72689f Mon Sep 17 00:00:00 2001
From: PeratX <1215714524@qq.com>
Date: Tue, 11 Apr 2017 14:42:30 +0800
Subject: [PATCH] Implemented Launcher shortcuts
---
app/src/main/AndroidManifest.xml | 4 ++
.../java/org/itxtech/daedalus/Daedalus.java | 38 ++++++++++
.../daedalus/activity/MainActivity.java | 67 ++++++++++++++++--
.../receiver/BootBroadcastReceiver.java | 3 +
.../daedalus/service/DaedalusVpnService.java | 9 +++
.../mipmap-hdpi/ic_security_black_18dp.png | Bin 0 -> 443 bytes
.../mipmap-mdpi/ic_security_black_18dp.png | Bin 0 -> 324 bytes
.../mipmap-xhdpi/ic_security_black_18dp.png | Bin 0 -> 523 bytes
.../mipmap-xxhdpi/ic_security_black_18dp.png | Bin 0 -> 675 bytes
.../mipmap-xxxhdpi/ic_security_black_18dp.png | Bin 0 -> 840 bytes
app/src/main/res/xml/shortcuts.xml | 15 ++++
11 files changed, 129 insertions(+), 7 deletions(-)
create mode 100644 app/src/main/res/mipmap-hdpi/ic_security_black_18dp.png
create mode 100644 app/src/main/res/mipmap-mdpi/ic_security_black_18dp.png
create mode 100644 app/src/main/res/mipmap-xhdpi/ic_security_black_18dp.png
create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_security_black_18dp.png
create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_security_black_18dp.png
create mode 100644 app/src/main/res/xml/shortcuts.xml
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 0000000000000000000000000000000000000000..2c9cbff5663450c02cdc61c7986135480bae0044
GIT binary patch
literal 443
zcmV;s0Yv_ZP)004R>
z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN
zS#tmY3ljhU3ljkVnw%H_00A>eL_t(I%iYwkO9NpX$MLrVwG2eC=)C_x!QiT362)|N
zf?%>uFjz#cFF5S#iD3f`{t*MqfeRuU)|Le4z_s1>F?eCm{SHgsH{JK1*YjL>z8{$C
zQ>03ZD#iT7qDCJfM4uW~HYw9!h!6wb13IKZISCZ7X$1?roUw=#y!}-Rn?e}bbb`+w
z6=nfKOo$G)$y~&UC$=VfQ6}6dy9@n6PUikoc9WA`n@g?`Z5*R6I5+AQacQ#Cn4O)_
z>21V`+1k!zON@|l9e{ZT8SEJG!(8}Q-lwtxZ;0FI1Z<|VBZSz98=c2QX3;}5<0q~}
zFP1Ivg7{)NX;k;{BWwi^;j@z#3WpQWVTJ=f5k8fyG}-4nV9$IYM33D($+gM@(ue6vo_WA{RITY2ZDl}6&3&h002ovPDHLkV1jCvv9JID
literal 0
HcmV?d00001
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 0000000000000000000000000000000000000000..8d6692bafcce2370b0e91bc0c8d5f09261b6063b
GIT binary patch
literal 324
zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m6p}rHd>I(3)EF2VS{N990fib~
zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`j)FbFd;%$g$s
z6x`$K;uxZFJ~_dG-N~Ute1(xu@(-?-%MChf4m2hTAGU9M&r>Y%kNKg!!g5E^u
zHAwTE7MK&XrfW!qA?8C4HfRx)atm$;`QJDB@|bhrP{;>q5$p#zh@-6XgxMu3UVq
zC+9g);==y_5=k3e3z@ELace7g2u>VUz(
Oz~JfX=d#Wzp$P!C=5J&G
literal 0
HcmV?d00001
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 0000000000000000000000000000000000000000..3928538fa2162d4b6e5acb34ddd6503b1e3a3f79
GIT binary patch
literal 523
zcmV+m0`&cfP)004R>
z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN
zS#tmY3ljhU3ljkVnw%H_00DzZL_t(Y$75iiBX9>o3IPX03d0qK|3G*J$l@T+5HW@Z
zhL>PNVDKeSM2s{;v>E0y{D2$q3CXY@KpAafLu4nC#`_F~416f=0>Pd5Lk$rk5O|Cs
zgn=0>^B)Vu8ESq=A@YY|C4)JV+!&5g~DGb9)k2^K$zy*#QR!Jyq>@ha>F$wOm;ut7#((Z38bxXQ?NL>dHf
z&nn!7tv-$bM+MQ)QdAdTxjmDhL2AG<6eKnke;vZd@Bpttk_@+@wF@ty>d2JgJ5Ga?
z7;b_2-x!REso4U7{>Nre5W_n#?>B=#u{CW7QauYX$e3XZl>HrO5edMO;W3gyr{JuI
zDD@ptK#*ZJT4MMMj8g&fS|mCQOQ4?o&aj9004R>
z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN
zS#tmY3ljhU3ljkVnw%H_00J9HL_t(o!|j+oOCv!T$A1yuh~44q8MxvOEL21-w2?%V
z!@|SzK7fK?P(cfA#llW&@g4FFt~l<(f!{zpv9Xck#6nPfK@1UHn`E*vJF~O9vyJ9?
zs_gvPUv~bpJM%nHjzYAu!V0b7gL+7j#lj*>ik`4A6^yZu^(yxnqrxmGN|KWjP(Dvc
z5;f=0l@yfEtKcpc9J1#z6OKUNE;>78@tYAMpm;`)E;>7uVT%r-QBSI-i_Q*RutZ~#
z&I;~guf(C+5~Zb;S$gHLgv23y!YmRxuwsWohK;y*YZR6!!^*HS>@C3J#$j>!E&7ea
z`sBCh6rv$2m6=gyVWU!f%v-eou{ypBU6WiC;lT)OIj6c;%Z`k|(mBbS{i4%|LNo6UYvwTktcHK$%-EoF
z{7wac%?ZV>-dVq$XP>Z-!mlUVbW4jppRgZdd|SVcX%Vlb7ud8Iy;Xe^OC#wSHf&p1
zlirHK2){hR`fPLY(|hgNAQrJZEY7tUIi=oDsoSk^&K~1rY;JY=E#L>G`&&Lf6up)A
z3S>004R>
z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN
zS#tmY3ljhU3ljkVnw%H_00O{CL_t(&-tCz?XcR#h$A6bQ(O5)@g?I)GQBfl(1bifj
zHe%zWGlf`KDS|esO<_<1f(Asi5KLotSb0_|_<%bL!BT~jyNIC35j5ms%;nZXPi7yt
zH#0l45wr6(dpFs69Ew;BW$N|m71~l#eD-#H`
zMx*k1Y0s5mO%DR9lGO;iWJ9_2d=cIxHDnd5!_+H0m*s%UR)Kb@1HH8hbU=81Cs(A;
z-hqY`pM^5J#|21pn7+oqN#&P!EfO|9Lf_PJS2%8W+50)%VN0hJkjv`scR#jMyCV=|BhQ
ziQv1ScW-^)Akb--@3`Kov58qjKwV4i1&6d(E_NKd;Ij}
zl-Xu0BF<813Urnio+*RAi_&4so1gIONImoH|KbUg;OmoO{J}
Sjshb90000
+
+
+
+
+
\ No newline at end of file