diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
index fad349c8..2019aa50 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
@@ -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,33 @@ class EpisodeAdapter(
}
}
+ if (card.airDate != null) {
+ val isUpcoming = unixTimeMS < card.airDate
+
+ if (isUpcoming) {
+ episodePlayIcon.isVisible = false
+ episodeUpcomingIcon.isVisible = !episodePoster.isVisible
+ 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 +302,7 @@ class EpisodeAdapter(
}
}
}
+
itemView.setOnClickListener {
clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card))
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
index a1574eec..1d3f5a08 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
@@ -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,
)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
index 37a905a7..499fced2 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
@@ -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
diff --git a/app/src/main/res/drawable/hourglass_24.xml b/app/src/main/res/drawable/hourglass_24.xml
new file mode 100644
index 00000000..7bd1ebbd
--- /dev/null
+++ b/app/src/main/res/drawable/hourglass_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/result_episode_large.xml b/app/src/main/res/layout/result_episode_large.xml
index 76e8c434..e5a6881a 100644
--- a/app/src/main/res/layout/result_episode_large.xml
+++ b/app/src/main/res/layout/result_episode_large.xml
@@ -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"/>
+ android:src="@drawable/play_button"
+ tools:visibility="invisible"/>
+
+
+
+
Episodes
%1$d-%2$d
%1$d %2$s
+ Upcoming in %s
S
E
No Episodes found