Inherit default_visibility from parent package

Enhances the visibility mechanism to use the default_visibility
property of the closest ancestor package that has the property
specified.

Bug: 133290645
Test: m droid
Change-Id: I7248e9034a73894ac8d514f913316438c4d7c079
diff --git a/android/visibility.go b/android/visibility.go
index 2e01ff6..94af343 100644
--- a/android/visibility.go
+++ b/android/visibility.go
@@ -413,11 +413,7 @@
 		if ok {
 			rule = value.(compositeRule)
 		} else {
-			packageQualifiedId := depQualified.getContainingPackageId()
-			value, ok = moduleToVisibilityRule.Load(packageQualifiedId)
-			if ok {
-				rule = value.(compositeRule)
-			}
+			rule = packageDefaultVisibility(ctx, depQualified)
 		}
 		if rule != nil && !rule.matches(qualified) {
 			ctx.ModuleErrorf("depends on %s which is not visible to this module", depQualified)
@@ -431,3 +427,20 @@
 	qualified := qualifiedModuleName{dir, moduleName}
 	return qualified
 }
+
+func packageDefaultVisibility(ctx BaseModuleContext, moduleId qualifiedModuleName) compositeRule {
+	moduleToVisibilityRule := moduleToVisibilityRuleMap(ctx)
+	packageQualifiedId := moduleId.getContainingPackageId()
+	for {
+		value, ok := moduleToVisibilityRule.Load(packageQualifiedId)
+		if ok {
+			return value.(compositeRule)
+		}
+
+		if packageQualifiedId.isRootPackage() {
+			return nil
+		}
+
+		packageQualifiedId = packageQualifiedId.getContainingPackageId()
+	}
+}