@@ -62,7 +62,7 @@ public class TouchHelperServiceImpl {
6262 private ScheduledExecutorService executorService ;
6363 private ScheduledFuture futureExpireSkipAdProcess ;
6464
65- private boolean b_method_by_activity_position , b_method_by_activity_widget , b_method_by_button_keyword ;
65+ private boolean skipad_by_activity_position , skipad_by_activity_widget , skipad_by_keyword ;
6666 private PackageManager packageManager ;
6767 private String currentPackageName , currentActivityName ;
6868 private String packageName ;
@@ -72,8 +72,7 @@ public class TouchHelperServiceImpl {
7272
7373 private Map <String , PackagePositionDescription > mapPackagePositions ;
7474 private Map <String , Set <PackageWidgetDescription >> mapPackageWidgets ;
75- private Set <PackageWidgetDescription > setWidgets ;
76- private PackagePositionDescription packagePositionDescription ;
75+ private Set <PackageWidgetDescription > setTargetedWidgets ;
7776
7877 // try to click 5 times, first click after 300ms, and delayed for 500ms for future clicks
7978 static final int PackagePositionClickFirstDelay = 300 ;
@@ -297,11 +296,11 @@ public void onAccessibilityEvent(AccessibilityEvent event) {
297296 // now to take different methods to skip ads
298297
299298 // first method is to skip ads by position in activity
300- if (b_method_by_activity_position ) {
299+ if (skipad_by_activity_position ) {
301300 // run this method for once only
302- b_method_by_activity_position = false ;
301+ skipad_by_activity_position = false ;
303302
304- packagePositionDescription = mapPackagePositions .get (currentPackageName );
303+ PackagePositionDescription packagePositionDescription = mapPackagePositions .get (currentPackageName );
305304 if (packagePositionDescription != null ) {
306305 ShowToastInIntentService ("正在根据位置跳过广告..." );
307306
@@ -325,36 +324,38 @@ public void run() {
325324 }
326325 }
327326
328- if (b_method_by_activity_widget ) {
327+ // second: skip ads by widget
328+ if (skipad_by_activity_widget ) {
329329// Log.d(TAG, "method by widget in STATE_CHANGED");
330- setWidgets = mapPackageWidgets .get (currentPackageName );
331- if (setWidgets != null ) {
330+ // run this once, and find targeted widgets for this package
331+ skipad_by_activity_widget = false ;
332+ setTargetedWidgets = mapPackageWidgets .get (currentPackageName );
333+ }
334+ if (setTargetedWidgets != null ) {
332335// Log.d(TAG, "Find skip-ad by widget, simulate click ");
333- findSkipButtonByWidget (service .getRootInActiveWindow (), setWidgets );
334- } else {
335- // no customized widget for this package, don't try this method again
336- b_method_by_activity_widget = false ;
337- }
336+ // this code could be run multiple times
337+ skipAdByTargetedWidget (service .getRootInActiveWindow (), setTargetedWidgets );
338338 }
339339
340- if (b_method_by_button_keyword ) {
340+ if (skipad_by_keyword ) {
341341// Log.d(TAG, "method by keywords in STATE_CHANGED");
342- findSkipButtonByTextOrDescription (service .getRootInActiveWindow ());
342+ // this code could be run multiple times
343+ skipAdByKeywords (service .getRootInActiveWindow ());
343344 }
344345 break ;
345346 case AccessibilityEvent .TYPE_WINDOW_CONTENT_CHANGED :
346347 if (!setPackages .contains (tempPkgName )) {
347348 break ;
348349 }
349350
350- if (b_method_by_activity_widget && setWidgets != null ) {
351+ if (setTargetedWidgets != null ) {
351352// Log.d(TAG, "method by widget in CONTENT_CHANGED");
352- findSkipButtonByWidget (event .getSource (), setWidgets );
353+ skipAdByTargetedWidget (event .getSource (), setTargetedWidgets );
353354 }
354355
355- if (b_method_by_button_keyword ) {
356+ if (skipad_by_keyword ) {
356357// Log.d(TAG, "method by keywords in CONTENT_CHANGED");
357- findSkipButtonByTextOrDescription (event .getSource ());
358+ skipAdByKeywords (event .getSource ());
358359 }
359360 break ;
360361// case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
@@ -378,8 +379,8 @@ public void onUnbind(Intent intent) {
378379 /**
379380 * 查找并点击包含keyword控件,目标包括Text和Description
380381 * * */
381- private void findSkipButtonByTextOrDescription (AccessibilityNodeInfo root ) {
382- // Log.d(TAG, "findSkipButtonByTextOrDescription triggered: " + Utilities.describeAccessibilityNode(root));
382+ private void skipAdByKeywords (AccessibilityNodeInfo root ) {
383+ // Log.d(TAG, "skipAdByKeywords triggered: " + Utilities.describeAccessibilityNode(root));
383384
384385 ArrayList <AccessibilityNodeInfo > listA = new ArrayList <>();
385386 ArrayList <AccessibilityNodeInfo > listB = new ArrayList <>();
@@ -430,8 +431,6 @@ private void findSkipButtonByTextOrDescription(AccessibilityNodeInfo root) {
430431 // is it possible that there are more nodes to click and this node does not work?
431432 // don't stop looking for more nodes
432433// break;
433- } else {
434- // Log.d(TAG, "Clicked already:" + nodeDesc);
435434 }
436435 }
437436
@@ -455,14 +454,15 @@ private void findSkipButtonByTextOrDescription(AccessibilityNodeInfo root) {
455454 /**
456455 * 查找并点击由 ActivityWidgetDescription 定义的控件
457456 */
458- private void findSkipButtonByWidget (AccessibilityNodeInfo root , Set <PackageWidgetDescription > set ) {
459- int a = 0 ;
460- int b = 1 ;
457+ private void skipAdByTargetedWidget (AccessibilityNodeInfo root , Set <PackageWidgetDescription > set ) {
461458 ArrayList <AccessibilityNodeInfo > listA = new ArrayList <>();
462- ArrayList <AccessibilityNodeInfo > listB = new ArrayList <>();
463459 listA .add (root );
464- while (a < b ) {
465- AccessibilityNodeInfo node = listA .get (a ++);
460+ ArrayList <AccessibilityNodeInfo > listB = new ArrayList <>();
461+
462+ int length = listA .size ();
463+ int index = 0 ;
464+ while (index < length ) {
465+ AccessibilityNodeInfo node = listA .get (index ++);
466466 if (node != null ) {
467467 Rect temRect = new Rect ();
468468 node .getBoundsInScreen (temRect );
@@ -485,6 +485,7 @@ private void findSkipButtonByWidget(AccessibilityNodeInfo root, Set<PackageWidge
485485// Log.d(TAG, "Find skip-ad by Widget " + e.toString());
486486 String nodeDesc = Utilities .describeAccessibilityNode (node );
487487 if (!clickedWidgets .contains (nodeDesc )) {
488+ // add this widget to clicked widget, avoid multiple click on the same widget
488489 clickedWidgets .add (nodeDesc );
489490
490491 ShowToastInIntentService ("正在根据控件跳过广告..." );
@@ -497,7 +498,8 @@ private void findSkipButtonByWidget(AccessibilityNodeInfo root, Set<PackageWidge
497498 }
498499 }
499500 }
500- setWidgets = null ;
501+ // clear setWidgets, stop trying
502+ setTargetedWidgets = null ;
501503 return ;
502504 }
503505 }
@@ -507,9 +509,9 @@ private void findSkipButtonByWidget(AccessibilityNodeInfo root, Set<PackageWidge
507509 }
508510 node .recycle ();
509511 }
510- if (a == b ) {
511- a = 0 ;
512- b = listB .size ();
512+ if (index == length ) {
513+ index = 0 ;
514+ length = listB .size ();
513515 listA = listB ;
514516 listB = new ArrayList <>();
515517 }
@@ -561,14 +563,13 @@ private boolean click(int X, int Y, long start_time, long duration) {
561563 */
562564 private void startSkipAdProcess () {
563565// Log.d(TAG, "Start Skip-ad process");
564- b_method_by_activity_position = true ;
565- b_method_by_activity_widget = true ;
566- b_method_by_button_keyword = true ;
567- setWidgets = null ;
568- packagePositionDescription = null ;
566+ skipad_by_activity_position = true ;
567+ skipad_by_activity_widget = true ;
568+ skipad_by_keyword = true ;
569+ setTargetedWidgets = null ;
569570 clickedWidgets .clear ();
570571
571- // cancel all methods 4 seconds later
572+ // cancel all methods N seconds later
572573 if ( !futureExpireSkipAdProcess .isCancelled () && !futureExpireSkipAdProcess .isDone ()) {
573574 futureExpireSkipAdProcess .cancel (true );
574575 }
@@ -595,11 +596,10 @@ private void stopSkipAdProcess() {
595596 * stop the skip-ad process, without cancel scheduled task
596597 */
597598 private void stopSkipAdProcessInner () {
598- b_method_by_activity_position = false ;
599- b_method_by_activity_widget = false ;
600- b_method_by_button_keyword = false ;
601- setWidgets = null ;
602- packagePositionDescription = null ;
599+ skipad_by_activity_position = false ;
600+ skipad_by_activity_widget = false ;
601+ skipad_by_keyword = false ;
602+ setTargetedWidgets = null ;
603603 }
604604
605605 /**
0 commit comments