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