Skip to content

Commit 2b513de

Browse files
authored
fix: prevent rear display crash when hide display cutout is enabled (#1534)
1 parent 158772f commit 2b513de

1 file changed

Lines changed: 37 additions & 2 deletions

File tree

  • library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/DisplayCutout.kt

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,51 @@
1919
package com.sevtinge.hyperceiler.libhook.rules.systemframework.display
2020

2121
import com.sevtinge.hyperceiler.libhook.base.BaseHook
22+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getStaticObjectField
2223
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.hookAllMethods
24+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.hookMethod
25+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getObjectField
26+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.setObjectField
2327

2428
object DisplayCutout : BaseHook() {
2529
override fun init() {
26-
findClass("android.view.DisplayCutout")
30+
val displayCutoutClass = findClass("android.view.DisplayCutout")
31+
val noCutout = displayCutoutClass.getStaticObjectField("NO_CUTOUT")
32+
33+
displayCutoutClass
2734
.hookAllMethods("pathAndDisplayCutoutFromSpec") {
2835
before {
2936
it.args[0] = "M 0,0 H 0 V 0 Z"
30-
it.args[1] = ""
37+
// Android 16 prioritizes rectSpec when it is present.
38+
// An empty string causes the framework to return NULL_PAIR,
39+
// which propagates a null DisplayCutout to secondary displays.
40+
// Use null so the synthetic empty pathSpec remains effective.
41+
it.args[1] = null
42+
}
43+
}
44+
45+
listOf("fromResourcesRectApproximation", "fromSpec").forEach { methodName ->
46+
displayCutoutClass.hookAllMethods(methodName) {
47+
after {
48+
if (it.result == null) {
49+
it.result = noCutout
50+
}
3151
}
3252
}
53+
}
54+
55+
val logicalDisplayClass = findClass("com.android.server.display.LogicalDisplay")
56+
logicalDisplayClass.hookMethod("getDisplayInfoLocked") {
57+
after {
58+
ensureNonNullDisplayCutout(it.result, noCutout)
59+
}
60+
}
61+
}
62+
63+
private fun ensureNonNullDisplayCutout(displayInfo: Any?, noCutout: Any?) {
64+
if (displayInfo == null || noCutout == null) return
65+
if (displayInfo.getObjectField("displayCutout") == null) {
66+
displayInfo.setObjectField("displayCutout", noCutout)
67+
}
3368
}
3469
}

0 commit comments

Comments
 (0)