mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	feat(ui): Episode Air date & Upcoming countdown
This commit is contained in:
		
							parent
							
								
									e6b9d621f9
								
							
						
					
					
						commit
						ec226cd455
					
				
					 6 changed files with 73 additions and 6 deletions
				
			
		|  | @ -9,9 +9,11 @@ import androidx.core.view.isVisible | |||
| import androidx.preference.PreferenceManager | ||||
| import androidx.recyclerview.widget.DiffUtil | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import com.lagradost.cloudstream3.APIHolder.unixTimeMS | ||||
| import com.lagradost.cloudstream3.R | ||||
| import com.lagradost.cloudstream3.databinding.ResultEpisodeBinding | ||||
| import com.lagradost.cloudstream3.databinding.ResultEpisodeLargeBinding | ||||
| import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.secondsToReadable | ||||
| import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD | ||||
| import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_LONG_CLICK | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadClickEvent | ||||
|  | @ -23,6 +25,8 @@ import com.lagradost.cloudstream3.utils.AppUtils.html | |||
| import com.lagradost.cloudstream3.utils.UIHelper.setImage | ||||
| import com.lagradost.cloudstream3.utils.UIHelper.toPx | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadHelper | ||||
| import java.text.DateFormat | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.* | ||||
| 
 | ||||
