From bcc17171e5fe96a73ed487d9af1bb3edcba01e11 Mon Sep 17 00:00:00 2001 From: LagradOst Date: Thu, 15 Jul 2021 18:45:25 +0200 Subject: [PATCH] sff --- .../com/lagradost/cloudstream3/MainAPI.kt | 5 + .../lagradost/cloudstream3/MainActivity.kt | 11 ++- .../com/lagradost/cloudstream3/UIHelper.kt | 8 +- .../DownloadFragment.kt} | 8 +- .../ui/download/DownloadHeaderAdapter.kt | 91 +++++++++++++++++++ .../DownloadViewModel.kt} | 4 +- .../cloudstream3/ui/result/EpisodeAdapter.kt | 47 +++++----- .../cloudstream3/ui/search/SearchAdaptor.kt | 10 +- .../cloudstream3/ui/search/SearchFragment.kt | 16 ++-- .../cloudstream3/utils/VideoDownloadHelper.kt | 25 +++++ .../ic_baseline_keyboard_arrow_right_24.xml | 5 + .../main/res/drawable/netflix_download.xml | 4 +- .../res/layout/download_header_episode.xml | 65 +++++++++++++ .../res/layout/fragment_notifications.xml | 2 +- app/src/main/res/layout/result_episode.xml | 25 +++-- .../main/res/layout/result_episode_large.xml | 11 +++ .../main/res/navigation/mobile_navigation.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 18 files changed, 277 insertions(+), 63 deletions(-) rename app/src/main/java/com/lagradost/cloudstream3/ui/{notifications/NotificationsFragment.kt => download/DownloadFragment.kt} (76%) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadHeaderAdapter.kt rename app/src/main/java/com/lagradost/cloudstream3/ui/{notifications/NotificationsViewModel.kt => download/DownloadViewModel.kt} (73%) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadHelper.kt create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml create mode 100644 app/src/main/res/layout/download_header_episode.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index 5c38706f..ac13343f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -138,6 +138,11 @@ enum class TvType { ONA, } +// IN CASE OF FUTURE ANIME MOVIE OR SMTH +fun TvType.isMovieType() : Boolean { + return this == TvType.Movie +} + data class SubtitleFile(val lang: String, val url: String) interface SearchResponse { diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 55cb8755..9502aca9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -157,11 +157,12 @@ class MainActivity : AppCompatActivity() { } CastButtonFactory.setUpMediaRouteButton(this, media_route_button) - if (!VideoDownloadManager.isMyServiceRunning(this, VideoDownloadKeepAliveService::class.java)) { - val mYourService = VideoDownloadKeepAliveService() - val mServiceIntent = Intent(this, mYourService::class.java).putExtra(START_VALUE_KEY, RESTART_ALL_DOWNLOADS_AND_QUEUE) - this.startService(mServiceIntent) - } + // THIS IS CURRENTLY REMOVED BECAUSE HIGHER VERS OF ANDROID NEEDS A NOTIFICATION + //if (!VideoDownloadManager.isMyServiceRunning(this, VideoDownloadKeepAliveService::class.java)) { + // val mYourService = VideoDownloadKeepAliveService() + // val mServiceIntent = Intent(this, mYourService::class.java).putExtra(START_VALUE_KEY, RESTART_ALL_DOWNLOADS_AND_QUEUE) + // this.startService(mServiceIntent) + //} /* val castContext = CastContext.getSharedInstance(applicationContext) diff --git a/app/src/main/java/com/lagradost/cloudstream3/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/UIHelper.kt index dfc8b5e6..a40e80bb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/UIHelper.kt @@ -83,16 +83,16 @@ object UIHelper { return result } - fun Activity.fixPaddingStatusbar(v: View) { + fun Context.fixPaddingStatusbar(v: View) { v.setPadding(v.paddingLeft, v.paddingTop + getStatusBarHeight(), v.paddingRight, v.paddingBottom) } - private fun Activity.getGridFormat(): String { + private fun Context.getGridFormat(): String { val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) return settingsManager.getString(getString(R.string.grid_format_key), "grid")!! } - fun Activity.getGridFormatId(): Int { + fun Context.getGridFormatId(): Int { return when (getGridFormat()) { "list" -> R.layout.search_result_compact "compact_list" -> R.layout.search_result_super_compact @@ -100,7 +100,7 @@ object UIHelper { } } - fun Activity.getGridIsCompact(): Boolean { + fun Context.getGridIsCompact(): Boolean { return getGridFormat() != "grid" } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt similarity index 76% rename from app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsFragment.kt rename to app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt index 9399066b..01322d31 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadFragment.kt @@ -1,4 +1,4 @@ -package com.lagradost.cloudstream3.ui.notifications +package com.lagradost.cloudstream3.ui.download import android.os.Bundle import android.view.LayoutInflater @@ -10,9 +10,9 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.lagradost.cloudstream3.R -class NotificationsFragment : Fragment() { +class DownloadFragment : Fragment() { - private lateinit var notificationsViewModel: NotificationsViewModel + private lateinit var notificationsViewModel: DownloadViewModel override fun onCreateView( inflater: LayoutInflater, @@ -20,7 +20,7 @@ class NotificationsFragment : Fragment() { savedInstanceState: Bundle? ): View? { notificationsViewModel = - ViewModelProvider(this).get(NotificationsViewModel::class.java) + ViewModelProvider(this).get(DownloadViewModel::class.java) val root = inflater.inflate(R.layout.fragment_notifications, container, false) val textView: TextView = root.findViewById(R.id.text_notifications) notificationsViewModel.text.observe(viewLifecycleOwner, Observer { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadHeaderAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadHeaderAdapter.kt new file mode 100644 index 00000000..839fcba5 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadHeaderAdapter.kt @@ -0,0 +1,91 @@ +package com.lagradost.cloudstream3.ui.download + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.cardview.widget.CardView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.model.GlideUrl +import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.isMovieType +import com.lagradost.cloudstream3.utils.VideoDownloadHelper +import kotlinx.android.synthetic.main.download_header_episode.view.* + +data class VisualDownloadHeaderCached( + val currentOngoingDownloads: Int, + val totalDownloads: Int, + val totalBytes: Long, + val data: VideoDownloadHelper.DownloadHeaderCached, +) + +data class DownloadHeaderClickEvent(val action: Int, val data: VideoDownloadHelper.DownloadHeaderCached) +data class DownloadClickEvent(val action: Int, val data: VideoDownloadHelper.DownloadEpisodeCached) + +class DownloadHeaderAdapter( + var cardList: List, + private val clickCallback: (DownloadHeaderClickEvent) -> Unit, +) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return DownloadHeaderViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.download_header_episode, parent, false), + clickCallback + ) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is DownloadHeaderViewHolder -> { + holder.bind(cardList[position]) + } + } + } + + override fun getItemCount(): Int { + return cardList.size + } + + class DownloadHeaderViewHolder + constructor( + itemView: View, + private val clickCallback: (DownloadHeaderClickEvent) -> Unit, + ) : RecyclerView.ViewHolder(itemView) { + private val poster: ImageView = itemView.download_header_poster + private val title: TextView = itemView.download_header_title + private val extraInfo: TextView = itemView.download_header_info + private val holder: CardView = itemView.episode_holder + + @SuppressLint("SetTextI18n") + fun bind(card: VisualDownloadHeaderCached) { + val d = card.data + if (d.poster != null) { + + val glideUrl = + GlideUrl(d.poster) + + poster.context.let { + Glide.with(it) + .load(glideUrl) + .into(poster) + } + } + + title.text = d.name + val mbString = "%.1f".format(card.totalBytes / 1000000f) + + extraInfo.text = + if (d.type.isMovieType()) + "${mbString}MB" else + "${card.totalDownloads} Episode${if (card.totalDownloads == 1) "" else "s"} | ${mbString}MB" + + holder.setOnClickListener { + clickCallback.invoke(DownloadHeaderClickEvent(0, d)) + } + } + } +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadViewModel.kt similarity index 73% rename from app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsViewModel.kt rename to app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadViewModel.kt index 0f0531d9..2279378a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadViewModel.kt @@ -1,10 +1,10 @@ -package com.lagradost.cloudstream3.ui.notifications +package com.lagradost.cloudstream3.ui.download import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -class NotificationsViewModel : ViewModel() { +class DownloadViewModel : ViewModel() { private val _text = MutableLiveData().apply { value = "This is notifications Fragment" 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 f7fc43d3..f7ad8126 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 @@ -17,7 +17,6 @@ import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastState import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.UIHelper.isCastApiAvailable -import kotlinx.android.synthetic.main.result_episode.view.* import kotlinx.android.synthetic.main.result_episode.view.episode_holder import kotlinx.android.synthetic.main.result_episode.view.episode_text import kotlinx.android.synthetic.main.result_episode_large.view.* @@ -30,9 +29,7 @@ const val ACTION_PLAY_EPISODE_IN_PLAYER = 1 data class EpisodeClickEvent(val action: Int, val data: ResultEpisode) class EpisodeAdapter( - private var activity: Activity, var cardList: List, - private val resView: RecyclerView, private val clickCallback: (EpisodeClickEvent) -> Unit, ) : RecyclerView.Adapter() { @@ -51,8 +48,6 @@ class EpisodeAdapter( return CardViewHolder( LayoutInflater.from(parent.context).inflate(layout, parent, false), - activity, - resView, clickCallback ) } @@ -72,17 +67,16 @@ class EpisodeAdapter( class CardViewHolder constructor( itemView: View, - val activity: Activity, - resView: RecyclerView, private val clickCallback: (EpisodeClickEvent) -> Unit, ) : RecyclerView.ViewHolder(itemView) { - private val episodeViewPrecentage: View? = itemView.episode_view_procentage - private val episodeViewPercentageOff: View? = itemView.episode_view_procentage_off + //private val episodeViewPrecentage: View? = itemView.episode_view_procentage + // private val episodeViewPercentageOff: View? = itemView.episode_view_procentage_off private val episodeText: TextView = itemView.episode_text private val episodeRating: TextView? = itemView.episode_rating private val episodeDescript: TextView? = itemView.episode_descript private val episodeProgress: ContentLoadingProgressBar? = itemView.episode_progress private val episodePoster: ImageView? = itemView.episode_poster + private val episodeDownload: ImageView? = itemView.episode_download // val episodeExtra: ImageView = itemView.episode_extra // private val episodePlay: ImageView = itemView.episode_play @@ -103,10 +97,10 @@ class EpisodeAdapter( } val watchProgress = card.getWatchProgress() - if (episodeViewPrecentage != null && episodeViewPercentageOff != null) { + /*if (episodeViewPrecentage != null && episodeViewPercentageOff != null) { setWidth(episodeViewPrecentage, watchProgress) setWidth(episodeViewPercentageOff, 1 - watchProgress) - } + }*/ episodeProgress?.progress = (watchProgress * 50).toInt() episodeProgress?.visibility = if (watchProgress > 0.0f) View.VISIBLE else View.GONE @@ -116,11 +110,9 @@ class EpisodeAdapter( if (episodePoster != null) { val glideUrl = GlideUrl(card.poster) - activity.let { - Glide.with(it) - .load(glideUrl) - .into(episodePoster) - } + Glide.with(episodePoster.context) + .load(glideUrl) + .into(episodePoster) } } else { episodePoster?.visibility = View.GONE @@ -140,19 +132,26 @@ class EpisodeAdapter( } episodeHolder.setOnClickListener { - if (activity.isCastApiAvailable()) { - val castContext = CastContext.getSharedInstance(activity) + episodeHolder.context?.let { ctx -> + if (ctx.isCastApiAvailable()) { + val castContext = CastContext.getSharedInstance(ctx) - if (castContext.castState == CastState.CONNECTED) { - clickCallback.invoke(EpisodeClickEvent(ACTION_CHROME_CAST_EPISODE, card)) + if (castContext.castState == CastState.CONNECTED) { + clickCallback.invoke(EpisodeClickEvent(ACTION_CHROME_CAST_EPISODE, card)) + } else { + // clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card)) + clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card)) + } } else { // clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card)) - clickCallback.invoke(EpisodeClickEvent(ACTION_DOWNLOAD_EPISODE, card)) + clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card)) //TODO REDO TO MAIN } - } else { - // clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card)) - clickCallback.invoke(EpisodeClickEvent(ACTION_DOWNLOAD_EPISODE, card)) //TODO REDO TO MAIN } + + } + + episodeDownload?.setOnClickListener { + clickCallback.invoke(EpisodeClickEvent(ACTION_DOWNLOAD_EPISODE, card)) } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt index d383c0cc..b235a43a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchAdaptor.kt @@ -31,7 +31,7 @@ class SearchAdapter( RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val layout = activity.getGridFormatId() + val layout = parent.context.getGridFormatId() return CardViewHolder( LayoutInflater.from(parent.context).inflate(layout, parent, false), activity, @@ -66,7 +66,7 @@ class SearchAdapter( //val cardTextExtra: TextView? = itemView.imageTextExtra //val imageTextProvider: TextView? = itemView.imageTextProvider val bg = itemView.backgroundCard - val compactView = activity.getGridIsCompact() + val compactView = itemView.context.getGridIsCompact() private val coverHeight: Int = if (compactView) 80.toPx else (resView.itemWidth / 0.68).roundToInt() fun bind(card: Any) { @@ -98,11 +98,11 @@ class SearchAdapter( val glideUrl = GlideUrl(card.posterUrl) - activity.let { - Glide.with(it) + + Glide.with(cardView.context) .load(glideUrl) .into(cardView) - } + } bg.setOnClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index e656fc4b..0c03d3b3 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -23,8 +23,6 @@ import com.lagradost.cloudstream3.UIHelper.getGridIsCompact import com.lagradost.cloudstream3.UIHelper.loadResult import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.observe -import com.lagradost.cloudstream3.ui.player.PlayerData -import com.lagradost.cloudstream3.ui.player.PlayerFragment import kotlinx.android.synthetic.main.fragment_search.* class SearchFragment : Fragment() { @@ -77,10 +75,10 @@ class SearchFragment : Fragment() { cardSpace.adapter = adapter search_loading_bar.alpha = 0f - val search_exit_icon = main_search.findViewById(androidx.appcompat.R.id.search_close_btn) - val search_mag_icon = main_search.findViewById(androidx.appcompat.R.id.search_mag_icon) - search_mag_icon.scaleX = 0.65f - search_mag_icon.scaleY = 0.65f + val searchExitIcon = main_search.findViewById(androidx.appcompat.R.id.search_close_btn) + val searchMagIcon = main_search.findViewById(androidx.appcompat.R.id.search_mag_icon) + searchMagIcon.scaleX = 0.65f + searchMagIcon.scaleY = 0.65f search_filter.setOnClickListener { val apiNamesSetting = activity?.getApiSettings() if (apiNamesSetting != null) { @@ -131,16 +129,16 @@ class SearchFragment : Fragment() { (cardSpace.adapter as SearchAdapter).cardList = data (cardSpace.adapter as SearchAdapter).notifyDataSetChanged() } - search_exit_icon.alpha = 1f + searchExitIcon.alpha = 1f search_loading_bar.alpha = 0f } is Resource.Failure -> { Toast.makeText(activity, "Server error", Toast.LENGTH_LONG).show() - search_exit_icon.alpha = 1f + searchExitIcon.alpha = 1f search_loading_bar.alpha = 0f } is Resource.Loading -> { - search_exit_icon.alpha = 0f + searchExitIcon.alpha = 0f search_loading_bar.alpha = 1f } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadHelper.kt new file mode 100644 index 00000000..13b0757b --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadHelper.kt @@ -0,0 +1,25 @@ +package com.lagradost.cloudstream3.utils + +import com.lagradost.cloudstream3.TvType + +object VideoDownloadHelper { + data class DownloadEpisodeCached( + val name: String?, + val poster: String?, + val episode: Int, + val season: Int?, + val id: Int, + val parentId: Int, + val rating: Int?, + val descript: String?, + ) + + data class DownloadHeaderCached( + val apiName: String, + val source: String, + val type : TvType, + val name: String, + val poster: String?, + val id: Int, + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml new file mode 100644 index 00000000..e011dbcd --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/netflix_download.xml b/app/src/main/res/drawable/netflix_download.xml index 9d9531d8..c08a6627 100644 --- a/app/src/main/res/drawable/netflix_download.xml +++ b/app/src/main/res/drawable/netflix_download.xml @@ -1,8 +1,8 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_notifications.xml b/app/src/main/res/layout/fragment_notifications.xml index cb3e2bec..733fce31 100644 --- a/app/src/main/res/layout/fragment_notifications.xml +++ b/app/src/main/res/layout/fragment_notifications.xml @@ -5,7 +5,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.notifications.NotificationsFragment"> + tools:context=".ui.download.DownloadFragment"> - @@ -33,7 +33,18 @@ android:layout_width="0dp" android:layout_height="match_parent"> - + --> + + + android:src="@drawable/netflix_download" + android:contentDescription="@string/download_descript"/> \ No newline at end of file diff --git a/app/src/main/res/layout/result_episode_large.xml b/app/src/main/res/layout/result_episode_large.xml index 65e4bf0e..56434537 100644 --- a/app/src/main/res/layout/result_episode_large.xml +++ b/app/src/main/res/layout/result_episode_large.xml @@ -58,6 +58,7 @@ android:orientation="vertical" android:layout_gravity="center" android:layout_width="match_parent" + android:layout_marginEnd="50dp" android:layout_height="wrap_content"> + Episode Poster Play Episode Allow to download episodes + Download \ No newline at end of file