void FOnlineAchievementsNull::QueryAchievements( const FUniqueNetId& PlayerId, const FOnQueryAchievementsCompleteDelegate& Delegate )
{
    if (!ReadAchievementsFromConfig())
    {
        // we don't have achievements
        Delegate.ExecuteIfBound(PlayerId, false);
        return;
    }

    FUniqueNetIdString NullId(PlayerId);
    if (!PlayerAchievements.Find(NullId))
    {
        // copy for a new player
        TArray<FOnlineAchievement> AchievementsForPlayer;
        const int32 AchNum = Achievements.Num();

        for (int32 AchIdx = 0; AchIdx < AchNum; ++AchIdx)
        {
            AchievementsForPlayer.Add( Achievements[ AchIdx ] );
        }

        PlayerAchievements.Add(NullId, AchievementsForPlayer);
    }

    Delegate.ExecuteIfBound(PlayerId, true);
}
void FOnlineAchievementsGameCircle::QueryAchievements(const FUniqueNetId& PlayerId, const FOnQueryAchievementsCompleteDelegate& Delegate)
{
	if(AndroidSubsystem->GetCallbackManager() == nullptr || AndroidSubsystem->GetIdentityGameCircle()->GetLoginStatus(0) != ELoginStatus::LoggedIn)
	{
		Delegate.ExecuteIfBound(PlayerId, false);
		return;
	}

	AmazonGames::AchievementsClientInterface::getAchievements(new FOnlineGetAchievementsCallback(AndroidSubsystem, FUniqueNetIdString(PlayerId), Delegate));
}
void FOnlineAchievementsNull::QueryAchievementDescriptions( const FUniqueNetId& PlayerId, const FOnQueryAchievementsCompleteDelegate& Delegate )
{
    if (!ReadAchievementsFromConfig())
    {
        // we don't have achievements
        Delegate.ExecuteIfBound(PlayerId, false);
        return;
    }

    if (AchievementDescriptions.Num() == 0)
    {
        const int32 AchNum = Achievements.Num();
        for (int32 AchIdx = 0; AchIdx < AchNum; ++AchIdx)
        {
            AchievementDescriptions.Add(Achievements[AchIdx].Id, Achievements[AchIdx]);
        }

        check(AchievementDescriptions.Num() > 0);
    }

    Delegate.ExecuteIfBound(PlayerId, true);
}
void FOnlineAchievementsSteam::QueryAchievementDescriptions( const FUniqueNetId& PlayerId, const FOnQueryAchievementsCompleteDelegate& Delegate )
{
	if (!bHaveConfiguredAchievements)
	{
		// we don't have achievements
		UE_LOG_ONLINE(Warning, TEXT("Steam achievements have not been configured in .ini"));

		Delegate.ExecuteIfBound( PlayerId, false );
		return;
	}

	// schedule a read (this will trigger the OnAchievementDescriptionsRead delegates)
	StatsInt->QueryAchievementsInternal( FUniqueNetIdSteam(PlayerId), Delegate );
}