calabash-android 0.4.0.pre10 → 0.4.0.pre11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. data/lib/calabash-android/lib/TestServer.apk +0 -0
  2. data/lib/calabash-android/operations.rb +19 -2
  3. data/lib/calabash-android/steps/list_steps.rb +1 -1
  4. data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
  5. data/lib/calabash-android/version.rb +1 -1
  6. data/test-server/AndroidManifest.xml +2 -0
  7. data/test-server/instrumentation-backend/antlr/UIQuery.g +13 -1
  8. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +1 -6
  9. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +10 -11
  10. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +26 -5
  11. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +6 -2
  12. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +17 -14
  13. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +727 -236
  14. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +212 -78
  15. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +45 -0
  16. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +54 -0
  17. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +41 -0
  18. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +42 -0
  19. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +79 -0
  20. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +147 -0
  21. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +5 -0
  22. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +3 -26
  23. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +50 -9
  24. metadata +9 -2
@@ -1,4 +1,4 @@
1
- // $ANTLR 3.4 antlr/UIQuery.g 2013-01-07 13:26:07
1
+ // $ANTLR 3.4 antlr/UIQuery.g 2013-01-24 10:28:02
2
2
 
3
3
  package sh.calaba.instrumentationbackend.query.antlr;
4
4
 
@@ -14,25 +14,28 @@ import org.antlr.runtime.tree.*;
14
14
  @SuppressWarnings({"all", "warnings", "unchecked"})
