diff --git a/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt b/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt index 042ba540e..007191682 100644 --- a/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt +++ b/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt @@ -4,6 +4,9 @@ import android.os.Build import androidx.annotation.ChecksSdkIntAtLeast object BuildCompat { + @get:ChecksSdkIntAtLeast(api = 37) + val atLeastC get() = Build.VERSION.SDK_INT >= 37 + @get:ChecksSdkIntAtLeast(api = Build.VERSION_CODES.VANILLA_ICE_CREAM) val atLeastV get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM diff --git a/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java b/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java new file mode 100644 index 000000000..0e85f0556 --- /dev/null +++ b/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java @@ -0,0 +1,14 @@ +package android.content.pm; + +import android.os.IInterface; +import android.os.RemoteException; + +import androidx.annotation.RequiresApi; + +import dev.rikka.tools.refine.RefineAs; + +@RequiresApi(37) +@RefineAs(IPackageManager.class) +public interface IPackageManagerV37 extends IInterface { + PackageInfoList getInstalledPackages(long flags, int userId) throws RemoteException; +} diff --git a/hidden-api/src/main/java/android/content/pm/PackageInfoList.java b/hidden-api/src/main/java/android/content/pm/PackageInfoList.java new file mode 100644 index 000000000..7c615d218 --- /dev/null +++ b/hidden-api/src/main/java/android/content/pm/PackageInfoList.java @@ -0,0 +1,18 @@ +package android.content.pm; + +import android.content.pm.PackageInfo; +import java.util.List; + +import androidx.annotation.RequiresApi; + +@RequiresApi(37) +public final class PackageInfoList extends ParceledListSlice { + public static PackageInfoList emptyList() { + throw new RuntimeException("Stub!"); + } + + public PackageInfoList(List list) { + super(list); + throw new RuntimeException("Stub!"); + } +} diff --git a/platform/build.gradle.kts b/platform/build.gradle.kts index 345fbf288..9d83ea639 100644 --- a/platform/build.gradle.kts +++ b/platform/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.ksp) alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.rikka.refine) } android { @@ -91,6 +92,7 @@ dependencies { implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.protobuf) implementation(libs.square.moshi) + implementation(libs.rikka.refine.runtime) ksp(libs.square.moshi.kotlin) } @@ -104,4 +106,4 @@ fun generateRandomName( return (1..length) .map { chars[random.nextInt(chars.length)] } .joinToString("") -} \ No newline at end of file +} diff --git a/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt b/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt index b1a2d6b48..d5f2d3a65 100644 --- a/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt +++ b/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt @@ -5,6 +5,7 @@ package com.dergoogler.mmrl.platform.hiddenApi import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.IPackageManager +import android.content.pm.IPackageManagerV37 import android.content.pm.PackageInfo import android.content.pm.ResolveInfo import android.os.SystemProperties @@ -13,6 +14,8 @@ import com.dergoogler.mmrl.compat.BuildCompat import com.dergoogler.mmrl.platform.PlatformManager.getSystemService import com.dergoogler.mmrl.platform.stub.IServiceManager +import dev.rikka.tools.refine.Refine; + class HiddenPackageManager( private val service: IServiceManager, ) { @@ -59,7 +62,9 @@ class HiddenPackageManager( flags: Int, userId: Int, ): List = - if (BuildCompat.atLeastT) { + if (BuildCompat.atLeastC) { + Refine.unsafeCast(packageManager).getInstalledPackages(flags.toLong(), userId).list + } else if (BuildCompat.atLeastT) { packageManager.getInstalledPackages(flags.toLong(), userId) } else { packageManager.getInstalledPackages(flags, userId)