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