| const val ACTION_PLAY_EPISODE_IN_PLAYER = 1 | ||||
|  | @ -104,7 +108,7 @@ class EpisodeAdapter( | |||
| 
 | ||||
|     override fun getItemViewType(position: Int): Int { | ||||
|         val item = getItem(position) | ||||
|         return if (item.poster.isNullOrBlank()) 0 else 1 | ||||
|         return if (item.poster.isNullOrBlank() && item.description.isNullOrBlank()) 0 else 1 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -260,6 +264,34 @@ class EpisodeAdapter( | |||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 if (card.airDate != null) { | ||||
|                     val isUpcoming = unixTimeMS < card.airDate | ||||
| 
 | ||||
|                     if (isUpcoming) { | ||||
|                         episodePoster.isVisible = false | ||||
|                         episodePlayIcon.isVisible = false | ||||
|                         episodeUpcomingIcon.isVisible = true | ||||
|                         episodeDate.setText( | ||||
|                             txt( | ||||
|                                 R.string.episode_upcoming_format, | ||||
|                                 secondsToReadable(card.airDate.minus(unixTimeMS).div(1000).toInt(), "") | ||||
|                             ) | ||||
|                         ) | ||||
|                     } else { | ||||
|                         episodeUpcomingIcon.isVisible = false | ||||
| 
 | ||||
|                         val formattedAirDate = SimpleDateFormat.getDateInstance( | ||||
|                             DateFormat.LONG, | ||||
|                             Locale.getDefault() | ||||
|                         ).apply { | ||||
|                         }.format(Date(card.airDate)) | ||||
| 
 | ||||
|                         episodeDate.setText(txt(formattedAirDate)) | ||||
|                     } | ||||
|                 } else { | ||||
|                     episodeDate.isVisible = false | ||||
|                 } | ||||
| 
 | ||||
|                 if (isLayout(EMULATOR or PHONE)) { | ||||
|                     episodePoster.setOnClickListener { | ||||
|                         clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card)) | ||||
|  | @ -271,6 +303,7 @@ class EpisodeAdapter( | |||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             itemView.setOnClickListener { | ||||
|                 clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card)) | ||||
|             } | ||||
|  |  | |||
|  | @ -50,6 +50,7 @@ data class ResultEpisode( | |||
|     val videoWatchState: VideoWatchState, | ||||
|     /** Sum of all previous season episode counts + episode */ | ||||
|     val totalEpisodeIndex: Int? = null, | ||||
|     val airDate: Long? = null, | ||||
| ) | ||||
| 
 | ||||
| fun ResultEpisode.getRealPosition(): Long { | ||||
|  | @ -85,6 +86,7 @@ fun buildResultEpisode( | |||
|     tvType: TvType, | ||||
|     parentId: Int, | ||||
|     totalEpisodeIndex: Int? = null, | ||||
|     airDate: Long? = null, | ||||
| ): ResultEpisode { | ||||
|     val posDur = getViewPos(id) | ||||
|     val videoWatchState = getVideoWatchState(id) ?: VideoWatchState.None | ||||
|  | @ -107,7 +109,8 @@ fun buildResultEpisode( | |||
|         tvType, | ||||
|         parentId, | ||||
|         videoWatchState, | ||||
|         totalEpisodeIndex | ||||
|         totalEpisodeIndex, | ||||
|         airDate, | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -2277,7 +2277,8 @@ class ResultViewModel2 : ViewModel() { | |||
|                                     fillers.getOrDefault(episode, false), | ||||
|                                     loadResponse.type, | ||||
|                                     mainId, | ||||
|                                     totalIndex | ||||
|                                     totalIndex, | ||||
|                                     airDate = i.date | ||||
|                                 ) | ||||
| 
 | ||||
|                             val season = eps.seasonIndex ?: 0 | ||||
|  | @ -2326,7 +2327,8 @@ class ResultViewModel2 : ViewModel() { | |||
|                                 null, | ||||
|                                 loadResponse.type, | ||||
|                                 mainId, | ||||
|                                 totalIndex | ||||
|                                 totalIndex, | ||||
|                                 airDate = episode.date | ||||
|                             ) | ||||
| 
 | ||||
|                         val season = ep.seasonIndex ?: 0 | ||||
|  |  | |||
							
								
								
									
										9
									
								
								app/src/main/res/drawable/hourglass_24.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/drawable/hourglass_24.xml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:width="24dp" | ||||
|     android:height="24dp" | ||||
|     android:viewportWidth="960" | ||||
|     android:viewportHeight="960"> | ||||
|   <path | ||||
|       android:fillColor="#9BA0A4" | ||||
|       android:pathData="M320,800h320v-120q0,-66 -47,-113t-113,-47q-66,0 -113,47t-47,113v120ZM480,440q66,0 113,-47t47,-113v-120L320,160v120q0,66 47,113t113,47ZM160,880v-80h80v-120q0,-61 28.5,-114.5T348,480q-51,-32 -79.5,-85.5T240,280v-120h-80v-80h640v80h-80v120q0,61 -28.5,114.5T612,480q51,32 79.5,85.5T720,680v120h80v80L160,880ZM480,800ZM480,160Z"/> | ||||
| </vector> | ||||
|  | @ -43,14 +43,26 @@ | |||
|                     android:foreground="?android:attr/selectableItemBackgroundBorderless" | ||||
|                     android:nextFocusRight="@id/download_button" | ||||
|                     android:scaleType="centerCrop" | ||||
|                     tools:src="@drawable/example_poster" /> | ||||
|                     tools:src="@drawable/example_poster" | ||||
|                     tools:visibility="invisible"/> | ||||
| 
 | ||||
|                 <ImageView | ||||
|                     android:id="@+id/episode_play_icon" | ||||
|                     android:layout_width="36dp" | ||||
|                     android:layout_height="36dp" | ||||
|                     android:layout_gravity="center" | ||||
|                     android:contentDescription="@string/play_episode" | ||||
|                     android:src="@drawable/play_button" /> | ||||
|                     android:src="@drawable/play_button" | ||||
|                     tools:visibility="invisible"/> | ||||
| 
 | ||||
|                 <ImageView | ||||
|                     android:id="@+id/episode_upcoming_icon" | ||||
|                     android:layout_width="36dp" | ||||
|                     android:layout_height="36dp" | ||||
|                     android:layout_gravity="center" | ||||
|                     android:src="@drawable/hourglass_24" | ||||
|                     android:visibility="gone" | ||||
|                     tools:visibility="visible" /> | ||||
| 
 | ||||
|                 <androidx.core.widget.ContentLoadingProgressBar | ||||
|                     android:id="@+id/episode_progress" | ||||
|  | @ -100,6 +112,13 @@ | |||
|                     android:layout_height="wrap_content" | ||||
|                     android:textColor="?attr/grayTextColor" | ||||
|                     tools:text="Rated: 8.8" /> | ||||
| 
 | ||||
|                 <TextView | ||||
|                     android:id="@+id/episode_date" | ||||
|                     android:layout_width="wrap_content" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:textColor="?attr/grayTextColor" | ||||
|                     tools:text="15 Apr 2024" /> | ||||
|             </LinearLayout> | ||||
| 
 | ||||
|             <com.lagradost.cloudstream3.ui.download.button.PieFetchButton | ||||
|  |  | |||
|  | @ -292,6 +292,7 @@ | |||
|     <string name="episodes">Episodes</string> | ||||
|     <string name="episodes_range">%1$d-%2$d</string> | ||||
|     <string name="episode_format" formatted="true">%1$d %2$s</string> | ||||
|     <string name="episode_upcoming_format" formatted="true">Upcoming in %s</string> | ||||
|     <string name="season_short">S</string> | ||||
|     <string name="episode_short">E</string> | ||||
|     <string name="no_episodes_found">No Episodes found</string> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue