diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index f931df3a..4803dc53 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -125,10 +125,9 @@ - + - diff --git a/src/main/res/xml/pref_all.xml b/src/main/res/xml/pref_all.xml index 8cb10dde..e29c44ec 100644 --- a/src/main/res/xml/pref_all.xml +++ b/src/main/res/xml/pref_all.xml @@ -70,6 +70,7 @@ diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksReceiver.scala b/src/main/scala/com/github/shadowsocks/BootReceiver.scala similarity index 70% rename from src/main/scala/com/github/shadowsocks/ShadowsocksReceiver.scala rename to src/main/scala/com/github/shadowsocks/BootReceiver.scala index 16bd4cd0..4ef97e16 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksReceiver.scala +++ b/src/main/scala/com/github/shadowsocks/BootReceiver.scala @@ -39,13 +39,19 @@ package com.github.shadowsocks -import android.content.{BroadcastReceiver, Context, Intent} +import android.content.pm.PackageManager +import android.content.{BroadcastReceiver, ComponentName, Context, Intent} import com.github.shadowsocks.utils._ -class ShadowsocksReceiver extends BroadcastReceiver { - def onReceive(context: Context, intent: Intent) { - if (ShadowsocksApplication.settings.getBoolean(Key.isAutoConnect, false)) { - Utils.startSsService(context) - } - } +object BootReceiver { + def getEnabled(context: Context) = PackageManager.COMPONENT_ENABLED_STATE_ENABLED == + context.getPackageManager.getComponentEnabledSetting(new ComponentName(context, classOf[BootReceiver])) + def setEnabled(context: Context, enabled: Boolean) = context.getPackageManager.setComponentEnabledSetting( + new ComponentName(context, classOf[BootReceiver]), + if (enabled) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP) +} + +class BootReceiver extends BroadcastReceiver { + def onReceive(context: Context, intent: Intent) = Utils.startSsService(context) } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala index ca31b992..a9399e18 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksSettings.scala @@ -16,7 +16,6 @@ import com.github.shadowsocks.utils.{Key, Utils} object ShadowsocksSettings { // Constants private final val TAG = "ShadowsocksSettings" - private final val PREFS_NAME = "Shadowsocks" private val PROXY_PREFS = Array(Key.profileName, Key.proxy, Key.remotePort, Key.localPort, Key.sitekey, Key.encMethod, Key.isAuth) private val FEATURE_PREFS = Array(Key.route, Key.isProxyApps, Key.isUdpDns, Key.isIpv6) @@ -81,6 +80,17 @@ class ShadowsocksSettings extends PreferenceFragment with OnSharedPreferenceChan false }) + val switch = findPreference(Key.isAutoConnect).asInstanceOf[SwitchPreference] + switch.setOnPreferenceChangeListener((_, value) => { + BootReceiver.setEnabled(activity, value.asInstanceOf[Boolean]) + true + }) + if (getPreferenceManager.getSharedPreferences.getBoolean(Key.isAutoConnect, false)) { + BootReceiver.setEnabled(activity, true) + getPreferenceManager.getSharedPreferences.edit.remove(Key.isAutoConnect).apply + } + switch.setChecked(BootReceiver.getEnabled(activity)) + findPreference("recovery").setOnPreferenceClickListener((preference: Preference) => { ShadowsocksApplication.track(TAG, "reset") activity.recovery() @@ -130,7 +140,7 @@ class ShadowsocksSettings extends PreferenceFragment with OnSharedPreferenceChan ShadowsocksApplication.settings.unregisterOnSharedPreferenceChangeListener(this) } - def onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) = key match { + def onSharedPreferenceChanged(pref: SharedPreferences, key: String) = key match { case Key.isNAT => activity.handler.post(() => { activity.detachService