15
15
  public class UIQueryParser extends Parser {
16
16
  public static final String[] tokenNames = new String[] {
17
- "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ALL", "BOOL", "ESC_SEQ", "FILTER_COLON", "HEX_DIGIT", "INT", "NAME", "NIL", "OCTAL_ESC", "QUALIFIED_NAME", "STRING", "UNICODE_ESC", "VISIBLE", "WHITE", "WILDCARD"
17
+ "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ALL", "BEGINPRED", "BOOL", "ENDPRED", "ESC_SEQ", "FILTER_COLON", "HEX_DIGIT", "INT", "NAME", "NIL", "OCTAL_ESC", "QUALIFIED_NAME", "RELATION", "STRING", "UNICODE_ESC", "VISIBLE", "WHITE", "WILDCARD"
18
18
  };
19
19
 
20
20
  public static final int EOF=-1;
21
21
  public static final int ALL=4;
22
- public static final int BOOL=5;
23
- public static final int ESC_SEQ=6;
24
- public static final int FILTER_COLON=7;
25
- public static final int HEX_DIGIT=8;
26
- public static final int INT=9;
27
- public static final int NAME=10;
28
- public static final int NIL=11;
29
- public static final int OCTAL_ESC=12;
30
- public static final int QUALIFIED_NAME=13;
31
- public static final int STRING=14;
32
- public static final int UNICODE_ESC=15;
33
- public static final int VISIBLE=16;
34
- public static final int WHITE=17;
35
- public static final int WILDCARD=18;
22
+ public static final int BEGINPRED=5;
23
+ public static final int BOOL=6;
24
+ public static final int ENDPRED=7;
25
+ public static final int ESC_SEQ=8;
26
+ public static final int FILTER_COLON=9;
27
+ public static final int HEX_DIGIT=10;
28
+ public static final int INT=11;
29
+ public static final int NAME=12;
30
+ public static final int NIL=13;
31
+ public static final int OCTAL_ESC=14;
32
+ public static final int QUALIFIED_NAME=15;
33
+ public static final int RELATION=16;
34
+ public static final int STRING=17;
35
+ public static final int UNICODE_ESC=18;
36
+ public static final int VISIBLE=19;
37
+ public static final int WHITE=20;
38
+ public static final int WILDCARD=21;
36
39
 
37
40
  // delegates
38
41
  public Parser[] getDelegates() {
@@ -180,7 +183,7 @@ public TreeAdaptor getTreeAdaptor() {
180
183
 
181
184
 
182
185
  // $ANTLR start "expr"
183
- // antlr/UIQuery.g:38:1: expr : ( className | filter | visibility ) ;
186
+ // antlr/UIQuery.g:38:1: expr : ( className | filter | visibility | predicate ) ;
184
187
  public final UIQueryParser.expr_return expr() throws RecognitionException {
185
188
  UIQueryParser.expr_return retval = new UIQueryParser.expr_return();
186
189
  retval.start = input.LT(1);
@@ -194,17 +197,19 @@ public TreeAdaptor getTreeAdaptor() {
194
197
 
195
198
  UIQueryParser.visibility_return visibility6 =null;
196
199
 
200
+ UIQueryParser.predicate_return predicate7 =null;
201
+
197
202
 
198
203
 
199
204
  try {
200
- // antlr/UIQuery.g:38:6: ( ( className | filter | visibility ) )
201
- // antlr/UIQuery.g:38:8: ( className | filter | visibility )
205
+ // antlr/UIQuery.g:38:6: ( ( className | filter | visibility | predicate ) )
206
+ // antlr/UIQuery.g:38:8: ( className | filter | visibility | predicate )
202
207
  {
203
208
  root_0 = (CommonTree)adaptor.nil();
204
209
 
205
210
 
206
- // antlr/UIQuery.g:38:8: ( className | filter | visibility )
207
- int alt2=3;
211
+ // antlr/UIQuery.g:38:8: ( className | filter | visibility | predicate )
212
+ int alt2=4;
208
213
  switch ( input.LA(1) ) {
209
214
  case QUALIFIED_NAME:
210
215
  case WILDCARD:
@@ -237,6 +242,11 @@ public TreeAdaptor getTreeAdaptor() {
237
242
  alt2=3;
238
243
  }
239
244
  break;
245
+ case BEGINPRED:
246
+ {
247
+ alt2=4;
248
+ }
249
+ break;
240
250
  default:
241
251
  NoViableAltException nvae =
242
252
  new NoViableAltException("", 2, 0, input);
@@ -280,6 +290,18 @@ public TreeAdaptor getTreeAdaptor() {
280
290
 
281
291
  adaptor.addChild(root_0, visibility6.getTree());
282
292
 
293
+ }
294
+ break;
295
+ case 4 :
296
+ // antlr/UIQuery.g:38:43: predicate
297
+ {
298
+ pushFollow(FOLLOW_predicate_in_expr89);
299
+ predicate7=predicate();
300
+
301
+ state._fsp--;
302
+
303
+ adaptor.addChild(root_0, predicate7.getTree());
304
+
283
305
  }
284
306
  break;
285
307
 
@@ -325,13 +347,13 @@ public TreeAdaptor getTreeAdaptor() {
325
347
 
326
348
  CommonTree root_0 = null;
327
349
 
328
- Token WILDCARD7=null;
329
- Token NAME8=null;
330
- Token QUALIFIED_NAME9=null;
350
+ Token WILDCARD8=null;
351
+ Token NAME9=null;
352
+ Token QUALIFIED_NAME10=null;
331
353
 
332
- CommonTree WILDCARD7_tree=null;
333
- CommonTree NAME8_tree=null;
334
- CommonTree QUALIFIED_NAME9_tree=null;
354
+ CommonTree WILDCARD8_tree=null;
355
+ CommonTree NAME9_tree=null;
356
+ CommonTree QUALIFIED_NAME10_tree=null;
335
357
 
336
358
  try {
337
359
  // antlr/UIQuery.g:41:13: ( ( WILDCARD ^| NAME ^| QUALIFIED_NAME ^) )
@@ -370,11 +392,11 @@ public TreeAdaptor getTreeAdaptor() {
370
392
  case 1 :
371
393
  // antlr/UIQuery.g:41:18: WILDCARD ^
372
394
  {
373
- WILDCARD7=(Token)match(input,WILDCARD,FOLLOW_WILDCARD_in_className103);
374
- WILDCARD7_tree =
375
- (CommonTree)adaptor.create(WILDCARD7)
395
+ WILDCARD8=(Token)match(input,WILDCARD,FOLLOW_WILDCARD_in_className107);
396
+ WILDCARD8_tree =
397
+ (CommonTree)adaptor.create(WILDCARD8)
376
398
  ;
377
- root_0 = (CommonTree)adaptor.becomeRoot(WILDCARD7_tree, root_0);
399
+ root_0 = (CommonTree)adaptor.becomeRoot(WILDCARD8_tree, root_0);
378
400
 
379
401
 
380
402
  }
@@ -382,11 +404,11 @@ public TreeAdaptor getTreeAdaptor() {
382
404
  case 2 :
383
405
  // antlr/UIQuery.g:41:30: NAME ^
384
406
  {
385
- NAME8=(Token)match(input,NAME,FOLLOW_NAME_in_className108);
386
- NAME8_tree =
387
- (CommonTree)adaptor.create(NAME8)
407
+ NAME9=(Token)match(input,NAME,FOLLOW_NAME_in_className112);
408
+ NAME9_tree =
409
+ (CommonTree)adaptor.create(NAME9)
388
410
  ;
389
- root_0 = (CommonTree)adaptor.becomeRoot(NAME8_tree, root_0);
411
+ root_0 = (CommonTree)adaptor.becomeRoot(NAME9_tree, root_0);
390
412
 
391
413
 
392
414
  }
@@ -394,11 +416,11 @@ public TreeAdaptor getTreeAdaptor() {
394
416
  case 3 :
395
417
  // antlr/UIQuery.g:41:38: QUALIFIED_NAME ^
396
418
  {
397
- QUALIFIED_NAME9=(Token)match(input,QUALIFIED_NAME,FOLLOW_QUALIFIED_NAME_in_className113);
398
- QUALIFIED_NAME9_tree =
399
- (CommonTree)adaptor.create(QUALIFIED_NAME9)
419
+ QUALIFIED_NAME10=(Token)match(input,QUALIFIED_NAME,FOLLOW_QUALIFIED_NAME_in_className117);
420
+ QUALIFIED_NAME10_tree =
421
+ (CommonTree)adaptor.create(QUALIFIED_NAME10)
400
422
  ;
401
- root_0 = (CommonTree)adaptor.becomeRoot(QUALIFIED_NAME9_tree, root_0);
423
+ root_0 = (CommonTree)adaptor.becomeRoot(QUALIFIED_NAME10_tree, root_0);
402
424
 
403
425
 
404
426
  }
@@ -446,11 +468,11 @@ public TreeAdaptor getTreeAdaptor() {
446
468
 
447
469
  CommonTree root_0 = null;
448
470
 
449
- Token ALL10=null;
450
- Token VISIBLE11=null;
471
+ Token ALL11=null;
472
+ Token VISIBLE12=null;
451
473
 
452
- CommonTree ALL10_tree=null;
453
- CommonTree VISIBLE11_tree=null;
474
+ CommonTree ALL11_tree=null;
475
+ CommonTree VISIBLE12_tree=null;
454
476
 
455
477
  try {
456
478
  // antlr/UIQuery.g:47:14: ( ( ALL ^| VISIBLE ^) )
@@ -480,11 +502,11 @@ public TreeAdaptor getTreeAdaptor() {
480
502
  case 1 :
481
503
  // antlr/UIQuery.g:47:19: ALL ^
482
504
  {
483
- ALL10=(Token)match(input,ALL,FOLLOW_ALL_in_visibility151);
484
- ALL10_tree =
485
- (CommonTree)adaptor.create(ALL10)
505
+ ALL11=(Token)match(input,ALL,FOLLOW_ALL_in_visibility155);
506
+ ALL11_tree =
507
+ (CommonTree)adaptor.create(ALL11)
486
508
  ;
487
- root_0 = (CommonTree)adaptor.becomeRoot(ALL10_tree, root_0);
509
+ root_0 = (CommonTree)adaptor.becomeRoot(ALL11_tree, root_0);
488
510
 
489
511
 
490
512
  }
@@ -492,11 +514,11 @@ public TreeAdaptor getTreeAdaptor() {
492
514
  case 2 :
493
515
  // antlr/UIQuery.g:47:26: VISIBLE ^
494
516
  {
495
- VISIBLE11=(Token)match(input,VISIBLE,FOLLOW_VISIBLE_in_visibility156);
496
- VISIBLE11_tree =
497
- (CommonTree)adaptor.create(VISIBLE11)
517
+ VISIBLE12=(Token)match(input,VISIBLE,FOLLOW_VISIBLE_in_visibility160);
518
+ VISIBLE12_tree =
519
+ (CommonTree)adaptor.create(VISIBLE12)
498
520
  ;
499
- root_0 = (CommonTree)adaptor.becomeRoot(VISIBLE11_tree, root_0);
521
+ root_0 = (CommonTree)adaptor.becomeRoot(VISIBLE12_tree, root_0);
500
522
 
501
523
 
502
524
  }
@@ -544,13 +566,13 @@ public TreeAdaptor getTreeAdaptor() {
544
566
 
545
567
  CommonTree root_0 = null;
546
568
 
547
- Token NAME12=null;
548
- Token FILTER_COLON13=null;
549
- Token set14=null;
569
+ Token NAME13=null;
570
+ Token FILTER_COLON14=null;
571
+ Token set15=null;
550
572
 
551
- CommonTree NAME12_tree=null;
552
- CommonTree FILTER_COLON13_tree=null;
553
- CommonTree set14_tree=null;
573
+ CommonTree NAME13_tree=null;
574
+ CommonTree FILTER_COLON14_tree=null;
575
+ CommonTree set15_tree=null;
554
576
 
555
577
  try {
556
578
  // antlr/UIQuery.g:54:8: ( NAME FILTER_COLON ^ ( INT | STRING | BOOL | NIL ) )
@@ -559,26 +581,26 @@ public TreeAdaptor getTreeAdaptor() {
559
581
  root_0 = (CommonTree)adaptor.nil();
560
582
 
561
583
 
562
- NAME12=(Token)match(input,NAME,FOLLOW_NAME_in_filter183);
563
- NAME12_tree =
564
- (CommonTree)adaptor.create(NAME12)
584
+ NAME13=(Token)match(input,NAME,FOLLOW_NAME_in_filter187);
585
+ NAME13_tree =
586
+ (CommonTree)adaptor.create(NAME13)
565
587
  ;
566
- adaptor.addChild(root_0, NAME12_tree);
588
+ adaptor.addChild(root_0, NAME13_tree);
567
589
 
568
590
 
569
- FILTER_COLON13=(Token)match(input,FILTER_COLON,FOLLOW_FILTER_COLON_in_filter185);
570
- FILTER_COLON13_tree =
571
- (CommonTree)adaptor.create(FILTER_COLON13)
591
+ FILTER_COLON14=(Token)match(input,FILTER_COLON,FOLLOW_FILTER_COLON_in_filter189);
592
+ FILTER_COLON14_tree =
593
+ (CommonTree)adaptor.create(FILTER_COLON14)
572
594
  ;
573
- root_0 = (CommonTree)adaptor.becomeRoot(FILTER_COLON13_tree, root_0);
595
+ root_0 = (CommonTree)adaptor.becomeRoot(FILTER_COLON14_tree, root_0);
574
596
 
575
597
 
576
- set14=(Token)input.LT(1);
598
+ set15=(Token)input.LT(1);
577
599
 
578
600
  if ( input.LA(1)==BOOL||input.LA(1)==INT||input.LA(1)==NIL||input.LA(1)==STRING ) {
579
601
  input.consume();
580
602
  adaptor.addChild(root_0,
581
- (CommonTree)adaptor.create(set14)
603
+ (CommonTree)adaptor.create(set15)
582
604
  );
583
605
  state.errorRecovery=false;
584
606
  }
@@ -611,24 +633,136 @@ public TreeAdaptor getTreeAdaptor() {
611
633
  }
612
634
  // $ANTLR end "filter"
613
635
 
636
+
637
+ public static class predicate_return extends ParserRuleReturnScope {
638
+ CommonTree tree;
639
+ public Object getTree() { return tree; }
640
+ };
641
+
642
+
643
+ // $ANTLR start "predicate"
644
+ // antlr/UIQuery.g:59:1: predicate : BEGINPRED ^ NAME WHITE ! RELATION WHITE ! ( INT | STRING | BOOL | NIL ) ENDPRED !;
645
+ public final UIQueryParser.predicate_return predicate() throws RecognitionException {
646
+ UIQueryParser.predicate_return retval = new UIQueryParser.predicate_return();
647
+ retval.start = input.LT(1);
648
+
649
+
650
+ CommonTree root_0 = null;
651
+
652
+ Token BEGINPRED16=null;
653
+ Token NAME17=null;
654
+ Token WHITE18=null;
655
+ Token RELATION19=null;
656
+ Token WHITE20=null;
657
+ Token set21=null;
658
+ Token ENDPRED22=null;
659
+
660
+ CommonTree BEGINPRED16_tree=null;
661
+ CommonTree NAME17_tree=null;
662
+ CommonTree WHITE18_tree=null;
663
+ CommonTree RELATION19_tree=null;
664
+ CommonTree WHITE20_tree=null;
665
+ CommonTree set21_tree=null;
666
+ CommonTree ENDPRED22_tree=null;
667
+
668
+ try {
669
+ // antlr/UIQuery.g:59:11: ( BEGINPRED ^ NAME WHITE ! RELATION WHITE ! ( INT | STRING | BOOL | NIL ) ENDPRED !)
670
+ // antlr/UIQuery.g:59:13: BEGINPRED ^ NAME WHITE ! RELATION WHITE ! ( INT | STRING | BOOL | NIL ) ENDPRED !
671
+ {
672
+ root_0 = (CommonTree)adaptor.nil();
673
+
674
+
675
+ BEGINPRED16=(Token)match(input,BEGINPRED,FOLLOW_BEGINPRED_in_predicate225);
676
+ BEGINPRED16_tree =
677
+ (CommonTree)adaptor.create(BEGINPRED16)
678
+ ;
679
+ root_0 = (CommonTree)adaptor.becomeRoot(BEGINPRED16_tree, root_0);
680
+
681
+
682
+ NAME17=(Token)match(input,NAME,FOLLOW_NAME_in_predicate228);
683
+ NAME17_tree =
684
+ (CommonTree)adaptor.create(NAME17)
685
+ ;
686
+ adaptor.addChild(root_0, NAME17_tree);
687
+
688
+
689
+ WHITE18=(Token)match(input,WHITE,FOLLOW_WHITE_in_predicate230);
690
+
691
+ RELATION19=(Token)match(input,RELATION,FOLLOW_RELATION_in_predicate233);
692
+ RELATION19_tree =
693
+ (CommonTree)adaptor.create(RELATION19)
694
+ ;
695
+ adaptor.addChild(root_0, RELATION19_tree);
696
+
697
+
698
+ WHITE20=(Token)match(input,WHITE,FOLLOW_WHITE_in_predicate235);
699
+
700
+ set21=(Token)input.LT(1);
701
+
702
+ if ( input.LA(1)==BOOL||input.LA(1)==INT||input.LA(1)==NIL||input.LA(1)==STRING ) {
703
+ input.consume();
704
+ adaptor.addChild(root_0,
705
+ (CommonTree)adaptor.create(set21)
706
+ );
707
+ state.errorRecovery=false;
708
+ }
709
+ else {
710
+ MismatchedSetException mse = new MismatchedSetException(null,input);
711
+ throw mse;
712
+ }
713
+
714
+
715
+ ENDPRED22=(Token)match(input,ENDPRED,FOLLOW_ENDPRED_in_predicate254);
716
+
717
+ }
718
+
719
+ retval.stop = input.LT(-1);
720
+
721
+
722
+ retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
723
+ adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
724
+
725
+ }
726
+ catch (RecognitionException re) {
727
+ reportError(re);
728
+ recover(input,re);
729
+ retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
730
+
731
+ }
732
+
733
+ finally {
734
+ // do for sure before leaving
735
+ }
736
+ return retval;
737
+ }
738
+ // $ANTLR end "predicate"
739
+
614
740
  // Delegated rules
615
741
 
616
742
 
617
743
 
618
744
 
619
- public static final BitSet FOLLOW_expr_in_query53 = new BitSet(new long[]{0x0000000000020002L});
620
- public static final BitSet FOLLOW_WHITE_in_query56 = new BitSet(new long[]{0x0000000000052410L});
621
- public static final BitSet FOLLOW_expr_in_query59 = new BitSet(new long[]{0x0000000000020002L});
745
+ public static final BitSet FOLLOW_expr_in_query53 = new BitSet(new long[]{0x0000000000100002L});
746
+ public static final BitSet FOLLOW_WHITE_in_query56 = new BitSet(new long[]{0x0000000000289030L});
747
+ public static final BitSet FOLLOW_expr_in_query59 = new BitSet(new long[]{0x0000000000100002L});
622
748
  public static final BitSet FOLLOW_className_in_expr77 = new BitSet(new long[]{0x0000000000000002L});
623
749
  public static final BitSet FOLLOW_filter_in_expr81 = new BitSet(new long[]{0x0000000000000002L});
624
750
  public static final BitSet FOLLOW_visibility_in_expr85 = new BitSet(new long[]{0x0000000000000002L});
625
- public static final BitSet FOLLOW_WILDCARD_in_className103 = new BitSet(new long[]{0x0000000000000002L});
626
- public static final BitSet FOLLOW_NAME_in_className108 = new BitSet(new long[]{0x0000000000000002L});
627
- public static final BitSet FOLLOW_QUALIFIED_NAME_in_className113 = new BitSet(new long[]{0x0000000000000002L});
628
- public static final BitSet FOLLOW_ALL_in_visibility151 = new BitSet(new long[]{0x0000000000000002L});
629
- public static final BitSet FOLLOW_VISIBLE_in_visibility156 = new BitSet(new long[]{0x0000000000000002L});
630
- public static final BitSet FOLLOW_NAME_in_filter183 = new BitSet(new long[]{0x0000000000000080L});
631
- public static final BitSet FOLLOW_FILTER_COLON_in_filter185 = new BitSet(new long[]{0x0000000000004A20L});
632
- public static final BitSet FOLLOW_set_in_filter188 = new BitSet(new long[]{0x0000000000000002L});
751
+ public static final BitSet FOLLOW_predicate_in_expr89 = new BitSet(new long[]{0x0000000000000002L});
752
+ public static final BitSet FOLLOW_WILDCARD_in_className107 = new BitSet(new long[]{0x0000000000000002L});
753
+ public static final BitSet FOLLOW_NAME_in_className112 = new BitSet(new long[]{0x0000000000000002L});
754
+ public static final BitSet FOLLOW_QUALIFIED_NAME_in_className117 = new BitSet(new long[]{0x0000000000000002L});
755
+ public static final BitSet FOLLOW_ALL_in_visibility155 = new BitSet(new long[]{0x0000000000000002L});
756
+ public static final BitSet FOLLOW_VISIBLE_in_visibility160 = new BitSet(new long[]{0x0000000000000002L});
757
+ public static final BitSet FOLLOW_NAME_in_filter187 = new BitSet(new long[]{0x0000000000000200L});
758
+ public static final BitSet FOLLOW_FILTER_COLON_in_filter189 = new BitSet(new long[]{0x0000000000022840L});
759
+ public static final BitSet FOLLOW_set_in_filter192 = new BitSet(new long[]{0x0000000000000002L});
760
+ public static final BitSet FOLLOW_BEGINPRED_in_predicate225 = new BitSet(new long[]{0x0000000000001000L});
761
+ public static final BitSet FOLLOW_NAME_in_predicate228 = new BitSet(new long[]{0x0000000000100000L});
762
+ public static final BitSet FOLLOW_WHITE_in_predicate230 = new BitSet(new long[]{0x0000000000010000L});
763
+ public static final BitSet FOLLOW_RELATION_in_predicate233 = new BitSet(new long[]{0x0000000000100000L});
764
+ public static final BitSet FOLLOW_WHITE_in_predicate235 = new BitSet(new long[]{0x0000000000022840L});
765
+ public static final BitSet FOLLOW_set_in_predicate238 = new BitSet(new long[]{0x0000000000000080L});
766
+ public static final BitSet FOLLOW_ENDPRED_in_predicate254 = new BitSet(new long[]{0x0000000000000002L});
633
767
 
634
768
  }
@@ -0,0 +1,45 @@
1
+ package sh.calaba.instrumentationbackend.query.ast;
2
+
3
+ import android.annotation.SuppressLint;
4
+
5
+ public class BeginsWithRelation implements UIQueryASTPredicateRelation {
6
+
7
+ private final boolean caseSensitive;
8
+
9
+ public BeginsWithRelation(boolean isCaseSensitive) {
10
+ super();
11
+ this.caseSensitive = isCaseSensitive;
12
+ }
13
+
14
+
15
+ public boolean isCaseSensitive() {
16
+ return caseSensitive;
17
+ }
18
+
19
+ /**
20
+ * Does firstValue BEGIN WITH secondValue?
21
+ */
22
+ @SuppressLint("DefaultLocale")
23
+ @Override
24
+ public boolean areRelated(Object firstValue, Object secondValue) {
25
+ if (firstValue == secondValue) {
26
+ return true;
27
+ }
28
+ if (firstValue == null || secondValue == null) {
29
+ return false;
30
+ }
31
+ if (firstValue instanceof CharSequence && secondValue instanceof CharSequence) {
32
+ String firstStr = firstValue.toString();
33
+ String secondStr = secondValue.toString();
34
+ if (!isCaseSensitive()) {
35
+ firstStr = firstStr.toLowerCase();
36
+ secondStr = secondStr.toLowerCase();
37
+ }
38
+ return firstStr.startsWith(secondStr);
39
+ }
40
+ else {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ }