Change syntax for jacoco filter wildcard params.

originally:
.* -> /**/*.class
now:
.* -> /*.class
.** -> /**/*.class

Also add NinjaAndShellEscape to allow filtering inner classes with $ in
the name.

Test: unittests.
Bug: b/71889972
Merged-In: Ifb8d7daa22bee02346885171edb15180af18f0de
Change-Id: Ifb8d7daa22bee02346885171edb15180af18f0de
(cherry picked from commit c61066684d5c8ddf600af602852c32fce6e6c6f4)
diff --git a/java/jacoco.go b/java/jacoco.go
index 8f1ceb2..541a84a 100644
--- a/java/jacoco.go
+++ b/java/jacoco.go
@@ -22,6 +22,7 @@
 	"strings"
 
 	"github.com/google/blueprint"
+	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
 )
@@ -105,13 +106,22 @@
 			return nil, err
 		}
 	}
-	return specs, nil
+	return proptools.NinjaAndShellEscape(specs), nil
 }
 
 func jacocoFilterToSpec(filter string) (string, error) {
-	wildcard := strings.HasSuffix(filter, "*")
-	filter = strings.TrimSuffix(filter, "*")
-	recursiveWildcard := wildcard && (strings.HasSuffix(filter, ".") || filter == "")
+	recursiveWildcard := strings.HasSuffix(filter, "**")
+	nonRecursiveWildcard := false
+	if !recursiveWildcard {
+		nonRecursiveWildcard = strings.HasSuffix(filter, "*")
+		filter = strings.TrimSuffix(filter, "*")
+	} else {
+		filter = strings.TrimSuffix(filter, "**")
+	}
+
+	if recursiveWildcard && !(strings.HasSuffix(filter, ".") || filter == "") {
+		return "", fmt.Errorf("only '**' or '.**' is supported as recursive wildcard in a filter")
+	}
 
 	if strings.ContainsRune(filter, '*') {
 		return "", fmt.Errorf("'*' is only supported as the last character in a filter")
@@ -121,7 +131,7 @@
 
 	if recursiveWildcard {
 		spec += "**/*.class"
-	} else if wildcard {
+	} else if nonRecursiveWildcard {
 		spec += "*.class"
 	} else {
 		spec += ".class"