mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	download movie UI
This commit is contained in:
		
							parent
							
								
									77778bdbb6
								
							
						
					
					
						commit
						de149172bc
					
				
					 6 changed files with 190 additions and 29 deletions
				
			
		|  | @ -47,6 +47,11 @@ object APIHolder { | |||
|         return apis[defProvider] | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     fun LoadResponse.getId(): Int { | ||||
|         return url.replace(getApiFromName(apiName).mainUrl, "").hashCode() | ||||
|     } | ||||
| 
 | ||||
|     fun Activity.getApiSettings(): HashSet<String> { | ||||
|         val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) | ||||
| 
 | ||||
|  | @ -150,7 +155,7 @@ enum class TvType { | |||
| } | ||||
| 
 | ||||
| // IN CASE OF FUTURE ANIME MOVIE OR SMTH | ||||
| fun TvType.isMovieType() : Boolean { | ||||
| fun TvType.isMovieType(): Boolean { | ||||
|     return this == TvType.Movie | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -55,7 +55,8 @@ class DubbedAnimeProvider : MainAPI() { | |||
|         val url = | ||||
|             mainUrl + (if (isMovie) "/movies/jsonMovie" else "/xz/v3/jsonEpi") + ".php?slug=$slug&_=$unixTime" | ||||
|         val response = khttp.get(url) | ||||
|         val mapped = response.let { mapper.readValue<QueryEpisodeResultRoot>(it.text) } | ||||
|         println(response.text) | ||||
|         val mapped = mapper.readValue<QueryEpisodeResultRoot>(response.text) | ||||
| 
 | ||||
|         return mapped.result.anime.first() | ||||
|     } | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ import android.widget.TextView | |||
| import androidx.appcompat.app.AlertDialog | ||||
| import androidx.core.widget.ContentLoadingProgressBar | ||||
| import androidx.fragment.app.FragmentActivity | ||||
| import com.google.android.material.button.MaterialButton | ||||
| import com.lagradost.cloudstream3.R | ||||
| import com.lagradost.cloudstream3.UIHelper.popupMenuNoIcons | ||||
| import com.lagradost.cloudstream3.ui.player.PlayerFragment | ||||
|  | @ -95,13 +96,14 @@ object DownloadButtonSetup { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun setUpButton( | ||||
|     fun setUpDownloadButton( | ||||
|         setupCurrentBytes: Long?, | ||||
|         setupTotalBytes: Long?, | ||||
|         progressBar: ContentLoadingProgressBar, | ||||
|         downloadImage: ImageView, | ||||
|         textView: TextView?, | ||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||
|         downloadView: View, | ||||
|         downloadImageChangeCallback: (Pair<Int, String>) -> Unit, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|         var lastState: VideoDownloadManager.DownloadType? = null | ||||
|  | @ -112,12 +114,19 @@ object DownloadButtonSetup { | |||
|         fun changeDownloadImage(state: VideoDownloadManager.DownloadType) { | ||||
|             lastState = state | ||||
|             if (currentBytes <= 0) needImageUpdate = true | ||||
|             val img = if (currentBytes > 0) when (state) { | ||||
|                 VideoDownloadManager.DownloadType.IsPaused -> R.drawable.ic_baseline_play_arrow_24 | ||||
|                 VideoDownloadManager.DownloadType.IsDownloading -> R.drawable.netflix_pause | ||||
|                 else -> R.drawable.ic_baseline_delete_outline_24 | ||||
|             } else R.drawable.netflix_download | ||||
|             downloadImage?.setImageResource(img) | ||||
|             val img = if (currentBytes > 0) { | ||||
|                 when (state) { | ||||
|                     VideoDownloadManager.DownloadType.IsPaused -> Pair( | ||||
|                         R.drawable.ic_baseline_play_arrow_24, | ||||
|                         "Download Paused" | ||||
|                     ) | ||||
|                     VideoDownloadManager.DownloadType.IsDownloading -> Pair(R.drawable.netflix_pause, "Downloading") | ||||
|                     else -> Pair(R.drawable.ic_baseline_delete_outline_24, "Downloaded") | ||||
|                 } | ||||
|             } else { | ||||
|                 Pair(R.drawable.netflix_download, "Download") | ||||
|             } | ||||
|             downloadImageChangeCallback.invoke(img) | ||||
|         } | ||||
| 
 | ||||
|         @SuppressLint("SetTextI18n") | ||||
|  | @ -185,7 +194,7 @@ object DownloadButtonSetup { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         downloadImage.setOnClickListener { | ||||
|         downloadView.setOnClickListener { | ||||
|             if (currentBytes <= 0) { | ||||
|                 clickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_DOWNLOAD, data)) | ||||
|             } else { | ||||
|  | @ -212,4 +221,33 @@ object DownloadButtonSetup { | |||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun setUpMaterialButton( | ||||
|         setupCurrentBytes: Long?, | ||||
|         setupTotalBytes: Long?, | ||||
|         progressBar: ContentLoadingProgressBar, | ||||
|         downloadButton: MaterialButton, | ||||
|         textView: TextView?, | ||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadButton, { | ||||
|             downloadButton?.setIconResource(it.first) | ||||
|             downloadButton?.text = it.second | ||||
|         }, clickCallback) | ||||
|     } | ||||
| 
 | ||||
|     fun setUpButton( | ||||
|         setupCurrentBytes: Long?, | ||||
|         setupTotalBytes: Long?, | ||||
|         progressBar: ContentLoadingProgressBar, | ||||
|         downloadImage: ImageView, | ||||
|         textView: TextView?, | ||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadImage, { | ||||
|             downloadImage?.setImageResource(it.first) | ||||
|         }, clickCallback) | ||||
|     } | ||||
| } | ||||
|  | @ -33,6 +33,7 @@ import com.google.android.gms.cast.framework.CastState | |||
| import com.google.android.material.button.MaterialButton | ||||
| import com.lagradost.cloudstream3.* | ||||
| import com.lagradost.cloudstream3.APIHolder.getApiFromName | ||||
| import com.lagradost.cloudstream3.APIHolder.getId | ||||
| import com.lagradost.cloudstream3.UIHelper.checkWrite | ||||
| import com.lagradost.cloudstream3.UIHelper.colorFromAttribute | ||||
| import com.lagradost.cloudstream3.UIHelper.fixPaddingStatusbar | ||||
|  | @ -49,6 +50,8 @@ import com.lagradost.cloudstream3.mvvm.observe | |||
| import com.lagradost.cloudstream3.ui.WatchType | ||||
| import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.setUpButton | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.setUpMaterialButton | ||||
| import com.lagradost.cloudstream3.ui.player.PlayerData | ||||
| import com.lagradost.cloudstream3.ui.player.PlayerFragment | ||||
| import com.lagradost.cloudstream3.utils.* | ||||
|  | @ -825,9 +828,62 @@ class ResultFragment : Fragment() { | |||
|                                 val card = currentEpisodes?.first() ?: return@setOnClickListener | ||||
|                                 handleAction(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card)) | ||||
|                             } | ||||
|                             result_options.setOnClickListener { | ||||
|                                 val card = currentEpisodes?.first() ?: return@setOnClickListener | ||||
| 
 | ||||
|                             result_play_movie.setOnLongClickListener { | ||||
|                                 val card = currentEpisodes?.first() ?: return@setOnLongClickListener true | ||||
|                                 handleAction(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card)) | ||||
|                                 return@setOnLongClickListener true | ||||
|                             } | ||||
| 
 | ||||
| //                            result_options.setOnClickListener { | ||||
| //                                val card = currentEpisodes?.first() ?: return@setOnClickListener | ||||
| //                                handleAction(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card)) | ||||
| //                            } | ||||
| 
 | ||||
|                             val localId = d.getId() | ||||
|                             val file = | ||||
|                                 VideoDownloadManager.getDownloadFileInfoAndUpdateSettings(requireContext(), localId) | ||||
| 
 | ||||
|                             setUpMaterialButton( | ||||
|                                 file?.fileLength, | ||||
|                                 file?.totalBytes, | ||||
|                                 result_movie_progress_downloaded, | ||||
|                                 result_download_movie, | ||||
|                                 result_movie_text_progress, | ||||
|                                 VideoDownloadHelper.DownloadEpisodeCached( | ||||
|                                     d.name, | ||||
|                                     d.posterUrl, | ||||
|                                     0, | ||||
|                                     null, | ||||
|                                     localId, | ||||
|                                     localId, | ||||
|                                     d.rating, | ||||
|                                     d.plot | ||||
|                                 ) | ||||
|                             ) { downloadClickEvent -> | ||||
|                                 if (downloadClickEvent.action == DOWNLOAD_ACTION_DOWNLOAD) { | ||||
|                                     handleAction( | ||||
|                                         EpisodeClickEvent( | ||||
|                                             ACTION_DOWNLOAD_EPISODE, | ||||
|                                             ResultEpisode( | ||||
|                                                 d.name, | ||||
|                                                 null, | ||||
|                                                 0, | ||||
|                                                 null, | ||||
|                                                 d.dataUrl, | ||||
|                                                 d.apiName, | ||||
|                                                 localId, | ||||
|                                                 0, | ||||
|                                                 0L, | ||||
|                                                 0L, | ||||
|                                                 null, | ||||
|                                                 null | ||||
|                                             ) | ||||
|                                         ) | ||||
|                                     ) | ||||
|                                 } else { | ||||
|                                     handleDownloadClick(activity, currentHeaderName, downloadClickEvent) | ||||
|                                 } | ||||
|                             } | ||||
|                         } else { | ||||
|                             result_movie_parent.visibility = GONE | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import android.content.Context | |||
| import androidx.lifecycle.* | ||||
| import com.lagradost.cloudstream3.* | ||||
| import com.lagradost.cloudstream3.APIHolder.getApiFromName | ||||
| import com.lagradost.cloudstream3.APIHolder.getId | ||||
| import com.lagradost.cloudstream3.mvvm.Resource | ||||
| import com.lagradost.cloudstream3.mvvm.safeApiCall | ||||
| import com.lagradost.cloudstream3.ui.WatchType | ||||
|  | @ -107,7 +108,7 @@ class ResultViewModel : ViewModel() { | |||
|                 val d = data.value | ||||
|                 if (d is LoadResponse) { | ||||
|                     page.postValue(d) | ||||
|                     val mainId = getId(d.url, api) | ||||
|                     val mainId = d.getId() | ||||
|                     id.postValue(mainId) | ||||
|                     loadWatchStatus(context, mainId) | ||||
| 
 | ||||
|  |  | |||
|  | @ -287,6 +287,7 @@ | |||
| 
 | ||||
|                 </com.lagradost.cloudstream3.widget.FlowLayout> | ||||
|                 <LinearLayout | ||||
|                         android:layout_marginTop="5dp" | ||||
|                         android:orientation="vertical" | ||||
|                         android:id="@+id/result_movie_parent" | ||||
|                         android:layout_width="match_parent" | ||||
|  | @ -297,47 +298,106 @@ | |||
|                             app:cornerRadius="4dp" | ||||
|                             android:id="@+id/result_play_movie" | ||||
|                             android:text="@string/play_movie_button" | ||||
|                             android:textStyle="bold" | ||||
| 
 | ||||
|                             app:rippleColor="?attr/textColor" | ||||
|                             android:textColor="?attr/textColor" | ||||
|                             app:iconTint="?attr/textColor" | ||||
|                             app:rippleColor="?attr/grayBackground" | ||||
|                             android:textColor="?attr/grayBackground" | ||||
|                             app:iconTint="?attr/grayBackground" | ||||
|                             android:textAllCaps="false" | ||||
|                             android:clickable="true" | ||||
|                             android:focusable="true" | ||||
| 
 | ||||
|                             app:iconGravity="textStart" | ||||
|                             app:strokeColor="?attr/textColor" | ||||
|                             app:strokeColor="?attr/grayBackground" | ||||
|                             app:backgroundTint="?attr/textColor" | ||||
|                             app:icon="@drawable/ic_baseline_play_arrow_24" | ||||
|                             android:backgroundTint="@color/transparent" | ||||
|                             style="@style/Widget.MaterialComponents.Button.OutlinedButton" | ||||
|                             android:layout_width="match_parent" | ||||
|                             android:layout_height="45dp"> | ||||
|                             android:layout_height="50dp"> | ||||
|                     </com.google.android.material.button.MaterialButton> | ||||
|                     <com.google.android.material.button.MaterialButton | ||||
|                             android:visibility="visible" | ||||
|                             android:layout_gravity="center_vertical" | ||||
|                             app:cornerRadius="4dp" | ||||
|                             android:id="@+id/result_options" | ||||
|                             android:text="@string/options" | ||||
|                             tools:text="Downloading" | ||||
|                             tools:icon="@drawable/netflix_download" | ||||
|                             android:textStyle="bold" | ||||
| 
 | ||||
|                             android:id="@+id/result_download_movie" | ||||
|                             app:rippleColor="?attr/textColor" | ||||
|                             android:textColor="?attr/textColor" | ||||
|                             app:iconTint="?attr/textColor" | ||||
|                             android:textAllCaps="false" | ||||
|                             android:clickable="true" | ||||
|                             android:focusable="true" | ||||
|                             android:backgroundTint="?attr/grayBackground" | ||||
|                             app:iconGravity="textStart" | ||||
|                             app:strokeColor="?attr/textColor" | ||||
|                             app:icon="@drawable/ic_baseline_play_arrow_24" | ||||
|                             android:backgroundTint="@color/transparent" | ||||
|                             style="@style/Widget.MaterialComponents.Button.OutlinedButton" | ||||
|                             android:layout_width="match_parent" | ||||
|                             android:layout_height="45dp"> | ||||
|                             android:layout_height="50dp"> | ||||
|                     </com.google.android.material.button.MaterialButton> | ||||
| 
 | ||||
|                     <androidx.core.widget.ContentLoadingProgressBar | ||||
|                             android:layout_width="match_parent" | ||||
|                             android:layout_height="20dp" | ||||
|                             tools:progress="50" | ||||
|                             android:id="@+id/result_movie_progress_downloaded" | ||||
|                             android:indeterminate="false" | ||||
|                             style="?android:attr/progressBarStyleHorizontal" | ||||
|                             android:max="100" | ||||
|                             android:layout_gravity="end|center_vertical" | ||||
|                             android:progress="0" | ||||
|                             android:visibility="visible" | ||||
|                             tools:visibility="visible"/> | ||||
|                     <!-- | ||||
|                     <androidx.constraintlayout.widget.ConstraintLayout | ||||
|                             android:orientation="horizontal" | ||||
|                             android:layout_width="match_parent" | ||||
|                             android:layout_height="40dp"> | ||||
|                         <androidx.core.widget.ContentLoadingProgressBar | ||||
|                                 app:layout_constraintTop_toTopOf="parent" | ||||
|                                 app:layout_constraintStart_toStartOf="parent" | ||||
|                                 app:layout_constraintEnd_toStartOf="@+id/result_movie_download" | ||||
|                                 android:layout_width="match_parent" | ||||
|                                 android:paddingEnd="40dp" | ||||
|                                 android:layout_height="40dp" | ||||
|                                 tools:progress="50" | ||||
|                                 android:id="@+id/result_movie_progress_downloaded" | ||||
|                                 android:indeterminate="false" | ||||
|                                 style="?android:attr/progressBarStyleHorizontal" | ||||
|                                 android:max="100" | ||||
|                                 android:layout_gravity="end|center_vertical" | ||||
|                                 android:progress="0" | ||||
|                                 android:visibility="visible" | ||||
|                                 tools:visibility="gone" | ||||
|                                 tools:ignore="RtlSymmetry"/> | ||||
|                         <ImageView | ||||
|                                 app:layout_constraintTop_toTopOf="parent" | ||||
|                                 android:visibility="visible" | ||||
|                                 android:layout_height="40dp" | ||||
|                                 android:layout_width="40dp" | ||||
|                                 android:layout_columnWeight="1" | ||||
|                                 android:layout_gravity="end|center_vertical" | ||||
|                                 android:padding="2dp" | ||||
|                                 android:id="@+id/result_movie_download" | ||||
|                                 android:background="?selectableItemBackgroundBorderless" | ||||
|                                 android:src="@drawable/ic_baseline_play_arrow_24" | ||||
|                                 android:contentDescription="@string/download_descript" | ||||
|                                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                                 app:layout_constraintEnd_toEndOf="parent"/> | ||||
|                     </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|                     --> | ||||
|                     <TextView | ||||
|                             android:id="@+id/result_movie_text_progress" | ||||
|                             android:layout_gravity="center_vertical" | ||||
|                             android:gravity="center_vertical" | ||||
|                             tools:text="128MB / 237MB" | ||||
|                             android:textColor="@color/grayTextColor" | ||||
|                             android:layout_width="wrap_content" | ||||
|                             android:layout_height="match_parent"> | ||||
|                     </TextView> | ||||
|                 </LinearLayout> | ||||
| 
 | ||||
|                 <LinearLayout android:orientation="horizontal" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> | ||||
|                 <LinearLayout android:orientation="horizontal" android:gravity="center_vertical" | ||||
|                               android:layout_width="match_parent" android:layout_height="wrap_content"> | ||||
|                     <com.google.android.material.button.MaterialButton | ||||
|                             android:visibility="visible" | ||||
|                             android:layout_gravity="center_vertical" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue