Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 10.0/AgeSignals/AgeSignals/AgeSignals.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
</ItemGroup>

<ItemGroup Condition="$(TargetFramework)=='net10.0-android'">
<PackageReference Include="Xamarin.Google.Android.Play.Age.Signals" Version="0.0.1-beta02" />
<PackageReference Include="Xamarin.Google.Android.Play.Age.Signals" Version="0.0.2" />
</ItemGroup>

<!-- iOS Binding Project Reference -->
Expand Down
74 changes: 72 additions & 2 deletions 10.0/AgeSignals/AgeSignals/Services/AgeSignalService.Android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -12,6 +13,10 @@ public partial class AgeSignalService : IAgeSignalService
{
private readonly ILogger<AgeSignalService> _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<AgeSignalService> logger)
{
Expand Down Expand Up @@ -42,8 +47,17 @@ public async Task<AgeVerificationResult> 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();
Expand Down Expand Up @@ -208,6 +222,62 @@ private string MapErrorCodeToMessage(Java.Lang.Exception exception)
// Fallback: return the exception message
return $"Age Signals API error: {exception.Message}";
}

/// <summary>
/// Creates a FakeAgeSignalsManager for testing while Google has paused live API responses.
/// You can modify this method to test different user scenarios.
/// </summary>
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
Expand Down
5 changes: 4 additions & 1 deletion eng/excluded_projects_macos.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
./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
Loading