mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
fixed provider, fixed toast stacking, updated quality API for better sorting
This commit is contained in:
parent
0967fe7600
commit
efa95ddbe6
17 changed files with 165 additions and 143 deletions
|
@ -51,16 +51,12 @@
|
||||||
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name=".receivers.VideoDownloadRestartReceiver"
|
android:name=".receivers.VideoDownloadRestartReceiver"
|
||||||
android:enabled="true"
|
android:enabled="false"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="restart_service" />
|
<action android:name="restart_service" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<service
|
|
||||||
android:name=".services.VideoDownloadKeepAliveService"
|
|
||||||
android:enabled="false" >
|
|
||||||
</service>
|
|
||||||
<service
|
<service
|
||||||
android:name=".services.VideoDownloadService"
|
android:name=".services.VideoDownloadService"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
package com.lagradost.cloudstream3
|
package com.lagradost.cloudstream3
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import android.app.PictureInPictureParams
|
import android.app.PictureInPictureParams
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.WindowManager
|
import android.view.*
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.annotation.StringRes
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.navigation.NavOptions
|
import androidx.navigation.NavOptions
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
|
@ -15,11 +20,6 @@ import androidx.navigation.fragment.NavHostFragment
|
||||||
import com.google.android.gms.cast.framework.CastButtonFactory
|
import com.google.android.gms.cast.framework.CastButtonFactory
|
||||||
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
||||||
import com.lagradost.cloudstream3.APIHolder.apis
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.hasPIPPermission
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.requestRW
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.shouldShowPIPMode
|
|
||||||
import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver
|
import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver
|
||||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
||||||
import com.lagradost.cloudstream3.ui.download.DownloadChildFragment
|
import com.lagradost.cloudstream3.ui.download.DownloadChildFragment
|
||||||
|
@ -33,10 +33,17 @@ import com.lagradost.cloudstream3.utils.DataStore.removeKey
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos
|
||||||
import com.lagradost.cloudstream3.utils.Event
|
import com.lagradost.cloudstream3.utils.Event
|
||||||
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
|
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.hasPIPPermission
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.requestRW
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.shouldShowPIPMode
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
import kotlinx.android.synthetic.main.fragment_result.*
|
import kotlinx.android.synthetic.main.fragment_result.*
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
|
|
||||||
const val VLC_PACKAGE = "org.videolan.vlc"
|
const val VLC_PACKAGE = "org.videolan.vlc"
|
||||||
const val VLC_INTENT_ACTION_RESULT = "org.videolan.vlc.player.result"
|
const val VLC_INTENT_ACTION_RESULT = "org.videolan.vlc.player.result"
|
||||||
val VLC_COMPONENT: ComponentName =
|
val VLC_COMPONENT: ComponentName =
|
||||||
|
@ -67,6 +74,41 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
||||||
val onColorSelectedEvent = Event<Pair<Int, Int>>()
|
val onColorSelectedEvent = Event<Pair<Int, Int>>()
|
||||||
val onDialogDismissedEvent = Event<Int>()
|
val onDialogDismissedEvent = Event<Int>()
|
||||||
lateinit var navOptions: NavOptions
|
lateinit var navOptions: NavOptions
|
||||||
|
|
||||||
|
var currentToast: Toast? = null
|
||||||
|
fun showToast(act: Activity?, @StringRes message: Int, duration: Int) {
|
||||||
|
if (act == null) return
|
||||||
|
showToast(act, act.getString(message), duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun showToast(act: Activity?, message: String, duration: Int) {
|
||||||
|
if (act == null) return
|
||||||
|
try {
|
||||||
|
currentToast?.cancel()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
val inflater = act.getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||||
|
|
||||||
|
val layout: View = inflater.inflate(
|
||||||
|
R.layout.toast,
|
||||||
|
act.findViewById<View>(R.id.toast_layout_root) as ViewGroup?
|
||||||
|
)
|
||||||
|
|
||||||
|
val text = layout.findViewById(R.id.text) as TextView
|
||||||
|
text.text = message.trim()
|
||||||
|
|
||||||
|
val toast = Toast(act)
|
||||||
|
toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx)
|
||||||
|
toast.duration = duration
|
||||||
|
toast.view = layout
|
||||||
|
toast.show()
|
||||||
|
currentToast = toast
|
||||||
|
} catch (e: Exception) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun enterPIPMode() {
|
private fun enterPIPMode() {
|
||||||
|
|
|
@ -2,7 +2,8 @@ package com.lagradost.cloudstream3.animeproviders
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.getQualityFromName
|
import com.lagradost.cloudstream3.utils.Qualities
|
||||||
|
import com.lagradost.cloudstream3.utils.extractorApis
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
@ -65,7 +66,8 @@ class AnimeFlickProvider : MainAPI() {
|
||||||
val title = doc.selectFirst("h2.title").text()
|
val title = doc.selectFirst("h2.title").text()
|
||||||
|
|
||||||
val yearText = doc.selectFirst(".trending-year")?.text()
|
val yearText = doc.selectFirst(".trending-year")?.text()
|
||||||
val year = if(yearText != null) Regex("""(\d{4})""").find(yearText)?.destructured?.component1()?.toIntOrNull() else null
|
val year = if (yearText != null) Regex("""(\d{4})""").find(yearText)?.destructured?.component1()
|
||||||
|
?.toIntOrNull() else null
|
||||||
val description = doc.selectFirst("p").text()
|
val description = doc.selectFirst("p").text()
|
||||||
|
|
||||||
val genres = doc.select("a[href*=\"genre-\"]").map { it.text() }
|
val genres = doc.select("a[href*=\"genre-\"]").map { it.text() }
|
||||||
|
@ -102,19 +104,33 @@ class AnimeFlickProvider : MainAPI() {
|
||||||
val html = khttp.get(data).text
|
val html = khttp.get(data).text
|
||||||
|
|
||||||
val episodeRegex = Regex("""(https://.*?\.mp4)""")
|
val episodeRegex = Regex("""(https://.*?\.mp4)""")
|
||||||
episodeRegex.findAll(html).map {
|
val links = episodeRegex.findAll(html).map {
|
||||||
it.value
|
it.value
|
||||||
}.toList().forEach {
|
}.toList()
|
||||||
|
for (link in links) {
|
||||||
|
var alreadyAdded = false
|
||||||
|
for (extractor in extractorApis) {
|
||||||
|
if (link.startsWith(extractor.mainUrl)) {
|
||||||
|
extractor.getSafeUrl(link, data)?.forEach {
|
||||||
|
callback(it)
|
||||||
|
}
|
||||||
|
alreadyAdded = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!alreadyAdded) {
|
||||||
callback(
|
callback(
|
||||||
ExtractorLink(
|
ExtractorLink(
|
||||||
"Animeflick",
|
this.name,
|
||||||
"Animeflick - Auto",
|
"${this.name} - Auto",
|
||||||
it,
|
link,
|
||||||
"",
|
"",
|
||||||
getQualityFromName("1080")
|
Qualities.P1080.value
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,6 @@ import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.lagradost.cloudstream3.services.RESTART_ALL_DOWNLOADS_AND_QUEUE
|
|
||||||
import com.lagradost.cloudstream3.services.START_VALUE_KEY
|
|
||||||
import com.lagradost.cloudstream3.services.VideoDownloadKeepAliveService
|
|
||||||
|
|
||||||
|
|
||||||
class VideoDownloadRestartReceiver : BroadcastReceiver() {
|
class VideoDownloadRestartReceiver : BroadcastReceiver() {
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
package com.lagradost.cloudstream3.services
|
|
||||||
|
|
||||||
import android.app.Service
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.IBinder
|
|
||||||
import android.util.Log
|
|
||||||
import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver
|
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getKeys
|
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
|
||||||
|
|
||||||
const val RESTART_ALL_DOWNLOADS_AND_QUEUE = 1
|
|
||||||
const val RESTART_NONE = 0
|
|
||||||
const val START_VALUE_KEY = "start_value"
|
|
||||||
|
|
||||||
class VideoDownloadKeepAliveService : Service() {
|
|
||||||
override fun onBind(p0: Intent?): IBinder? {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
||||||
val startValue = intent?.getIntExtra(START_VALUE_KEY, RESTART_NONE) ?: RESTART_NONE
|
|
||||||
Log.i("Service", "Restarted with start value of $startValue")
|
|
||||||
|
|
||||||
if (startValue == RESTART_ALL_DOWNLOADS_AND_QUEUE) {
|
|
||||||
val keys = this.getKeys(VideoDownloadManager.KEY_RESUME_PACKAGES)
|
|
||||||
val resumePkg = keys.mapNotNull { k -> this.getKey<VideoDownloadManager.DownloadResumePackage>(k) }
|
|
||||||
|
|
||||||
for (pkg in resumePkg) { // ADD ALL CURRENT DOWNLOADS
|
|
||||||
VideoDownloadManager.downloadFromResume(this, pkg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ADD QUEUE
|
|
||||||
val resumeQueue =
|
|
||||||
this.getKey<List<VideoDownloadManager.DownloadQueueResumePackage>>(VideoDownloadManager.KEY_RESUME_QUEUE_PACKAGES)
|
|
||||||
if (resumeQueue != null && resumeQueue.isNotEmpty()) {
|
|
||||||
val sorted = resumeQueue.sortedBy { item -> item.index }
|
|
||||||
for (queueItem in sorted) {
|
|
||||||
VideoDownloadManager.downloadFromResume(this, queueItem.pkg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return START_STICKY//super.onStartCommand(intent, flags, startId)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
|
||||||
val broadcastIntent = Intent()
|
|
||||||
broadcastIntent.action = "restart_service"
|
|
||||||
broadcastIntent.setClass(this, VideoDownloadRestartReceiver::class.java)
|
|
||||||
this.sendBroadcast(broadcastIntent)
|
|
||||||
super.onDestroy()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -57,6 +57,7 @@ import com.google.android.material.button.MaterialButton
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.canEnterPipMode
|
import com.lagradost.cloudstream3.MainActivity.Companion.canEnterPipMode
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.isInPIPMode
|
import com.lagradost.cloudstream3.MainActivity.Companion.isInPIPMode
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.Resource
|
import com.lagradost.cloudstream3.mvvm.Resource
|
||||||
import com.lagradost.cloudstream3.mvvm.observe
|
import com.lagradost.cloudstream3.mvvm.observe
|
||||||
|
@ -1242,7 +1243,8 @@ class PlayerFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val startIndexFromMap = currentSubtitles.map { it.removeSuffix(" ") }.indexOf(preferredSubtitles.removeSuffix(" ")) + 1
|
val startIndexFromMap =
|
||||||
|
currentSubtitles.map { it.removeSuffix(" ") }.indexOf(preferredSubtitles.removeSuffix(" ")) + 1
|
||||||
var subtitleIndex = startIndexFromMap
|
var subtitleIndex = startIndexFromMap
|
||||||
|
|
||||||
if (currentSubtitles.isEmpty()) {
|
if (currentSubtitles.isEmpty()) {
|
||||||
|
@ -1805,33 +1807,30 @@ class PlayerFragment : Fragment() {
|
||||||
when (error.type) {
|
when (error.type) {
|
||||||
ExoPlaybackException.TYPE_SOURCE -> {
|
ExoPlaybackException.TYPE_SOURCE -> {
|
||||||
if (currentUrl?.url != "") {
|
if (currentUrl?.url != "") {
|
||||||
Toast.makeText(
|
showToast(
|
||||||
activity,
|
activity,
|
||||||
"Source error\n" + error.sourceException.message,
|
"Source error\n" + error.sourceException.message,
|
||||||
LENGTH_SHORT
|
LENGTH_SHORT
|
||||||
)
|
)
|
||||||
.show()
|
|
||||||
tryNextMirror()
|
tryNextMirror()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExoPlaybackException.TYPE_REMOTE -> {
|
ExoPlaybackException.TYPE_REMOTE -> {
|
||||||
Toast.makeText(activity, "Remote error", LENGTH_SHORT)
|
showToast(activity, "Remote error", LENGTH_SHORT)
|
||||||
.show()
|
|
||||||
}
|
}
|
||||||
ExoPlaybackException.TYPE_RENDERER -> {
|
ExoPlaybackException.TYPE_RENDERER -> {
|
||||||
Toast.makeText(
|
showToast(
|
||||||
activity,
|
activity,
|
||||||
"Renderer error\n" + error.rendererException.message,
|
"Renderer error\n" + error.rendererException.message,
|
||||||
LENGTH_SHORT
|
LENGTH_SHORT
|
||||||
)
|
)
|
||||||
.show()
|
|
||||||
}
|
}
|
||||||
ExoPlaybackException.TYPE_UNEXPECTED -> {
|
ExoPlaybackException.TYPE_UNEXPECTED -> {
|
||||||
Toast.makeText(
|
showToast(
|
||||||
activity,
|
activity,
|
||||||
"Unexpected player error\n" + error.unexpectedException.message,
|
"Unexpected player error\n" + error.unexpectedException.message,
|
||||||
LENGTH_SHORT
|
LENGTH_SHORT
|
||||||
).show()
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1840,8 +1839,8 @@ class PlayerFragment : Fragment() {
|
||||||
println("Warning: Illegal state exception in PlayerFragment")
|
println("Warning: Illegal state exception in PlayerFragment")
|
||||||
} finally {
|
} finally {
|
||||||
setPreferredSubLanguage(
|
setPreferredSubLanguage(
|
||||||
if(isDownloadedFile) {
|
if (isDownloadedFile) {
|
||||||
if(activeSubtitles.isNotEmpty()) {
|
if (activeSubtitles.isNotEmpty()) {
|
||||||
activeSubtitles.first()
|
activeSubtitles.first()
|
||||||
} else null
|
} else null
|
||||||
} else {
|
} else {
|
||||||
|
@ -1877,9 +1876,7 @@ class PlayerFragment : Fragment() {
|
||||||
initPlayer(getCurrentUrl())
|
initPlayer(getCurrentUrl())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
context?.let { ctx ->
|
showToast(activity, "No Links Found", LENGTH_SHORT)
|
||||||
Toast.makeText(ctx, "No Links Found", LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ const val ACTION_COPY_LINK = 9
|
||||||
const val ACTION_SHOW_OPTIONS = 10
|
const val ACTION_SHOW_OPTIONS = 10
|
||||||
|
|
||||||
const val ACTION_CLICK_DEFAULT = 11
|
const val ACTION_CLICK_DEFAULT = 11
|
||||||
|
const val ACTION_SHOW_TOAST = 12
|
||||||
|
|
||||||
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
|
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
|
||||||
|
|
||||||
|
@ -173,7 +174,7 @@ class EpisodeAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
episodePoster?.setOnLongClickListener {
|
episodePoster?.setOnLongClickListener {
|
||||||
Toast.makeText(it.context, R.string.play_episode_toast, Toast.LENGTH_SHORT).show()
|
clickCallback.invoke(EpisodeClickEvent(ACTION_SHOW_TOAST, card))
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,25 +31,16 @@ import com.google.android.material.button.MaterialButton
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromName
|
import com.lagradost.cloudstream3.APIHolder.getApiFromName
|
||||||
import com.lagradost.cloudstream3.APIHolder.getId
|
import com.lagradost.cloudstream3.APIHolder.getId
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIcons
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.requestRW
|
|
||||||
import com.lagradost.cloudstream3.mvvm.Resource
|
import com.lagradost.cloudstream3.mvvm.Resource
|
||||||
import com.lagradost.cloudstream3.mvvm.observe
|
import com.lagradost.cloudstream3.mvvm.observe
|
||||||
import com.lagradost.cloudstream3.ui.WatchType
|
import com.lagradost.cloudstream3.ui.WatchType
|
||||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD
|
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD
|
||||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
||||||
import com.lagradost.cloudstream3.ui.download.EasyDownloadButton
|
|
||||||
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
|
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
|
||||||
|
import com.lagradost.cloudstream3.ui.download.EasyDownloadButton
|
||||||
import com.lagradost.cloudstream3.ui.player.PlayerData
|
import com.lagradost.cloudstream3.ui.player.PlayerData
|
||||||
import com.lagradost.cloudstream3.ui.player.PlayerFragment
|
import com.lagradost.cloudstream3.ui.player.PlayerFragment
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getDownloadSubsLanguageISO639_1
|
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getDownloadSubsLanguageISO639_1
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
|
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
|
||||||
|
@ -60,16 +51,22 @@ import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getFolderName
|
import com.lagradost.cloudstream3.utils.DataStore.getFolderName
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.setKey
|
import com.lagradost.cloudstream3.utils.DataStore.setKey
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIcons
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.requestRW
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename
|
import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename
|
||||||
import kotlinx.android.synthetic.main.fragment_result.*
|
import kotlinx.android.synthetic.main.fragment_result.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.HashMap
|
|
||||||
|
|
||||||
const val MAX_SYNO_LENGH = 300
|
const val MAX_SYNO_LENGH = 300
|
||||||
|
|
||||||
|
@ -278,7 +275,7 @@ class ResultFragment : Fragment() {
|
||||||
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
||||||
if (!chromecastSupport) {
|
if (!chromecastSupport) {
|
||||||
media_route_button.setOnClickListener {
|
media_route_button.setOnClickListener {
|
||||||
Toast.makeText(it.context, "This provider has no chromecast support", Toast.LENGTH_LONG).show()
|
showToast(activity, "This provider has no chromecast support", Toast.LENGTH_LONG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +366,11 @@ class ResultFragment : Fragment() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
is Resource.Failure -> {
|
is Resource.Failure -> {
|
||||||
Toast.makeText(requireContext(), R.string.error_loading_links, Toast.LENGTH_SHORT).show()
|
showToast(
|
||||||
|
activity,
|
||||||
|
R.string.error_loading_links,
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|
||||||
|
@ -476,7 +477,7 @@ class ResultFragment : Fragment() {
|
||||||
|
|
||||||
// DOWNLOAD VIDEO
|
// DOWNLOAD VIDEO
|
||||||
VideoDownloadManager.downloadEpisode(
|
VideoDownloadManager.downloadEpisode(
|
||||||
ctx,
|
activity,
|
||||||
src,//url ?: return,
|
src,//url ?: return,
|
||||||
folder,
|
folder,
|
||||||
meta,
|
meta,
|
||||||
|
@ -525,6 +526,10 @@ class ResultFragment : Fragment() {
|
||||||
if (!isLoaded) return@main // CANT LOAD
|
if (!isLoaded) return@main // CANT LOAD
|
||||||
|
|
||||||
when (episodeClick.action) {
|
when (episodeClick.action) {
|
||||||
|
ACTION_SHOW_TOAST -> {
|
||||||
|
showToast(activity, R.string.play_episode_toast, Toast.LENGTH_SHORT)
|
||||||
|
}
|
||||||
|
|
||||||
ACTION_CLICK_DEFAULT -> {
|
ACTION_CLICK_DEFAULT -> {
|
||||||
context?.let { ctx ->
|
context?.let { ctx ->
|
||||||
if (ctx.isConnectedToChromecast()) {
|
if (ctx.isConnectedToChromecast()) {
|
||||||
|
@ -584,7 +589,7 @@ class ResultFragment : Fragment() {
|
||||||
?: return@acquireSingeExtractorLink
|
?: return@acquireSingeExtractorLink
|
||||||
val clip = ClipData.newPlainText(link.name, link.url)
|
val clip = ClipData.newPlainText(link.name, link.url)
|
||||||
serviceClipboard.setPrimaryClip(clip)
|
serviceClipboard.setPrimaryClip(clip)
|
||||||
Toast.makeText(requireContext(), "Text Copied", Toast.LENGTH_SHORT).show()
|
showToast(activity, "Link copied to clipboard", Toast.LENGTH_SHORT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1012,7 +1017,7 @@ class ResultFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Resource.Failure -> {
|
is Resource.Failure -> {
|
||||||
result_error_text.text = data.errorString
|
result_error_text.text = url?.plus("\n") + data.errorString
|
||||||
updateVisStatus(1)
|
updateVisStatus(1)
|
||||||
}
|
}
|
||||||
is Resource.Loading -> {
|
is Resource.Loading -> {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.ui.search
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
||||||
|
|
||||||
object SearchHelper {
|
object SearchHelper {
|
||||||
|
@ -12,9 +13,7 @@ object SearchHelper {
|
||||||
activity.loadSearchResult(card)
|
activity.loadSearchResult(card)
|
||||||
}
|
}
|
||||||
SEARCH_ACTION_SHOW_METADATA -> {
|
SEARCH_ACTION_SHOW_METADATA -> {
|
||||||
activity?.let { act ->
|
showToast(activity, callback.card.name, Toast.LENGTH_SHORT)
|
||||||
Toast.makeText(act, callback.card.name, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.os.Bundle
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||||
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
|
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
|
||||||
|
@ -19,7 +20,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
thread {
|
thread {
|
||||||
if (!requireActivity().runAutoUpdate(false)) {
|
if (!requireActivity().runAutoUpdate(false)) {
|
||||||
activity?.runOnUiThread {
|
activity?.runOnUiThread {
|
||||||
Toast.makeText(this.context, "No Update Found", Toast.LENGTH_SHORT).show()
|
showToast(activity, "No Update Found", Toast.LENGTH_SHORT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import com.google.android.exoplayer2.text.Cue
|
||||||
import com.google.android.exoplayer2.ui.CaptionStyleCompat
|
import com.google.android.exoplayer2.ui.CaptionStyleCompat
|
||||||
import com.jaredrummler.android.colorpicker.ColorPickerDialog
|
import com.jaredrummler.android.colorpicker.ColorPickerDialog
|
||||||
import com.lagradost.cloudstream3.MainActivity
|
import com.lagradost.cloudstream3.MainActivity
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.setKey
|
import com.lagradost.cloudstream3.utils.DataStore.setKey
|
||||||
|
@ -207,7 +208,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
|
|
||||||
this.setOnLongClickListener {
|
this.setOnLongClickListener {
|
||||||
it.context.setColor(id, null)
|
it.context.setColor(id, null)
|
||||||
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,7 +249,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
subs_subtitle_elevation.setOnLongClickListener {
|
subs_subtitle_elevation.setOnLongClickListener {
|
||||||
state.elevation = 0
|
state.elevation = 0
|
||||||
it.context.updateState()
|
it.context.updateState()
|
||||||
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,7 +277,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
subs_edge_type.setOnLongClickListener {
|
subs_edge_type.setOnLongClickListener {
|
||||||
state.edgeType = CaptionStyleCompat.EDGE_TYPE_OUTLINE
|
state.edgeType = CaptionStyleCompat.EDGE_TYPE_OUTLINE
|
||||||
it.context.updateState()
|
it.context.updateState()
|
||||||
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +313,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
subs_font.setOnLongClickListener { textView ->
|
subs_font.setOnLongClickListener { textView ->
|
||||||
state.typeface = null
|
state.typeface = null
|
||||||
textView.context.updateState()
|
textView.context.updateState()
|
||||||
Toast.makeText(textView.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +337,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
|
|
||||||
subs_auto_select_language.setOnLongClickListener { textView ->
|
subs_auto_select_language.setOnLongClickListener { textView ->
|
||||||
textView.context.setKey(SUBTITLE_AUTO_SELECT_KEY, "en")
|
textView.context.setKey(SUBTITLE_AUTO_SELECT_KEY, "en")
|
||||||
Toast.makeText(textView.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,7 +360,7 @@ class SubtitlesFragment : Fragment() {
|
||||||
subs_download_languages.setOnLongClickListener { textView ->
|
subs_download_languages.setOnLongClickListener { textView ->
|
||||||
textView.context.setKey(SUBTITLE_DOWNLOAD_KEY, listOf("en"))
|
textView.context.setKey(SUBTITLE_DOWNLOAD_KEY, listOf("en"))
|
||||||
|
|
||||||
Toast.makeText(textView.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
|
showToast(activity, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT)
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@ import com.fasterxml.jackson.databind.json.JsonMapper
|
||||||
import com.fasterxml.jackson.module.kotlin.KotlinModule
|
import com.fasterxml.jackson.module.kotlin.KotlinModule
|
||||||
import com.fasterxml.jackson.module.kotlin.readValue
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
import com.lagradost.cloudstream3.BuildConfig
|
import com.lagradost.cloudstream3.BuildConfig
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate
|
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.net.URLConnection
|
import java.net.URLConnection
|
||||||
|
@ -178,7 +178,7 @@ class InAppUpdater {
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
println(e)
|
println(e)
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
Toast.makeText(this, "Permission error", Toast.LENGTH_SHORT).show()
|
showToast(this, "Permission error", Toast.LENGTH_SHORT)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -291,14 +291,14 @@ class InAppUpdater {
|
||||||
val context = this
|
val context = this
|
||||||
builder.apply {
|
builder.apply {
|
||||||
setPositiveButton("Update") { _, _ ->
|
setPositiveButton("Update") { _, _ ->
|
||||||
Toast.makeText(context, "Download started", Toast.LENGTH_LONG).show()
|
showToast(context, "Download started", Toast.LENGTH_LONG)
|
||||||
thread {
|
thread {
|
||||||
val downloadStatus = context.downloadUpdate(update.updateURL)
|
val downloadStatus = context.downloadUpdate(update.updateURL)
|
||||||
if (!downloadStatus) {
|
if (!downloadStatus) {
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
Toast.makeText(context,
|
showToast(context,
|
||||||
"Download Failed",
|
"Download Failed",
|
||||||
Toast.LENGTH_LONG).show()
|
Toast.LENGTH_LONG)
|
||||||
}
|
}
|
||||||
} /*else {
|
} /*else {
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
package com.lagradost.cloudstream3.utils
|
package com.lagradost.cloudstream3.utils
|
||||||
|
|
||||||
import android.app.ActivityManager
|
import android.app.*
|
||||||
import android.app.NotificationChannel
|
|
||||||
import android.app.NotificationManager
|
|
||||||
import android.app.PendingIntent
|
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
@ -19,6 +16,7 @@ import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.lagradost.cloudstream3.MainActivity
|
import com.lagradost.cloudstream3.MainActivity
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
|
@ -908,15 +906,15 @@ object VideoDownloadManager {
|
||||||
return context.getKey(KEY_RESUME_PACKAGES, id.toString())
|
return context.getKey(KEY_RESUME_PACKAGES, id.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun downloadFromResume(context: Context, pkg: DownloadResumePackage, setKey: Boolean = true) {
|
fun downloadFromResume(context: Activity, pkg: DownloadResumePackage, setKey: Boolean = true) {
|
||||||
if (!currentDownloads.any { it == pkg.item.ep.id }) {
|
if (!currentDownloads.any { it == pkg.item.ep.id }) {
|
||||||
if (currentDownloads.size == maxConcurrentDownloads) {
|
if (currentDownloads.size == maxConcurrentDownloads) {
|
||||||
main {
|
main {
|
||||||
Toast.makeText(
|
showToast( // can be replaced with regular Toast
|
||||||
context,
|
context,
|
||||||
"${pkg.item.ep.mainName}${pkg.item.ep.episode?.let { " Episode $it " } ?: " "}queued",
|
"${pkg.item.ep.mainName}${pkg.item.ep.episode?.let { " Episode $it " } ?: " "}queued",
|
||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
downloadQueue.addLast(pkg)
|
downloadQueue.addLast(pkg)
|
||||||
|
@ -947,12 +945,13 @@ object VideoDownloadManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun downloadEpisode(
|
fun downloadEpisode(
|
||||||
context: Context,
|
context: Activity?,
|
||||||
source: String?,
|
source: String?,
|
||||||
folder: String?,
|
folder: String?,
|
||||||
ep: DownloadEpisodeMetadata,
|
ep: DownloadEpisodeMetadata,
|
||||||
links: List<ExtractorLink>
|
links: List<ExtractorLink>
|
||||||
) {
|
) {
|
||||||
|
if(context == null) return
|
||||||
val validLinks = links.filter { !it.isM3u8 }
|
val validLinks = links.filter { !it.isM3u8 }
|
||||||
if (validLinks.isNotEmpty()) {
|
if (validLinks.isNotEmpty()) {
|
||||||
downloadFromResume(context, DownloadResumePackage(DownloadItem(source, folder, ep, validLinks), null))
|
downloadFromResume(context, DownloadResumePackage(DownloadItem(source, folder, ep, validLinks), null))
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
android:id="@+id/overlay_loading_skip_button"
|
android:id="@+id/overlay_loading_skip_button"
|
||||||
android:text="@string/skip_loading"
|
android:text="@string/skip_loading"
|
||||||
|
|
||||||
|
|
||||||
app:rippleColor="?attr/colorPrimary"
|
app:rippleColor="?attr/colorPrimary"
|
||||||
android:textColor="?attr/textColor"
|
android:textColor="?attr/textColor"
|
||||||
app:iconTint="?attr/textColor"
|
app:iconTint="?attr/textColor"
|
||||||
|
|
|
@ -389,10 +389,13 @@
|
||||||
</TextView>
|
</TextView>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout android:orientation="horizontal" android:gravity="center_vertical"
|
<LinearLayout
|
||||||
android:layout_width="match_parent" android:layout_height="wrap_content">
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:visibility="visible"
|
android:visibility="gone"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:id="@+id/result_season_button"
|
android:id="@+id/result_season_button"
|
||||||
tools:text="Season 1"
|
tools:text="Season 1"
|
||||||
|
@ -409,7 +412,7 @@
|
||||||
android:layout_height="50dp">
|
android:layout_height="50dp">
|
||||||
</com.google.android.material.button.MaterialButton>
|
</com.google.android.material.button.MaterialButton>
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:visibility="visible"
|
android:visibility="gone"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
android:id="@+id/result_episode_select"
|
android:id="@+id/result_episode_select"
|
||||||
tools:text="50-100"
|
tools:text="50-100"
|
||||||
|
|
19
app/src/main/res/layout/toast.xml
Normal file
19
app/src/main/res/layout/toast.xml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/toast_layout_root"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:padding="5dp"
|
||||||
|
app:cardCornerRadius="10dp"
|
||||||
|
android:background="?attr/bitDarkerGrayBackground">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:padding="20dp"
|
||||||
|
android:id="@+id/text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:textColor="?attr/textColor"/>
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
|
@ -7,6 +7,7 @@
|
||||||
<item name="colorAccent">@color/colorAccent</item>
|
<item name="colorAccent">@color/colorAccent</item>
|
||||||
<item name="android:windowBackground">@drawable/splash_background</item>
|
<item name="android:windowBackground">@drawable/splash_background</item>
|
||||||
<item name="android:navigationBarColor">?attr/bitDarkerGrayBackground</item>
|
<item name="android:navigationBarColor">?attr/bitDarkerGrayBackground</item>
|
||||||
|
<item name="android:colorEdgeEffect">?attr/textColor</item>
|
||||||
|
|
||||||
<!--<item name="android:navigationBarColor">@color/darkBackground</item>-->
|
<!--<item name="android:navigationBarColor">@color/darkBackground</item>-->
|
||||||
<item name="android:statusBarColor">@color/grayBackground</item>
|
<item name="android:statusBarColor">@color/grayBackground</item>
|
||||||
|
|
Loading…
Reference in a new issue