88using BMM . Core . Constants ;
99using BMM . Core . Extensions ;
1010using BMM . Core . GuardedActions . ContinueListening . Interfaces ;
11+ using BMM . Core . Implementations . FirebaseRemoteConfig ;
1112using BMM . Core . Implementations . Localization . Interfaces ;
1213using BMM . Core . Translation ;
1314using 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