Unverified Commit 6e9f445d authored by Mygod's avatar Mygod Committed by GitHub

Merge pull request #2507 from Mygod/r

Support Android 11 beta 1
parents f2c83f97 b71f3f15
......@@ -24,10 +24,10 @@ val Project.currentFlavor get() = gradle.startParameter.taskRequests.toString().
fun Project.setupCommon() {
android.apply {
compileSdkVersion(29)
compileSdkVersion(30)
defaultConfig {
minSdkVersion(21)
targetSdkVersion(29)
targetSdkVersion(30)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
val javaVersion = JavaVersion.VERSION_1_8
......
......@@ -19,9 +19,16 @@
<uses-feature android:name="android.software.leanback"
android:required="false"/>
<queries>
<intent>
<action android:name="com.github.shadowsocks.plugin.ACTION_NATIVE_PLUGIN" />
</intent>
</queries>
<application
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:autoRevokePermissions="allowed"
android:backupAgent="com.github.shadowsocks.ConfigBackupHelper"
android:extractNativeLibs="true"
android:fullBackupContent="@xml/backup_descriptor"
......
......@@ -26,6 +26,7 @@ import android.content.Intent
import android.content.ServiceConnection
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.os.RemoteException
import com.github.shadowsocks.bg.BaseService
import com.github.shadowsocks.bg.ProxyService
......@@ -38,7 +39,7 @@ import com.github.shadowsocks.utils.Key
/**
* This object should be compact as it will not get GC-ed.
*/
class ShadowsocksConnection(private val handler: Handler = Handler(),
class ShadowsocksConnection(private val handler: Handler = Handler(Looper.getMainLooper()),
private var listenForDeath: Boolean = false) :
ServiceConnection, IBinder.DeathRecipient {
companion object {
......
......@@ -93,7 +93,7 @@ object DefaultNetworkListener {
// NB: this runs in ConnectivityThread, and this behavior cannot be changed until API 26
private object Callback : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) = runBlocking { networkActor.send(NetworkMessage.Put(network)) }
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) {
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
// it's a good idea to refresh capabilities
runBlocking { networkActor.send(NetworkMessage.Update(network)) }
}
......
......@@ -88,12 +88,13 @@ sealed class DnsResolverCompat {
"bindSocketToNetwork", Int::class.java, Int::class.java)
}
private val netId by lazy { Network::class.java.getDeclaredField("netId") }
@SuppressLint("NewApi")
override fun bindSocket(network: Network, socket: FileDescriptor) {
val netId = netId.get(network)!!
val err = bindSocketToNetwork.invoke(null, socket.int, netId) as Int
if (err == 0) return
val message = "Binding socket to network $netId"
throw IOException(message, ErrnoException(message, -err))
throw ErrnoException(message, -err).rethrowAsSocketException()
}
/**
......
......@@ -24,9 +24,7 @@ import android.os.Build
import android.os.SystemClock
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app
import com.github.shadowsocks.acl.Acl
import com.github.shadowsocks.core.R
import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.Key
......
......@@ -20,6 +20,7 @@
package com.github.shadowsocks.net
import android.annotation.SuppressLint
import android.net.LocalServerSocket
import android.net.LocalSocket
import android.net.LocalSocketAddress
......@@ -63,6 +64,7 @@ abstract class LocalSocketListener(name: String, socketFile: File) : Thread(name
closeChannel.sendBlocking(Unit)
}
@SuppressLint("NewApi")
open fun shutdown(scope: CoroutineScope) {
running = false
localSocket.fileDescriptor?.apply {
......@@ -71,7 +73,7 @@ abstract class LocalSocketListener(name: String, socketFile: File) : Thread(name
Os.shutdown(this, OsConstants.SHUT_RDWR)
} catch (e: ErrnoException) {
// suppress fd inactive or already closed
if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw IOException(e)
if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw e.rethrowAsSocketException()
}
}
scope.launch { closeChannel.receive() }
......
......@@ -3,6 +3,8 @@
package="com.github.shadowsocks"
tools:ignore="MissingLeanbackSupport">
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission-sdk-23 android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.touchscreen"
......@@ -85,6 +87,9 @@
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
<meta-data
android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
<receiver android:name=".tasker.ActionListener"
......
......@@ -27,6 +27,7 @@ import android.content.Intent
import android.net.VpnService
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.RemoteException
import android.view.*
import androidx.appcompat.app.AppCompatActivity
......@@ -130,7 +131,7 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
else -> Core.startService()
}
private val handler = Handler()
private val handler = Handler(Looper.getMainLooper())
private val connection = ShadowsocksConnection(handler, true)
override fun onServiceConnected(service: IShadowsocksService) = changeState(try {
BaseService.State.values()[service.state]
......
......@@ -120,7 +120,7 @@ class ScannerActivity : AppCompatActivity(), BarcodeRetriever {
menuInflater.inflate(R.menu.scanner_menu, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.action_import_clipboard -> {
startImport(true)
true
......
......@@ -27,6 +27,7 @@ import android.content.Intent
import android.net.VpnService
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.RemoteException
import android.text.format.Formatter
import android.widget.Toast
......@@ -117,7 +118,7 @@ class MainPreferenceFragment : LeanbackPreferenceFragmentCompat(), ShadowsocksCo
}
}
private val handler = Handler()
private val handler = Handler(Looper.getMainLooper())
private val connection = ShadowsocksConnection(handler, true)
override fun onServiceConnected(service: IShadowsocksService) = changeState(try {
BaseService.State.values()[service.state]
......
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