Target API 31 on Google variant
This commit is contained in:
@@ -10,7 +10,6 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
val javaVersion = JavaVersion.VERSION_11
|
val javaVersion = JavaVersion.VERSION_11
|
||||||
val targetSdk = 29
|
|
||||||
buildToolsVersion = "31.0.0"
|
buildToolsVersion = "31.0.0"
|
||||||
compileOptions {
|
compileOptions {
|
||||||
isCoreLibraryDesugaringEnabled = true
|
isCoreLibraryDesugaringEnabled = true
|
||||||
@@ -22,10 +21,10 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "be.mygod.vpnhotspot"
|
applicationId = "be.mygod.vpnhotspot"
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
this.targetSdk = targetSdk
|
targetSdk = 29
|
||||||
resourceConfigurations.addAll(arrayOf("it", "ru", "zh-rCN", "zh-rTW"))
|
resourceConfigurations.addAll(arrayOf("it", "ru", "zh-rCN", "zh-rTW"))
|
||||||
versionCode = 279
|
versionCode = 280
|
||||||
versionName = "2.12.8"
|
versionName = "2.13.0"
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
javaCompileOptions.annotationProcessorOptions.arguments.apply {
|
javaCompileOptions.annotationProcessorOptions.arguments.apply {
|
||||||
put("room.expandProjection", "true")
|
put("room.expandProjection", "true")
|
||||||
@@ -33,7 +32,7 @@ android {
|
|||||||
put("room.schemaLocation", "$projectDir/schemas")
|
put("room.schemaLocation", "$projectDir/schemas")
|
||||||
}
|
}
|
||||||
buildConfigField("boolean", "DONATIONS", "true")
|
buildConfigField("boolean", "DONATIONS", "true")
|
||||||
buildConfigField("int", "TARGET_SDK", targetSdk.toString())
|
buildConfigField("int", "TARGET_SDK", "29")
|
||||||
}
|
}
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
@@ -57,7 +56,9 @@ android {
|
|||||||
}
|
}
|
||||||
create("google") {
|
create("google") {
|
||||||
dimension = "freedom"
|
dimension = "freedom"
|
||||||
|
targetSdk = 31
|
||||||
buildConfigField("boolean", "DONATIONS", "false")
|
buildConfigField("boolean", "DONATIONS", "false")
|
||||||
|
buildConfigField("int", "TARGET_SDK", "31")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sourceSets.getByName("androidTest").assets.srcDir("$projectDir/schemas")
|
sourceSets.getByName("androidTest").assets.srcDir("$projectDir/schemas")
|
||||||
@@ -91,6 +92,7 @@ dependencies {
|
|||||||
implementation("com.takisoft.preferencex:preferencex-simplemenu:1.1.0")
|
implementation("com.takisoft.preferencex:preferencex-simplemenu:1.1.0")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.4")
|
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.4")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2")
|
||||||
|
add("googleImplementation", "com.github.tiann:FreeReflection:3.1.0")
|
||||||
testImplementation("junit:junit:4.13.2")
|
testImplementation("junit:junit:4.13.2")
|
||||||
androidTestImplementation("androidx.room:room-testing:$roomVersion")
|
androidTestImplementation("androidx.room:room-testing:$roomVersion")
|
||||||
androidTestImplementation("androidx.test:runner:1.4.0")
|
androidTestImplementation("androidx.test:runner:1.4.0")
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package be.mygod.vpnhotspot.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
|
fun UnblockHelper(context: Context) {
|
||||||
|
val getDeclaredMethod = Class::class.java.getDeclaredMethod("getDeclaredMethod",
|
||||||
|
String::class.java, arrayOf<Class<*>>()::class.java)
|
||||||
|
val clazz = Class.forName("dalvik.system.VMRuntime")
|
||||||
|
val setHiddenApiExemptions = getDeclaredMethod(clazz, "setHiddenApiExemptions",
|
||||||
|
arrayOf(Array<String>::class.java)) as Method
|
||||||
|
setHiddenApiExemptions(clazz.getDeclaredMethod("getRuntime")(null), arrayOf(""))
|
||||||
|
}
|
||||||
5
mobile/src/google/AndroidManifest.xml
Normal file
5
mobile/src/google/AndroidManifest.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- Required since API 31, when targeting API 31 -->
|
||||||
|
<uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_CONNECT"/>
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package be.mygod.vpnhotspot.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import me.weishu.reflection.Reflection
|
||||||
|
|
||||||
|
fun UnblockHelper(context: Context) {
|
||||||
|
check(Reflection.unseal(context) == 0)
|
||||||
|
}
|
||||||
@@ -52,10 +52,6 @@
|
|||||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
<!-- Required since API 29 -->
|
<!-- Required since API 29 -->
|
||||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
<!-- Required since API 31, when targeting API 31 -->
|
|
||||||
<!--
|
|
||||||
<uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_CONNECT"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
|
|||||||
@@ -320,12 +320,11 @@ sealed class TetherManager(protected val parent: TetheringFragment) : Manager(),
|
|||||||
onTetheringStarted() // force flush
|
onTetheringStarted() // force flush
|
||||||
}
|
}
|
||||||
override fun onResume(owner: LifecycleOwner) {
|
override fun onResume(owner: LifecycleOwner) {
|
||||||
if (Build.VERSION.SDK_INT < 31 || parent.requireContext().checkSelfPermission(
|
if (Build.VERSION.SDK_INT < 31) return
|
||||||
Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED) {
|
if (parent.requireContext().checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) ==
|
||||||
|
PackageManager.PERMISSION_GRANTED) {
|
||||||
tethering.ensureInit(parent.requireContext())
|
tethering.ensureInit(parent.requireContext())
|
||||||
} else if (parent.shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_CONNECT)) {
|
} else parent.requestBluetooth.launch(Manifest.permission.BLUETOOTH_CONNECT)
|
||||||
parent.requestBluetooth.launch(Manifest.permission.BLUETOOTH_CONNECT)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
override fun onDestroy(owner: LifecycleOwner) = tethering.close()
|
override fun onDestroy(owner: LifecycleOwner) = tethering.close()
|
||||||
|
|
||||||
|
|||||||
@@ -3,31 +3,22 @@ package be.mygod.vpnhotspot.util
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.net.wifi.SoftApConfiguration
|
import android.net.wifi.SoftApConfiguration
|
||||||
import android.net.wifi.p2p.WifiP2pConfig
|
import android.net.wifi.p2p.WifiP2pConfig
|
||||||
import android.os.Build
|
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import java.lang.reflect.Method
|
import be.mygod.vpnhotspot.App.Companion.app
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The central object for accessing all the useful blocked APIs. Thanks Google!
|
* The central object for accessing all the useful blocked APIs. Thanks Google!
|
||||||
*
|
*
|
||||||
* Lazy cannot be used directly as it will create inner classes.
|
* Lazy cannot be used directly as it will create inner classes.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(28)
|
||||||
@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi")
|
@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi")
|
||||||
@Suppress("FunctionName")
|
@Suppress("FunctionName")
|
||||||
object UnblockCentral {
|
object UnblockCentral {
|
||||||
/**
|
/**
|
||||||
* Retrieve this property before doing dangerous shit.
|
* Retrieve this property before doing dangerous shit.
|
||||||
*/
|
*/
|
||||||
private val init by lazy {
|
private val init by lazy { UnblockHelper(app) }
|
||||||
if (Build.VERSION.SDK_INT < 28) return@lazy
|
|
||||||
// TODO: fix this not working when targeting API 30+
|
|
||||||
val getDeclaredMethod = Class::class.java.getDeclaredMethod("getDeclaredMethod",
|
|
||||||
String::class.java, arrayOf<Class<*>>()::class.java)
|
|
||||||
val clazz = Class.forName("dalvik.system.VMRuntime")
|
|
||||||
val setHiddenApiExemptions = getDeclaredMethod(clazz, "setHiddenApiExemptions",
|
|
||||||
arrayOf(Array<String>::class.java)) as Method
|
|
||||||
setHiddenApiExemptions(clazz.getDeclaredMethod("getRuntime")(null), arrayOf(""))
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiresApi(31)
|
@RequiresApi(31)
|
||||||
fun setUserConfiguration(clazz: Class<*>) = init.let {
|
fun setUserConfiguration(clazz: Class<*>) = init.let {
|
||||||
|
|||||||
Reference in New Issue
Block a user