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