1111import androidx .annotation .NonNull ;
1212import androidx .annotation .RequiresApi ;
1313
14- import java .lang .reflect .Field ;
1514import java .util .Arrays ;
1615import java .util .function .BiConsumer ;
1716import java .util .function .BiPredicate ;
@@ -229,13 +228,13 @@ private void hookWindowState(ClassLoader classLoader) throws ClassNotFoundExcept
229228 var walker = StackWalker .getInstance ();
230229 var match = walker .walk (frames -> frames
231230 .map (StackWalker .StackFrame ::getMethodName )
232- .limit (6 )
233- .skip (2 )
231+ .limit (10 )
232+ .skip (6 )
234233 .anyMatch (s -> s .equals ("setInitialSurfaceControlProperties" ) || s .equals ("createSurfaceLocked" )));
235234 if (match ) return chain .proceed ();
236235 } else {
237236 var stackTrace = new Throwable ().getStackTrace ();
238- for (int i = 4 ; i < stackTrace .length && i < 8 ; i ++) {
237+ for (int i = 8 ; i < stackTrace .length && i < 12 ; i ++) {
239238 var name = stackTrace [i ].getMethodName ();
240239 if (name .equals ("setInitialSurfaceControlProperties" ) ||
241240 name .equals ("createSurfaceLocked" )) {
@@ -247,8 +246,6 @@ private void hookWindowState(ClassLoader classLoader) throws ClassNotFoundExcept
247246 });
248247 }
249248
250- private static Field captureSecureLayersField ;
251-
252249 private void hookScreenCapture (ClassLoader classLoader ) throws ClassNotFoundException , NoSuchFieldException {
253250 Class <?> screenCaptureClazz ;
254251 Class <?> captureArgsClazz ;
@@ -262,11 +259,25 @@ private void hookScreenCapture(ClassLoader classLoader) throws ClassNotFoundExce
262259 screenCaptureClazz = SurfaceControl .class ;
263260 captureArgsClazz = classLoader .loadClass ("android.view.SurfaceControl$CaptureArgs" );
264261 }
265- captureSecureLayersField = captureArgsClazz .getDeclaredField (Build .VERSION .SDK_INT >= Build .VERSION_CODES .BAKLAVA &&
262+ var captureSecureLayersField = captureArgsClazz .getDeclaredField (Build .VERSION .SDK_INT >= Build .VERSION_CODES .BAKLAVA &&
266263 Build .VERSION .SDK_INT_FULL >= Build .VERSION_CODES_FULL .BAKLAVA_1 ? "mSecureContentPolicy" : "mCaptureSecureLayers" );
267264 captureSecureLayersField .setAccessible (true );
268- hookMethods (screenCaptureClazz , new ScreenCaptureHooker (), "nativeCaptureDisplay" );
269- hookMethods (screenCaptureClazz , new ScreenCaptureHooker (), "nativeCaptureLayers" );
265+ Hooker hooker = chain -> {
266+ var captureArgs = chain .getArg (0 );
267+ try {
268+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .BAKLAVA &&
269+ Build .VERSION .SDK_INT_FULL >= Build .VERSION_CODES_FULL .BAKLAVA_1 ) {
270+ captureSecureLayersField .set (captureArgs , 1 );
271+ } else {
272+ captureSecureLayersField .set (captureArgs , true );
273+ }
274+ } catch (IllegalAccessException t ) {
275+ module .log (Log .ERROR , TAG , "ScreenCaptureHooker failed" , t );
276+ }
277+ return chain .proceed ();
278+ };
279+ hookMethods (screenCaptureClazz , hooker , "nativeCaptureDisplay" );
280+ hookMethods (screenCaptureClazz , hooker , "nativeCaptureLayers" );
270281 }
271282
272283 private void hookDisplayControl (ClassLoader classLoader ) throws ClassNotFoundException , NoSuchMethodException {
@@ -280,7 +291,7 @@ private void hookDisplayControl(ClassLoader classLoader) throws ClassNotFoundExc
280291 hook (method ).intercept (chain -> {
281292 if (Build .VERSION .SDK_INT < Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
282293 var stackTrace = new Throwable ().getStackTrace ();
283- for (int i = 4 ; i < stackTrace .length && i < 8 ; i ++) {
294+ for (int i = 8 ; i < stackTrace .length && i < 12 ; i ++) {
284295 var name = stackTrace [i ].getMethodName ();
285296 if (name .equals ("createVirtualDisplayLocked" )) {
286297 return chain .proceed ();
@@ -403,23 +414,4 @@ private void hookOnResume() throws NoSuchMethodException {
403414 return chain .proceed ();
404415 });
405416 }
406-
407- private static class ScreenCaptureHooker implements Hooker {
408-
409- @ Override
410- public Object intercept (@ NonNull Chain chain ) throws Throwable {
411- var captureArgs = chain .getArg (0 );
412- try {
413- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .BAKLAVA &&
414- Build .VERSION .SDK_INT_FULL >= Build .VERSION_CODES_FULL .BAKLAVA_1 ) {
415- captureSecureLayersField .set (captureArgs , 1 );
416- } else {
417- captureSecureLayersField .set (captureArgs , true );
418- }
419- } catch (IllegalAccessException t ) {
420- module .log (Log .ERROR , TAG , "ScreenCaptureHooker failed" , t );
421- }
422- return chain .proceed ();
423- }
424- }
425417}
0 commit comments