diff --git a/app/build.gradle b/app/build.gradle index 813029ad..a71a48b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,8 +91,8 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0-rc01' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.0-rc01' + implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0-alpha01' + implementation 'androidx.navigation:navigation-ui-ktx:2.5.0-alpha01' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' testImplementation 'junit:junit:4.13.2' @@ -105,7 +105,7 @@ dependencies { implementation "com.google.android.material:material:1.5.0" - implementation "androidx.preference:preference-ktx:1.1.1" + implementation "androidx.preference:preference-ktx:1.2.0" implementation 'com.github.bumptech.glide:glide:4.12.0' kapt 'com.github.bumptech.glide:compiler:4.12.0' @@ -157,7 +157,7 @@ dependencies { // API because cba maintaining it myself implementation "com.uwetrottmann.tmdb2:tmdb-java:2.6.0" - + implementation 'com.github.discord:OverlappingPanels:0.1.3' // debugImplementation because LeakCanary should only run in debug builds. // debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 5df55982..79fddbc1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -48,7 +48,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.requestRW import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.fragment_result.* +import kotlinx.android.synthetic.main.fragment_result_swipe.* import java.io.File import kotlin.concurrent.thread diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SflixProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SflixProvider.kt index 29dc2abd..51f8461d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SflixProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/SflixProvider.kt @@ -119,6 +119,23 @@ class SflixProvider(providerUrl: String, providerName: String) : MainAPI() { ?: throw RuntimeException("Unable to get id from '$url'") else dataId + val recommendations = + document.select("div.film_list-wrap > div.flw-item")?.mapNotNull { element -> + val titleHeader = + element.select("div.film-detail > .film-name > a") ?: return@mapNotNull null + val recUrl = fixUrlNull(titleHeader.attr("href")) ?: return@mapNotNull null + val recTitle = titleHeader.text() ?: return@mapNotNull null + val poster = element.select("div.film-poster > img")?.attr("data-src") + MovieSearchResponse( + recTitle, + recUrl, + this.name, + if (recUrl.contains("/movie/")) TvType.Movie else TvType.TvSeries, + poster, + year = null + ) + } + if (isMovie) { // Movies val episodesUrl = "$mainUrl/ajax/movie/episodes/$id" @@ -139,6 +156,7 @@ class SflixProvider(providerUrl: String, providerName: String) : MainAPI() { this.posterUrl = posterUrl this.plot = plot setDuration(duration) + this.recommendations = recommendations } } else { val seasonsDocument = app.get("$mainUrl/ajax/v2/tv/seasons/$id").document @@ -183,6 +201,7 @@ class SflixProvider(providerUrl: String, providerName: String) : MainAPI() { this.year = year this.plot = plot setDuration(duration) + this.recommendations = recommendations } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/AbstractPlayerFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/AbstractPlayerFragment.kt index 39383556..d19a4ae9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/AbstractPlayerFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/AbstractPlayerFragment.kt @@ -335,13 +335,16 @@ abstract class AbstractPlayerFragment( SubtitlesFragment.applyStyleEvent += ::onSubStyleChanged try { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) + context?.let { + val settingsManager = PreferenceManager.getDefaultSharedPreferences( + it + ) + val currentPrefSize = + settingsManager.getInt(getString(R.string.video_cache_key), 300) - val currentPrefSize = - settingsManager.getInt(getString(R.string.video_cache_key), 300) - - player.cacheSize = currentPrefSize * 1024L * 1024L - } catch (e : Exception) { + player.cacheSize = currentPrefSize * 1024L * 1024L + } + } catch (e: Exception) { logError(e) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt index 255122bc..ae22d282 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt @@ -974,8 +974,9 @@ open class FullScreenPlayer : AbstractPlayerFragment() { } try { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(activity) context?.let { ctx -> + val settingsManager = PreferenceManager.getDefaultSharedPreferences(ctx) + navigationBarHeight = ctx.getNavigationBarHeight() statusBarHeight = ctx.getStatusBarHeight() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index 770e5a74..f2065068 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.content.Intent.* import android.content.res.ColorStateList import android.content.res.Configuration +import android.graphics.Rect import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -29,6 +30,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.discord.panels.OverlappingPanelsLayout +import com.discord.panels.PanelsChildGestureRegionObserver import com.google.android.gms.cast.framework.CastButtonFactory import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastState @@ -85,6 +88,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImageBlur import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename import kotlinx.android.synthetic.main.fragment_result.* +import kotlinx.android.synthetic.main.fragment_result_swipe.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.withContext @@ -175,7 +179,7 @@ fun ResultEpisode.getWatchProgress(): Float { return (getDisplayPosition() / 1000).toFloat() / (duration / 1000).toFloat() } -class ResultFragment : Fragment() { +class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegionsListener { companion object { fun newInstance( url: String, @@ -375,7 +379,7 @@ class ResultFragment : Fragment() { ): View? { viewModel = ViewModelProvider(this)[ResultViewModel::class.java] - return inflater.inflate(R.layout.fragment_result, container, false) + return inflater.inflate(R.layout.fragment_result_swipe, container, false) } override fun onDestroyView() { @@ -491,8 +495,18 @@ class ResultFragment : Fragment() { } private fun setRecommendations(rec: List?) { - return - result_recommendations?.isGone = rec.isNullOrEmpty() + val isInvalid = rec.isNullOrEmpty() + result_recommendations?.isGone = isInvalid + result_recommendations_btt?.isGone = isInvalid + result_recommendations_btt?.setOnClickListener { + if(result_overlapping_panels?.getSelectedPanel()?.ordinal == 1) { + result_overlapping_panels?.openEndPanel() + } else { + result_overlapping_panels?.closePanels() + } + } + result_overlapping_panels?.setEndPanelLockState(if (isInvalid) OverlappingPanelsLayout.LockState.CLOSE else OverlappingPanelsLayout.LockState.UNLOCKED) + rec?.let { list -> (result_recommendations?.adapter as SearchAdapter?)?.apply { cardList = list @@ -502,8 +516,8 @@ class ResultFragment : Fragment() { } private fun fixGrid() { - activity?.getSpanCount()?.let { count -> - result_recommendations?.spanCount = count + activity?.getSpanCount()?.let { _ -> + //result_recommendations?.spanCount = count // this is due to discord not changing size with rotation } } @@ -534,6 +548,9 @@ class ResultFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) fixGrid() + result_recommendations?.spanCount = 3 + result_overlapping_panels?.setStartPanelLockState(OverlappingPanelsLayout.LockState.CLOSE) + result_overlapping_panels?.setEndPanelLockState(OverlappingPanelsLayout.LockState.CLOSE) updateUIListener = ::updateUI @@ -546,7 +563,7 @@ class ResultFragment : Fragment() { hideKeyboard() activity?.loadCache() - activity?.fixPaddingStatusbar(result_scroll) + activity?.fixPaddingStatusbar(result_top_bar) //activity?.fixPaddingStatusbar(result_barstatus) /* val backParameter = result_back.layoutParams as FrameLayout.LayoutParams @@ -1042,7 +1059,8 @@ class ResultFragment : Fragment() { max = (viewPos.duration / 1000).toInt() progress = (viewPos.position / 1000).toInt() } - result_resume_series_progress_text?.text = getString(R.string.resume_time_left).format((viewPos.duration - viewPos.position) / (60_000)) + result_resume_series_progress_text?.text = + getString(R.string.resume_time_left).format((viewPos.duration - viewPos.position) / (60_000)) } } } @@ -1528,4 +1546,8 @@ class ResultFragment : Fragment() { } } } + + override fun onGestureRegionsUpdate(gestureRegions: List) { + result_overlapping_panels?.setChildGestureRegions(gestureRegions) + } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index 4dc7d09f..167edc56 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -410,8 +410,8 @@ class SearchFragment : Fragment() { search_master_recycler?.adapter = masterAdapter search_master_recycler?.layoutManager = GridLayoutManager(context, 1) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - val isAdvancedSearch = settingsManager.getBoolean("advanced_search", true) + val settingsManager = context?.let { PreferenceManager.getDefaultSharedPreferences(it) } + val isAdvancedSearch = settingsManager?.getBoolean("advanced_search", true) ?: true search_master_recycler?.isVisible = isAdvancedSearch search_autofit_results?.isVisible = !isAdvancedSearch diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index 313c1e14..f65c8def 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -198,11 +198,11 @@ class SettingsFragment : PreferenceFragmentCompat() { val appThemePreference = findPreference(getString(R.string.app_theme_key))!! val subPreference = findPreference(getString(R.string.subtitle_settings_key))!! val videoCachePreference = findPreference(getString(R.string.video_cache_key))!! + val settingsManager = PreferenceManager.getDefaultSharedPreferences(requireContext()) videoCachePreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.video_cache_size_names) val prefValues = resources.getIntArray(R.array.video_cache_size_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentPrefSize = settingsManager.getInt(getString(R.string.video_cache_key), 300) @@ -255,8 +255,6 @@ class SettingsFragment : PreferenceFragmentCompat() { } subdubPreference.setOnPreferenceClickListener { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - activity?.getApiDubstatusSettings()?.let { current -> val dublist = DubStatus.values() val names = dublist.map { it.name } @@ -284,8 +282,6 @@ class SettingsFragment : PreferenceFragmentCompat() { } providerLangPreference.setOnPreferenceClickListener { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - activity?.getApiProviderLangSettings()?.let { current -> val allLangs = HashSet() for (api in apis) { @@ -348,7 +344,6 @@ class SettingsFragment : PreferenceFragmentCompat() { downloadPathPreference.setOnPreferenceClickListener { val dirs = getDownloadDirs() - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentDir = settingsManager.getString(getString(R.string.download_path_pref), null) ?: getDownloadDir().toString() @@ -376,7 +371,6 @@ class SettingsFragment : PreferenceFragmentCompat() { preferedMediaTypePreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.media_type_pref) val prefValues = resources.getIntArray(R.array.media_type_pref_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentPrefMedia = settingsManager.getInt(getString(R.string.prefer_media_type_key), 0) @@ -400,7 +394,6 @@ class SettingsFragment : PreferenceFragmentCompat() { allLayoutPreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.app_layout) val prefValues = resources.getIntArray(R.array.app_layout_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentLayout = settingsManager.getInt(getString(R.string.app_layout_key), -1) @@ -425,7 +418,6 @@ class SettingsFragment : PreferenceFragmentCompat() { colorPrimaryPreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.themes_overlay_names) val prefValues = resources.getStringArray(R.array.themes_overlay_names_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentLayout = settingsManager.getString(getString(R.string.primary_color_key), prefValues.first()) @@ -450,7 +442,6 @@ class SettingsFragment : PreferenceFragmentCompat() { appThemePreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.themes_names) val prefValues = resources.getStringArray(R.array.themes_names_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentLayout = settingsManager.getString(getString(R.string.app_theme_key), prefValues.first()) @@ -475,7 +466,6 @@ class SettingsFragment : PreferenceFragmentCompat() { watchQualityPreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.quality_pref) val prefValues = resources.getIntArray(R.array.quality_pref_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentQuality = settingsManager.getInt( @@ -498,7 +488,6 @@ class SettingsFragment : PreferenceFragmentCompat() { dnsPreference.setOnPreferenceClickListener { val prefNames = resources.getStringArray(R.array.dns_pref) val prefValues = resources.getIntArray(R.array.dns_pref_values) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) val currentDns = settingsManager.getInt(getString(R.string.dns_pref), 0) @@ -516,8 +505,6 @@ class SettingsFragment : PreferenceFragmentCompat() { } try { - val settingsManager = PreferenceManager.getDefaultSharedPreferences(context) - beneneCount = settingsManager.getInt(getString(R.string.benene_count), 0) benenePreference.summary = @@ -567,7 +554,6 @@ class SettingsFragment : PreferenceFragmentCompat() { try { val code = languageCodes[languageIndex] setLocale(activity, code) - val settingsManager = PreferenceManager.getDefaultSharedPreferences(pref.context) settingsManager.edit().putString(getString(R.string.locale_key), code).apply() activity?.recreate() } catch (e: Exception) { @@ -579,7 +565,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } private fun getCurrentLocale(): String { - val res = context!!.resources + val res = requireContext().resources // Change locale settings in the app. // val dm = res.displayMetrics val conf = res.configuration diff --git a/app/src/main/res/drawable/baseline_list_alt_24.xml b/app/src/main/res/drawable/baseline_list_alt_24.xml new file mode 100644 index 00000000..91683dc6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_list_alt_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml index add1c564..1e858d7a 100644 --- a/app/src/main/res/layout/fragment_result.xml +++ b/app/src/main/res/layout/fragment_result.xml @@ -165,6 +165,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + - + --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - - - - - - diff --git a/app/src/main/res/layout/fragment_result_swipe.xml b/app/src/main/res/layout/fragment_result_swipe.xml new file mode 100644 index 00000000..141ec325 --- /dev/null +++ b/app/src/main/res/layout/fragment_result_swipe.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 3ab73406..3f72e8e5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -275,7 +275,7 @@ نصٌّ حكيمٌ لهُ سِرٌّ قاطِعٌ وَذُو شَأنٍ عَظيمٍ مكتوبٌ على ثوبٍ أخضرَ ومُغلفٌ بجلدٍ أزرق - موصى به + موصى به تحميل من ملف الملف الذي تم تنزيله diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index eb6c1f74..5ca7b1c1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -335,7 +335,7 @@ --> The quick brown fox jumps over the lazy dog - Consiglaito + Consiglaito Caricato %s Carica da file Downloaded file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index af748a4b..592f38c7 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -271,7 +271,7 @@ --> Xem trước mẫu phụ đề - Được đề xuất + Được đề xuất Đã tải %s Chọn tệp Tệp đã tải diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1766a7f4..28f71231 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -380,7 +380,7 @@ --> The quick brown fox jumps over the lazy dog - Recommended + Recommended Loaded %s Load from file Downloaded file diff --git a/build.gradle b/build.gradle index 47a254a0..a0c8aa16 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath "com.android.tools.build:gradle:4.1.3" + classpath 'com.android.tools.build:gradle:7.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e472ce80..4e4f7bfc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Apr 30 17:11:15 CEST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME