From 98bc65a5bf5b60a641773f3dc6c774ba7db7f8a1 Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Wed, 7 Jul 2021 09:29:08 -0400 Subject: [PATCH 1/8] - moved glide to the project gradle for easier dependency - changed animeworldtv theme to use a blue instead of orange - made the details fragment much better --- UIViews/build.gradle | 6 +- animeworld/build.gradle | 6 +- animeworldtv/build.gradle | 6 +- .../animeworldtv/CardPresenter.kt | 27 +++++++++ .../DetailsDescriptionPresenter.kt | 13 +++-- .../animeworldtv/VideoDetailsFragment.kt | 57 ++++++++++++++----- .../src/main/res/layout/episode_item.xml | 21 +++++++ animeworldtv/src/main/res/values/colors.xml | 5 +- build.gradle | 4 ++ mangaworld/build.gradle | 6 +- 10 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 animeworldtv/src/main/res/layout/episode_item.xml diff --git a/UIViews/build.gradle b/UIViews/build.gradle index 20c805d34..c202eae08 100644 --- a/UIViews/build.gradle +++ b/UIViews/build.gradle @@ -96,9 +96,9 @@ dependencies { implementation 'com.facebook.shimmer:shimmer:0.5.0' - implementation 'com.github.bumptech.glide:glide:4.12.0' - kapt 'com.github.bumptech.glide:compiler:4.12.0' - implementation("com.github.bumptech.glide:recyclerview-integration:4.12.0") { + implementation glide + kapt glideCompiler + implementation("com.github.bumptech.glide:recyclerview-integration:$glideVersion") { // Excludes the support library because it's already included by Glide. transitive = false } diff --git a/animeworld/build.gradle b/animeworld/build.gradle index 0399646fc..83324c7f5 100644 --- a/animeworld/build.gradle +++ b/animeworld/build.gradle @@ -102,9 +102,9 @@ dependencies { implementation "androidx.mediarouter:mediarouter:1.2.3" implementation "com.github.KaustubhPatange:Android-Cast-Local-Sample:0.01" - implementation 'com.github.bumptech.glide:glide:4.12.0' - kapt 'com.github.bumptech.glide:compiler:4.12.0' - implementation("com.github.bumptech.glide:recyclerview-integration:4.12.0") { + implementation glide + kapt glideCompiler + implementation("com.github.bumptech.glide:recyclerview-integration:$glideVersion") { // Excludes the support library because it's already included by Glide. transitive = false } diff --git a/animeworldtv/build.gradle b/animeworldtv/build.gradle index c8e74cab0..8ce415657 100644 --- a/animeworldtv/build.gradle +++ b/animeworldtv/build.gradle @@ -38,7 +38,7 @@ dependencies { implementation appCompat implementation 'androidx.leanback:leanback:1.1.0-rc01' implementation 'androidx.leanback:leanback-preference:1.1.0-rc01' - implementation 'com.github.bumptech.glide:glide:4.12.0' + implementation glide implementation rxkotlin implementation rxandroid @@ -46,7 +46,9 @@ dependencies { implementation rxbindingKotlin implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation material - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation constraintlayout + + implementation 'androidx.palette:palette-ktx:1.0.0' def exoplayer_version = "2.14.0" diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt index 21208d1f4..4678d24e0 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt @@ -3,11 +3,13 @@ package com.programmersbox.animeworldtv import android.graphics.drawable.Drawable import android.util.Log import android.view.ViewGroup +import android.widget.TextView import androidx.core.content.ContextCompat import androidx.leanback.widget.ImageCardView import androidx.leanback.widget.Presenter import com.bumptech.glide.Glide import com.programmersbox.helpfulutils.layoutInflater +import com.programmersbox.models.ChapterModel import com.programmersbox.models.ItemModel import kotlin.properties.Delegates @@ -78,4 +80,29 @@ class CardPresenter : Presenter() { private val CARD_WIDTH = 313 private val CARD_HEIGHT = 176 } +} + +class EpisodePresenter : Presenter() { + + override fun onCreateViewHolder(parent: ViewGroup): Presenter.ViewHolder { + + return Presenter.ViewHolder( + parent.context.layoutInflater.inflate(R.layout.episode_item, parent, false).also { + + it.isFocusable = true + it.isFocusableInTouchMode = true + + } + ) + } + + override fun onBindViewHolder(viewHolder: Presenter.ViewHolder, item: Any) { + val movie = item as ChapterModel + val cardView = viewHolder.view.findViewById(R.id.episode_name) + cardView.text = movie.name + } + + override fun onUnbindViewHolder(viewHolder: ViewHolder?) { + + } } \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/DetailsDescriptionPresenter.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/DetailsDescriptionPresenter.kt index e83cc13cd..57c55d1d1 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/DetailsDescriptionPresenter.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/DetailsDescriptionPresenter.kt @@ -1,18 +1,19 @@ package com.programmersbox.animeworldtv import androidx.leanback.widget.AbstractDetailsDescriptionPresenter -import com.programmersbox.models.ItemModel +import com.programmersbox.models.InfoModel -class DetailsDescriptionPresenter : AbstractDetailsDescriptionPresenter() { +class DetailsDescriptionPresenter(private val model: InfoModel?) : AbstractDetailsDescriptionPresenter() { override fun onBindDescription( viewHolder: AbstractDetailsDescriptionPresenter.ViewHolder, item: Any ) { - val movie = item as ItemModel + val movie = model//item as ItemModel + + viewHolder.title.text = movie?.title + viewHolder.subtitle.text = movie?.genres?.joinToString("\t")//movie?.source?.serviceName + viewHolder.body.text = movie?.description - viewHolder.title.text = movie.title - viewHolder.subtitle.text = movie.source.serviceName - viewHolder.body.text = movie.description } } \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt index a79c78bf7..e4a09ea05 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt @@ -14,6 +14,7 @@ import androidx.leanback.widget.* import com.bumptech.glide.Glide import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition +import com.programmersbox.models.ChapterModel import com.programmersbox.models.InfoModel import com.programmersbox.models.ItemModel import io.reactivex.android.schedulers.AndroidSchedulers @@ -55,7 +56,7 @@ class VideoDetailsFragment : DetailsSupportFragment() { mAdapter = ArrayObjectAdapter(mPresenterSelector) setupDetailsOverviewRow(it) setupDetailsOverviewRowPresenter(it) - //setupRelatedMovieListRow(it) + setupRelatedMovieListRow(it) adapter = mAdapter initializeBackground(it) onItemViewClickedListener = ItemViewClickedListener() @@ -118,7 +119,7 @@ class VideoDetailsFragment : DetailsSupportFragment() { val actionAdapter = ArrayObjectAdapter() - movie?.chapters?.reversed()?.forEach { + /*movie?.chapters?.reversed()?.forEach { actionAdapter.add( Action( it.hashCode().toLong(), @@ -126,9 +127,17 @@ class VideoDetailsFragment : DetailsSupportFragment() { it.uploaded ) ) - } + }*/ actionAdapter.add( + Action( + 4L, + "Source", + movie?.source?.serviceName.orEmpty(), + ) + ) + + /*actionAdapter.add( Action( ACTION_WATCH_TRAILER, resources.getString(R.string.watch_trailer_1), @@ -148,7 +157,7 @@ class VideoDetailsFragment : DetailsSupportFragment() { resources.getString(R.string.buy_1), resources.getString(R.string.buy_2) ) - ) + )*/ row.actionsAdapter = actionAdapter mAdapter.add(row) @@ -156,9 +165,8 @@ class VideoDetailsFragment : DetailsSupportFragment() { private fun setupDetailsOverviewRowPresenter(movie: InfoModel?) { // Set detail background. - val detailsPresenter = FullWidthDetailsOverviewRowPresenter(DetailsDescriptionPresenter()) - detailsPresenter.backgroundColor = - ContextCompat.getColor(requireContext(), R.color.selected_background) + val detailsPresenter = FullWidthDetailsOverviewRowPresenter(DetailsDescriptionPresenter(movie)) + detailsPresenter.backgroundColor = ContextCompat.getColor(requireContext(), R.color.detail_background) // Hook up transition element. val sharedElementHelper = FullWidthDetailsOverviewSharedElementHelper() @@ -198,7 +206,6 @@ class VideoDetailsFragment : DetailsSupportFragment() { } ?.addTo(disposable)*/ - } else { Toast.makeText(requireContext(), action.toString(), Toast.LENGTH_SHORT).show() } @@ -212,15 +219,27 @@ class VideoDetailsFragment : DetailsSupportFragment() { /*val subcategories = arrayOf(getString(R.string.related_movies)) val list = MovieList.list - Collections.shuffle(list) - val listRowAdapter = ArrayObjectAdapter(CardPresenter()) - for (j in 0 until NUM_COLS) { - listRowAdapter.add(list[j % 5]) + Collections.shuffle(list)*/ + + val chapters = model.chapters.reversed()//.map { it.copy(it.name.removePrefix(model.title)) } + + chapters.chunked(5).forEachIndexed { index, list -> + val listRowAdapter = ArrayObjectAdapter(EpisodePresenter()) + listRowAdapter.addAll(0, list) + val header = HeaderItem(index.toLong(), "Episodes ${(index * 5) + 1} - ${index * 5 + list.size}") + mAdapter.add(ListRow(header, listRowAdapter)) } + /*for (j in 0 until 5) { + listRowAdapter.add(chapters[j % 5]) + }*/ + - val header = HeaderItem(0, subcategories[0]) - mAdapter.add(ListRow(header, listRowAdapter)) - mPresenterSelector.addClassPresenter(ListRow::class.java, ListRowPresenter())*/ + /*val listRowAdapter = ArrayObjectAdapter(EpisodePresenter()) + listRowAdapter.addAll(0, model.chapters.reversed()) + + val header = HeaderItem(0, "Episodes") + mAdapter.add(ListRow(header, listRowAdapter))*/ + mPresenterSelector.addClassPresenter(ListRow::class.java, ListRowPresenter()) } private fun convertDpToPixel(context: Context, dp: Int): Int { @@ -251,6 +270,14 @@ class VideoDetailsFragment : DetailsSupportFragment() { } else { Toast.makeText(requireContext(), item.toString(), Toast.LENGTH_SHORT).show() }*/ + + if (item is ChapterModel) { + val intent = Intent(requireContext(), PlaybackActivity::class.java) + intent.putExtra(DetailsActivity.MOVIE, item) + startActivity(intent) + } else { + Toast.makeText(requireContext(), item.toString(), Toast.LENGTH_SHORT).show() + } } } diff --git a/animeworldtv/src/main/res/layout/episode_item.xml b/animeworldtv/src/main/res/layout/episode_item.xml new file mode 100644 index 000000000..eae0923b2 --- /dev/null +++ b/animeworldtv/src/main/res/layout/episode_item.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/animeworldtv/src/main/res/values/colors.xml b/animeworldtv/src/main/res/values/colors.xml index 733f3f53e..5788fa775 100644 --- a/animeworldtv/src/main/res/values/colors.xml +++ b/animeworldtv/src/main/res/values/colors.xml @@ -2,7 +2,8 @@ #000000 #DDDDDD #0096a6 - #ffaa3f - #ffaa3f + #29b6f6 + #29b6f6 #3d3d3d + #424242 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 26ca6d38a..234eac3a5 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,10 @@ buildscript { ext.gson = 'com.google.code.gson:gson:2.8.7' + ext.glideVersion = "4.12.0" + ext.glide = "com.github.bumptech.glide:glide:$glideVersion" + ext.glideCompiler = "com.github.bumptech.glide:compiler:$glideVersion" + ext.rxkotlin = "io.reactivex.rxjava2:rxkotlin:2.4.0" ext.rxandroid = "io.reactivex.rxjava2:rxandroid:2.1.1" ext.rxbinding = 'com.jakewharton.rxbinding2:rxbinding:2.2.0' diff --git a/mangaworld/build.gradle b/mangaworld/build.gradle index f323e11f7..66a24d475 100644 --- a/mangaworld/build.gradle +++ b/mangaworld/build.gradle @@ -67,9 +67,9 @@ dependencies { implementation project(':favoritesdatabase') implementation project(':manga_sources') - implementation 'com.github.bumptech.glide:glide:4.12.0' - kapt 'com.github.bumptech.glide:compiler:4.12.0' - implementation("com.github.bumptech.glide:recyclerview-integration:4.12.0") { + implementation glide + kapt glideCompiler + implementation("com.github.bumptech.glide:recyclerview-integration:$glideVersion") { // Excludes the support library because it's already included by Glide. transitive = false } From 6e703f9a56b21199553679a551287dbc4ac43adb Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Wed, 7 Jul 2021 10:46:17 -0400 Subject: [PATCH 2/8] - added favorites - added Firebase! WHICH MEANS LOGGING IN! Settings need to be working now --- .gitignore | 1 + animeworldtv/build.gradle | 16 + animeworldtv/src/main/AndroidManifest.xml | 5 +- .../animeworldtv/AnimeWorldTV.kt | 7 + .../animeworldtv/FavoriteFragment.kt | 273 ++++++++++++++++++ .../animeworldtv/FavoritesActivity.kt | 16 + .../animeworldtv/MainFragment.kt | 8 + .../programmersbox/animeworldtv/TvUtils.kt | 246 ++++++++++++++++ .../animeworldtv/VideoDetailsFragment.kt | 123 ++++++-- .../main/res/layout/activity_favorites.xml | 9 + animeworldtv/src/main/res/values/strings.xml | 4 + 11 files changed, 687 insertions(+), 21 deletions(-) create mode 100644 animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt create mode 100644 animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoritesActivity.kt create mode 100644 animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt create mode 100644 animeworldtv/src/main/res/layout/activity_favorites.xml diff --git a/.gitignore b/.gitignore index 64d004d02..fd545ac52 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ local.properties /animeworld/google-services.json /mangaworld/google-services.json /novelworld/google-services.json +/animeworldtv/google-services.json diff --git a/animeworldtv/build.gradle b/animeworldtv/build.gradle index 8ce415657..97225f39d 100644 --- a/animeworldtv/build.gradle +++ b/animeworldtv/build.gradle @@ -1,6 +1,8 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'com.google.gms.google-services' + id 'com.google.firebase.crashlytics' } android { @@ -48,6 +50,17 @@ dependencies { implementation material implementation constraintlayout + implementation 'com.google.firebase:firebase-crashlytics:18.1.0' + implementation 'com.google.firebase:firebase-analytics:19.0.0' + + implementation 'com.google.firebase:firebase-auth:21.0.1' + implementation 'com.google.android.gms:play-services-auth:19.0.0' + implementation 'com.firebaseui:firebase-ui-auth:7.1.1' + implementation 'com.google.firebase:firebase-firestore-ktx:23.0.1' + implementation 'com.google.firebase:firebase-database-ktx:20.0.0' + + //implementation project(':UIViews') + implementation 'androidx.palette:palette-ktx:1.0.0' def exoplayer_version = "2.14.0" @@ -60,6 +73,9 @@ dependencies { implementation project(':Models') implementation project(':anime_sources') + implementation project(':favoritesdatabase') + + implementation room.room //Custom Libraries implementation jakepurple13Tools.helpfultools diff --git a/animeworldtv/src/main/AndroidManifest.xml b/animeworldtv/src/main/AndroidManifest.xml index 087e83790..9c6f5d50d 100644 --- a/animeworldtv/src/main/AndroidManifest.xml +++ b/animeworldtv/src/main/AndroidManifest.xml @@ -12,12 +12,15 @@ android:required="true" /> + diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/AnimeWorldTV.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/AnimeWorldTV.kt index 1d66e330c..ee716599f 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/AnimeWorldTV.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/AnimeWorldTV.kt @@ -9,6 +9,13 @@ class AnimeWorldTV : Application() { override fun onCreate() { super.onCreate() + + FirebaseDb.DOCUMENT_ID = "favoriteShows" + FirebaseDb.CHAPTERS_ID = "episodesWatched" + FirebaseDb.COLLECTION_ID = "animeworld" + FirebaseDb.ITEM_ID = "showUrl" + FirebaseDb.READ_OR_WATCHED_ID = "numEpisodes" + startKoin { androidLogger() androidContext(this@AnimeWorldTV) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt new file mode 100644 index 000000000..fdd8573a7 --- /dev/null +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt @@ -0,0 +1,273 @@ +package com.programmersbox.animeworldtv + +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.os.Bundle +import android.os.Handler +import android.util.DisplayMetrics +import android.util.Log +import android.view.Gravity +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.app.ActivityOptionsCompat +import androidx.core.content.ContextCompat +import androidx.leanback.app.BackgroundManager +import androidx.leanback.app.BrowseSupportFragment +import androidx.leanback.widget.* +import com.bumptech.glide.Glide +import com.bumptech.glide.request.target.SimpleTarget +import com.bumptech.glide.request.transition.Transition +import com.programmersbox.anime_sources.Sources +import com.programmersbox.favoritesdatabase.DbModel +import com.programmersbox.favoritesdatabase.ItemDatabase +import com.programmersbox.favoritesdatabase.toItemModel +import com.programmersbox.models.ItemModel +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.Flowables +import io.reactivex.rxkotlin.addTo +import io.reactivex.rxkotlin.subscribeBy +import io.reactivex.schedulers.Schedulers +import java.util.* + +class FavoriteFragment : BrowseSupportFragment() { + + private val mHandler = Handler() + private lateinit var mBackgroundManager: BackgroundManager + private var mDefaultBackground: Drawable? = null + private lateinit var mMetrics: DisplayMetrics + private var mBackgroundTimer: Timer? = null + private var mBackgroundUri: String? = null + + override fun onActivityCreated(savedInstanceState: Bundle?) { + Log.i(TAG, "onCreate") + super.onActivityCreated(savedInstanceState) + + prepareBackgroundManager() + + setupUIElements() + + loadRows() + + setupEventListeners() + } + + override fun onDestroy() { + super.onDestroy() + Log.d(TAG, "onDestroy: " + mBackgroundTimer?.toString()) + mBackgroundTimer?.cancel() + disposable.dispose() + itemListener.unregister() + } + + private fun prepareBackgroundManager() { + + mBackgroundManager = BackgroundManager.getInstance(activity) + mBackgroundManager.attach(requireActivity().window) + mDefaultBackground = ContextCompat.getDrawable(requireContext(), R.drawable.default_background) + mMetrics = DisplayMetrics() + requireActivity().windowManager.defaultDisplay.getMetrics(mMetrics) + } + + private fun setupUIElements() { + title = getString(R.string.browse_title) + // over title + headersState = BrowseSupportFragment.HEADERS_ENABLED + isHeadersTransitionOnBackEnabled = true + + // set fastLane (or headers) background color + brandColor = ContextCompat.getColor(requireContext(), R.color.fastlane_background) + // set search icon color + searchAffordanceColor = ContextCompat.getColor(requireContext(), R.color.search_opaque) + } + + private val disposable = CompositeDisposable() + private val itemDao by lazy { ItemDatabase.getInstance(requireContext()).itemDao() } + private val itemListener = FirebaseDb.FirebaseListener() + + private fun loadRows() { + /*val list = Sources.ANIMEKISA_SUBBED.getRecent().blockingGet() + .map { + MovieList.buildMovieInfo( + title = it.title, + description = it.description, + studio = it.source.serviceName, + videoUrl = it.url, + cardImageUrl = it.imageUrl, + backgroundImageUrl = it.imageUrl + ) + }*/ + + //MovieList.list + + val rowsAdapter = ArrayObjectAdapter(ListRowPresenter()) + val cardPresenter = CardPresenter() + + /*for (i in 0 until NUM_ROWS) { + if (i != 0) { + Collections.shuffle(list) + } + val listRowAdapter = ArrayObjectAdapter(cardPresenter) + for (j in 0 until NUM_COLS) { + listRowAdapter.add(list[j % 5]) + } + val header = HeaderItem(i.toLong(), MovieList.MOVIE_CATEGORY[i]) + rowsAdapter.add(ListRow(header, listRowAdapter)) + }*/ + + Flowables.combineLatest( + itemListener.getAllShowsFlowable(), + itemDao.getAllFavorites() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + ) { fire, db -> (db + fire).groupBy(DbModel::url).map { it.value.maxByOrNull(DbModel::numChapters)!! } } + //Yts.getRecent() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map { + it.mapNotNull { + try { + it.toItemModel(Sources.valueOf(it.source)) + } catch (e: IllegalArgumentException) { + null + } + } + } + .map { it.groupBy { it.source } } + .subscribeBy { + rowsAdapter.clear() + it.entries.forEach { + val (t, u) = it + val listRowAdapter = ArrayObjectAdapter(cardPresenter) + + listRowAdapter.addAll(0, u) + + val header = HeaderItem(t?.hashCode()?.toLong() ?: 0L, t.toString()) + rowsAdapter.add(ListRow(header, listRowAdapter)) + } + + /*for (i in 0 until NUM_ROWS) { + if (i != 0) { + Collections.shuffle(it) + } + val listRowAdapter = ArrayObjectAdapter(cardPresenter) + for (j in 0 until NUM_COLS) { + listRowAdapter.add(it[j % 5]) + } + val header = HeaderItem(i.toLong(), MovieList.MOVIE_CATEGORY[i]) + rowsAdapter.add(ListRow(header, listRowAdapter)) + }*/ + } + .addTo(disposable) + + adapter = rowsAdapter + } + + private fun setupEventListeners() { + setOnSearchClickedListener { + val intent = Intent(requireContext(), SearchActivity::class.java) + startActivity(intent) + } + + onItemViewClickedListener = ItemViewClickedListener() + onItemViewSelectedListener = ItemViewSelectedListener() + } + + private inner class ItemViewClickedListener : OnItemViewClickedListener { + override fun onItemClicked( + itemViewHolder: Presenter.ViewHolder, + item: Any, + rowViewHolder: RowPresenter.ViewHolder, + row: Row + ) { + + if (item is ItemModel) { + Log.d(TAG, "Item: $item") + val intent = Intent(context!!, DetailsActivity::class.java) + intent.putExtra(DetailsActivity.MOVIE, item) + + val bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( + activity!!, + (itemViewHolder.view as CustomImageCardView).mainImageView, + DetailsActivity.SHARED_ELEMENT_NAME + ) + .toBundle() + startActivity(intent, bundle) + } + } + } + + private inner class ItemViewSelectedListener : OnItemViewSelectedListener { + override fun onItemSelected( + itemViewHolder: Presenter.ViewHolder?, item: Any?, + rowViewHolder: RowPresenter.ViewHolder, row: Row + ) { + /*if (item is Movie) { + mBackgroundUri = item.backgroundImageUrl + startBackgroundTimer() + }*/ + } + } + + private fun updateBackground(uri: String?) { + val width = mMetrics.widthPixels + val height = mMetrics.heightPixels + Glide.with(requireContext()) + .load(uri) + .centerCrop() + .error(mDefaultBackground) + .into>( + object : SimpleTarget(width, height) { + override fun onResourceReady( + drawable: Drawable, + transition: Transition? + ) { + mBackgroundManager.drawable = drawable + } + }) + mBackgroundTimer?.cancel() + } + + private fun startBackgroundTimer() { + mBackgroundTimer?.cancel() + mBackgroundTimer = Timer() + mBackgroundTimer?.schedule(UpdateBackgroundTask(), BACKGROUND_UPDATE_DELAY.toLong()) + } + + private inner class UpdateBackgroundTask : TimerTask() { + + override fun run() { + mHandler.post { updateBackground(mBackgroundUri) } + } + } + + private inner class GridItemPresenter : Presenter() { + override fun onCreateViewHolder(parent: ViewGroup): Presenter.ViewHolder { + val view = TextView(parent.context) + view.layoutParams = ViewGroup.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT) + view.isFocusable = true + view.isFocusableInTouchMode = true + view.setBackgroundColor(ContextCompat.getColor(context!!, R.color.default_background)) + view.setTextColor(Color.WHITE) + view.gravity = Gravity.CENTER + return Presenter.ViewHolder(view) + } + + override fun onBindViewHolder(viewHolder: Presenter.ViewHolder, item: Any) { + (viewHolder.view as TextView).text = item as String + } + + override fun onUnbindViewHolder(viewHolder: Presenter.ViewHolder) {} + } + + companion object { + private val TAG = "FavoritesFragment" + + private val BACKGROUND_UPDATE_DELAY = 300 + private val GRID_ITEM_WIDTH = 200 + private val GRID_ITEM_HEIGHT = 200 + private val NUM_ROWS = 6 + private val NUM_COLS = 15 + } +} \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoritesActivity.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoritesActivity.kt new file mode 100644 index 000000000..9eb003e44 --- /dev/null +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoritesActivity.kt @@ -0,0 +1,16 @@ +package com.programmersbox.animeworldtv + +import android.os.Bundle +import androidx.fragment.app.FragmentActivity + +class FavoritesActivity : FragmentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_favorites) + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.favorites_browse_fragment, FavoriteFragment()) + .commitNow() + } + } +} \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt index 5eba6e33c..9f5b786f5 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt @@ -161,6 +161,7 @@ class MainFragment : BrowseSupportFragment() { val mGridPresenter = GridItemPresenter() val gridRowAdapter = ArrayObjectAdapter(mGridPresenter) + gridRowAdapter.add(resources.getString(R.string.favorites)) gridRowAdapter.add(resources.getString(R.string.grid_view)) gridRowAdapter.add(getString(R.string.error_fragment)) gridRowAdapter.add(resources.getString(R.string.personal_settings)) @@ -209,6 +210,13 @@ class MainFragment : BrowseSupportFragment() { val intent = Intent(context!!, SettingsActivity::class.java) startActivity(intent) } + item.contains(getString(R.string.grid_view)) -> { + FirebaseAuthentication.signIn(requireActivity()) + } + item.contains(getString(R.string.favorites)) -> { + val intent = Intent(context!!, FavoritesActivity::class.java) + startActivity(intent) + } else -> { Toast.makeText(context!!, item, Toast.LENGTH_SHORT).show() } diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt new file mode 100644 index 000000000..af00426d1 --- /dev/null +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt @@ -0,0 +1,246 @@ +package com.programmersbox.animeworldtv + +import android.annotation.SuppressLint +import android.app.Activity +import com.firebase.ui.auth.AuthUI +import com.google.android.gms.tasks.Task +import com.google.android.gms.tasks.Tasks +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.FirebaseUser +import com.google.firebase.firestore.FieldValue +import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.firestore.FirebaseFirestoreSettings +import com.google.firebase.firestore.ListenerRegistration +import com.google.firebase.firestore.ktx.toObjects +import com.programmersbox.favoritesdatabase.ChapterWatched +import com.programmersbox.favoritesdatabase.DbModel +import com.programmersbox.rxutils.toLatestFlowable +import io.reactivex.Completable +import io.reactivex.subjects.PublishSubject +import org.koin.core.component.KoinComponent + +object FirebaseAuthentication : KoinComponent { + + private const val RC_SIGN_IN = 32 + + val auth: FirebaseAuth = FirebaseAuth.getInstance() + + //private val logo: MainLogo by inject() + + fun signIn(activity: Activity) { + //val signInIntent = googleSignInClient!!.signInIntent + //activity.startActivityForResult(signInIntent, RC_SIGN_IN) + // Choose authentication providers + val providers = arrayListOf( + AuthUI.IdpConfig.GoogleBuilder().build() + ) + + // Create and launch sign-in intent + activity.startActivityForResult( + AuthUI.getInstance() + .createSignInIntentBuilder() + //.setTheme(R.style.Theme_OtakuWorld) + //.setLogo(R.mipmap.big_logo) + //.setLogo(logo.logoId) + .setAvailableProviders(providers) + .build(), + RC_SIGN_IN + ) + } + + fun signOut() { + auth.signOut() + //currentUser = null + } + + val currentUser: FirebaseUser? get() = FirebaseAuth.getInstance().currentUser + +} + +object FirebaseDb { + + var DOCUMENT_ID = "" + var CHAPTERS_ID = "" + var COLLECTION_ID = "" + var ITEM_ID = "" + var READ_OR_WATCHED_ID = "" + + @SuppressLint("StaticFieldLeak") + private val db = FirebaseFirestore.getInstance().apply { + firestoreSettings = FirebaseFirestoreSettings.Builder() + .setPersistenceEnabled(true) + /*.setHost("10.0.2.2:8080") + .setSslEnabled(false) + .setPersistenceEnabled(false)*/ + //.setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) + //.setCacheSizeBytes() + .build() + } + + private fun Task.await(): TResult = Tasks.await(this) + + private val showDoc2 get() = FirebaseAuthentication.currentUser?.let { db.collection(COLLECTION_ID).document(DOCUMENT_ID).collection(it.uid) } + private val episodeDoc2 get() = FirebaseAuthentication.currentUser?.let { db.collection(COLLECTION_ID).document(CHAPTERS_ID).collection(it.uid) } + + private data class FirebaseAllShows(val first: String = DOCUMENT_ID, val second: List = emptyList()) + + private data class FirebaseDbModel( + val title: String? = null, + val description: String? = null, + val showUrl: String? = null, + val mangaUrl: String? = null, + val imageUrl: String? = null, + val source: String? = null, + var numEpisodes: Int? = null, + var chapterCount: Int? = null + ) + + private data class FirebaseChapterWatched( + val url: String? = null, + val name: String? = null, + val showUrl: String? = null, + ) + + private fun FirebaseDbModel.toDbModel() = DbModel( + title.orEmpty(), + description.orEmpty(), + (showUrl ?: mangaUrl).orEmpty(), + imageUrl.orEmpty(), + source.orEmpty(), + numEpisodes ?: chapterCount ?: 0, + ) + + private fun DbModel.toFirebaseDbModel() = FirebaseDbModel( + title, + description, + url, + url, + imageUrl, + source, + numChapters, + numChapters + ) + + private fun FirebaseChapterWatched.toChapterWatchedModel() = ChapterWatched( + url.orEmpty().pathToUrl(), + name.orEmpty(), + showUrl.orEmpty().pathToUrl(), + ) + + private fun ChapterWatched.toFirebaseChapterWatched() = FirebaseChapterWatched( + url, + name, + this.favoriteUrl, + ) + + private fun String.urlToPath() = replace("/", "<") + private fun String.pathToUrl() = replace("<", "/") + + fun getAllShows() = showDoc2 + ?.get() + ?.await() + ?.toObjects() + ?.map { it.toDbModel() } + .orEmpty() + + fun insertShow(showDbModel: DbModel) = Completable.create { emitter -> + showDoc2?.document(showDbModel.url.urlToPath()) + ?.set(showDbModel.toFirebaseDbModel()) + ?.addOnSuccessListener { emitter.onComplete() } + ?.addOnFailureListener { emitter.onError(it) } ?: emitter.onComplete() + } + + fun removeShow(showDbModel: DbModel) = Completable.create { emitter -> + showDoc2?.document(showDbModel.url.urlToPath()) + ?.delete() + ?.addOnSuccessListener { emitter.onComplete() } + ?.addOnFailureListener { emitter.onError(it) } ?: emitter.onComplete() + } + + fun updateShow(showDbModel: DbModel) = Completable.create { emitter -> + showDoc2?.document(showDbModel.url.urlToPath()) + ?.update(READ_OR_WATCHED_ID, showDbModel.numChapters) + ?.addOnSuccessListener { emitter.onComplete() } + ?.addOnFailureListener { emitter.onError(it) } ?: emitter.onComplete() + } + + fun insertEpisodeWatched(episodeWatched: ChapterWatched) = Completable.create { emitter -> + episodeDoc2?.document(episodeWatched.favoriteUrl.urlToPath()) + ?.set("create" to 1) + ?.addOnSuccessListener { + episodeDoc2?.document(episodeWatched.favoriteUrl.urlToPath()) + //?.set("watched" to listOf(episodeWatched.toFirebaseEpisodeWatched()), SetOptions.merge()) + ?.update("watched", FieldValue.arrayUnion(episodeWatched.toFirebaseChapterWatched())) + //?.collection(episodeWatched.url.urlToPath()) + //?.document("watched") + //?.set(episodeWatched.toFirebaseEpisodeWatched()) + ?.addOnSuccessListener { emitter.onComplete() } + ?.addOnFailureListener { emitter.onError(it) } ?: emitter.onComplete() + } ?: emitter.onComplete() + } + + fun removeEpisodeWatched(episodeWatched: ChapterWatched) = Completable.create { emitter -> + episodeDoc2?.document(episodeWatched.favoriteUrl.urlToPath()) + ?.update("watched", FieldValue.arrayRemove(episodeWatched.toFirebaseChapterWatched())) + //?.collection(episodeWatched.url.urlToPath()) + //?.document("watched") + //?.delete() + ?.addOnSuccessListener { emitter.onComplete() } + ?.addOnFailureListener { emitter.onError(it) } ?: emitter.onComplete() + emitter.onComplete() + } + + class FirebaseListener { + + private var listener: ListenerRegistration? = null + + fun getAllShowsFlowable() = PublishSubject.create> { emitter -> + //assert(listener == null) + listener?.remove() + listener = showDoc2?.addSnapshotListener { value, error -> + value?.toObjects() + ?.map { it.toDbModel() } + ?.let(emitter::onNext) + error?.let(emitter::onError) + } + if (listener == null) emitter.onNext(emptyList()) + }.toLatestFlowable() + + fun findItemByUrl(url: String?) = PublishSubject.create { emitter -> + //assert(listener == null) + listener?.remove() + listener = showDoc2?.whereEqualTo(ITEM_ID, url)?.addSnapshotListener { value, error -> + value?.toObjects() + .also { println(it) } + ?.map { it.toDbModel() } + ?.let { emitter.onNext(it.isNotEmpty()) } + error?.let(emitter::onError) + } + if (listener == null) emitter.onNext(false) + }.toLatestFlowable() + + fun getAllEpisodesByShow(showUrl: String) = PublishSubject.create> { emitter -> + //assert(listener == null) + listener?.remove() + listener = episodeDoc2 + ?.document(showUrl.urlToPath()) + ?.addSnapshotListener { value, error -> + value?.toObject(Watched::class.java)?.watched + ?.map { it.toChapterWatchedModel() } + ?.let(emitter::onNext) + error?.let(emitter::onError) + } + if (listener == null) emitter.onNext(emptyList()) + }.toLatestFlowable() + + //fun getAllEpisodesByShow(showDbModel: DbModel) = getAllEpisodesByShow(showDbModel.showUrl) + + fun unregister() { + listener?.remove() + listener = null + } + + } + + private class Watched(val watched: List = emptyList()) +} \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt index e4a09ea05..fc838ba7a 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/VideoDetailsFragment.kt @@ -14,11 +14,15 @@ import androidx.leanback.widget.* import com.bumptech.glide.Glide import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition +import com.programmersbox.favoritesdatabase.ItemDatabase +import com.programmersbox.favoritesdatabase.toDbModel import com.programmersbox.models.ChapterModel import com.programmersbox.models.InfoModel import com.programmersbox.models.ItemModel +import io.reactivex.Completable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.Flowables import io.reactivex.rxkotlin.addTo import io.reactivex.rxkotlin.subscribeBy import io.reactivex.schedulers.Schedulers @@ -96,6 +100,9 @@ class VideoDetailsFragment : DetailsSupportFragment() { }) } + private val itemDao by lazy { ItemDatabase.getInstance(requireContext()).itemDao() } + private val itemListener = FirebaseDb.FirebaseListener() + private fun setupDetailsOverviewRow(movie: InfoModel?) { Log.d(TAG, "doInBackground: " + mSelectedMovie?.toString()) val row = DetailsOverviewRow(mSelectedMovie) @@ -137,6 +144,35 @@ class VideoDetailsFragment : DetailsSupportFragment() { ) ) + + Flowables.combineLatest( + itemListener.findItemByUrl(movie!!.url), + itemDao.containsItem(movie!!.url) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map { it.second || it.first } + .subscribe { + actionAdapter.replace( + 1, + Action( + 5L, + resources.getString(if (it) R.string.removeFromFavorites else R.string.addToFavorites) + )//.also { it.icon = R.drawable.exo_ic_check } + ) + isFavorite = it + } + .addTo(disposable) + + actionAdapter.add( + Action( + 5L, + resources.getString(R.string.addToFavorites) + ) + ) + + //actionAdapter.replace() + /*actionAdapter.add( Action( ACTION_WATCH_TRAILER, @@ -163,6 +199,8 @@ class VideoDetailsFragment : DetailsSupportFragment() { mAdapter.add(row) } + private var isFavorite = false + private fun setupDetailsOverviewRowPresenter(movie: InfoModel?) { // Set detail background. val detailsPresenter = FullWidthDetailsOverviewRowPresenter(DetailsDescriptionPresenter(movie)) @@ -178,36 +216,75 @@ class VideoDetailsFragment : DetailsSupportFragment() { detailsPresenter.onActionClickedListener = OnActionClickedListener { action -> - movie?.chapters?.find { it.hashCode().toLong() == action.id } + /*movie?.chapters?.find { it.hashCode().toLong() == action.id } ?.let { val intent = Intent(requireContext(), PlaybackActivity::class.java) intent.putExtra(DetailsActivity.MOVIE, it) startActivity(intent) - } - - if (action.id == ACTION_WATCH_TRAILER) { + }*/ + + when (action.id) { + 5L -> { + + fun addItem(model: InfoModel) { + val db = model.toDbModel(model.chapters.size) + Completable.concatArray( + FirebaseDb.insertShow(db), + itemDao.insertFavorite(db).subscribeOn(Schedulers.io()) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe() + .addTo(disposable) + } - /* - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.flatMap { - println(it) - it.chapters.firstOrNull()?.getChapterInfo() - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) + fun removeItem(model: InfoModel) { + val db = model.toDbModel(model.chapters.size) + Completable.concatArray( + FirebaseDb.removeShow(db), + itemDao.deleteFavorite(model.toDbModel()).subscribeOn(Schedulers.io()) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe() + .addTo(disposable) } - ?.subscribeBy { - mSelectedMovie?.videoUrl = it.firstOrNull()?.link - val intent = Intent(requireContext(), PlaybackActivity::class.java) - intent.putExtra(DetailsActivity.MOVIE, mSelectedMovie) - startActivity(intent) + movie?.let { (if (isFavorite) ::removeItem else ::addItem)(it) } + /*movie?.toDbModel(movie.chapters.size)?.let { + if(isFavorite) itemDao.deleteFavorite(it) else itemDao.insertFavorite(it) } - ?.addTo(disposable)*/ + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe() + ?.addTo(disposable)*/ + } + ACTION_WATCH_TRAILER -> { - } else { - Toast.makeText(requireContext(), action.toString(), Toast.LENGTH_SHORT).show() + /* + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.flatMap { + println(it) + it.chapters.firstOrNull()?.getChapterInfo() + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + } + ?.subscribeBy { + mSelectedMovie?.videoUrl = it.firstOrNull()?.link + + val intent = Intent(requireContext(), PlaybackActivity::class.java) + intent.putExtra(DetailsActivity.MOVIE, mSelectedMovie) + startActivity(intent) + + } + ?.addTo(disposable)*/ + + } + else -> { + //Toast.makeText(requireContext(), action.toString(), Toast.LENGTH_SHORT).show() + } } } mPresenterSelector.addClassPresenter(DetailsOverviewRow::class.java, detailsPresenter) @@ -215,6 +292,12 @@ class VideoDetailsFragment : DetailsSupportFragment() { private val disposable = CompositeDisposable() + override fun onDestroy() { + super.onDestroy() + disposable.dispose() + itemListener.unregister() + } + private fun setupRelatedMovieListRow(model: InfoModel) { /*val subcategories = arrayOf(getString(R.string.related_movies)) val list = MovieList.list diff --git a/animeworldtv/src/main/res/layout/activity_favorites.xml b/animeworldtv/src/main/res/layout/activity_favorites.xml new file mode 100644 index 000000000..f3f0b4b0c --- /dev/null +++ b/animeworldtv/src/main/res/layout/activity_favorites.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/animeworldtv/src/main/res/values/strings.xml b/animeworldtv/src/main/res/values/strings.xml index 5701de385..16e58b128 100644 --- a/animeworldtv/src/main/res/values/strings.xml +++ b/animeworldtv/src/main/res/values/strings.xml @@ -13,9 +13,13 @@ AT $9.99 Movie + Remove from Favorites + Add to Favorites + An error occurred Dismiss Hello blank fragment + Favorites \ No newline at end of file From 0eff04850061cf5e2e6dbc6eab9a7b6e6a7528dd Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Wed, 7 Jul 2021 10:57:18 -0400 Subject: [PATCH 3/8] - changed default icon to the animeworld icon --- .../animeworldtv/CardPresenter.kt | 2 +- .../animeworldtv/FavoriteFragment.kt | 1 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3593 -> 2737 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4206 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4737 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2636 -> 1777 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2394 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2877 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4926 -> 3815 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5963 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6734 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7909 -> 6459 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 12064 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11440 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10652 -> 9022 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 16676 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16292 bytes .../res/values/ic_launcher_background.xml | 4 ++++ 20 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 animeworldtv/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 animeworldtv/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 animeworldtv/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 animeworldtv/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 animeworldtv/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 animeworldtv/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 animeworldtv/src/main/res/values/ic_launcher_background.xml diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt index 4678d24e0..bd8f8da27 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/CardPresenter.kt @@ -27,7 +27,7 @@ class CardPresenter : Presenter() { sDefaultBackgroundColor = ContextCompat.getColor(parent.context, R.color.default_background) sSelectedBackgroundColor = ContextCompat.getColor(parent.context, R.color.selected_background) - mDefaultCardImage = ContextCompat.getDrawable(parent.context, R.drawable.movie) + mDefaultCardImage = ContextCompat.getDrawable(parent.context, R.mipmap.ic_launcher) return Presenter.ViewHolder( parent.context.layoutInflater.inflate(R.layout.tv_item, parent, false).also { diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt index fdd8573a7..797ffc904 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/FavoriteFragment.kt @@ -181,7 +181,6 @@ class FavoriteFragment : BrowseSupportFragment() { rowViewHolder: RowPresenter.ViewHolder, row: Row ) { - if (item is ItemModel) { Log.d(TAG, "Item: $item") val intent = Intent(context!!, DetailsActivity::class.java) diff --git a/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..c9ad5f98f --- /dev/null +++ b/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..c9ad5f98f --- /dev/null +++ b/animeworldtv/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher.png b/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher.png index a571e60098c92c2baca8a5df62f2929cbff01b52..9744bb4955e93e62a5069dd56edd77ce010a071a 100644 GIT binary patch delta 2730 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 literal 3593 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 P00000NkvXXu0mjfP=x?Y diff --git a/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..b27cae806d677de9b1d5d51940efbd11c1cd9a31 GIT binary patch literal 4206 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 literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_round.png b/animeworldtv/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ba79fbf57c64d7535d600e7946fc8769304264 GIT binary patch literal 4737 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 P00000NkvXXu0mjf7f}xn literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-mdpi/ic_launcher.png b/animeworldtv/src/main/res/mipmap-mdpi/ic_launcher.png index c41dd28531901b2c23927768c84bb6765ebcc1db..be8e8c1eeae48299797629aa837d1806a08459db 100644 GIT binary patch delta 1762 zcmV<81|9j#6!8s^BYy_CNkl6vr*B$(-pQ`=^;|reO|bAWqoWO&r4vr&6ok@DgU*1a7)eNqV4{U23J3}kFCT@uEX!kgEbOvRc9(tN zw{tG+%42tV^uy&3e>30t{r0ze_ny!FopbKF_cvj}-D4ad0Dl5V6aB1!(HMR&Ya9*a z@a^gQL%Ny4X-Ejymrkd1KQ#n3 z95>SI^#{qcd%Oa;g2iYwK1=}Z+=$LLI(O6AFY4{v#)C)@{4t&>8L=fWu@)%a-VVBiiu6M(BP$J)~RMJ9N-zor5y;(|%7z z8M+nrHh<0712{U(X#ISbyJN-cD}+D$as$uqXNU1j0qWlU_%_7q&jjGu0od*6IB-i=Jc+lvi1u$38=m#!?{KdsIA)R-RP*_+Ps;a7Bu~uUsx#OLplKRRW+qd9-ZdRJK?l;xdB2#LZDWwM_nq^*Vkk1 z+JCj~m}rYh5U#{en*&`E0QS+wm651@X$edhO8Xfw5P;giYV8R^I|V(9udM{_><#v= zt}f32{5whtJe$|gTO$Ho5&)}A0mWOZMBq9pjrsy;Zf-?FLK3-$1qwwyN=wVd{hyQ5 zC}>+K;Egz!o9`8%+u;yTnO&7#N)mw1l7C8(9eCy)=mG-)a&z;9v23`>)QRNeBj_aP z-MivZR9J!=H*O+7zsNfPNq6*j;YJ3U@FW2+=3a#S`2{fMT<{5CG@5YWz+uWNa{P2C z74$y>rlPzGmrKfU^ymrX8fVVr;!x5r&}wza%F0GkQi{kvz5u#v8&EeV3>`_wqyaD$T!!M! zRj^#Y=@a16#mi8s+Ql{dKLe>$ZAeW`r@*yQy1hzi^St*g)GJ$)N(3?2R+0c%u2iG$ zy>M8r-tY;)8ON1r`0UC+HY&SCHh&|Ra^3R@(Aa|dpfxb&U6KaC)~rIq(oN_rt{gIm z|JOX=N~QnSit5(-k4zc>UbwVGd;@)E&L9I;tXM&*vw742*RNm4#*G{M-RmqW6RS3d z-XL8m!N#k;jvr(|LP7!}BO{TRn23G*_6-u>_x2sP4G#}Tc6N5Z|Ky5SO@C`>o|z>B zU^n6k#;)$@@2~W93JVKy{P=OCr>74R7kWE(?C|(qMn(oIDk|J@<67ypM0`t&{~C$Q zY3f9qnkCk-BXNEq^IFL+EIs?#&1`GAb$xOO`AVTD*9%`XOxPp)MC>nb`gS9xE!(@1h`u(kds*Ta1ifwEPUDb4|t+?a1{@fHeC`<^-;mUw2SrKIqAF9R`JfPZ0c?mEdmc&lZ^ zPl9titr>>ejv4XhZgFw(Gvjr8JvB9TnlAwH(jYT4^HB;y4L2GuFF43HD#x`Qv9YmF zvW@xq`4fG;VtPO(lcjSe;e$c^b-4QG%vD}qeu8Y9G@N&20kdb%o?2E`mPJ*jR;SY$ zh+faR$k87N z5gZ(RKV42HJ>+LiW?M$};+=zqeD6Mg%4@*hJ;urLA2bo5E1;`sRsaA107*qoM6N<$ Eg08!3x&QzG delta 2628 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 literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-mdpi/ic_launcher_round.png b/animeworldtv/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8da54f14af3888d9bf5e0161550f90f60d59f648 GIT binary patch literal 2877 zcmV-D3&Qk?P)qweqkfC!|~NKy0|!g^^f-8<@D9k}^@NRdH)8;dj^=`n%md~A@lk;Lns3Xb2O zKw65l+voF@c)eaFk`B*}M08Hq=r>v;tbO9H10mD3YCg z-2nXsCD3=`4D=l@0MqGWuvA2zkG2objhf)5^Kwu^-4nM&kxgT3Vj+qfvw>>*cugJt!ZF!(EYEypk4Adb0ywlEmNXF^I9C(ueGo^ z;@ydqh_2-6=;-*-kadFhdqiEu1+2u-(bf*_OIOP^`20NRO8S5Wsk^VAfgCd9SZrXu zbOpLM?*`S+!9}E;#^0{HjWz|sNuLW}A@j_wLDJv2dp~fOu27RnJ-?xuf>=1aRpMvN}OZMJqJt=jT5>$Ootu>dNS>P?vy_|)WZ zI12rJ-`=c(w&*_&X#U3wP+Nrz6t0Eh;$m38em$&RyLQC1apOiPDJh{q1xr~CTH<#? znq3H%iR+UkDq5hwzkjcP-Z$kHGi?x=i!REtODvuyHe8V*_|QP z2B94XwOW0Usx#kSL|CoXG9Ca0kZ!}rOcT_y|6Xt_K1@ ziegqk%Xch$N9vhG*}A&ADp2NIsr3B$^JDFHyOLi-MM<-GC2Ap>`K7x3K4;g_x^O5h3qQ>aU~zFN`#mTC>VZoBGtdD3d@;Cg>SdK#uh+M3+O+8r z2|!(4-Pe)vO&$QD3cJA2A1Z`{6z?#*`P+xxq zbGZo)95@0Ni*-l<)EjB$|CJ>V)?#n~OeT{qH8pjD1faIIb|RY9zyoloG|czO3V{li zKL988`Ja5e4-^U|?Ae{l(rjU25!BRNhRVun$oVu6j%A+&jiw!r9?b!d+cP8pnj5HF zB{!n<$^$@)8jl}8{*(luw6yebe*kucigl6Xi-B4Ne*o3hmmoQLGn_ba3RWj3gXV@7 z47~=X?Zbz%@Z1Rd_Z^1ZQw7l2*fewu2-LId2m{bxSUL#6!Gi}UNdR(lbH9Ze)5!od ztC{(_x26Ql96SI@ZK(&+83=`<1wK1@8Vb)8v7p|$BL!0S9AxJw@%n}hAArqf3kd-0 z00_Y67i0i1<#%u2zI~zu0CVso$W#`@)OogIr`faf(69hVpwiNd%R*7t&X_8Xwz zc3@ZlVhZ(7sp4m#^N=j?**P{8Q9SapX*8NDl=(rvk&DFKnkq}9SP|R*ki^qSzsJPHU_rYUl!yIVD;CeglCn78zl^edg9OAuYV=S~<;HB= zwk-w+e5deO(Id9k6c2$i5?{Qq%u~B75d}N{y|=e_&^*9TfX1vmaCYj%xxqu32QBHu zKwm(zVdEJU%A>_EV{v((axR%qDsI@2(Uj&kn!@))Lh3%9V9G55XZua5Xwlv{XkmkR zVhhPM?4w07H7!`MfK2qY%F4=g3Pe1-{G?{BZDhe6F5z9+u3M|?!7a=Pg798aAm;ik zl7(an`K^r*4`iyxYHDgu36@|c6+yVV^x#5^jP$9T7_e>}aGaetrKcUD+t8jB6%~0X z!?#J6pngBh3yv{J6U)lVGAO&yK|w`XO*H!uFD!;9Y*#!Ehm`AyH|;@ggV~TY{~eNn zRosyr!i@xC0{J1<2#4@^#>WG>!`Dlq;65RfIkK{{w$h$=Bs}j4z5XwMLlAN>xztz3jT<)wJIJK^`ubAL z?|q~}F~1AeksaboLRv#r6FzqJqwO~U08s6i0E9a)hf~bs%QMa>DV^BNJQs!jeZl>JSyB1b=Uvw5y&ExDR3~kUx*XYI`sdCFADUKa4kyk?k#MW!FDTOqh00000NkvXXu0mjf?do}) literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-xhdpi/ic_launcher.png b/animeworldtv/src/main/res/mipmap-xhdpi/ic_launcher.png index 6dba46dab19242bf475ddf2e0a10042de6a0be16..548257da6e0199683aa93d86de0b99a67c533cdd 100644 GIT binary patch literal 3815 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 djcpG``#%|G-mR-|nJ ziD!nlM5WpyKdG{c3k2M;jXYyyVo*^yGIoo3`~=S|F7P^2q1SWS$X&WX;`m|lvakY#7qwtaxT_5#?fq+k)xD_wHQ zyOv!iWuFs&s&k8$>66s&pN$6(OHEJH8Iv+e1ce=IQ2k}QWOKrE(R&G&rrwRul5JO? z9Uk8YLMp2>9IqF#Te_G{OqvQMdu+CapwA4T<&Q@QcIv*Lg9wCU@r|C(t0{!0uNy}p2{-c$-u10k!W;Vg~%I&@z+#7Zi7r~hD8!> zpn1}&ANh%cY`4tCA32CA8i#xOs?h4F_7zdAHMab<*W)CuwR|(~gd5`m3bQqKX^YNG z+~{>s$Jk%6cClss$H84jVN#H-lJD2DGwI}SA zu}tz|ZwBc|Pw=EGw^kh`Vk_xMX|KfNCGdbgab3{y-S*BeH0I5?Fmdh355OcbEk&^| zvJH}xPR|SFnmgsUkXAZ4wj<1U04=0TZjaXuYB~;x?~Ljrb98Ioa7$W@Q2QHJmAU3m zqlJ2~r0VR++WqVw;&dIr@dIHqjUh+ASQh@B(NS@~cD1|dsV_-;UPjE8^RNw3E?oOx zSawJ0BrAl>2pdY6WexcT5X1q?^`Am81jG3nOs~fmQ$LhX9bynlAH4$-4lBA9QiYq@ z87)AMgAz(4!fMjm9M<0w0a6v{tIV^NELObpXP3`b)U*@x89Tb^oO+db`gC@e(i|b` ze67ZZ)BB~r(*Qpqoo`Z}T1l_aj#u&OY)!Dzm}f9df7x`HDRr$b;S`>(2aRx?w^7$t zp_L2SLwiLhm-FJ$ZHb+HJ7c0JKl0+sH@!SL|IheR2Of?`TP?pRa8i{~W;*EZeiU;! z5qg1lRW#x}?|K&Fq6|x^H3Q09CRZ14A}?5rOE%fsHgbZ;pRpI;nrtX##M(YnKkkk3 z+~&?#V1fxYR?-#{_;rMDS7${>_1W~iW^pf+R{8V$q~hG zUj~ld*aJ{`0%9kHw*9lEZDL0H32F{V&21_p^|9KQOZ%(tH&iu#-3N2M1Oqu=%QMi) z3a!@quYHxs5mE$*16Q&)2UBmDU*nJw+cVC%T6}3p3y>DMkb|)L)lti?c%_LG1@z1Y z`O0Nc)Qe2`t(A=Nx@S-67lfIMT>Z~C1iCb;(6G!=-@6n{h*4Lbzb@xt6wbJ=GtlqPq%4|UJ~huHD1cmeY)$p=}87X%EjT<#QNXdk!a+04QLozV|jq@$tbmh zpao9vHJHhQpjvywl(1?PE{BS zfR{NBD8e6C^$``kE!T9P9nZe@25vZLg&y^Ao*qb^nTes4#=LOmYXkDsiTF=zn}0jrbE{YJ2QDvE0x2)7y(Ha}6$KtxlNp z;n(;S{ex!!X?=Ij-kdhogzEktXGnH|JzUO_edSyAXRv4nLYTwEfl#KVS+7%bqIYCP z&ur^~ZSZtANr8eUyQne{v(gw++&~%2)9p(*3iM+2oFo6$4_%fmG}($R8Zaq{=*v4` zV!nyJ@5vIXQ1m?j1P)8`sLf>nrc_UlatmZ=)H+st(SRps zxN#&CRCYp(79mnAy*pBRv1>hmJjf?BH^u0slOl&xgTlsm$Om)hVJd^1pw4p?10fzlXzO(| zbC^>xs!xnAKfHePWTo%hPXFv8`7IYqX4gT` zQp(=7i+KlBm-}5**KPuCw9u!rR)J;9#3s|m!}eO2EEDB?Pkw-lW*+C<{DR2Le5qD; zzW@8)0)O3mN~otlX@tuhMxW;eIGuX+$rh3RWDgY7H8H4MMK0V0;bN9|!@w63^l3&5 z&0)q+q@6rD=7qQk$KedGU)PVDaA-g0fo}fn9X~WTc}y8_Lj%CE2dVh@8NOLV10^oF zQI_gsGrQl%rRNcT`SgZzAFOvvC4dF?AeqWY?4l@*#U3O*MGdG^xOm5JV%3;SOATnC z?9tAd{*w^|RtEk`S%@DO?b=lWR>)||^HL+is%@`JzWz^pKeH;4-@qzLS8dlpcx49nHQ47}Z2YEuTDZEA(kW3fYY_p}B6cIFk zMbt8vgs1oug8 zCnR@us&d9lEL~oxDKzSww@MWCZXwy07+^2K-AXe{GvG?+83e%j7Yl=f%Wb4B)huao zbP=@84F{aNVYG1Qhajw~Y1qVPFM1Qkkb`Yy&!y;yTE(C{18v*gn>iwt74810m`a_j zaeX94mEQ@K&M}<#Z@w(hKC*E2WHWD)aW;8Ua;S+nTxrjgc~uYuVX9eNx@n2>nQ}l) z;B1~Sl1qH^^=wCgv3{;zvR7E`t1eGiP7&c2d+p1;-4J!)xm3Fy$-)_obcQRPY%u7? z7XZstD$nFs>PYE%Mk7Z{QrB2riY@bl%aA*O>%{wOH%T-++P~>LC$UivlwLe&{{}*+ zkbH2ug77!!3m_rRpBFHht_jt>Us4q($OqsvHD3?|8t7vwAtJ;_*cvb{S`NuWeEIon zjsj(8M}cyEYQ>V-6XE1Hk4Wp-sts3$%7Mpv9*9VOz!5|H}i>_1X} zG`$FAG#B1$-wY#f-mxdT>FlkZLKBH?LVAFB!E}EpL75H{6wBvM^fdB%R?-j~0d|zFTA*n!Sbq@R7I$sS)Sf>=TgS> z7DkZ`m`^wC_Q@rUNntv|0Ijbf9@edvA$M)+#jMo`0r?s#41#UZ0l`5jQ8RIPkWYkL zLuSnjlMf=nsvrXsbLOTQ^D;=vJ4mu6B%p$6II+3u_iquF#Dv=&_{Ne5M{*;lK;68G zCcB|s+9?b}BBHf%?-TpXD^VR_P2J5myX1qdO&uW~Rc4(W7+B=mt#w&%j7)yuSIH`t zvogKN-ARwD5bj&d;OK|`hx40`q@@8|QhsDpp0fOFB|4a zU1aM=Yf<2ymK zU)xMo{8RuIn0NEhLK+-->qo3hthYqL6fpI~8=Tz!8VDrj z@vG(yaO``ZSJL~M*f_nb>_GJJSMJoZ*88oEkhy(K3iaPYXuH$dX>EnPP{xi--@Dwg z8bG_SeeY6%=g@5Mxo0Doc1WM#-}0nC;rzZU_NEIRnJ6u}J@fBxdZ$f@l{?MD&mg$S z$EPCM$0zZwcWT`FU8Ej^5NG;)p+aG`xn!?$Ve)&}j!{ORq1@*_ZMk}L0Xz(ns0%wv z9I$7!d>;Njr6K{E7`|9mr3TLh#}wtivvU+hRX$+hNoyYhzm|q6NXEYB#;z=!b~YVO zWr0qjXwDrkt-=^PD4HVWGMq`hmTMQky0!3gBy|fkG9WF~kSkw-QzO(sS=AbRuW`op ziGH!+lMV1j#rCixt9)sG6m~TjhW8@qc&IPD{BVWND zE}dlIZ@O6{V18XdiKR=l<6aTB2BC&kpPu^4(Q%5cZf_ImMCN6)=Q;MHw2-oy@2Dq? zBq7jYByn6Ri}-6uueQEcae}Jfz;iW9-@@@%gT6?;;VkD{|RNoav#$0VNE zk286ieB7O8wkeB~4|tO=-Xbmsf3}F4F>ZOgHfk8otsKVsWsAHTSaa8kixa6o-Ri^V z0)MR_rp^PW%$7L2Smf5N&hU;cW4ZGprO>fj*|YxR`_GR&s^#MgsOp7EmAx&@#MrCd zyIaPnnh;UNM5d{7{h@D7*U-~T?d!MX93o|1b~=jXSLmU?qT;fW${(B>2Xkjm*GkNF z&(^d3J)=9>N78NIp1Mp3lsdWVqBKFPu2q<(dE3}t|E*)2wDb9~gCECHE8@~_#Vp&a zzNrs!hW)H{u=fDT_Q!n=TZu}6ReD;sxxz$>nGv(gZ_n?Q)KNRCDM?WkW)Tt6)_~Oti@qu znN>F{u&G*@4#IlWSL&!A&j##b`&MC~p0sVBm$%!^Bl3=c7(hDZ!^<+e-tss2)yt(x z$nZNxGicL&jZaDSBl-=Wldgm+-w<8h*fJuXxYp9vzdkqR0ekR37Mk8nak_ZEKsEd+1zE9#lMU|QU<|9lW?xSW zvcS}C@RAQQZa)|4x*<2e`l=?t?w8fnLR4T8d-PS`6Fo%p$M161mM)A5Cy3&!#QaEX z@2>iE%I(1+6&-DBWYa@cppm_7rt~Cq9UQ1|yv6*g$Z^A6qz1AFKVnr8HuAIeIEZWd zPnFQ2F%XX?87wg|dINV-Bc;~k!S-OPe@lFxF`etST8 zYBqFUmVxf_Vzl% z>N^VUa`>CrUX&j9I7gjEW_xbg&&ZsGDxdieUG|d8S8PTRn^;j3Z+2HgN%^-J4_-rJ zXnf(VwiM{`(!1kQ-kmx_glGg2hl7>navKm(D!K5JLPflaqwl!@=S3KHKUi>Q@G@-i z2f*op1XSQagY&T=(2UtqhGr_!IVGhQo<_Cev}U$uS$zzs&CUe-C!|t{-YTRI(9rzra8(p9AMp zy7DN5MBq=41%fmQaW?Imo(9s^;2wHljKF3D>@`2F8~IHf6OfBs;7yHv6qKvxNr8Wr zl-3lJk^$rkB0+4-w2J*kCtKWrXF034)>l3cqw#Lt*!1lPxS{a&d54k^o{H!KNN#3x zDSaf7onkGRDVl=Sje*S-PzQoe8Xo(P=~uaKHCh_=DwKVp;+RLc2Jfr??o-RHmpoU< zKJPZEphtqS<}bbKY!4*T`6%-mpKxv2%fho41UI$$YZ_>K9n6#LuErL= zrAO3P)u#*|L1VGt)m19t-f}nQ&OfjOwd42MB+$!%l8BJ`Ri1HM%A|}+h`lrT=r<9nYU%*DmB6uS zqi2P8A9x=J-cdrPE5}+@-#<6F=1b+Q;N6ksE_D5w8;^Hc`cY}O&(6h=3_BM!=5jh< zDBP$#U*+ZeOt(@!>GM)YE-4c8mUXS&?s!j6fZ-o+@kq}<{f4UAqP6EzmA=j?)jqLO zyoFk6f+u+2b~JzWZ+>$wBv_mdNL$qkJoEu@cM=;wh!j?xYp$(Sj3=h(DRl!TQ)2Or zf4TWh46tNc=d6foeJPai2(ONiin9XtKScZ<1Ua)b#IU_{`(u_{r^~5v#2IIk5WjP7 z;S?_t;=FfbkdkD&lHOsET^nchw4We5I~nD#ddvn6wbHR?Eu-B~y<|5y6KdV<8yEd# zoo?3e%QpC6;#8yMY?_ZiNt4wery%rqfYNnE%(^AQ3A}t1fcTtPu-CATQIG|U7SY|+ zZR_$q@@c0vDQ0m;Xg4pH-1G>yc`fQjMbh|9}4zxO4j@893cRQH*aY^IGJzxOp*E z%+lHGzotD1jSov~N?w`u;lp*chO7`$&VcBgDZ$jdxxykmn@SZj@bKgCX%7D20N?_8S z8h}s}IaI?>qRBF}HYHR+4~S_=~6exsNvNto6 zpr&5i$K#3qXVxG@_3e8DdvM~M&8K}P_e9@4yYYT#HV{80|EsX80oq?kaC6{NW^57B zk3M<1FLx{mA*~}9dP#$y67hB1Gxg;VgORzq07e%scRZ}q6+}GqY2d|UB5@f2AIT#e zN0aL1aL9`0&5w!Kexi&j%cL{ z0`lA9pLDg+(#3*H?FIBYdr-R5X|w4?BwD(*>N>2IIVGexbKTf|*~sxd%BOU7>?2f7 z!Nf0@Du-ijvb>Gwn&V=<>jCBG6(dVKK2rpk@YJIgiM_Vk#(+o7HwQNXo);f3~ zT1zAUv$H5bBzzQ{ZD${)v3=(o*`X%V!8j@5+iC7faI>h2FDkpypfP1X6-iobiJ{?J zr{{STt*O)7Sas`oc_ehhJGRbZ-7wKw%nCCtYJfUGc*pZq7TV@Q;KGX=G`ixVK|L|s zfhX8HgAVhxP#vtD6S?;GX)?yORGdTUO`TxN8Dak*`R(g!;R$qV!HI|ZX8*}TFU**K zE9@1k~+fRA1@p5?K(LI3Y&`3T8x zEhG`J6Wmov)C*$@olc8N+a&wF%&%Lo?00?*53Bdw5EHwjx3?^Ie=m6LYn{8HIdHy$ z=i0GQ-G=zb_!eeJtJ-2Gyp)sb+XNd3|_L3`~Cz|feU z^=4QgIto`km93JQ*q0HLLo$RO!d=gfoZm7EGZwiAs6v;9*4Hd5=YaNe#y$9Ri(GMo zYfS_eX7u<)89nk6C$GoWEl$m%^b!Mut<8RKuRED#b4GP#Gd*4gU>7>CW6_k^fCJ697F||3ZMMs>zsg%d=K~4%K?)~MB zt(BD^j(QG6GuK#B-CLZc$_C50zYraZ7uO;w+yau+N}uu{wa9(EiNvex0AeYA{$wCH zEh9JCq>=(^B+^x$`(^Wn4G-Jw#+lZ>?rD98Hr2rTIY*p3~v&ao4_W&O|Nz%(4;u~>HLMAwUF*jci;Ut?Do=KL1^brQWqZ|StSk3G}!#}+CF zT*xuk=;puH1(us2TIxhE!e};NI0qHC2I$KEn?RhkF%SrTwD#3X>tJ>+B!Tnl8I&}E z&x$FF{4dnpf~7{y^I7irE;dnG(Zo432R*DAn%OhL9NF61YL7NXXLWR(g`US~n342h zsuP+qk#uS0qpDDp{3_`uw}gq8>h!5av-|CMMlQ!9LdTM}R~xu}W4VH$pftXdrucfY z?FbmJb}Z~dVyetuv0Qh$%W53NcE;6mw_hu2sdZeLpzK~NOMZxLWfoO#7D2m?#$2bW z5)HNK@mA(T`3K0){~k%(q=%Tls?c!~C#o`j@6iW{k?ysGT}QV>USxQzdRsbvpnLt= z8c0bgYtHHvOFiruN{-*El8wE%WdODcAN$Ns8aEbK99}D)PH+|EiV8i#Md)BOT~WZ0 zugUt6pp`!B2M6!ctG|Bu1Q|7_uTysY(bEIh=v!M%JGAIoT8t2Hi&i4bE|IXn{2}4_ ztlen?xm%;9weW+_UNf|`7L}AJtOOJI4Lt1Vd`lcNt5M*GoB86$zJm_opmIp)B$C1> zm#AH+5*KTW@9%FTi*4ETmcdepVh26^)zr$_$2F;|xyv&o$Mk=}U`P^N5I3Z0WDreD za6rF9p{r9J-J<_8tT<5jsDZw?7?A!IO43FCLTJbQ-}6@u`Z8%^4qk2AM=v2F8jReJ z){J3BX`nZ`&0HxTLg-=x`l*9*`f|GJ@Ut};wth({4WZ%f$dwLoqlUjgw#$c5=_NIj zKq^s`z+n@CgBikySt-&-?A|PKIYyeNTl;9Tz92_Z3tt(tR-kAn?V0a9AkAx$iA}}j zfIq;0a6HPuQYqHD+p09?Jq`jgOs<6`tWz`;m>T2TT$A$Nr07KcU{n^{3A=475|8?~ z&<7RLW`B%+MK(Tp01`Qrsl0iC6&?|zB{1H(KRtsYcVdTN+vb7!oV>C*(`Vr0zq@i2l)qPqjHJ zNejDtH;{UIuid5V=@^y8Cnh=BWyku-Y(udEpCfwfl1{%_PZs#ixN8o^K$%!9?^r|! zr394!0}LgcZrl)QL6Nn9@ZmQ3%k&%H#aao3I0?R968;Q|$+{UhmMJ6T5%vtV;*CSP zx5tzzyM4d^@K@ic&-4P)F1|;an!kv&813XJwd7{It}u-_bJBcP6+;7X{6{==-yV&% zTrfdpo*B)cqeV-|+LlA5pc#3lHVt&uo;xnM*H)d%hVIYJd=oF_~^pA#(B;F1RIxG8Ci z;-&}BHZ#P$|9{@?kCuTO7p_jY;1$~libt;twpIoF*<#(B|HtkBiRNh#BP?|G)MxOn zm7c}qEuv0Nyee=Kc@=Elu!jiY)%Cz>sFiX!d$L<N-`zrMfwU7wM~Cp{^94o2|Frv>n04#s9?rU|zAY!1y`R^dB=P%_2&D zaxQvgl5)-;_M>j3t6Rs2lIM!&>v`<%YIXHMIr#ki8}=4?78|!tf1|vdzr>r&kkSqP2B1K)R?KV-AG9a-X=Z+70&)+W9C*rCm$y3popMXF&~cPvw* zoE%L>^eaGu``|7T;EWG&^jQ(*QklUn3agCjb@6|SVzE+E`Bwwa zOAkU4hUK=^<}P4ORm>k3wh~$4k((%?iu+UyzeP!Pco>N|cQvC#LdE3HKZ~H|E1BBB zX+jlp`ntA2)!8d2G~z0##gjimo^J5DLshF77PCS(m!a|FyXS(rnL!(gu-d%D>uw`! z8cbOXY|u9pvEOyP!0aRkV_#smHJkAWSQs%U1Dk3Ee|Xe)3j0gqohGs-?g0MWwV zbfVym4ueIu`(zO@jI|9sp&+Svk;}66pPI5uMIxPz1Y=3RmcE?nDRFrO8=}+CAg-L} zJ6LRMcTb7P7ZUMWPgD* zE!t&toeXiLaML}bo+X1ZZSW>S{S6Dp5O#5N9(x%ibq&0p%*!SH_aa4?IB4xa6#-LV z2$!nz3WHPGctTj3HhhnO#tQT7P@=N(;o!q8<0CVZW)u2X#Jdk6^0h4 zGxP7&BQP4X?lLmZd-F&P!;BVs3 zIXiV9NX5qRMzirgG&KBv+~EZFaAh+ayfhXVUn~8Rb@*<}S*Z+M?ouE-Smv?us-q1`ts*#NvF(3WJyvnG21Q+3~wpue$o4|Tc6LTm~b3I9KYu=p>UNjvS2uOJwRAc=KW4|&Ee^v zV0`FV)AkChoWfhC6*yhgjH_lAE1lB=G2sUsmRzQ{q=iASH$Va=QBe3y9w; a;UK`_77l**!?GJ)I5z?;gGTJ;*<)`p!7la+Vg<#D z4Fs0HbXe)I3+J74xr4Lp&dw|>O`Y#M-@@#adw-{&TlS4NULUUyxdQ;KkgPe`$dGWI z)obMP4mbf=ijz$~o?|0=j`eF~O-nd|RoWEb_?<0Mb)>pTjggviYRu2kceXMNDa}7$ zYluift#X|&gVY4+C#1PZyO3Ov9wLPx#UUjjrEp5(=Ysh)F8rRk{2BDDGDeu5FAXcn zz#DWN|F4DA2Wb=1J)}e=$jZvfq0G!o#U#FuKkF`kHoc>kF+q4$B;H2!e?_F8NdF*3 zhyfRYsYB9=NXIGnp_91QfGPZ4|L}KLlxpA0419eg2P7XOpo;;{GDqqqC@U9(ax=q+ zx266|#|XjBivG7lT89)b0M7x+upr<{8ImEqk24~kx6Lk>skADwc3$*%Ris5o8WHe< zxhM?KO)(?KRB=XVcw4I)>q|+I`qHBR`y%;^fH$zs#e@Wb5Ewyi{#n$I(#2jIgiMwH zT?1*K2zbHFKrtu5JOMwb4>d%-!MfNwTG8L#c)TujN?QVe&rM=&p!}knvAz~NdykEt zmrLriN+9@RACVzMOj@mWK6cTnSosB^AtV*p*gXRHI-O2if`Qi~p)b_0jEs!GE?v4* zs#q{VaJH1pVB^kllapyNTc4qYbafP@+$2#BBNpG)K=vlKVYK3kU&SN{S_YLndd!d4GTZ%3=(PQu3={qdYkH z`3oy`I?yI2LF!{)&>TJs;WJl2aPRRD@c#qAzx_|(`$0GGZQfOu{MvjEs?UCgpzlXQ z*sl%{yJa6F-@FeQF>#Ek`3+l%3F+zSH$y@~suhVQ2rrC|jwZ=>C-C!Sa&(!H5fKfV zBj-Rp*%4G<^hdD2RRp$D^8ctOYRhz{A*tT}`C>} z@#VYoY<9FdNDq&K*lqhE=!a3@*Ydl92R=8o=!T5w2NCoC3n`DDfi5lGY;%N%78wEY z@$q{_(UEn5OFxEVb43oW1(kyA_aoO$3kLm__uDYKY> zSm+27G({mE9v*cp>XdnLjqIBhzQ@U2r%NU$;lfo0qT-09V=o99I2EE1>_k_0NDB%B zU3!LD;cP~9EF^n+LF|r$pdPn?g|dp7kJ=Qyc2{=TYDVb-4>CoE5G!jDZkCaLjC=ct zYCDSTzAhyd;t!kx)#v@>O#qsd!0y9YGL?Mm0RxbMj$r01fkIHU&l4f_sXxmHLQp#> zBvq12M9g0e=@=d>^#_Dca&j{G`1lO8h!zMAB`z+mGOCy_H$BQq$>^9!l~tYk$eNje z&ix@~vlFEG1u?)1vaCQ-tvPlPg8NPYzgFML`i1bB%R!rvWR@w4jg9p`apJ^V`F6_u zW-FBbh1~Qg0$-Pw#*!*>kfwpRXVFKxIlj$mFvc6}2G#^5x4-2t%QGmlxY_g)#1GbEH4jN5yI|raBX|cDG`Q zDim!S1@uKAQ>L}cle1#TnbAVf);GzT2Lxaju$<8J(T476Jn@IjB2Mm`ieQu1Ro)&F`3qkM)R{* zX~}`29yVZ-+i`X34Vn`!2C+S5jMVXA!-hf2mMx)S!-mkHL4zV8dUu;PZD921(M%Y0 zB0(XLgZqw0!7?mqM=jk9x@6f>ww4NY&z?Oyh?v^QX2*hxpxvs8H-{>5zLeOI<1)-_ zzlXRzM~ymMS65eP)Tj|us89jE{PIh%x3`A@0|pcc(YrtW^i$TBX3d%bI!nEfno8Ad zfGD>^#;`Tz-V;S3X+%VX`p-ZAtVh@$IB>v5uHtEhG3K zMFU@fsd|?#UEr;^-hw@Q_CR!WG&4m-Nf_Xr%#_krAn2cckkXb zxLs@J$8?IcrVl=@F_-dd* z)iie70a-IdpXliC)v8s?R?-X!(T}&ccVoOEUVO6@#cp;o2-Rrdn-Vgqd(NFZ$L#Hj z6)TDr14tXEPoEA55?sD~*+_jWoz<;!=Q$w*rpTEg<_DspqBMX1{dY^k*l1EFFaYD$ zA4T>*Q#$d=$R1V{M?LL+1kG_5lQD8hWdPHX5H-tba+g+E71x9bB0Qfze-17#E(0XP zQNjMl#l_7M4L3?U;57drgSt8mqG+EdnCxgtW&lyl`o9dy*ztcKGbMCcLRReQ>AA?L z9}vZ-rO;znZPn< zQ`J#w8~Rr_#MsuLEW!V=>eZ`Pg|xJ^`{G)L(b5BkWnrV{>Px|Is})r_l`?=DeD$h3 z{P=@Cj2J!v^Mx1@SX!7j*AZ4MU#oXde7pu`Om~1jy@!CGufN`RZf@6Ly|9)0xDM^qQG(u;(I>L(^6HLxKnIR>PMghS9zWAsYR z31=@WGAT+KK+?Z_*&3KNYat97@+)S~SM;=CpVMI&I&>_??=Mu}+uIjLkDda92aSdc z7cRZ&X*u=-+QRgocLY+X)MUH?dpy z>zSeG)w^UF5E&V%S-*b$hX#?5z<@Jn&a}WA666>_)lcz&d*tGciU(ShFd!iz5wp^{ zuzmYqOp0S;F3e&8wejM0z4}n(g0)JLu|#A*dnpFkoH%jf10@VdIOCQR3zHPYk^1Q}EyjTB z*F3=9ek60k;o*@G7N&-E>$Wg}BO_nT(;@RT?3eLqTf^X)j~~;Bpr8 zk}%Ey)u(+~QO;5fpp?C5&jGM)+a6|4#58`~Ojx#bwVo;YZT@1|xnnOfZ4Dei6D6F# zdGj_4JLx{LKd=-7Xbe2K&-fP%nCvL40cy26YQ~HiA4oC)8&C(;H$W~7r70XjQHl-E zdHY+00R$}B>tBYBL$ecZ@co%H7s0;&2t8+d{P-CdHEJ@97%>r@?Tc7EG*rzZpV=73 zuKw>vlUZn8IirTo{~Lx=C&oK8DP`kLuN{SCg>Lortk7JtSQ`w^^FabzRFnClZDfp=qiJFi4MZ>obhc+x zzh6ZLgbtmNGi{OPMVS~E&Y~et%(H01uC37l8GiE3t5>i7EZRINQ)Mj%g8Hz9 z5U&~os45!VYh2FUr!-Zt$pM-8_;}d4bLViv80~)`$H#asbV!?t1#co!_xN+m4PMtb%{rYv;NxYN`u}~ZxFq?WQJsOrt zA+?K(3yp?V?{giXq#IXE<7 zskks8Dk=)vw{H)a3$ZDRa_i1$bw6o8Eku!8%qL9Dij9rM+-CDw!WR9&o01IR$w9gP z{rmqrB_$oRQ#_c^W*C3>WrAy;MkfzkV6zARdIH99w^Ezv!n(lVm9v0mV`O0OiobB z-8kwf+C%8kqX&Ha@yF1iLkF{oOh(zVW!Y56cJ12b=@}h6c7$HNdcnqx8<`oBs~M5~ zC(Wk-B=nb=l1r@w^FwoASFc_@hA=g0|8tok+jrl6*ACV5v0Pn<=0*l|9m-;1bBc17 zAR0HWU%x(l_St8k(P#>1@kVk=_Iy}mfad5q+4|3e2M>JSdFLHktY<50euQJhh!He( zqWY~{x0Y~;kesB&rtGcV%~n3rj#e)_189v{K$k%fGH9CQB5p4Inbf9(2M?|#EIFpi z4sM1jp|fmU)F*#9}&7uFKH)sx@E3~y>h0Ork?SP%4q?m<`kNR*iT{eW?nW1P=FEr$97f)rUmA5qhCHg zKG7)sUl4|a2M>NTFN@`^FhZcM-RoSra%B~djZLo?xa9?^&i0Dth?)a3tzZcY3o{@} z>gv|5%c3Y$cca%3#l*zOM>lfqc;d?{zp>j7NJe{t^i$!@$;oLWVaGAd+pa07I^+wg zVMNp{BqYRJE-xUP7=Pe21pP1?l5cxigaMs9cLr-~Ye}Lq7LloIs#K{0d-v|m*9IS9 z;})>!M{9a;hYh@-+4e=jpv0@1qS)V*7N8mt2WxNJwrvcposwI)O*@N3F8&kL6MqM- zCjX^|EnBw0$dMyq`0(LIiLz=`amnwAXywcO`}gy_-3?WKLx;}HUI!qP^{UlsShj50 z6v7O_uasx$7agVQ)Tu+mXm%Ku9wt*nBRnQEMa+=ZQx-$amVGR3&*!eStWqgO)E+8t zn7T%r*DY|^PG658xZgxbx^c&38wnE<&=YtNRva^n?3!iOy?b|xVQaQ**|Ke5V4#ZI zQJWXWJmueGv^_;lG>GHnGzvnWc+HU&8X6dcAj7^JeZscDyj=~1av z+8Hxuj3kUWRuxx*kAWS$m1^x>g zHt1-WKPX+gbW2Z9&l^gaz&eSNm58cs=9Z8Jo8_jYvh8$eoLg>NG68(jeis*)n}|Vc z!h&N`D8H=1R#UcW)#`2htY>R$+uFm!!(A{(N;Y?*{D7u2vT9;cnj|uh@y{XEH!yo~ zxmJEBEb1d)^LwjYxpM6Y1CB+hf;2tGm>@Xi_mEn-xw%~s95Xdkeqck#7(ry#rmU6( zKQWmxfMz-?SSl-Q#s{ZPog%YC)6Cx!Io(44g(Z4nnP$zJ(Ju_quh4yP`t<1ok&%%? zbfi^We<`ZyNWpuBIG?ZaqWV5LT-tJ=KJR;(q5xly3Fv&@=9cJbBWY%E4S4 zSgEi$GlEOKj<=Q8^}^x9hmSXG*pNoGno!@W;8EPb7c+svu<~|xcJJb6LyC_VEm}1B z_U+r=RFmhw$Cb&QbXG9}K8u?h=4h#{DD^%L4h~a!jNg#=sXXsvvHnRzN<`j#@4feG zRIgs0ewp;&)v8tNuxHPn^^YDsil9h||2kb3ub&r*j}UA;wSn5ge#KLxp*frpJ9g~Y zNNuLJQy-`=)ThEovMg$nXfZZPMyBqw{PE0WJEYg8I_6ouW@L(dCDqC zW^mB6xS7%NkeP*+)FvkZA0GnipACBC^boM)~s3c?YedAl7ntcD&4+) z`z|PDYf#M}laJt;w7`r^9ytl0S*Et2F|}n4H*-195=@M+&p(Bg)Q0Wbx36v6w(U3E z+%%@PQk%Kd+muA`4Kio4pQz3?&^g!VjA)K&e7m`G=T2~Tc0T&x!Gjjz#H=oq{`*V zrt)ZsOjAmK81Y46pHkX_p%}J$!4XUqm zuv$>nm8ymhyaqg<3=x=O%}s_4 k2USeMd212a#UAkg0WsysqhmV9CIA2c07*qoM6N<$f(|jdS^xk5 literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher.png b/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher.png index 15ac681720f3df43c647bf0c081f0314ee34eae1..a522c60cfb8ff28e0ff1aef2c0a72d58d3771a8d 100644 GIT binary patch literal 6459 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 diff --git a/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..735afeefe316330876c5860aee8e047bd01f28bc GIT binary patch literal 12064 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 J@Q=oU{{yyY5##^> literal 0 HcmV?d00001 diff --git a/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/animeworldtv/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb3d8a9676b8c3c62609c4009f264e368c61377 GIT binary patch literal 11440 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 be}ar{orsu>H2a|civcLfsmoSLBSZfme!{f3 literal 10652 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 je>=5@je8@}iL|6SL{zh`G> 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 + + #FFFFFF + \ No newline at end of file From 8ae646f9714aab19d446f90ad1938dc9e0ee9d25 Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Wed, 7 Jul 2021 12:04:04 -0400 Subject: [PATCH 4/8] - got settings working!!! --- animeworldtv/src/main/AndroidManifest.xml | 6 +- .../animeworldtv/BrowseErrorActivity.kt | 79 --------- .../animeworldtv/MainActivity.kt | 15 ++ .../animeworldtv/MainFragment.kt | 29 +++- .../animeworldtv/SearchFragment.kt | 39 ++++- .../animeworldtv/SettingsActivity.kt | 163 ++++++++++++++++++ .../programmersbox/animeworldtv/TvUtils.kt | 4 + .../src/main/res/layout/settings_fragment.xml | 11 +- animeworldtv/src/main/res/values/strings.xml | 5 + animeworldtv/src/main/res/values/themes.xml | 7 + .../src/main/res/xml/leanback_preferences.xml | 62 +++---- 11 files changed, 288 insertions(+), 132 deletions(-) create mode 100644 animeworldtv/src/main/java/com/programmersbox/animeworldtv/SettingsActivity.kt diff --git a/animeworldtv/src/main/AndroidManifest.xml b/animeworldtv/src/main/AndroidManifest.xml index 9c6f5d50d..15988bb70 100644 --- a/animeworldtv/src/main/AndroidManifest.xml +++ b/animeworldtv/src/main/AndroidManifest.xml @@ -26,13 +26,13 @@ android:theme="@style/Theme.Leanback" /> + android:theme="@style/Theme.OtakuWorld.LeanbackPreferences" /> diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/BrowseErrorActivity.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/BrowseErrorActivity.kt index 07c3fab4f..21619a7f1 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/BrowseErrorActivity.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/BrowseErrorActivity.kt @@ -10,12 +10,6 @@ import android.widget.FrameLayout import android.widget.ProgressBar import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import androidx.leanback.preference.LeanbackPreferenceFragmentCompat -import androidx.leanback.preference.LeanbackSettingsFragmentCompat -import androidx.preference.DialogPreference -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.PreferenceScreen /** * BrowseErrorActivity shows how to use ErrorFragment. @@ -79,76 +73,3 @@ class BrowseErrorActivity : FragmentActivity() { private val SPINNER_HEIGHT = 100 } } - -class SettingsActivity : FragmentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.settings_fragment) - /*if (savedInstanceState == null) { - getSupportFragmentManager().beginTransaction() - .replace(android.R.id.content, SettingsFragment()) - .commitNow() - }*/ - } -} - -class SettingsFragment : LeanbackSettingsFragmentCompat(), DialogPreference.TargetFragment { - private var mPreferenceFragment: PreferenceFragmentCompat? = null - override fun onPreferenceStartInitialScreen() { - mPreferenceFragment = buildPreferenceFragment(R.xml.leanback_preferences, null) - startPreferenceFragment(mPreferenceFragment!!) - } - - override fun onPreferenceStartFragment( - preferenceFragment: PreferenceFragmentCompat?, - preference: Preference? - ): Boolean { - return false - } - - override fun findPreference(key: CharSequence): T? = - mPreferenceFragment?.findPreference(key) - - override fun onPreferenceStartScreen( - preferenceFragment: PreferenceFragmentCompat?, - preferenceScreen: PreferenceScreen - ): Boolean { - startPreferenceFragment(buildPreferenceFragment(R.xml.leanback_preferences, preferenceScreen.key)) - return true - } - - private fun buildPreferenceFragment(preferenceResId: Int, root: String?): LeanbackPreferenceFragmentCompat { - val fragment = PrefFragment() - val args = Bundle() - args.putInt(PREFERENCE_RESOURCE_ID, preferenceResId) - args.putString(PREFERENCE_ROOT, root) - fragment.arguments = args - return fragment - } - - class PrefFragment : LeanbackPreferenceFragmentCompat() { - override fun onCreatePreferences(bundle: Bundle?, s: String?) { - setPreferencesFromResource(R.xml.leanback_preferences, s) - /*val root = arguments?.getString(PREFERENCE_ROOT, null) - val prefResId = arguments?.getInt(PREFERENCE_RESOURCE_ID)!! - if (root == null) { - addPreferencesFromResource(prefResId) - } else { - setPreferencesFromResource(prefResId, root) - }*/ - } - - override fun onPreferenceTreeClick(preference: Preference): Boolean { - /*if (preference.key.equals(getString(R.string.pref_key_login))) { - // Open an AuthenticationActivity - startActivity(Intent(activity, AuthenticationActivity::class.java)) - }*/ - return super.onPreferenceTreeClick(preference) - } - } - - companion object { - private const val PREFERENCE_RESOURCE_ID = "preferenceResource" - private const val PREFERENCE_ROOT = "root" - } -} \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainActivity.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainActivity.kt index c2f1c1c51..1957be689 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainActivity.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainActivity.kt @@ -2,6 +2,8 @@ package com.programmersbox.animeworldtv import android.os.Bundle import androidx.fragment.app.FragmentActivity +import com.programmersbox.anime_sources.Sources +import com.programmersbox.models.sourcePublish /** * Loads [MainFragment]. @@ -11,6 +13,19 @@ class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + if (currentService == null) { + val s = Sources.values().random() + sourcePublish.onNext(s) + currentService = s.serviceName + } else if (currentService != null) { + try { + Sources.valueOf(currentService!!) + } catch (e: IllegalArgumentException) { + null + }?.let(sourcePublish::onNext) + } + if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .replace(R.id.main_browse_fragment, MainFragment()) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt index 9f5b786f5..b077653c3 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt @@ -19,8 +19,8 @@ import androidx.leanback.widget.* import com.bumptech.glide.Glide import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition -import com.programmersbox.anime_sources.anime.WcoSubbed import com.programmersbox.models.ItemModel +import com.programmersbox.models.sourcePublish import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.addTo @@ -112,7 +112,12 @@ class MainFragment : BrowseSupportFragment() { rowsAdapter.add(ListRow(header, listRowAdapter)) }*/ - WcoSubbed.getList() + sourcePublish + .flatMapSingle { + it.getList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } //Yts.getRecent() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -133,6 +138,18 @@ class MainFragment : BrowseSupportFragment() { it.groupBy { it.title.firstOrNull() } } .subscribeBy { + rowsAdapter.clear() + + val gridHeader = HeaderItem(NUM_ROWS.toLong(), "PREFERENCES") + + val mGridPresenter = GridItemPresenter() + val gridRowAdapter = ArrayObjectAdapter(mGridPresenter) + gridRowAdapter.add(resources.getString(R.string.favorites)) + //gridRowAdapter.add(resources.getString(R.string.grid_view)) + //gridRowAdapter.add(getString(R.string.error_fragment)) + gridRowAdapter.add(resources.getString(R.string.personal_settings)) + rowsAdapter.add(ListRow(gridHeader, gridRowAdapter)) + it.entries.forEach { val (t, u) = it val listRowAdapter = ArrayObjectAdapter(cardPresenter) @@ -162,8 +179,8 @@ class MainFragment : BrowseSupportFragment() { val mGridPresenter = GridItemPresenter() val gridRowAdapter = ArrayObjectAdapter(mGridPresenter) gridRowAdapter.add(resources.getString(R.string.favorites)) - gridRowAdapter.add(resources.getString(R.string.grid_view)) - gridRowAdapter.add(getString(R.string.error_fragment)) + //gridRowAdapter.add(resources.getString(R.string.grid_view)) + //gridRowAdapter.add(getString(R.string.error_fragment)) gridRowAdapter.add(resources.getString(R.string.personal_settings)) rowsAdapter.add(ListRow(gridHeader, gridRowAdapter)) @@ -210,9 +227,9 @@ class MainFragment : BrowseSupportFragment() { val intent = Intent(context!!, SettingsActivity::class.java) startActivity(intent) } - item.contains(getString(R.string.grid_view)) -> { + /*item.contains(getString(R.string.grid_view)) -> { FirebaseAuthentication.signIn(requireActivity()) - } + }*/ item.contains(getString(R.string.favorites)) -> { val intent = Intent(context!!, FavoritesActivity::class.java) startActivity(intent) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt index c6e1140a0..afe7d1bd9 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt @@ -10,13 +10,14 @@ import androidx.fragment.app.Fragment import androidx.leanback.app.SearchFragment import androidx.leanback.app.SearchSupportFragment import androidx.leanback.widget.* -import com.programmersbox.anime_sources.anime.WcoSubbed import com.programmersbox.models.ItemModel +import com.programmersbox.models.sourcePublish import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.addTo import io.reactivex.rxkotlin.subscribeBy import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit /** * A simple [Fragment] subclass. @@ -62,7 +63,12 @@ class CustomSearchFragment : SearchSupportFragment(), SearchSupportFragment.Sear super.onCreate(savedInstanceState) setSearchResultProvider(this) setOnItemViewClickedListener(ItemViewClickedListener()) - WcoSubbed.getList() + sourcePublish + .flatMapSingle { + it.getList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { searchList.addAll(it) } @@ -87,9 +93,32 @@ class CustomSearchFragment : SearchSupportFragment(), SearchSupportFragment.Sear override fun onQueryTextSubmit(query: String): Boolean { rowsAdapter.clear() if (!TextUtils.isEmpty(query)) { - delayedLoad.setSearchQuery(query) - handler.removeCallbacks(delayedLoad) - handler.postDelayed(delayedLoad, SEARCH_DELAY_MS) + //delayedLoad.setSearchQuery(query) + //handler.removeCallbacks(delayedLoad) + //handler.postDelayed(delayedLoad, SEARCH_DELAY_MS) + sourcePublish + .flatMapSingle { + it.searchList(query, list = searchList) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .delay(SEARCH_DELAY_MS, TimeUnit.MILLISECONDS) + .map { it.groupBy { it.title.firstOrNull().toString() } } + .subscribe { + it.forEach { + val (t, u) = it + val listRowAdapter = ArrayObjectAdapter(CardPresenter()) + + listRowAdapter.addAll(0, u) + + val header = HeaderItem(t.hashCode().toLong(), t) + + rowsAdapter.add(ListRow(header, listRowAdapter)) + } + } + .addTo(disposable) } return true } diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SettingsActivity.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SettingsActivity.kt new file mode 100644 index 000000000..d8c8cef9d --- /dev/null +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SettingsActivity.kt @@ -0,0 +1,163 @@ +package com.programmersbox.animeworldtv + +import android.graphics.drawable.Drawable +import android.os.Bundle +import androidx.fragment.app.FragmentActivity +import androidx.leanback.preference.LeanbackPreferenceFragmentCompat +import androidx.leanback.preference.LeanbackSettingsFragmentCompat +import androidx.preference.DialogPreference +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceScreen +import com.bumptech.glide.Glide +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.firebase.auth.FirebaseUser +import com.programmersbox.anime_sources.Sources +import com.programmersbox.models.sourcePublish +import com.programmersbox.thirdpartyutils.into +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.addTo + +class SettingsActivity : FragmentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.settings_fragment) + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.settings_fragment, SettingsFragment()) + .commitNow() + } + } +} + +class SettingsFragment : LeanbackSettingsFragmentCompat(), DialogPreference.TargetFragment { + private var mPreferenceFragment: PreferenceFragmentCompat? = null + override fun onPreferenceStartInitialScreen() { + mPreferenceFragment = buildPreferenceFragment(R.xml.leanback_preferences, null) + startPreferenceFragment(mPreferenceFragment!!) + } + + override fun onPreferenceStartFragment( + preferenceFragment: PreferenceFragmentCompat?, + preference: Preference? + ): Boolean { + return false + } + + override fun findPreference(key: CharSequence): T? = + mPreferenceFragment?.findPreference(key) + + override fun onPreferenceStartScreen( + preferenceFragment: PreferenceFragmentCompat?, + preferenceScreen: PreferenceScreen + ): Boolean { + startPreferenceFragment(buildPreferenceFragment(R.xml.leanback_preferences, preferenceScreen.key)) + return true + } + + private fun buildPreferenceFragment(preferenceResId: Int, root: String?): LeanbackPreferenceFragmentCompat { + val fragment = PrefFragment() + val args = Bundle() + args.putInt(PREFERENCE_RESOURCE_ID, preferenceResId) + args.putString(PREFERENCE_ROOT, root) + fragment.arguments = args + return fragment + } + + class PrefFragment : LeanbackPreferenceFragmentCompat() { + + private val disposable = CompositeDisposable() + + override fun onCreatePreferences(bundle: Bundle?, s: String?) { + //setPreferencesFromResource(R.xml.leanback_preferences, s) + val root = arguments?.getString(PREFERENCE_ROOT, null) + val prefResId = arguments?.getInt(PREFERENCE_RESOURCE_ID)!! + if (root == null) { + addPreferencesFromResource(prefResId) + } else { + setPreferencesFromResource(prefResId, root) + } + + findPreference("user_account")?.let { p -> + + fun accountChanges(user: FirebaseUser?) { + activity?.let { + Glide.with(this@PrefFragment) + .load(user?.photoUrl) + .placeholder(R.mipmap.ic_launcher) + .error(R.mipmap.ic_launcher) + .fallback(R.mipmap.ic_launcher) + .circleCrop() + .into { resourceReady { image, _ -> p.icon = image } } + } + p.title = user?.displayName ?: "User" + } + + FirebaseAuthentication.auth.addAuthStateListener { accountChanges(it.currentUser) } + + accountChanges(FirebaseAuthentication.currentUser) + } + + findPreference("about_version")?.let { p -> + p.title = + getString( + R.string.currentVersion, + context?.packageManager?.getPackageInfo(requireContext().packageName, 0)?.versionName.orEmpty() + ) + } + + findPreference("current_source")?.let { p -> + + p.setOnPreferenceClickListener { + val list = Sources.values() + val service = requireContext().currentService + MaterialAlertDialogBuilder(requireContext(), R.style.Theme_MaterialComponents) + .setTitle(R.string.chooseASource) + .setSingleChoiceItems( + list.map { it.serviceName }.toTypedArray(), + list.indexOfFirst { it.serviceName == service } + ) { d, i -> + sourcePublish.onNext(list[i]) + requireContext().currentService = list[i].serviceName + d.dismiss() + } + .setPositiveButton(R.string.done) { d, _ -> d.dismiss() } + .show() + true + } + sourcePublish.subscribe { p.title = getString(R.string.currentSource, it.serviceName) } + .addTo(disposable) + } + } + + override fun onPreferenceTreeClick(preference: Preference): Boolean { + if (preference.key.equals("user_account")) { + // Open an AuthenticationActivity + //startActivity(Intent(activity, AuthenticationActivity::class.java)) + FirebaseAuthentication.currentUser?.let { + MaterialAlertDialogBuilder(this@PrefFragment.requireContext()) + .setTitle("Log Out") + .setMessage("Are you sure?") + .setPositiveButton("Yes") { d, _ -> + FirebaseAuthentication.signOut() + d.dismiss() + } + .setNegativeButton("No") { d, _ -> d.dismiss() } + .show() + } ?: FirebaseAuthentication.signIn(requireActivity()) + } + return super.onPreferenceTreeClick(preference) + } + + override fun onDestroy() { + super.onDestroy() + disposable.dispose() + } + + } + + companion object { + private const val PREFERENCE_RESOURCE_ID = "preferenceResource" + private const val PREFERENCE_ROOT = "root" + } +} \ No newline at end of file diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt index af00426d1..a45e72f9c 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/TvUtils.kt @@ -2,6 +2,7 @@ package com.programmersbox.animeworldtv import android.annotation.SuppressLint import android.app.Activity +import android.content.Context import com.firebase.ui.auth.AuthUI import com.google.android.gms.tasks.Task import com.google.android.gms.tasks.Tasks @@ -14,11 +15,14 @@ import com.google.firebase.firestore.ListenerRegistration import com.google.firebase.firestore.ktx.toObjects import com.programmersbox.favoritesdatabase.ChapterWatched import com.programmersbox.favoritesdatabase.DbModel +import com.programmersbox.gsonutils.sharedPrefObjectDelegate import com.programmersbox.rxutils.toLatestFlowable import io.reactivex.Completable import io.reactivex.subjects.PublishSubject import org.koin.core.component.KoinComponent +var Context.currentService: String? by sharedPrefObjectDelegate(null) + object FirebaseAuthentication : KoinComponent { private const val RC_SIGN_IN = 32 diff --git a/animeworldtv/src/main/res/layout/settings_fragment.xml b/animeworldtv/src/main/res/layout/settings_fragment.xml index b47124cac..76c11cf45 100644 --- a/animeworldtv/src/main/res/layout/settings_fragment.xml +++ b/animeworldtv/src/main/res/layout/settings_fragment.xml @@ -1,4 +1,13 @@ + diff --git a/animeworldtv/src/main/res/values/strings.xml b/animeworldtv/src/main/res/values/strings.xml index 16e58b128..27630d3dc 100644 --- a/animeworldtv/src/main/res/values/strings.xml +++ b/animeworldtv/src/main/res/values/strings.xml @@ -16,6 +16,11 @@ Remove from Favorites Add to Favorites + Version: %s + Choose a Source + Done + Current Source: %s + An error occurred Dismiss diff --git a/animeworldtv/src/main/res/values/themes.xml b/animeworldtv/src/main/res/values/themes.xml index d44e065fc..70880c067 100644 --- a/animeworldtv/src/main/res/values/themes.xml +++ b/animeworldtv/src/main/res/values/themes.xml @@ -1,4 +1,11 @@ \ No newline at end of file diff --git a/animeworldtv/src/main/res/xml/leanback_preferences.xml b/animeworldtv/src/main/res/xml/leanback_preferences.xml index 3cbb198c4..ccfe3b2b3 100644 --- a/animeworldtv/src/main/res/xml/leanback_preferences.xml +++ b/animeworldtv/src/main/res/xml/leanback_preferences.xml @@ -1,8 +1,6 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - + app:key="about_version" + app:title="Version: " /> + + - + app:title="Force Stop"><!– Start an Intent –> + app:title="Uninstall"><!– Start an Intent –> + app:title="More Information" />--> + + + \ No newline at end of file From 19ce9869162cfbd7fb98c4970f4b015cc751fc4f Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Wed, 7 Jul 2021 12:12:11 -0400 Subject: [PATCH 5/8] - added a error handler --- .../main/java/com/programmersbox/animeworldtv/MainFragment.kt | 1 + .../main/java/com/programmersbox/animeworldtv/SearchFragment.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt index b077653c3..8d27f8744 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/MainFragment.kt @@ -117,6 +117,7 @@ class MainFragment : BrowseSupportFragment() { it.getList() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .onErrorReturnItem(emptyList()) } //Yts.getRecent() .subscribeOn(Schedulers.io()) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt index afe7d1bd9..4bc066060 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/SearchFragment.kt @@ -101,6 +101,7 @@ class CustomSearchFragment : SearchSupportFragment(), SearchSupportFragment.Sear it.searchList(query, list = searchList) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .onErrorReturnItem(emptyList()) } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) From 650265d53bef74fff11bd3774d3995e106ada14e Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Thu, 8 Jul 2021 08:57:08 -0400 Subject: [PATCH 6/8] - changed chapter items to show both options --- .../programmersbox/uiviews/ChapterAdapter.kt | 4 +- .../programmersbox/uiviews/DetailsFragment.kt | 2 +- .../uiviews/utils/BindingUtils.kt | 3 +- UIViews/src/main/res/layout/chapter_item.xml | 196 +++++++----------- .../src/main/res/layout/details_fragment.xml | 1 + build.gradle | 2 +- 6 files changed, 78 insertions(+), 130 deletions(-) diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/ChapterAdapter.kt b/UIViews/src/main/java/com/programmersbox/uiviews/ChapterAdapter.kt index 7bd479b24..534aaaf98 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/ChapterAdapter.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/ChapterAdapter.kt @@ -50,8 +50,8 @@ class ChapterAdapter( binding.swatch = swatchInfo binding.executePendingBindings() binding.readChapterButton.setOnClickListener { binding.chapterListCard.performClick() } - binding.markedReadButton.setOnClickListener { binding.readChapter.performClick() } - binding.uploadedInfo2.setOnClickListener { binding.chapterListCard.performClick() } + //binding.markedReadButton.setOnClickListener { binding.readChapter.performClick() } + //binding.uploadedInfo2.setOnClickListener { binding.chapterListCard.performClick() } binding.chapterListCard.setOnClickListener { genericInfo.chapterOnClick(chapterModel, dataList, context) binding.readChapter.isChecked = true diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/DetailsFragment.kt b/UIViews/src/main/java/com/programmersbox/uiviews/DetailsFragment.kt index ecb9f1c0a..b2312737c 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/DetailsFragment.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/DetailsFragment.kt @@ -199,7 +199,7 @@ class DetailsFragment : Fragment() { BooleanArray(adapter.itemCount) { i -> checked.any { it1 -> it1.url == adapter[i].url } } ) { _, i, _ -> (binding.infoChapterList.findViewHolderForAdapterPosition(i) as? ChapterAdapter.ChapterHolder) - ?.binding?.markedReadButton?.performClick() + ?.binding?.readChapter?.performClick() } .setPositiveButton(R.string.done) { d, _ -> d.dismiss() } .show() diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/utils/BindingUtils.kt b/UIViews/src/main/java/com/programmersbox/uiviews/utils/BindingUtils.kt index bd394c99f..c1bc1862f 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/utils/BindingUtils.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/utils/BindingUtils.kt @@ -69,7 +69,7 @@ fun collapsingToolbarColors(view: CollapsingToolbarLayout, swatchInfo: SwatchInf @BindingAdapter("titleColor") fun titleColor(view: TextView, swatchInfo: SwatchInfo?) { - swatchInfo?.titleColor?.let { view.setTextColor(it) } + swatchInfo?.bodyColor?.let { view.setTextColor(it) } } @BindingAdapter("bodyColor") @@ -97,6 +97,7 @@ fun buttonTint(view: CheckBox, swatchInfo: SwatchInfo?) { fun startButtonColor(view: MaterialButton, swatchInfo: SwatchInfo?) { swatchInfo?.bodyColor?.let { view.iconTint = ColorStateList.valueOf(it) } swatchInfo?.bodyColor?.let { view.setTextColor(it) } + swatchInfo?.bodyColor?.let { view.strokeColor = ColorStateList.valueOf(it) } } @BindingAdapter("uploadedText") diff --git a/UIViews/src/main/res/layout/chapter_item.xml b/UIViews/src/main/res/layout/chapter_item.xml index 2a99ab48e..41f1cad68 100644 --- a/UIViews/src/main/res/layout/chapter_item.xml +++ b/UIViews/src/main/res/layout/chapter_item.xml @@ -1,8 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -15,148 +14,95 @@ type="com.programmersbox.models.SwatchInfo" /> - + android:layout_marginVertical="5dp" + app:cardBackgroundColor="@{swatch.rgb}" + app:cardCornerRadius="0dp" + tools:cardBackgroundColor="@sample/sample_colors"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> - - - + + - - + + - - - - - - - - + android:orientation="horizontal" + android:weightSum="2"> + app:strokeColor="#ffffff" /> - - - + android:layout_height="match_parent" + android:layout_marginHorizontal="5dp" + android:layout_weight="1" + android:drawableTint="#ffffff" + android:text="@string/download_chapter" + android:textColor="?android:textColorPrimary" + app:icon="@drawable/ic_baseline_download_24" + app:iconGravity="textTop" + app:iconTint="?android:textColorPrimary" + app:startButtonColor="@{swatch}" + app:strokeColor="#ffffff" /> - + - + - + \ No newline at end of file diff --git a/UIViews/src/main/res/layout/details_fragment.xml b/UIViews/src/main/res/layout/details_fragment.xml index 7976fcf4a..d7caaa35b 100644 --- a/UIViews/src/main/res/layout/details_fragment.xml +++ b/UIViews/src/main/res/layout/details_fragment.xml @@ -224,6 +224,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:layout_marginVertical="5dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/chapter_item" /> diff --git a/build.gradle b/build.gradle index 234eac3a5..27ced641a 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.kotlin_version = "1.5.20" ext.jakepurple13 = "10.6.5" - ext.otakuVersionName = "18.7" + ext.otakuVersionName = "19.0" ext.latestAboutLibsRelease = "+" ext.coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0" From b9fda487dd25973c65d7a657c59b7d9b40832ef4 Mon Sep 17 00:00:00 2001 From: jakepurple13 Date: Thu, 8 Jul 2021 12:22:52 -0400 Subject: [PATCH 7/8] - added two new sources! Putlocker and Vidstreaming! --- .../programmersbox/anime_sources/Sources.kt | 4 + .../anime_sources/anime/Putlocker.kt | 173 ++++++++++++++++ .../anime_sources/anime/Vidstreaming.kt | 193 ++++++++++++++++++ .../anime_sources/ExampleUnitTest.kt | 132 +++++++++++- .../programmersbox/animeworld/GenericAnime.kt | 2 +- animeworldtv/src/main/AndroidManifest.xml | 1 + .../animeworldtv/AnimeWorldTV.kt | 10 + .../animeworldtv/PlaybackVideoFragment.kt | 18 +- 8 files changed, 526 insertions(+), 7 deletions(-) create mode 100644 anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Putlocker.kt create mode 100644 anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Vidstreaming.kt diff --git a/anime_sources/src/main/java/com/programmersbox/anime_sources/Sources.kt b/anime_sources/src/main/java/com/programmersbox/anime_sources/Sources.kt index 79bd62705..8622fcb49 100644 --- a/anime_sources/src/main/java/com/programmersbox/anime_sources/Sources.kt +++ b/anime_sources/src/main/java/com/programmersbox/anime_sources/Sources.kt @@ -14,6 +14,10 @@ enum class Sources(private val api: ApiService) : ApiService by api { YTS(Yts), + VIDSTREAMING(Vidstreaming), + + PUTLOCKERTV(PutlockerTV), PUTLOCKERANIME(PutlockerAnime), PUTLOCKERCARTOONS(PutlockerCartoons), PUTLOCKERMOVIES(PutlockerMovies), + ANIMEKISA_SUBBED(AnimeKisaSubbed), ANIMEKISA_DUBBED(AnimeKisaDubbed), ANIMEKISA_MOVIES(AnimeKisaMovies), WCO_DUBBED(WcoDubbed), WCO_SUBBED(WcoSubbed), WCO_CARTOON(WcoCartoon), WCO_MOVIES(WcoMovies), WCO_OVA(WcoOva), diff --git a/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Putlocker.kt b/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Putlocker.kt new file mode 100644 index 000000000..42883b32c --- /dev/null +++ b/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Putlocker.kt @@ -0,0 +1,173 @@ +package com.programmersbox.anime_sources.anime + +import android.util.Base64 +import com.programmersbox.anime_sources.ShowApi +import com.programmersbox.anime_sources.toJsoup +import com.programmersbox.models.ChapterModel +import com.programmersbox.models.InfoModel +import com.programmersbox.models.ItemModel +import com.programmersbox.models.Storage +import io.reactivex.Single +import org.jsoup.Jsoup +import org.jsoup.nodes.Document + +object PutlockerTV : Putlocker("tv-series.html") { + override val serviceName: String get() = "PUTLOCKERTV" +} + +object PutlockerAnime : Putlocker("anime-series.html") { + override val serviceName: String get() = "PUTLOCKERANIME" +} + +object PutlockerCartoons : Putlocker("cartoon.html") { + override val serviceName: String get() = "PUTLOCKERCARTOONS" +} + +object PutlockerMovies : Putlocker("cinema-movies.html") { + override val serviceName: String get() = "PUTLOCKERMOVIES" +} + +abstract class Putlocker(allPath: String) : ShowApi( + baseUrl = "https://putlockers.fm", + allPath = allPath, + recentPath = "recently-added.html" +) { + override fun getRecent(doc: Document): Single> = Single.create { + doc + .select("ul.list") + .select("div.item") + .map { + + val des = it.select("a.thumb").attr("onmouseover") + .orEmpty() + + val regex = "Tip\\('(.*)'\\)".toRegex() + .find(des) + ?.groups?.get(1)?.value + .orEmpty() + + ItemModel( + title = it.text(), + description = Jsoup.parse(regex).text(), + imageUrl = it.select("img[alt]").attr("abs:src"), + url = it.select("a.thumb").attr("abs:href"), + source = this + ) + } + .let(it::onSuccess) + } + + override fun searchList(searchText: CharSequence, page: Int, list: List): Single> { + return Single.create> { + + "$baseUrl/search-movies/${searchText.split(" ").joinToString("+") { it.trim() }}.html".toJsoup() + .select("ul.list") + .select("div.item") + .map { + + val des = it.select("a.thumb").attr("onmouseover") + .orEmpty() + + val regex = "Tip\\('(.*)'\\)".toRegex() + .find(des) + ?.groups?.get(1)?.value + .orEmpty() + + ItemModel( + title = it.text(), + description = Jsoup.parse(regex).text(), + imageUrl = it.select("img[alt]").attr("abs:src"), + url = it.select("a.thumb").attr("abs:href"), + source = this + ) + } + .let(it::onSuccess) + + } + .onErrorResumeNext(super.searchList(searchText, page, list)) + } + + override fun getList(doc: Document): Single> = Single.create { + doc + .select("ul.list") + .select("div.item") + .map { + + val des = it.select("a.thumb").attr("onmouseover") + .orEmpty() + + val regex = "Tip\\('(.*)'\\)".toRegex() + .find(des) + ?.groups?.get(1)?.value + .orEmpty() + + ItemModel( + title = it.text(), + description = Jsoup.parse(regex).text(), + imageUrl = it.select("img[alt]").attr("abs:src"), + url = it.select("a.thumb").attr("abs:href"), + source = this + ) + } + .let(it::onSuccess) + } + + override fun getItemInfo(source: ItemModel, doc: Document): Single = Single.create { + InfoModel( + source = this, + title = source.title, + url = source.url, + alternativeNames = emptyList(), + description = doc.select("p").select("strong:contains(Synopsis:)").text(), + imageUrl = source.imageUrl, + genres = doc.select("p").select("strong:contains(Genres:)").text().split(","), + chapters = doc.select("a.episode") + .map { + ChapterModel( + it.text(), + it.select("a").attr("abs:href"), + "", + source.url, + this + ) + }.reversed() + .ifEmpty { + listOf( + ChapterModel( + source.title, + source.url, + "", + source.url, + this + ) + ) + } + ) + .let(it::onSuccess) + } + + override fun getChapterInfo(chapterModel: ChapterModel): Single> { + return Single.create { + + val d = chapterModel.url.toJsoup() + + val regex = "Base64.decode\\(\"(.*)\"\\)".toRegex().find(d?.toString().orEmpty())?.groups?.get(1)?.value + val b = Jsoup.parse(String(Base64.decode(regex, Base64.DEFAULT))).select("iframe").attr("abs:src") + val links = b.toJsoup().select("source").attr("src") + + it.onSuccess( + listOf( + Storage( + link = links, + source = chapterModel.url, + quality = "Good", + sub = "Yes" + ).apply { + headers["referer"] = "http://eplayvid.com/" + } + ) + ) + } + } + +} \ No newline at end of file diff --git a/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Vidstreaming.kt b/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Vidstreaming.kt new file mode 100644 index 000000000..6436179d4 --- /dev/null +++ b/anime_sources/src/main/java/com/programmersbox/anime_sources/anime/Vidstreaming.kt @@ -0,0 +1,193 @@ +package com.programmersbox.anime_sources.anime + +import androidx.annotation.WorkerThread +import com.programmersbox.anime_sources.ShowApi +import com.programmersbox.anime_sources.toJsoup +import com.programmersbox.gsonutils.fromJson +import com.programmersbox.models.ChapterModel +import com.programmersbox.models.InfoModel +import com.programmersbox.models.ItemModel +import com.programmersbox.models.Storage +import io.reactivex.Single +import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.RequestBody +import okio.BufferedSink +import org.jsoup.nodes.Document + +object Vidstreaming : ShowApi( + baseUrl = "https://vidstreaming.io", + allPath = "popular", + recentPath = "" +) { + + override val serviceName: String get() = "VIDSTREAMING" + + override fun getRecent(doc: Document): Single> = Single.create { + doc + .select("li.video-block") + .map { + ItemModel( + title = it.select("div.name").text(), + description = "", + imageUrl = it.select("div.picture").select("img").attr("abs:src"), + url = it.select("a").first().attr("abs:href"), + source = this + ) + } + .let(it::onSuccess) + } + + override fun getList(doc: Document): Single> = Single.create { + doc + .select("li.video-block") + .map { + ItemModel( + title = it.select("div.name").text(), + description = "", + imageUrl = it.select("div.picture").select("img").attr("abs:src"), + url = it.select("a").first().attr("abs:href"), + source = this + ) + } + .let(it::onSuccess) + } + + override fun getItemInfo(source: ItemModel, doc: Document): Single = Single.create { + InfoModel( + source = this, + title = source.title, + url = source.url, + alternativeNames = emptyList(), + description = doc.select("dic.post-entry").text(), + imageUrl = source.imageUrl, + genres = emptyList(), + chapters = doc.select("li.video-block").map { + ChapterModel( + it.select("div.name").text(), + it.select("a").attr("abs:href"), + it.select("span.date").text(), + source.url, + this + ) + } + ) + .let(it::onSuccess) + } + + override fun getChapterInfo(chapterModel: ChapterModel): Single> { + return Single.create { + + //val e = "https://vidstreaming.io/videos/tensei-shitara-slime-datta-ken-episode-24-9".toJsoup() + //println(e) + + val v = chapterModel.url.toJsoup().select("div.play-video").select("iframe").attr("abs:src") + + val s = v.toJsoup() + val links = s.select("li.linkserver") + + val xstream = links.find { it.text() == "Xstreamcdn" }?.attr("abs:data-video") + + val xApi = "https://fcdn.stream/api/source/${xstream?.split("/")?.last()}" + val api = getApiPost(xApi).fromJson() + val file = api?.data?.firstOrNull() + //println(getApi(file!!)) + + it.onSuccess( + listOf( + Storage( + link = file?.file, + source = chapterModel.url, + quality = file?.label, + sub = "Yes" + ) + ) + ) + + } + } + + data class Xstream(val success: Boolean?, val player: Player?, val data: List?, val captions: List?, val is_vr: Boolean?) + + data class XstreamData(val file: String?, val label: String?, val type: String?) + + data class Player( + val poster_file: String?, + val logo_file: String?, + val logo_position: String?, + val logo_link: String?, + val logo_margin: Number?, + val aspectratio: String?, + val powered_text: String?, + val powered_url: String?, + val css_background: String?, + val css_text: String?, + val css_menu: String?, + val css_mntext: String?, + val css_caption: String?, + val css_cttext: String?, + val css_ctsize: Number?, + val css_ctopacity: Number?, + val css_ctedge: String?, + val css_icon: String?, + val css_ichover: String?, + val css_tsprogress: String?, + val css_tsrail: String?, + val css_button: String?, + val css_bttext: String?, + val opt_autostart: Boolean?, + val opt_title: Boolean?, + val opt_quality: Boolean?, + val opt_caption: Boolean?, + val opt_download: Boolean?, + val opt_sharing: Boolean?, + val opt_playrate: Boolean?, + val opt_mute: Boolean?, + val opt_loop: Boolean?, + val opt_vr: Boolean?, + val opt_cast: Boolean?, + val opt_nodefault: Boolean?, + val opt_forceposter: Boolean?, + val opt_parameter: Boolean?, + val restrict_domain: String?, + val restrict_action: String?, + val restrict_target: String?, + val resume_enable: Boolean?, + val resume_text: String?, + val resume_yes: String?, + val resume_no: String?, + val adb_enable: Boolean?, + val adb_offset: Number?, + val adb_text: String?, + val ads_adult: Boolean?, + val ads_pop: Boolean?, + val ads_vast: Boolean?, + val ads_free: Boolean?, + val trackingId: String?, + val income: Boolean?, + val incomePop: Boolean?, + val logger: String?, + val revenue: String?, + val revenue_fallback: String?, + val revenue_track: String? + ) + + @WorkerThread + private fun getApiPost(url: String, builder: okhttp3.Request.Builder.() -> Unit = {}): String? { + val request = okhttp3.Request.Builder() + .url(url) + .apply(builder) + .post(object : RequestBody() { + override fun contentType(): MediaType? = "application/json".toMediaTypeOrNull() + + override fun writeTo(sink: BufferedSink) { + } + + }) + .build() + val response = OkHttpClient().newCall(request).execute() + return if (response.code == 200) response.body!!.string() else null + } + +} diff --git a/anime_sources/src/test/java/com/programmersbox/anime_sources/ExampleUnitTest.kt b/anime_sources/src/test/java/com/programmersbox/anime_sources/ExampleUnitTest.kt index 45ca4a885..a8b573c8a 100644 --- a/anime_sources/src/test/java/com/programmersbox/anime_sources/ExampleUnitTest.kt +++ b/anime_sources/src/test/java/com/programmersbox/anime_sources/ExampleUnitTest.kt @@ -1,10 +1,7 @@ package com.programmersbox.anime_sources import androidx.annotation.WorkerThread -import com.programmersbox.anime_sources.anime.AnimeKisaSubbed -import com.programmersbox.anime_sources.anime.AnimeToonDubbed -import com.programmersbox.anime_sources.anime.WcoDubbed -import com.programmersbox.anime_sources.anime.Yts +import com.programmersbox.anime_sources.anime.* import com.programmersbox.gsonutils.getApi import com.programmersbox.gsonutils.header import com.programmersbox.models.ChapterModel @@ -29,6 +26,133 @@ import org.junit.Test */ class ExampleUnitTest { + @Test + fun putlockerTest() { + + //val f = "http://putlockers.fm/recently-added.html".toJsoup() + //println(f) + + //PutlockerTV.IS_TEST = true + + /*val list = PutlockerTV.getList().blockingGet().randomOrNull() + ?.toInfoModel()?.blockingGet() + ?.chapters?.firstOrNull() + ?.getChapterInfo()?.blockingGet()?.firstOrNull() + //println(list.joinToString("\n")) + println(list?.link)*/ + + val search = PutlockerTV.searchList("the mask", list = emptyList()).blockingGet() + //println(search.joinToString("\n")) + println(search.first().toInfoModel().blockingGet()) + + //println(list?.link?.toJsoup()) + + /*val items = f.select("ul.list").select("div.item").map { it.select("a.thumb").attr("abs:href") } + //println(items.joinToString("\n")) + + val d = items.firstOrNull()?.toJsoup() + //println(d) + + val regex = "Base64.decode\\(\"(.*)\"\\)".toRegex().find(d?.toString().orEmpty())?.groups?.get(1)?.value + + //println(regex) + + val b = Jsoup.parse(String(Base64.getDecoder().decode(regex))).select("iframe").attr("abs:src") + //println(b) + + val links = b.toJsoup() + println(links)*/ + + } + + @Test + fun watchmovieTest() { + val f = Jsoup.connect("https://watchmovie.movie/search.html").data("keyword", "One").get() + println(f) + } + + @Test + fun vidStreamingTest() { + + //val f = "https://vidstreaming.io/popular".toJsoup() + //println(f) + + val f = Vidstreaming.getList().blockingGet().firstOrNull()?.toInfoModel()?.blockingGet() + + println(f) + + /*val e = "https://vidstreaming.io/videos/tensei-shitara-slime-datta-ken-episode-24-9".toJsoup() + //println(e) + + val v = e.select("div.play-video").select("iframe").attr("abs:src") + println(v) + + val s = v.toJsoup() + //println(s) + val links = s.select("li.linkserver") + println(links.joinToString("\n")) + + val xstream = links.find { it.text() == "Xstreamcdn" }?.attr("abs:data-video") + println(xstream) + + //val x = xstream?.toJsoup() + //println(x) + + val xApi = "https://fcdn.stream/api/source/${xstream?.split("/")?.last()}" + println(xApi) + val api = getApiPost(xApi).fromJson() + println(api) + val file = api?.data?.firstOrNull()?.file + println(getApi(file!!))*/ + } + + @Test + fun fboxTest() { + //val f = "https://putlockernew.site/all-movies".toJsoup()//"https://putlockernew.site".toJsoup() + //println(f) + + val g = "https://putlockernew.site/watch-movie/america-the-motion-picture-2021_cw9q88erb/976x909-full-movie-online?watchnow=1".toJsoup() + //println(g) + + val d = g.select("div.show_player").select("iframe").attr("abs:src").toJsoup() + //println(d) + + //val mix = "]+src=\"([^\"]+)\"[^>]*><\\/iframe>".toRegex().find(doc.toString())!!.groups[1]!!.value + val doc2 = d//Jsoup.connect(mix.trim()).get() + val r = "\\}\\('(.+)',(\\d+),(\\d+),'([^']+)'\\.split\\('\\|'\\)".toRegex().find(doc2.toString())!! + fun encodeBaseN(num: Int, n: Int): String { + var num1 = num + val fullTable = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + //println("$num - $n") + val table = fullTable.substring(0..n - 1) + if (num1 == 0) return table[0].toString() + var ret = "" + while (num1 > 0) { + ret = (table[num1 % n].toString() + ret) + num1 = Math.floorDiv(num, n) + if (num1 == 1) num1 = 0 + //println("$ret - $num1") + } + return ret + } + val (obfucastedCode, baseTemp, countTemp, symbolsTemp) = r.destructured + //println(r.destructured.toList().joinToString("\n")) + val base = baseTemp.toInt() + var count = countTemp.toInt() + val symbols = symbolsTemp.split("|") + val symbolTable = mutableMapOf() + while (count > 0) { + count-- + val baseNCount = encodeBaseN(count, base) + symbolTable[baseNCount] = if (symbols[count].isNotEmpty()) symbols[count] else baseNCount + } + val unpacked = "\\b(\\w+)\\b".toRegex().replace(obfucastedCode) { symbolTable[it.groups[0]!!.value].toString() } + println(unpacked) + val search = "MDCore\\.v.*?=\"([^\"]+)".toRegex().find(unpacked)?.groups?.get(1)?.value + //"https:$search" + println(search) + } + @Test fun animekisaTest() { diff --git a/animeworld/src/main/java/com/programmersbox/animeworld/GenericAnime.kt b/animeworld/src/main/java/com/programmersbox/animeworld/GenericAnime.kt index e88f32f23..3fed64560 100644 --- a/animeworld/src/main/java/com/programmersbox/animeworld/GenericAnime.kt +++ b/animeworld/src/main/java/com/programmersbox/animeworld/GenericAnime.kt @@ -154,7 +154,7 @@ class GenericAnime(val context: Context) : GenericInfo { request.addHeader("User-Agent", "\"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0\"") request.addHeader("Accept", "text/html,video/mp4,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") request.addHeader("Access-Control-Allow-Origin", "*") - request.addHeader("Referer", "http://thewebsite.com") + request.addHeader("Referer", i.headers["referer"] ?: "http://thewebsite.com") request.addHeader("Connection", "keep-alive") i.headers.entries.forEach { request.headers[it.key] = it.value } diff --git a/animeworldtv/src/main/AndroidManifest.xml b/animeworldtv/src/main/AndroidManifest.xml index 15988bb70..88fed488a 100644 --- a/animeworldtv/src/main/AndroidManifest.xml +++ b/animeworldtv/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:usesCleartextTraffic="true" android:supportsRtl="true" android:theme="@style/Theme.OtakuWorld"> Date: Thu, 8 Jul 2021 13:43:53 -0400 Subject: [PATCH 8/8] - hopefully this will keep the tv on --- .../java/com/programmersbox/animeworldtv/PlaybackActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/PlaybackActivity.kt b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/PlaybackActivity.kt index b6a9e219a..8a9aa012c 100644 --- a/animeworldtv/src/main/java/com/programmersbox/animeworldtv/PlaybackActivity.kt +++ b/animeworldtv/src/main/java/com/programmersbox/animeworldtv/PlaybackActivity.kt @@ -1,6 +1,7 @@ package com.programmersbox.animeworldtv import android.os.Bundle +import android.view.WindowManager import androidx.fragment.app.FragmentActivity /** Loads [PlaybackVideoFragment]. */ @@ -8,6 +9,7 @@ class PlaybackActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) if (savedInstanceState == null) { supportFragmentManager.beginTransaction() .replace(android.R.id.content, PlaybackVideoFragment())