Tricks to start VPN service in background
This commit is contained in:
@@ -16,13 +16,13 @@
|
||||
android:targetSdkVersion="16"/>
|
||||
|
||||
<application
|
||||
android:name="com.github.shadowsocks.ShadowsocksApplication"
|
||||
android:name=".ShadowsocksApplication"
|
||||
android:hardwareAccelerated="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name">
|
||||
|
||||
<activity
|
||||
android:name="com.github.shadowsocks.Shadowsocks"
|
||||
android:name=".Shadowsocks"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/Theme.GAEProxy"
|
||||
android:launchMode="singleTask">
|
||||
@@ -32,8 +32,14 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ShadowVpnActivity"
|
||||
android:theme="@android:style/Theme.Translucent.NoTitleBar"
|
||||
android:launchMode="singleTask">
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="com.github.shadowsocks.AppManager"
|
||||
android:name=".AppManager"
|
||||
android:theme="@style/Theme.GAEProxy"
|
||||
android:label="@string/app_name">
|
||||
<intent-filter>
|
||||
@@ -43,11 +49,11 @@
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name="com.github.shadowsocks.ShadowsocksService"
|
||||
android:name=".ShadowsocksService"
|
||||
android:enabled="true"/>
|
||||
|
||||
<service
|
||||
android:name="com.github.shadowsocks.ShadowVpnService"
|
||||
android:name=".ShadowVpnService"
|
||||
android:label="@string/app_name"
|
||||
android:permission="android.permission.BIND_VPN_SERVICE"
|
||||
android:exported="false">
|
||||
@@ -56,7 +62,7 @@
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver android:name="com.github.shadowsocks.ShadowsocksReceiver">
|
||||
<receiver android:name=".ShadowsocksReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
||||
</intent-filter>
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.github.shadowsocks
|
||||
|
||||
import android.app.Activity
|
||||
import android.os.Bundle
|
||||
import android.net.VpnService
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
|
||||
class ShadowVpnActivity extends Activity {
|
||||
|
||||
override def onCreate(savedInstanceState: Bundle) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val intent = VpnService.prepare(this)
|
||||
if (intent != null) {
|
||||
startActivityForResult(intent, Shadowsocks.REQUEST_CONNECT)
|
||||
} else {
|
||||
onActivityResult(Shadowsocks.REQUEST_CONNECT, Activity.RESULT_OK, null)
|
||||
}
|
||||
}
|
||||
|
||||
override def onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
|
||||
resultCode match {
|
||||
case Activity.RESULT_OK => {
|
||||
val it: Intent = new Intent(this, classOf[ShadowVpnService])
|
||||
startService(it)
|
||||
}
|
||||
case _ => {
|
||||
Log.e(Shadowsocks.TAG, "Failed to start VpnService")
|
||||
}
|
||||
}
|
||||
finish()
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@
|
||||
*/
|
||||
package com.github.shadowsocks
|
||||
|
||||
import android.app.{NotificationManager, Notification, PendingIntent, Service}
|
||||
import android.app._
|
||||
import android.content._
|
||||
import android.content.pm.PackageInfo
|
||||
import android.content.pm.PackageManager
|
||||
@@ -166,10 +166,15 @@ class ShadowVpnService extends VpnService {
|
||||
}
|
||||
|
||||
def handleCommand(intent: Intent) {
|
||||
if (intent == null) {
|
||||
|
||||
if (VpnService.prepare(this) != null) {
|
||||
val i = new Intent(this, classOf[ShadowVpnActivity])
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(i)
|
||||
stopSelf()
|
||||
return
|
||||
}
|
||||
|
||||
appHost = settings.getString("proxy", "127.0.0.1")
|
||||
sitekey = settings.getString("sitekey", "default")
|
||||
encMethod = settings.getString("encMethod", "table")
|
||||
@@ -362,7 +367,6 @@ class ShadowVpnService extends VpnService {
|
||||
super.onCreate()
|
||||
EasyTracker.getTracker.sendEvent("service", "start", getVersionName, 0L)
|
||||
settings = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
|
||||
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
|
||||
.asInstanceOf[NotificationManager]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user