Allow excluding specific overlay sub-directories

This change allows PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS to
refer to subdirectories of directories in PRODUCT_PACKAGE_OVERLAYS,
e.g.:
PRODUCT_PACKAGE_OVERLAYS := foo/overlay
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS := foo/overlay/packages/apps/HelloWorld

Bug: 118823052
Test: m nothing (soong tests)
Change-Id: Ic9f89c11d023ea1b4f6f2f6683d94c81aa7b8a1b
diff --git a/java/android_resources.go b/java/android_resources.go
index 47535d2..efd3e3d 100644
--- a/java/android_resources.go
+++ b/java/android_resources.go
@@ -44,10 +44,6 @@
 type overlayGlobResult struct {
 	dir   string
 	paths android.DirectorySortedPaths
-
-	// Set to true of the product has selected that values in this overlay should not be moved to
-	// Runtime Resource Overlay (RRO) packages.
-	excludeFromRRO bool
 }
 
 const overlayDataKey = "overlayDataKey"
@@ -69,10 +65,11 @@
 		files := data.paths.PathsInDirectory(filepath.Join(data.dir, dir.String()))
 		if len(files) > 0 {
 			overlayModuleDir := android.PathForSource(ctx, data.dir, dir.String())
+
 			// If enforce RRO is enabled for this module and this overlay is not in the
 			// exclusion list, ignore the overlay.  The list of ignored overlays will be
 			// passed to Make to be turned into an RRO package.
-			if rroEnabled && !data.excludeFromRRO {
+			if rroEnabled && !ctx.Config().EnforceRROExcludedOverlay(overlayModuleDir.String()) {
 				rroDirs = append(rroDirs, overlayModuleDir)
 			} else {
 				res = append(res, globbedResourceDir{
@@ -102,10 +99,6 @@
 		var result overlayGlobResult
 		result.dir = overlay
 
-		// Mark overlays that will not have Runtime Resource Overlays enforced on them
-		// based on the product config
-		result.excludeFromRRO = ctx.Config().EnforceRROExcludedOverlay(overlay)
-
 		files, err := ctx.GlobWithDeps(filepath.Join(overlay, "**/*"), androidResourceIgnoreFilenames)
 		if err != nil {
 			ctx.Errorf("failed to glob resource dir %q: %s", overlay, err.Error())
diff --git a/java/app_test.go b/java/app_test.go
index 7e06dba..21bda3c 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -149,9 +149,13 @@
 		},
 	},
 	{
-		name:                       "enforce RRO on all",
-		enforceRROTargets:          []string{"*"},
-		enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
+		name:              "enforce RRO on all",
+		enforceRROTargets: []string{"*"},
+		enforceRROExcludedOverlays: []string{
+			// Excluding specific apps/res directories also allowed.
+			"device/vendor/blah/static_overlay/foo",
+			"device/vendor/blah/static_overlay/bar/res",
+		},
 		overlayFiles: map[string][]string{
 			"foo": []string{"device/vendor/blah/static_overlay/foo/res/values/strings.xml"},
 			"bar": []string{"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
@@ -208,11 +212,12 @@
 
 			getOverlays := func(moduleName string) ([]string, []string) {
 				module := ctx.ModuleForTests(moduleName, "android_common")
-				overlayCompiledPaths := module.Output("aapt2/overlay.list").Inputs.Strings()
-
+				overlayFile := module.MaybeOutput("aapt2/overlay.list")
 				var overlayFiles []string
-				for _, o := range overlayCompiledPaths {
-					overlayFiles = append(overlayFiles, module.Output(o).Inputs.Strings()...)
+				if overlayFile.Rule != nil {
+					for _, o := range overlayFile.Inputs.Strings() {
+						overlayFiles = append(overlayFiles, module.Output(o).Inputs.Strings()...)
+					}
 				}
 
 				rroDirs := module.Module().(*AndroidApp).rroDirs.Strings()