Skip to content

Commit

Permalink
fix?: fallback to Q suspend if api in U is not changed in some distro #…
Browse files Browse the repository at this point in the history
  • Loading branch information
aistra0528 committed Mar 24, 2024
1 parent ba5cab3 commit 81585db
Showing 1 changed file with 40 additions and 34 deletions.
74 changes: 40 additions & 34 deletions app/src/main/kotlin/com/aistra/hail/utils/HShizuku.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.os.ParcelFileDescriptor
import android.os.SystemClock
import android.view.InputEvent
import android.view.KeyEvent
import androidx.annotation.RequiresApi
import com.aistra.hail.BuildConfig
import com.aistra.hail.utils.HPackages.myUserId
import moe.shizuku.server.IShizukuService
Expand Down Expand Up @@ -108,33 +109,24 @@ object HShizuku {
return runCatching {
val pm = asInterface("android.content.pm.IPackageManager", "package")
(when {
HTarget.U && Build.VERSION.SECURITY_PATCH.replace("-", "").toInt() > 20240300 -> HiddenApiBypass.invoke(
pm::class.java,
pm,
"setPackagesSuspendedAsUser",
arrayOf(packageName),
suspended,
null,
null,
if (suspended) suspendDialogInfo else null,
0,
callerPackage,
userId /*suspendingUserId*/,
userId /*targetUserId*/
)

HTarget.Q -> HiddenApiBypass.invoke(
pm::class.java,
pm,
"setPackagesSuspendedAsUser",
arrayOf(packageName),
suspended,
null,
null,
if (suspended) suspendDialogInfo else null,
callerPackage,
userId
)
HTarget.U -> runCatching {
HiddenApiBypass.invoke(
pm::class.java,
pm,
"setPackagesSuspendedAsUser",
arrayOf(packageName),
suspended,
null,
null,
if (suspended) suspendDialogInfo else null,
0,
callerPackage,
userId /*suspendingUserId*/,
userId /*targetUserId*/
)
}.getOrElse { setPackagesSuspendedAsUserSinceQ(pm, packageName, suspended) }

HTarget.Q -> setPackagesSuspendedAsUserSinceQ(pm, packageName, suspended)

HTarget.P -> HiddenApiBypass.invoke(
pm::class.java,
Expand All @@ -161,14 +153,28 @@ object HShizuku {
}
}

@RequiresApi(Build.VERSION_CODES.Q)
private fun setPackagesSuspendedAsUserSinceQ(pm: Any, packageName: String, suspended: Boolean): Any =
HiddenApiBypass.invoke(
pm::class.java,
pm,
"setPackagesSuspendedAsUser",
arrayOf(packageName),
suspended,
null,
null,
if (suspended) suspendDialogInfo else null,
callerPackage,
userId
)

private val suspendDialogInfo: Any
@SuppressLint("PrivateApi") get() = HiddenApiBypass.newInstance(Class.forName("android.content.pm.SuspendDialogInfo\$Builder"))
.let {
HiddenApiBypass.invoke(
it::class.java, it, "setNeutralButtonAction", 1 /*BUTTON_ACTION_UNSUSPEND*/
)
HiddenApiBypass.invoke(it::class.java, it, "build")
}
@RequiresApi(Build.VERSION_CODES.P) @SuppressLint("PrivateApi") get() = HiddenApiBypass.newInstance(
Class.forName("android.content.pm.SuspendDialogInfo\$Builder")
).let {
HiddenApiBypass.invoke(it::class.java, it, "setNeutralButtonAction", 1 /*BUTTON_ACTION_UNSUSPEND*/)
HiddenApiBypass.invoke(it::class.java, it, "build")
}

fun uninstallApp(packageName: String): Boolean = execute(
"pm ${if (HPackages.canUninstallNormally(packageName)) "uninstall" else "uninstall --user current"} $packageName"
Expand Down

0 comments on commit 81585db

Please sign in to comment.