Add OtherModuleHasProvider to blueprint.

Bug: 377723687
Test: Unit tests and compare the ninja and mk files generated.
Change-Id: I0d24c5b2fedf47f2e5716c44c51928b83dfe17d9
diff --git a/module_ctx.go b/module_ctx.go
index b04aed9..7fc8e43 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -385,6 +385,8 @@
 	// This method shouldn't be used directly, prefer the type-safe android.OtherModuleProvider instead.
 	OtherModuleProvider(m Module, provider AnyProviderKey) (any, bool)
 
+	OtherModuleHasProvider(m Module, provider AnyProviderKey) bool
+
 	// OtherModuleIsAutoGenerated returns true if a module has been generated from another module,
 	// instead of being defined in Android.bp file
 	OtherModuleIsAutoGenerated(m Module) bool
@@ -675,6 +677,11 @@
 	return m.context.provider(module, provider.provider())
 }
 
+func (m *baseModuleContext) OtherModuleHasProvider(logicModule Module, provider AnyProviderKey) bool {
+	module := m.context.moduleInfo[getWrappedModule(logicModule)]
+	return m.context.hasProvider(module, provider.provider())
+}
+
 func (m *baseModuleContext) Provider(provider AnyProviderKey) (any, bool) {
 	return m.context.provider(m.module, provider.provider())
 }
diff --git a/provider.go b/provider.go
index 8f9120d..05485d6 100644
--- a/provider.go
+++ b/provider.go
@@ -203,6 +203,28 @@
 // Once Go has generics the return value can be typed and the type assert by callers can be dropped:
 // provider(type T)(m *moduleInfo, provider ProviderKey(T)) T
 func (c *Context) provider(m *moduleInfo, provider *providerKey) (any, bool) {
+	validateProvider(c, m, provider)
+	if len(m.providers) > provider.id {
+		if p := m.providers[provider.id]; p != nil {
+			return p, true
+		}
+	}
+
+	return nil, false
+}
+
+func (c *Context) hasProvider(m *moduleInfo, provider *providerKey) bool {
+	validateProvider(c, m, provider)
+	if len(m.providers) > provider.id {
+		if p := m.providers[provider.id]; p != nil {
+			return true
+		}
+	}
+
+	return false
+}
+
+func validateProvider(c *Context, m *moduleInfo, provider *providerKey) {
 	if provider.mutator == "" {
 		if !m.finishedGenerateBuildActions {
 			panic(fmt.Sprintf("Can't get value of provider %s before GenerateBuildActions finished",
@@ -215,14 +237,6 @@
 				provider.typ, provider.mutator))
 		}
 	}
-
-	if len(m.providers) > provider.id {
-		if p := m.providers[provider.id]; p != nil {
-			return p, true
-		}
-	}
-
-	return nil, false
 }
 
 func (c *Context) mutatorFinishedForModule(mutator *mutatorInfo, m *moduleInfo) bool {