Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Achievement deep link handling #674

Merged
merged 1 commit into from
Feb 11, 2025
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
1 change: 1 addition & 0 deletions BMM.Api/Framework/HTTP/ApiUris.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public class ApiUris

public static string Achievements = "statistics/achievements{?theme,lang}";
public static string AchievementsToAcknowledge = "statistics/achievements/to/acknowledge{?theme,lang}";
public static string Achievement = "statistics/achievement/{id}/{?theme,lang}";

public static string YearInReview = "statistics/year-in-review/overview";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,6 @@ public interface IStatisticsClient
Task PostListeningEvents(IList<ListeningEvent> listeningEvents);
Task<AchievementsHolder> GetAchievements(AppTheme theme);
Task<IList<Achievement>> GetAchievementsToAcknowledge(AppTheme theme);
Task<Achievement> GetAchievement(string id, AppTheme theme);
}
}
8 changes: 8 additions & 0 deletions BMM.Api/Implementation/Clients/StatisticsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ public Task<IList<Achievement>> GetAchievementsToAcknowledge(AppTheme theme)
return Get<IList<Achievement>>(uri);
}

public Task<Achievement> GetAchievement(string id, AppTheme theme)
{
var uri = new UriTemplate(ApiUris.Achievement);
uri.SetParameter("id", id);
uri.SetParameter("theme", theme);
return Get<Achievement>(uri);
}

