@@ -126,6 +126,14 @@ public void onSystemServerLoaded(@NonNull SystemServerLoadedParam param) {
126126 log ("hook WindowState failed" , t );
127127 }
128128
129+ if (Build .VERSION .SDK_INT < Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
130+ try {
131+ hookSurfaceControl (classLoader );
132+ } catch (Throwable t ) {
133+ log ("hook SurfaceControl failed" , t );
134+ }
135+ }
136+
129137 // oplus dumpsys
130138 // dumpsys window screenshot systemQuickTileScreenshotOut display_id=0
131139 try {
@@ -228,6 +236,13 @@ private void hookWindowState(ClassLoader classLoader) throws ClassNotFoundExcept
228236 hook (isSecureLockedMethod , SecureLockedHooker .class );
229237 }
230238
239+ private void hookSurfaceControl (ClassLoader classLoader ) throws ClassNotFoundException , NoSuchMethodException {
240+ var windowStateClazz = classLoader .loadClass ("android.view.SurfaceControl$Transaction" );
241+ @ SuppressLint ("SoonBlockedPrivateApi" )
242+ var setSecureMethod = windowStateClazz .getDeclaredMethod ("setSecure" , SurfaceControl .class , boolean .class );
243+ hook (setSecureMethod , SetSecureHooker .class );
244+ }
245+
231246 private static Field captureSecureLayersField ;
232247
233248 private void hookScreenCapture (ClassLoader classLoader ) throws ClassNotFoundException , NoSuchFieldException {
@@ -381,7 +396,7 @@ public static void before(@NonNull BeforeHookCallback callback) {
381396 if (Build .VERSION .SDK_INT < Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
382397 var uid = android .os .Process .myUid ();
383398 // cannot bypass hasCaptureBlackoutContentPermission() in SurfaceFlinger.cpp
384- // skipping this hook for S~T before implement native hook
399+ // skipping this hook for S~T
385400 if (uid != 1000 && uid != 1003 ) {
386401 return ;
387402 }
@@ -450,6 +465,17 @@ public static void before(@NonNull BeforeHookCallback callback) {
450465 }
451466 }
452467
468+ @ XposedHooker
469+ private static class SetSecureHooker implements Hooker {
470+ @ BeforeInvocation
471+ public static void before (@ NonNull BeforeHookCallback callback ) {
472+ var isSecure = callback .getArgs ()[1 ];
473+ if (isSecure instanceof Boolean ) {
474+ callback .getArgs ()[1 ] = false ;
475+ }
476+ }
477+ }
478+
453479 @ XposedHooker
454480 private static class ReturnTrueHooker implements Hooker {
455481 @ BeforeInvocation
0 commit comments