diff --git a/project/Build.scala b/project/Build.scala index 0fb9acb1..d97b41ac 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -5,8 +5,8 @@ import org.scalasbt.androidplugin._ import org.scalasbt.androidplugin.AndroidKeys._ object App { - val version = "1.6.2" - val versionCode = 32 + val version = "1.6.3" + val versionCode = 33 } object General { diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index 71b5c45a..679ce646 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -42,8 +42,7 @@ import android.content._ import android.content.res.AssetManager import android.graphics.Typeface import android.os._ -import android.preference.Preference -import android.preference.PreferenceManager +import android.preference.{CheckBoxPreference, Preference, PreferenceManager} import android.util.Log import android.view.KeyEvent import android.widget.CompoundButton @@ -67,6 +66,7 @@ import android.net.{Uri, VpnService} import android.webkit.{WebViewClient, WebView} import android.app.backup.BackupManager import scala.concurrent.ops._ +import android.content.SharedPreferences.OnSharedPreferenceChangeListener object Shadowsocks { @@ -89,7 +89,7 @@ object Shadowsocks { private def setPreferenceEnabled() { val state = getActivity.asInstanceOf[Shadowsocks].state - val enabled: Boolean = state != State.CONNECTED && state != State.CONNECTING + val enabled = state != State.CONNECTED && state != State.CONNECTING for (name <- PROXY_PREFS) { val pref: Preference = findPreference(name) if (pref != null) { @@ -125,7 +125,7 @@ object Shadowsocks { } } - class FeatureFragment extends UnifiedPreferenceFragment { + class FeatureFragment extends UnifiedPreferenceFragment with OnSharedPreferenceChangeListener{ var receiver: BroadcastReceiver = null @@ -135,14 +135,11 @@ object Shadowsocks { for (name <- Shadowsocks.FEATRUE_PREFS) { val pref: Preference = findPreference(name) if (pref != null) { - val settings = PreferenceManager.getDefaultSharedPreferences(getActivity) val status = getActivity.getSharedPreferences(Key.status, Context.MODE_PRIVATE) val isRoot = status.getBoolean(Key.isRoot, false) - if (name == Key.isAutoConnect || name == Key.isGlobalProxy) { - pref.setEnabled(isRoot) - } else if ((name == Key.isBypassApps) || (name == Key.proxyedApps)) { - val isGlobalProxy: Boolean = settings.getBoolean(Key.isGlobalProxy, false) - pref.setEnabled(enabled && isRoot && !isGlobalProxy) + if (Seq(Key.isAutoConnect, Key.isGlobalProxy, + Key.isBypassApps, Key.proxyedApps).contains(name)) { + pref.setEnabled(enabled && isRoot) } else { pref.setEnabled(enabled) } @@ -175,6 +172,10 @@ object Shadowsocks { override def onPause() { super.onPause() } + + def onSharedPreferenceChanged(prefs: SharedPreferences, key: String) { + if (key == Key.isGlobalProxy) setPreferenceEnabled() + } } } @@ -203,7 +204,8 @@ object Typefaces { class Shadowsocks extends UnifiedSherlockPreferenceActivity - with CompoundButton.OnCheckedChangeListener { + with CompoundButton.OnCheckedChangeListener + with OnSharedPreferenceChangeListener { private val MSG_CRASH_RECOVER: Int = 1 private val MSG_INITIAL_FINISH: Int = 2 @@ -268,14 +270,21 @@ class Shadowsocks private def copyFile(in: InputStream, out: OutputStream) { val buffer: Array[Byte] = new Array[Byte](1024) var read: Int = 0 - while ((({ + while ({ read = in.read(buffer) read - })) != -1) { + } != -1) { out.write(buffer, 0, read) } } + def onSharedPreferenceChanged(prefs: SharedPreferences, key: String) { + if (key == Key.isGlobalProxy) { + val enabled = state != State.CONNECTED && state != State.CONNECTING + setPreferenceEnabled(enabled) + } + } + private def crash_recovery() { val sb = new StringBuilder @@ -453,13 +462,13 @@ class Shadowsocks switchButton.setEnabled(false) Crouton.makeText(Shadowsocks.this, R.string.vpn_status, style).show() } - setPreferenceEnabled(false) + setPreferenceEnabled(enabled = false) onStateChanged(State.CONNECTED, null) } else { switchButton.setEnabled(true) switchButton.setChecked(false) Crouton.cancelAllCroutons() - setPreferenceEnabled(true) + setPreferenceEnabled(enabled = true) if (status.getBoolean(Key.isRunning, false)) { spawn { crash_recovery() @@ -474,21 +483,19 @@ class Shadowsocks } private def setPreferenceEnabled(enabled: Boolean) { + val isRoot = status.getBoolean(Key.isRoot, false) for (name <- Shadowsocks.PROXY_PREFS) { - val pref: Preference = findPreference(name) + val pref = findPreference(name) if (pref != null) { pref.setEnabled(enabled) } } for (name <- Shadowsocks.FEATRUE_PREFS) { - val pref: Preference = findPreference(name) + val pref = findPreference(name) if (pref != null) { - val isRoot = status.getBoolean(Key.isRoot, false) - if (name == Key.isAutoConnect || name == Key.isGlobalProxy) { - pref.setEnabled(isRoot) - } else if ((name == Key.isBypassApps) || (name == Key.proxyedApps)) { - val isGlobalProxy: Boolean = settings.getBoolean(Key.isGlobalProxy, false) - pref.setEnabled(enabled && isRoot && !isGlobalProxy) + if (Seq(Key.isAutoConnect, Key.isGlobalProxy, + Key.isBypassApps, Key.proxyedApps).contains(name)) { + pref.setEnabled(enabled && isRoot) } else { pref.setEnabled(enabled) } @@ -511,7 +518,7 @@ class Shadowsocks super.onDestroy() Crouton.cancelAllCroutons() unregisterReceiver(receiver) - (new BackupManager(this)).dataChanged() + new BackupManager(this).dataChanged() } def reset() { @@ -673,12 +680,12 @@ class Shadowsocks progressDialog = ProgressDialog .show(Shadowsocks.this, "", getString(R.string.connecting), true, true) } - setPreferenceEnabled(false) + setPreferenceEnabled(enabled = false) } case State.CONNECTED => { clearDialog() if (!switchButton.isChecked) switchButton.setChecked(true) - setPreferenceEnabled(false) + setPreferenceEnabled(enabled = false) } case State.STOPPED => { clearDialog() @@ -697,7 +704,7 @@ class Shadowsocks .makeText(Shadowsocks.this, getString(R.string.vpn_error).format(m), style) .show() } - setPreferenceEnabled(true) + setPreferenceEnabled(enabled = true) } } sendBroadcast(new Intent(Action.UPDATE_FRAGMENT))