Skip to content

Commit dcd2a06

Browse files
committed
All episodes item added
1 parent a39c165 commit dcd2a06

3 files changed

Lines changed: 87 additions & 67 deletions

File tree

BMM.Core/Translation/en/Translations.designer.cs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

BMM.Core/Translation/en/main.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@
251251
"AslaksenTheme1": "Believe in the God of miracles",
252252
"AslaksenTheme2": "I have been crucified with Christ",
253253
"AslaksenTheme3": "To fear and love God",
254-
"AslaksenTheme4": "Humility is everything"
254+
"AslaksenTheme4": "Humility is everything",
255+
"AllEpisodes": "All episodes"
255256
},
256257
"CuratedPlaylistViewModel": {
257258
"Title": "Playlist"

BMM.UI.iOS/Application/CarPlay/Creators/HomeLayoutCreator.cs

Lines changed: 84 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using BMM.Core.Constants;
99
using BMM.Core.Extensions;
1010
using BMM.Core.GuardedActions.ContinueListening.Interfaces;
11+
using BMM.Core.Implementations.FirebaseRemoteConfig;
1112
using BMM.Core.Implementations.Localization.Interfaces;
1213
using BMM.Core.Translation;
1314
using BMM.Core.ValueConverters;
@@ -31,6 +32,7 @@ public class HomeLayoutCreator : BaseLayoutCreator, IHomeLayoutCreator
3132
private IPlaylistLayoutCreator PlaylistLayoutCreator => Mvx.IoCProvider!.Resolve<IPlaylistLayoutCreator>();
3233
private IAlbumLayoutCreator AlbumLayoutCreator => Mvx.IoCProvider!.Resolve<IAlbumLayoutCreator>();
3334
private IHandleAutoplayAction HandleAutoplayAction => Mvx.IoCProvider!.Resolve<IHandleAutoplayAction>();
35+
private IFirebaseRemoteConfig FirebaseRemoteConfig => Mvx.IoCProvider!.Resolve<IFirebaseRemoteConfig>();
3436

3537
private CPInterfaceController _cpInterfaceController;
3638
private CPListTemplate _homeTemplate;
@@ -49,6 +51,7 @@ public async Task<CPListTemplate> Create(CPInterfaceController cpInterfaceContro
4951

5052
public override async Task Load()
5153
{
54+
int currentPodcastId = FirebaseRemoteConfig.CurrentPodcastId;
5255
var discoverItems = (await DiscoverClient.GetDocumentsCarPlay(AppTheme.Light, CachePolicy.UseCacheAndRefreshOutdated))
5356
.ToList();
5457

@@ -80,85 +83,99 @@ public override async Task Load()
8083
foreach (var group in grouped)
8184
{
8285
var trackListItems = new List<ICPListTemplateItem>();
83-
trackListItems.AddRange(await GetTrackListItems(CpInterfaceController, group.Documents, covers));
86+
trackListItems.AddRange(await GetListItems(CpInterfaceController, group.Documents, covers, currentPodcastId));
8487
sections.Add(new CPListSection(trackListItems.ToArray(), group.Title, null));
8588
}
8689

8790
_homeTemplate.SafeUpdateSections(sections.ToArray());
8891
}
8992

90-
private async Task<IList<ICPListTemplateItem>> GetTrackListItems(
91-
CPInterfaceController cpInterfaceController,
93+
private async Task<IList<ICPListTemplateItem>> GetListItems(CPInterfaceController cpInterfaceController,
9294
IEnumerable<Document> documents,
93-
IDictionary<string, UIImage> covers)
95+
IDictionary<string, UIImage> covers,
96+
int currentPodcastId)
9497
{
95-
return await Task.WhenAll(documents
96-
.Select(async d =>
97-
{
98-
CPListItem trackListItem = null;
98+
var listOfTemplateItems = new List<ICPListTemplateItem>();
9999

100-
switch (d)
100+
foreach (var document in documents)
101+
{
102+
switch (document)
103+
{
104+
case ContinueListeningTile continueListeningTile:
101105
{
102-
case ContinueListeningTile continueListeningTile:
103-
{
104-
trackListItem = await CreateItemForTile(cpInterfaceController, continueListeningTile, covers);
105-
break;
106-
}
107-
case Playlist playlist:
108-
{
109-
trackListItem = new CPListItem(playlist.Title, null, covers.GetCover(playlist.Cover));
110-
trackListItem.Handler = async (item, block) =>
111-
{
112-
var playlistLayout = await PlaylistLayoutCreator.Create(cpInterfaceController, playlist.Id, playlist.Title);
113-
await cpInterfaceController.PushTemplateAsync(playlistLayout, true);
114-
block();
115-
};
116-
117-
break;
118-
}
119-
case Album album:
120-
{
121-
trackListItem = new CPListItem(album.Title, null, covers.GetCover(album.Cover));
122-
trackListItem.Handler = async (item, block) =>
123-
{
124-
var playlistLayout = await AlbumLayoutCreator.Create(cpInterfaceController, album.Id, album.Title);
125-
await cpInterfaceController.PushTemplateAsync(playlistLayout, true);
126-
block();
127-
};
128-
129-
break;
130-
}
131-
case Podcast podcast:
132-
{
133-
trackListItem = new CPListItem(podcast.Title, null, covers.GetCover(podcast.Cover));
134-
trackListItem.Handler = async (item, block) =>
135-
{
136-
var podcastLayout = await PodcastLayoutCreator.Create(cpInterfaceController, podcast.Id, podcast.Title);
137-
await cpInterfaceController.PushTemplateAsync(podcastLayout, true);
138-
block();
139-
};
140-
141-
break;
142-
}
143-
case Contributor contributor:
144-
{
145-
trackListItem = new CPListItem(contributor.Name, null, covers.GetCover(contributor.Cover));
146-
trackListItem.Handler = async (item, block) =>
147-
{
148-
var contributorLayout = await ContributorLayoutCreator.Create(cpInterfaceController, contributor.Id, contributor.Name);
149-
await cpInterfaceController.PushTemplateAsync(contributorLayout, true);
150-
block();
151-
};
152-
153-
break;
154-
}
106+
listOfTemplateItems.Add(await CreateItemForTile(cpInterfaceController, continueListeningTile, covers));
107+
listOfTemplateItems.AddIf(
108+
() => currentPodcastId == continueListeningTile.ShufflePodcastId,
109+
CreateListItem(
110+
BMMLanguageBinder[Translations.PodcastViewModel_AllEpisodes],
111+
covers.GetCover(continueListeningTile.CoverUrl),
112+
() => PodcastLayoutCreator.Create(cpInterfaceController, continueListeningTile.ShufflePodcastId!.Value, continueListeningTile.Title),
113+
CpInterfaceController));
114+
break;
115+
}
116+
case Playlist playlist:
117+
{
118+
listOfTemplateItems.Add(CreateListItem(
119+
playlist.Title,
120+
covers.GetCover(playlist.Cover),
121+
() => PlaylistLayoutCreator.Create(cpInterfaceController, playlist.Id, playlist.Title),
122+
cpInterfaceController
123+
));
124+
break;
125+
}
126+
case Album album:
127+
{
128+
listOfTemplateItems.Add(CreateListItem(
129+
album.Title,
130+
covers.GetCover(album.Cover),
131+
() => AlbumLayoutCreator.Create(cpInterfaceController, album.Id, album.Title),
132+
cpInterfaceController
133+
));
134+
break;
135+
}
136+
case Podcast podcast:
137+
{
138+
listOfTemplateItems.Add(CreateListItem(
139+
podcast.Title,
140+
covers.GetCover(podcast.Cover),
141+
() => PodcastLayoutCreator.Create(cpInterfaceController, podcast.Id, podcast.Title),
142+
cpInterfaceController
143+
));
144+
break;
145+
}
146+
case Contributor contributor:
147+
{
148+
listOfTemplateItems.Add(CreateListItem(
149+
contributor.Name,
150+
covers.GetCover(contributor.Cover),
151+
() => ContributorLayoutCreator.Create(cpInterfaceController, contributor.Id, contributor.Name),
152+
cpInterfaceController
153+
));
154+
break;
155155
}
156+
}
157+
}
156158

157-
trackListItem!.AccessoryType = CPListItemAccessoryType.DisclosureIndicator;
158-
return trackListItem;
159-
}));
159+
return listOfTemplateItems;
160160
}
161-
161+
162+
private CPListItem CreateListItem(
163+
string title,
164+
UIImage? image,
165+
Func<Task<CPListTemplate>> createLayoutFunc,
166+
CPInterfaceController cpInterfaceController)
167+
{
168+
var listItem = new CPListItem(title, null, image);
169+
listItem.Handler = async (item, block) =>
170+
{
171+
var layout = await createLayoutFunc();
172+
await cpInterfaceController.PushTemplateAsync(layout, true);
173+
block();
174+
};
175+
listItem!.AccessoryType = CPListItemAccessoryType.DisclosureIndicator;
176+
return listItem;
177+
}
178+
162179
private async Task<CPListItem> CreateItemForTile(CPInterfaceController cpInterfaceController,
163180
ContinueListeningTile continueListeningTile,
164181
IDictionary<string, UIImage> covers)
@@ -191,6 +208,7 @@ await CarPlayPlayerPresenter.PlayAndShowPlayer(
191208
await HandleAutoplayAction.ExecuteGuarded(continueListeningTile);
192209
block();
193210
};
211+
item!.AccessoryType = CPListItemAccessoryType.DisclosureIndicator;
194212
return item;
195213
}
196214
}

0 commit comments

Comments
 (0)