public Task<ProjectProgress> GetProjectProgress(AppTheme theme)
{
var uri = new UriTemplate(ApiUris.ProjectProgress);
Expand Down
7 changes: 7 additions & 0 deletions BMM.Core/Implementations/DeepLinking/DeepLinkHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class DeepLinkHandler : IDeepLinkHandler
{
public const string PlayTrackRegex = "^/track/(?<id>[0-9]+)(/(?<language>.*))?$";
public const string QuizRegex = "^/question/(?<id>[0-9]+)$";
public const string AchievementRegex = "^/achievement/(?<id>[A-Za-z0-9]+)$";
public static readonly string Music = "music";

private readonly string _baseBrowsePath = "browse/";
Expand Down Expand Up @@ -114,6 +115,7 @@ public DeepLinkHandler(
new RegexDeepLink<GenericDocumentsViewParameters>("^/browse(/(?<path>.*))?$", OpenGenericDocumentsView),
new RegexDeepLink("^/romans-questions$", OpenRomansQuestions),
new RegexDeepLink<IdDeepLinkParameters>(QuizRegex, OpenQuizQuestion),
new RegexDeepLink<StringIdParameters>(AchievementRegex, OpenAchievement),
new RegexDeepLink("^/$", DoNothing)
};
}
Expand Down Expand Up @@ -202,6 +204,11 @@ private async Task OpenQuizQuestion(IdDeepLinkParameters deepLinkParameters)
{
await NavigateTo<QuizQuestionViewModel, IQuizQuestionViewModelParameter>(new QuizQuestionViewModelParameter(deepLinkParameters.Id));
}

private async Task OpenAchievement(StringIdParameters parameters)
{
await NavigateTo<AchievementDetailsViewModel, IAchievementDetailsParameter>(new AchievementDetailsParameter(parameters.Id));
}

private Task DoNothing()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using BMM.Core.Implementations.DeepLinking.Base.Interfaces;

namespace BMM.Core.Implementations.DeepLinking.Parameters;

public class StringIdParameters : IDeepLinkParameters
{
public string Id { get; set; }
}
37 changes: 30 additions & 7 deletions BMM.Core/ViewModels/AchievementDetailsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using BMM.Core.Extensions;
using BMM.Core.GuardedActions.BibleStudy.Interfaces;
using BMM.Core.Helpers;
using BMM.Core.Implementations.Device;
using BMM.Core.Messages.MediaPlayer;
using BMM.Core.Models.POs.Base.Interfaces;
using BMM.Core.Models.POs.BibleStudy;
Expand All @@ -22,6 +23,8 @@ public class AchievementDetailsViewModel : DocumentsViewModel, IBaseViewModel<IA
{
private readonly IAcknowledgeAchievementAction _acknowledgeAchievementAction;
private readonly IMediaPlayer _mediaPlayer;
private readonly IStatisticsClient _statisticsClient;
private readonly IDeviceInfo _deviceInfo;
private AchievementPO _achievementPO;
private IMvxAsyncCommand _buttonClickedCommand;
private bool _shouldShowConfetti;
Expand All @@ -33,17 +36,21 @@ public AchievementDetailsViewModel(
IAcknowledgeAchievementAction acknowledgeAchievementAction,
IActivateRewardAction activateRewardAction,
IMediaPlayer mediaPlayer,
ITracksClient tracksClient)
ITracksClient tracksClient,
IStatisticsClient statisticsClient,
IDeviceInfo deviceInfo)
{
_acknowledgeAchievementAction = acknowledgeAchievementAction;
_mediaPlayer = mediaPlayer;
_statisticsClient = statisticsClient;
_deviceInfo = deviceInfo;
activateRewardAction.AttachDataContext(this);
ButtonClickedCommand = activateRewardAction.Command;
_playbackStatusChangedMessageToken = Messenger.Subscribe<PlaybackStatusChangedMessage>(PlaybackStateChanged);

PlayNextClickedCommand = new ExceptionHandlingCommand(async () =>
{
int? trackId = NavigationParameter.AchievementPO.TrackId;
int? trackId = AchievementPO.TrackId;

if (trackId == null)
return;
Expand Down Expand Up @@ -87,18 +94,34 @@ private void PlaybackStateChanged(PlaybackStatusChangedMessage playbackStatusCha

public override async Task<IEnumerable<IDocumentPO>> LoadItems(CachePolicy policy = CachePolicy.UseCacheAndRefreshOutdated)
{
AchievementPO = NavigationParameter.AchievementPO;
ShouldShowPlayNextButton = NavigationParameter.AchievementPO.TrackId.HasValue;
await _acknowledgeAchievementAction.ExecuteGuarded(NavigationParameter.AchievementPO);
await LoadAchievement();
ShouldShowPlayNextButton = AchievementPO.TrackId.HasValue;
await _acknowledgeAchievementAction.ExecuteGuarded(AchievementPO);
ShouldShowConfetti = AchievementPO.IsActive && !AchievementPO.IsAcknowledged;
RefreshTrack();
return Enumerable.Empty<IDocumentPO>();
}

private async Task LoadAchievement()
{
if (NavigationParameter.AchievementPO != null)
{
AchievementPO = NavigationParameter.AchievementPO;
return;
}

var achievement = await _statisticsClient.GetAchievement(NavigationParameter.Id, await _deviceInfo.GetCurrentTheme());
AchievementPO = new AchievementPO(achievement, NavigationService);
}

public AchievementPO AchievementPO
{
get => _achievementPO;
set => SetProperty(ref _achievementPO, value);
set
{
SetProperty(ref _achievementPO, value);
RaisePropertyChanged(nameof(ButtonTitle));
}
}

public IMvxAsyncCommand ButtonClickedCommand
Expand Down Expand Up @@ -131,7 +154,7 @@ protected override void RefreshTrackWithId(int? currentTrackId)

private void RefreshTrack()
{
int? trackId = NavigationParameter.AchievementPO.TrackId;
int? trackId = AchievementPO.TrackId;

if (trackId == null)
return;
Expand Down
12 changes: 10 additions & 2 deletions BMM.Core/ViewModels/Parameters/AchievementDetailsParameter.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
using System.Runtime.CompilerServices;
using BMM.Core.Models.POs.BibleStudy;
using BMM.Core.ViewModels.Parameters.Interface;

namespace BMM.Core.ViewModels.Parameters;

public class AchievementDetailsParameter : IAchievementDetailsParameter
{
public AchievementDetailsParameter(AchievementPO achievementPO)
public AchievementDetailsParameter(
AchievementPO achievementPO)
{
AchievementPO = achievementPO;
}


public AchievementDetailsParameter(string id)
{
Id = id;
}

public string Id { get; }
public AchievementPO AchievementPO { get; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ namespace BMM.Core.ViewModels.Parameters.Interface;

public interface IAchievementDetailsParameter
{
string Id { get; }
AchievementPO AchievementPO { get; }
}
3 changes: 2 additions & 1 deletion BMM.UI.Android/Application/Activities/MainActivity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ namespace BMM.UI.Droid.Application.Activities
"/contributors",
"/featured",
"/browse/.*",
"/year-in-review"
"/year-in-review",
"/achievement/.*"
}
)]
public class MainActivity : BaseFragmentActivity<MainActivityViewModel>
Expand Down