Commit ca995962 authored by Max Lv's avatar Max Lv

Merge branch 'master' of github.com:shadowsocks/shadowsocks-android

Conflicts:
	src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala
parents e22ffa86 24233f10
...@@ -20,7 +20,7 @@ resolvers += "madeye private releases" at "http://madeye-maven-repository.google ...@@ -20,7 +20,7 @@ resolvers += "madeye private releases" at "http://madeye-maven-repository.google
libraryDependencies ++= Seq( libraryDependencies ++= Seq(
"dnsjava" % "dnsjava" % "2.1.5", "dnsjava" % "dnsjava" % "2.1.5",
"org.scalaj" %% "scalaj-http" % "0.3.10", "com.github.kevinsawicki" % "http-request" % "5.6",
"commons-net" % "commons-net" % "3.3", "commons-net" % "commons-net" % "3.3",
"com.google.zxing" % "android-integration" % "2.2" "com.google.zxing" % "android-integration" % "2.2"
) )
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks" package="com.github.shadowsocks"
android:versionCode="88" android:versionCode="89"
android:versionName="2.5.0"> android:versionName="2.5.1">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
......
This diff is collapsed.
...@@ -61,6 +61,7 @@ import com.nostra13.universalimageloader.core.{DisplayImageOptions, ImageLoader, ...@@ -61,6 +61,7 @@ import com.nostra13.universalimageloader.core.{DisplayImageOptions, ImageLoader,
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer
import com.github.shadowsocks.utils.{Utils, Scheme, Key} import com.github.shadowsocks.utils.{Utils, Scheme, Key}
import scala.concurrent.ops._
import scala.language.implicitConversions import scala.language.implicitConversions
case class ProxiedApp(uid: Int, name: String, packageName: String, var proxied: Boolean) case class ProxiedApp(uid: Int, name: String, packageName: String, var proxied: Boolean)
...@@ -245,18 +246,17 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe ...@@ -245,18 +246,17 @@ class AppManager extends Activity with OnCheckedChangeListener with OnClickListe
} }
}) })
bypassSwitch.setChecked(prefs.getBoolean(Key.isBypassApps, false)) bypassSwitch.setChecked(prefs.getBoolean(Key.isBypassApps, false))
appListView = findViewById(R.id.applistview).asInstanceOf[ListView]
} }
protected override def onResume() { protected override def onResume() {
super.onResume() super.onResume()
new Thread { spawn {
override def run() {
handler.post(loadStartRunnable) handler.post(loadStartRunnable)
appListView = findViewById(R.id.applistview).asInstanceOf[ListView]
if (!appsLoaded) loadApps() if (!appsLoaded) loadApps()
handler.post(loadFinishRunnable) handler.post(loadFinishRunnable)
} }
}.start()
} }
def saveAppSettings(context: Context) { def saveAppSettings(context: Context) {
......
...@@ -75,7 +75,7 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -75,7 +75,7 @@ class ShadowsocksNatService extends Service with BaseService {
private val mSetForegroundSignature = Array[Class[_]](classOf[Boolean]) private val mSetForegroundSignature = Array[Class[_]](classOf[Boolean])
var closeReceiver: BroadcastReceiver = null var closeReceiver: BroadcastReceiver = null
var conReceiver: BroadcastReceiver = null var connReceiver: BroadcastReceiver = null
var notificationManager: NotificationManager = null var notificationManager: NotificationManager = null
var config: Config = null var config: Config = null
var apps: Array[ProxiedApp] = null var apps: Array[ProxiedApp] = null
...@@ -139,27 +139,45 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -139,27 +139,45 @@ class ShadowsocksNatService extends Service with BaseService {
setDnsForAllNetwork("127.0.0.1") setDnsForAllNetwork("127.0.0.1")
} }
def resetDns() { def resetDns() = {
restoreDnsForAllNetwork() setDnsForAllNetwork("114.114.114.114 8.8.8.8 208.67.222.222")
} }
def flushDns() {
if (Utils.isLollipopOrAbove) {
val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager]
val networks = manager.getAllNetworks
val cmdBuf = new ArrayBuffer[String]()
networks.foreach(network => {
val networkInfo = manager.getNetworkInfo(network)
if (networkInfo.isAvailable) {
val netId = network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int]
cmdBuf.append("ndc resolver flushnet %d".format(netId))
}
})
Console.runRootCommand(cmdBuf.toArray)
} else {
Console.runRootCommand(Array("ndc resolver flushdefaultif", "ndc resolver flushif wlan0"))
}
}
def destroyConnectionReceiver() { def destroyConnectionReceiver() {
if (conReceiver != null) { if (connReceiver != null) {
unregisterReceiver(conReceiver) unregisterReceiver(connReceiver)
conReceiver = null connReceiver = null
} }
resetDns() resetDns()
} }
def initConnectionReceiver() { def initConnectionReceiver() {
setupDns()
val filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) val filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
conReceiver = new BroadcastReceiver { connReceiver = new BroadcastReceiver {
override def onReceive(context: Context, intent: Intent) = { override def onReceive(context: Context, intent: Intent) = {
setupDns() setupDns()
} }
} }
registerReceiver(conReceiver, filter) registerReceiver(connReceiver, filter)
} }
def startShadowsocksDaemon() { def startShadowsocksDaemon() {
...@@ -299,7 +317,6 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -299,7 +317,6 @@ class ShadowsocksNatService extends Service with BaseService {
startRedsocksDaemon() startRedsocksDaemon()
startShadowsocksDaemon() startShadowsocksDaemon()
setupIptables() setupIptables()
flushDNS()
true true
} }
...@@ -397,10 +414,6 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -397,10 +414,6 @@ class ShadowsocksNatService extends Service with BaseService {
Console.runRootCommand(Utils.getIptables + " -t nat -F OUTPUT") Console.runRootCommand(Utils.getIptables + " -t nat -F OUTPUT")
} }
def flushDNS() {
Console.runRootCommand(Array("ndc resolver flushdefaultif", "ndc resolver flushif wlan0"))
}
def setupIptables() = { def setupIptables() = {
val init_sb = new ArrayBuffer[String] val init_sb = new ArrayBuffer[String]
val http_sb = new ArrayBuffer[String] val http_sb = new ArrayBuffer[String]
...@@ -487,6 +500,9 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -487,6 +500,9 @@ class ShadowsocksNatService extends Service with BaseService {
config = c config = c
// register connection receiver
if (Utils.isLollipopOrAbove) initConnectionReceiver()
// register close receiver // register close receiver
val filter = new IntentFilter() val filter = new IntentFilter()
filter.addAction(Intent.ACTION_SHUTDOWN) filter.addAction(Intent.ACTION_SHUTDOWN)
...@@ -499,9 +515,6 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -499,9 +515,6 @@ class ShadowsocksNatService extends Service with BaseService {
} }
registerReceiver(closeReceiver, filter) registerReceiver(closeReceiver, filter)
// register connection receiver
if (Utils.isLollipopOrAbove) initConnectionReceiver()
// send event // send event
application.tracker.send(new HitBuilders.EventBuilder() application.tracker.send(new HitBuilders.EventBuilder()
.setCategory(TAG) .setCategory(TAG)
...@@ -527,8 +540,13 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -527,8 +540,13 @@ class ShadowsocksNatService extends Service with BaseService {
if (config != null) { if (config != null) {
// Clean up
killProcesses() killProcesses()
// Set DNS
if (Utils.isLollipopOrAbove) setupDns()
flushDns()
var resolved: Boolean = false var resolved: Boolean = false
if (!InetAddressUtils.isIPv4Address(config.proxy) && if (!InetAddressUtils.isIPv4Address(config.proxy) &&
!InetAddressUtils.isIPv6Address(config.proxy)) { !InetAddressUtils.isIPv6Address(config.proxy)) {
......
...@@ -42,7 +42,7 @@ package com.github.shadowsocks.utils ...@@ -42,7 +42,7 @@ package com.github.shadowsocks.utils
import android.content.{SharedPreferences, Context} import android.content.{SharedPreferences, Context}
import com.github.shadowsocks.ShadowsocksApplication import com.github.shadowsocks.ShadowsocksApplication
import com.google.android.gms.tagmanager.Container import com.google.android.gms.tagmanager.Container
import scalaj.http.{HttpOptions, Http} import com.github.kevinsawicki.http.HttpRequest
import com.github.shadowsocks.aidl.Config import com.github.shadowsocks.aidl.Config
object ConfigUtils { object ConfigUtils {
...@@ -183,12 +183,12 @@ object ConfigUtils { ...@@ -183,12 +183,12 @@ object ConfigUtils {
def getPublicConfig(context: Context, container: Container, config: Config): Config = { def getPublicConfig(context: Context, container: Container, config: Config): Config = {
val url = container.getString("proxy_url") val url = container.getString("proxy_url")
val sig = Utils.getSignature(context) val sig = Utils.getSignature(context)
val list = Http val list = HttpRequest
.post(url) .post(url)
.params("sig" -> sig) .connectTimeout(2000)
.option(HttpOptions.connTimeout(1000)) .readTimeout(2000)
.option(HttpOptions.readTimeout(5000)) .send("sig="+sig)
.asString .body
val proxies = util.Random.shuffle(list.split('|').toSeq).toSeq val proxies = util.Random.shuffle(list.split('|').toSeq).toSeq
val proxy = proxies(0).split(':') val proxy = proxies(0).split(':')
......
...@@ -181,6 +181,7 @@ object Utils { ...@@ -181,6 +181,7 @@ object Utils {
} }
def resolve(host: String, addrType: Int): Option[String] = { def resolve(host: String, addrType: Int): Option[String] = {
try {
val lookup = new Lookup(host, addrType) val lookup = new Lookup(host, addrType)
val resolver = new SimpleResolver("114.114.114.114") val resolver = new SimpleResolver("114.114.114.114")
resolver.setTimeout(5) resolver.setTimeout(5)
...@@ -196,6 +197,9 @@ object Utils { ...@@ -196,6 +197,9 @@ object Utils {
return Some(r.asInstanceOf[AAAARecord].getAddress.getHostAddress) return Some(r.asInstanceOf[AAAARecord].getAddress.getHostAddress)
} }
} }
} catch {
case e: Exception => None
}
None None
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment