diff --git a/10.0/AgeSignals/AgeSignals/AgeSignals.csproj b/10.0/AgeSignals/AgeSignals/AgeSignals.csproj
index 25507e8c1..e3cc13b3c 100644
--- a/10.0/AgeSignals/AgeSignals/AgeSignals.csproj
+++ b/10.0/AgeSignals/AgeSignals/AgeSignals.csproj
@@ -50,7 +50,7 @@
-
+
diff --git a/10.0/AgeSignals/AgeSignals/Services/AgeSignalService.Android.cs b/10.0/AgeSignals/AgeSignals/Services/AgeSignalService.Android.cs
index 8e2bbe2b8..2aad4cb06 100644
--- a/10.0/AgeSignals/AgeSignals/Services/AgeSignalService.Android.cs
+++ b/10.0/AgeSignals/AgeSignals/Services/AgeSignalService.Android.cs
@@ -2,6 +2,7 @@
using AgeSignals.Services;
using Microsoft.Extensions.Logging;
using Google.Android.Play.AgeSignals;
+using Google.Android.Play.AgeSignals.Testing;
using Android.Gms.Tasks;
using Android.Gms.Common.Apis;
using Java.Lang;
@@ -12,6 +13,10 @@ public partial class AgeSignalService : IAgeSignalService
{
private readonly ILogger _logger;
private IAgeSignalsManager? _ageSignalsManager;
+
+ // Set to true to use FakeAgeSignalsManager since Google has paused the live API
+ // Change to false when Google launches the API live (expected May/July 2026)
+ private static readonly bool UseFakeForTesting = true;
public AgeSignalService(ILogger logger)
{
@@ -42,8 +47,17 @@ public async Task RequestAgeVerificationAsync(AgeVerifica
if (_ageSignalsManager == null)
{
- _ageSignalsManager = AgeSignalsManagerFactory.Create(context);
- _logger.LogInformation("Age Signals Manager initialized");
+ if (UseFakeForTesting)
+ {
+ // Use FakeAgeSignalsManager since Google has paused live responses
+ _ageSignalsManager = CreateFakeAgeSignalsManager();
+ _logger.LogWarning("Using FakeAgeSignalsManager - Live API paused by Google (returns error -1)");
+ }
+ else
+ {
+ _ageSignalsManager = AgeSignalsManagerFactory.Create(context);
+ _logger.LogInformation("Age Signals Manager initialized");
+ }
}
var ageSignalsRequest = AgeSignalsRequest.InvokeBuilder().Build();
@@ -208,6 +222,62 @@ private string MapErrorCodeToMessage(Java.Lang.Exception exception)
// Fallback: return the exception message
return $"Age Signals API error: {exception.Message}";
}
+
+ ///
+ /// Creates a FakeAgeSignalsManager for testing while Google has paused live API responses.
+ /// You can modify this method to test different user scenarios.
+ ///
+ private IAgeSignalsManager CreateFakeAgeSignalsManager()
+ {
+ var fakeManager = new FakeAgeSignalsManager();
+
+ // SCENARIO 1: Verified adult user (18+) - Default for testing
+ // Status: 1 = VERIFIED
+ var fakeVerifiedUser = AgeSignalsResult.InvokeBuilder()
+ .SetUserStatus(Java.Lang.Integer.ValueOf(1))
+ .Build();
+ fakeManager.SetNextAgeSignalsResult(fakeVerifiedUser);
+
+ // SCENARIO 2: Supervised user (13-17 years old) - Uncomment to test
+ // Status: 2 = SUPERVISED
+ // var fakeSupervisedUser = AgeSignalsResult.InvokeBuilder()
+ // .SetUserStatus(Java.Lang.Integer.ValueOf(2))
+ // .SetAgeLower(Java.Lang.Integer.ValueOf(13))
+ // .SetAgeUpper(Java.Lang.Integer.ValueOf(17))
+ // .SetInstallId("fake_install_id_12345")
+ // .Build();
+ // fakeManager.SetNextAgeSignalsResult(fakeSupervisedUser);
+
+ // SCENARIO 3: Unknown status (not verified) - Uncomment to test
+ // Status: 0 = UNKNOWN
+ // var fakeUnknownUser = AgeSignalsResult.InvokeBuilder()
+ // .SetUserStatus(Java.Lang.Integer.ValueOf(0))
+ // .Build();
+ // fakeManager.SetNextAgeSignalsResult(fakeUnknownUser);
+
+ // SCENARIO 4: Supervised user with pending parental approval - Uncomment to test
+ // Status: 3 = SUPERVISED_APPROVAL_PENDING
+ // var fakePendingUser = AgeSignalsResult.InvokeBuilder()
+ // .SetUserStatus(Java.Lang.Integer.ValueOf(3))
+ // .SetAgeLower(Java.Lang.Integer.ValueOf(13))
+ // .SetAgeUpper(Java.Lang.Integer.ValueOf(17))
+ // .SetInstallId("fake_install_id_12345")
+ // .Build();
+ // fakeManager.SetNextAgeSignalsResult(fakePendingUser);
+
+ // SCENARIO 5: Supervised user with denied parental approval - Uncomment to test
+ // Status: 4 = SUPERVISED_APPROVAL_DENIED
+ // var fakeDeniedUser = AgeSignalsResult.InvokeBuilder()
+ // .SetUserStatus(Java.Lang.Integer.ValueOf(4))
+ // .SetAgeLower(Java.Lang.Integer.ValueOf(13))
+ // .SetAgeUpper(Java.Lang.Integer.ValueOf(17))
+ // .SetInstallId("fake_install_id_12345")
+ // .Build();
+ // fakeManager.SetNextAgeSignalsResult(fakeDeniedUser);
+
+ _logger.LogInformation("FakeAgeSignalsManager created with VERIFIED adult user scenario");
+ return fakeManager;
+ }
}
// Success listener implementation
diff --git a/eng/excluded_projects_macos.txt b/eng/excluded_projects_macos.txt
index 688dd2cf6..cf7623e08 100644
--- a/eng/excluded_projects_macos.txt
+++ b/eng/excluded_projects_macos.txt
@@ -13,4 +13,7 @@
# The NuGet packaging test project must be built after the package has been created at least once. The effort to adapt the standard build process has limited benefit
./9.0/Packaging/NuGetWithMSBuildFiles/src/PackageConsumerApp/PackageConsumerApp.csproj
-./10.0/Packaging/NuGetWithMSBuildFiles/src/PackageConsumerApp/PackageConsumerApp.csproj
\ No newline at end of file
+./10.0/Packaging/NuGetWithMSBuildFiles/src/PackageConsumerApp/PackageConsumerApp.csproj
+
+# The Age Signals sample requires iOS code signing certificates that aren't available in CI environments
+./10.0/AgeSignals/AgeSignals/AgeSignals.csproj
\ No newline at end of file