forked from recloudstream/cloudstream
Merge pull request #11 from recloudstream/patch-1
This commit is contained in:
commit
113c5fe22a
14 changed files with 233 additions and 55 deletions
|
@ -42,6 +42,7 @@ import com.lagradost.cloudstream3.ui.AutofitRecyclerView
|
|||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment
|
||||
import com.lagradost.cloudstream3.ui.result.START_ACTION_RESUME_LATEST
|
||||
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||
import com.lagradost.cloudstream3.ui.search.*
|
||||
import com.lagradost.cloudstream3.ui.search.SearchHelper.handleSearchClickCallback
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
|
||||
|
@ -519,6 +520,16 @@ class HomeFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
|
||||
home_main_poster_recyclerview?.adapter =
|
||||
HomeChildItemAdapter(
|
||||
mutableListOf(),
|
||||
R.layout.home_result_big_grid,
|
||||
nextFocusUp = home_main_poster_recyclerview.nextFocusUpId,
|
||||
nextFocusDown = home_main_poster_recyclerview.nextFocusDownId
|
||||
) { callback ->
|
||||
homeHandleSearch(callback)
|
||||
}
|
||||
home_main_poster_recyclerview.setLinearListLayout()
|
||||
observe(homeViewModel.randomItems) { items ->
|
||||
if (items.isNullOrEmpty()) {
|
||||
toggleMainVisibility(false)
|
||||
|
@ -531,15 +542,7 @@ class HomeFragment : Fragment() {
|
|||
}
|
||||
|
||||
val randomSize = items.size
|
||||
home_main_poster_recyclerview?.adapter =
|
||||
HomeChildItemAdapter(
|
||||
items.toMutableList(),
|
||||
R.layout.home_result_big_grid,
|
||||
nextFocusUp = home_main_poster_recyclerview.nextFocusUpId,
|
||||
nextFocusDown = home_main_poster_recyclerview.nextFocusDownId
|
||||
) { callback ->
|
||||
homeHandleSearch(callback)
|
||||
}
|
||||
tempAdapter?.updateList(items)
|
||||
if (context?.isTvSettings() == false) {
|
||||
home_main_poster_recyclerview?.post {
|
||||
(home_main_poster_recyclerview?.layoutManager as CenterZoomLayoutManager?)?.let { manager ->
|
||||
|
@ -813,6 +816,8 @@ class HomeFragment : Fragment() {
|
|||
homeHandleSearch(callback)
|
||||
}
|
||||
}
|
||||
home_watch_child_recyclerview.setLinearListLayout()
|
||||
home_bookmarked_child_recyclerview.setLinearListLayout()
|
||||
|
||||
home_watch_child_recyclerview?.adapter = HomeChildItemAdapter(
|
||||
ArrayList(),
|
||||
|
@ -901,6 +906,7 @@ class HomeFragment : Fragment() {
|
|||
}, { name ->
|
||||
homeViewModel.expand(name)
|
||||
})
|
||||
home_master_recycler.setLinearListLayout()
|
||||
home_master_recycler?.setMaxViewPoolSize(0, Int.MAX_VALUE)
|
||||
home_master_recycler.layoutManager = object : LinearLayoutManager(context) {
|
||||
override fun supportsPredictiveItemAnimations(): Boolean {
|
||||
|
|
|
@ -10,6 +10,8 @@ import androidx.recyclerview.widget.ListUpdateCallback
|
|||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.HomePageList
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.ui.result.LinearListLayout
|
||||
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
||||
import com.lagradost.cloudstream3.ui.search.SearchFragment.Companion.filterSearchResponse
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
|
@ -153,6 +155,7 @@ class ParentItemAdapter(
|
|||
).apply {
|
||||
isHorizontal = info.isHorizontalImages
|
||||
}
|
||||
recyclerView.setLinearListLayout()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,7 +170,7 @@ class ParentItemAdapter(
|
|||
isHorizontal = info.isHorizontalImages
|
||||
hasNext = expand.hasNext
|
||||
}
|
||||
|
||||
recyclerView.setLinearListLayout()
|
||||
title.text = info.name
|
||||
|
||||
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.LayoutRes
|
||||
|
@ -75,9 +76,12 @@ class EpisodeAdapter(
|
|||
}
|
||||
|
||||
override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) {
|
||||
if(holder.itemView.hasFocus()) {
|
||||
if (holder.itemView.hasFocus()) {
|
||||
holder.itemView.clearFocus()
|
||||
}
|
||||
//(holder.itemView as? FrameLayout?)?.descendantFocusability =
|
||||
// ViewGroup.FOCUS_BLOCK_DESCENDANTS
|
||||
|
||||
if (holder is DownloadButtonViewHolder) {
|
||||
holder.downloadButton.dispose()
|
||||
}
|
||||
|
@ -87,11 +91,20 @@ class EpisodeAdapter(
|
|||
if (holder is DownloadButtonViewHolder) {
|
||||
holder.downloadButton.dispose()
|
||||
mBoundViewHolders.remove(holder)
|
||||
//(holder.itemView as? FrameLayout?)?.descendantFocusability =
|
||||
// ViewGroup.FOCUS_BLOCK_DESCENDANTS
|
||||
}
|
||||
}
|
||||
|
||||
override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {
|
||||
if (holder is DownloadButtonViewHolder) {
|
||||
//println("onViewAttachedToWindow = ${holder.absoluteAdapterPosition}")
|
||||
//holder.itemView.post {
|
||||
// if (holder.itemView.isAttachedToWindow)
|
||||
// (holder.itemView as? FrameLayout?)?.descendantFocusability =
|
||||
// ViewGroup.FOCUS_AFTER_DESCENDANTS
|
||||
//}
|
||||
|
||||
holder.reattachDownloadButton()
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +158,6 @@ class EpisodeAdapter(
|
|||
) : RecyclerView.ViewHolder(itemView), DownloadButtonViewHolder {
|
||||
override var downloadButton = EasyDownloadButton()
|
||||
|
||||
|
||||
var episodeDownloadBar: ContentLoadingProgressBar? = null
|
||||
var episodeDownloadImage: ImageView? = null
|
||||
var localCard: ResultEpisode? = null
|
||||
|
@ -217,17 +229,17 @@ class EpisodeAdapter(
|
|||
}
|
||||
}
|
||||
|
||||
parentView.setOnClickListener {
|
||||
itemView.setOnClickListener {
|
||||
clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card))
|
||||
}
|
||||
|
||||
if (isTrueTv) {
|
||||
parentView.isFocusable = true
|
||||
parentView.isFocusableInTouchMode = true
|
||||
parentView.touchscreenBlocksFocus = false
|
||||
itemView.isFocusable = true
|
||||
itemView.isFocusableInTouchMode = true
|
||||
//itemView.touchscreenBlocksFocus = false
|
||||
}
|
||||
|
||||
parentView.setOnLongClickListener {
|
||||
itemView.setOnLongClickListener {
|
||||
clickCallback.invoke(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card))
|
||||
|
||||
return@setOnLongClickListener true
|
||||
|
@ -242,6 +254,9 @@ class EpisodeAdapter(
|
|||
downloadButton.dispose()
|
||||
val card = localCard
|
||||
if (hasDownloadSupport && card != null) {
|
||||
if (episodeDownloadBar == null ||
|
||||
episodeDownloadImage == null
|
||||
) return
|
||||
val downloadInfo = VideoDownloadManager.getDownloadFileInfoAndUpdateSettings(
|
||||
itemView.context,
|
||||
card.id
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
package com.lagradost.cloudstream3.ui.result
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
|
||||
fun RecyclerView?.setLinearListLayout(isHorizontal: Boolean = true) {
|
||||
if(this == null) return
|
||||
this.layoutManager =
|
||||
this.context?.let { LinearListLayout(it).apply { if (isHorizontal) setHorizontal() else setVertical() } }
|
||||
?: this.layoutManager
|
||||
}
|
||||
|
||||
class LinearListLayout(context: Context?) :
|
||||
LinearLayoutManager(context) {
|
||||
|
||||
fun setHorizontal() {
|
||||
orientation = HORIZONTAL
|
||||
}
|
||||
|
||||
fun setVertical() {
|
||||
orientation = VERTICAL
|
||||
}
|
||||
|
||||
private fun getCorrectParent(focused: View): View? {
|
||||
var current: View? = focused
|
||||
val last: ArrayList<View> = arrayListOf(focused)
|
||||
while (current != null && current !is RecyclerView) {
|
||||
current = (current.parent as? View?)?.also { last.add(it) }
|
||||
}
|
||||
return last.getOrNull(last.count() - 2)
|
||||
}
|
||||
|
||||
private fun getPosition(view: View?): Int? {
|
||||
return (view?.layoutParams as? RecyclerView.LayoutParams?)?.absoluteAdapterPosition
|
||||
}
|
||||
|
||||
private fun getViewFromPos(pos: Int): View? {
|
||||
for (i in 0 until childCount) {
|
||||
val child = getChildAt(i)
|
||||
if ((child?.layoutParams as? RecyclerView.LayoutParams?)?.absoluteAdapterPosition == pos) {
|
||||
return child
|
||||
}
|
||||
}
|
||||
return null
|
||||
//return recyclerView.children.firstOrNull { child -> (child.layoutParams as? RecyclerView.LayoutParams?)?.absoluteAdapterPosition == pos) }
|
||||
}
|
||||
|
||||
/*
|
||||
private fun scrollTo(position: Int) {
|
||||
val linearSmoothScroller = LinearSmoothScroller(recyclerView.context)
|
||||
linearSmoothScroller.targetPosition = position
|
||||
startSmoothScroll(linearSmoothScroller)
|
||||
}*/
|
||||
|
||||
override fun onInterceptFocusSearch(focused: View, direction: Int): View? {
|
||||
val dir = if (orientation == HORIZONTAL) {
|
||||
if (direction == View.FOCUS_DOWN || direction == View.FOCUS_UP) return null
|
||||
if (direction == View.FOCUS_RIGHT) 1 else -1
|
||||
} else {
|
||||
if (direction == View.FOCUS_RIGHT || direction == View.FOCUS_LEFT) return null
|
||||
if (direction == View.FOCUS_DOWN) 1 else -1
|
||||
}
|
||||
|
||||
return try {
|
||||
getPosition(getCorrectParent(focused))?.let { position ->
|
||||
val lookfor = dir + position
|
||||
//clamp(dir + position, 0, recyclerView.adapter?.itemCount ?: return null)
|
||||
getViewFromPos(lookfor) ?: run {
|
||||
scrollToPosition(lookfor)
|
||||
null
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
/*override fun onRequestChildFocus(
|
||||
parent: RecyclerView,
|
||||
state: RecyclerView.State,
|
||||
child: View,
|
||||
focused: View?
|
||||
): Boolean {
|
||||
return super.onRequestChildFocus(parent, state, child, focused)
|
||||
getPosition(getCorrectParent(focused ?: return true))?.let {
|
||||
val startView = findFirstVisibleChildClosestToStart(true,true)
|
||||
val endView = findFirstVisibleChildClosestToEnd(true,true)
|
||||
val start = getPosition(startView)
|
||||
val end = getPosition(endView)
|
||||
fill(parent,LayoutState())
|
||||
|
||||
val helper = mOrientationHelper ?: return false
|
||||
val laidOutArea: Int = abs(
|
||||
helper.getDecoratedEnd(startView)
|
||||
- helper.getDecoratedStart(endView)
|
||||
)
|
||||
val itemRange: Int = abs(
|
||||
(start
|
||||
- end)
|
||||
) + 1
|
||||
|
||||
val avgSizePerRow = laidOutArea.toFloat() / itemRange
|
||||
|
||||
return Math.round(
|
||||
itemsBefore * avgSizePerRow + ((orientation.getStartAfterPadding()
|
||||
- orientation.getDecoratedStart(startChild)))
|
||||
)
|
||||
recyclerView.scrollToPosition(it)
|
||||
}
|
||||
return true*/
|
||||
|
||||
//return super.onRequestChildFocus(parent, state, child, focused)
|
||||
/* if (focused == null || focused == child) {
|
||||
return super.onRequestChildFocus(parent, state, child, focused)
|
||||
}
|
||||
|
||||
try {
|
||||
val pos = getPosition(getCorrectParent(focused) ?: return true)
|
||||
scrollToPosition(pos)
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
return true
|
||||
}*/
|
||||
}
|
|
@ -471,31 +471,6 @@ open class ResultFragment : ResultTrailerPlayer() {
|
|||
syncModel.addFromUrl(url)
|
||||
|
||||
val api = getApiFromName(apiName)
|
||||
if (media_route_button != null) {
|
||||
val chromecastSupport = api.hasChromecastSupport
|
||||
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
||||
if (!chromecastSupport) {
|
||||
media_route_button?.setOnClickListener {
|
||||
showToast(activity, R.string.no_chromecast_support_toast, Toast.LENGTH_LONG)
|
||||
}
|
||||
}
|
||||
activity?.let { act ->
|
||||
if (act.isCastApiAvailable()) {
|
||||
try {
|
||||
CastButtonFactory.setUpMediaRouteButton(act, media_route_button)
|
||||
val castContext = CastContext.getSharedInstance(act.applicationContext)
|
||||
media_route_button?.isGone =
|
||||
castContext.castState == CastState.NO_DEVICES_AVAILABLE
|
||||
// this shit leaks for some reason
|
||||
//castContext.addCastStateListener { state ->
|
||||
// media_route_button?.isGone = state == CastState.NO_DEVICES_AVAILABLE
|
||||
//}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result_episodes?.adapter =
|
||||
EpisodeAdapter(
|
||||
|
|
|
@ -5,23 +5,26 @@ import android.graphics.Rect
|
|||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.NestedScrollView
|
||||
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
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
||||
import com.lagradost.cloudstream3.DubStatus
|
||||
import com.lagradost.cloudstream3.LoadResponse
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.SearchResponse
|
||||
import com.lagradost.cloudstream3.mvvm.Some
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.player.CSPlayerEvent
|
||||
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||
|
@ -125,6 +128,8 @@ class ResultFragmentPhone : ResultFragment() {
|
|||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
val apiName = arguments?.getString(API_NAME_BUNDLE) ?: return
|
||||
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
player_open_source?.setOnClickListener {
|
||||
|
@ -192,6 +197,37 @@ class ResultFragmentPhone : ResultFragment() {
|
|||
}
|
||||
//result_poster_blur_holder?.translationY = -scrollY.toFloat()
|
||||
})
|
||||
val api = APIHolder.getApiFromName(apiName)
|
||||
|
||||
if (media_route_button != null) {
|
||||
val chromecastSupport = api.hasChromecastSupport
|
||||
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
||||
if (!chromecastSupport) {
|
||||
media_route_button?.setOnClickListener {
|
||||
CommonActivity.showToast(
|
||||
activity,
|
||||
R.string.no_chromecast_support_toast,
|
||||
Toast.LENGTH_LONG
|
||||
)
|
||||
}
|
||||
}
|
||||
activity?.let { act ->
|
||||
if (act.isCastApiAvailable()) {
|
||||
try {
|
||||
CastButtonFactory.setUpMediaRouteButton(act, media_route_button)
|
||||
val castContext = CastContext.getSharedInstance(act.applicationContext)
|
||||
media_route_button?.isGone =
|
||||
castContext.castState == CastState.NO_DEVICES_AVAILABLE
|
||||
// this shit leaks for some reason
|
||||
//castContext.addCastStateListener { state ->
|
||||
// media_route_button?.isGone = state == CastState.NO_DEVICES_AVAILABLE
|
||||
//}
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
observe(viewModel.episodesCountText) { count ->
|
||||
result_episodes_text.setText(count)
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.ui.result
|
|||
import android.app.Dialog
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -15,10 +16,17 @@ import com.lagradost.cloudstream3.mvvm.Some
|
|||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setMaxViewPoolSize
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
|
||||
import kotlinx.android.synthetic.main.fragment_home.*
|
||||
import kotlinx.android.synthetic.main.fragment_result.*
|
||||
import kotlinx.android.synthetic.main.fragment_result_tv.*
|
||||
import kotlinx.android.synthetic.main.fragment_result_tv.result_episodes
|
||||
import kotlinx.android.synthetic.main.fragment_result_tv.result_episodes_text
|
||||
import kotlinx.android.synthetic.main.fragment_result_tv.result_play_movie
|
||||
import kotlinx.android.synthetic.main.fragment_result_tv.result_root
|
||||
|
||||
class ResultFragmentTv : ResultFragment() {
|
||||
override val resultLayout = R.layout.fragment_result_tv
|
||||
|
@ -95,13 +103,21 @@ class ResultFragmentTv : ResultFragment() {
|
|||
result_recommendations_filter_selection?.isVisible = false
|
||||
}
|
||||
}
|
||||
|
||||
var loadingDialog: Dialog? = null
|
||||
var popupDialog: Dialog? = null
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
result_episodes?.layoutManager =
|
||||
//LinearListLayout(result_episodes ?: return, result_episodes?.context).apply {
|
||||
LinearListLayout(result_episodes?.context).apply {
|
||||
setHorizontal()
|
||||
}
|
||||
(result_episodes?.adapter as EpisodeAdapter?)?.apply {
|
||||
layout = R.layout.result_episode_both_tv
|
||||
}
|
||||
//result_episodes?.setMaxViewPoolSize(0, Int.MAX_VALUE)
|
||||
|
||||
result_season_selection.setAdapter()
|
||||
result_range_selection.setAdapter()
|
||||
|
|
|
@ -917,7 +917,7 @@
|
|||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
android:descendantFocusability="afterDescendants"
|
||||
android:paddingBottom="100dp"
|
||||
tools:listitem="@layout/result_episode" />
|
||||
tools:listitem="@layout/result_episode_both_tv" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
app:cardCornerRadius="@dimen/rounded_image_radius"
|
||||
app:cardBackgroundColor="@color/transparent"
|
||||
app:cardElevation="0dp"
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_marginBottom="5dp">
|
||||
<!--
|
||||
android:nextFocusLeft="@id/result_episode_download"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<include android:visibility="gone" layout="@layout/result_episode" />
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<include
|
||||
tools:visibility="visible"
|
||||
|
|
|
@ -6,19 +6,18 @@
|
|||
android:nextFocusRight="@id/result_episode_download"
|
||||
android:id="@+id/episode_holder_large"
|
||||
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:cardCornerRadius="@dimen/rounded_image_radius"
|
||||
app:cardBackgroundColor="?attr/boxItemBackground"
|
||||
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_marginBottom="10dp">
|
||||
|
||||
<LinearLayout
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:padding="10dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
app:cardCornerRadius="@dimen/rounded_image_radius"
|
||||
app:cardBackgroundColor="?attr/boxItemBackground"
|
||||
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_marginBottom="10dp">
|
||||
|
||||
<LinearLayout
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
app:cardCornerRadius="@dimen/rounded_image_radius"
|
||||
app:cardBackgroundColor="@color/transparent"
|
||||
app:cardElevation="0dp"
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_marginBottom="5dp">
|
||||
|
||||
<androidx.core.widget.ContentLoadingProgressBar
|
||||
|
|
Loading…
Reference in a new issue