forked from recloudstream/cloudstream
updated homepage UI
This commit is contained in:
parent
d5ae225070
commit
58f0af0187
11 changed files with 363 additions and 199 deletions
|
@ -34,8 +34,8 @@ android {
|
|||
applicationId "com.lagradost.cloudstream3"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 31
|
||||
versionCode 29
|
||||
versionName "2.1.0"
|
||||
versionCode 30
|
||||
versionName "2.1.1"
|
||||
|
||||
resValue "string", "app_version",
|
||||
"${defaultConfig.versionName}${versionNameSuffix ?: ""}"
|
||||
|
|
|
@ -11,12 +11,12 @@ import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
|||
|
||||
class HomeChildItemAdapter(
|
||||
var cardList: List<SearchResponse>,
|
||||
val layout: Int = R.layout.home_result_grid,
|
||||
private val clickCallback: (SearchClickCallback) -> Unit
|
||||
) :
|
||||
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
val layout = R.layout.home_result_grid
|
||||
return CardViewHolder(
|
||||
LayoutInflater.from(parent.context).inflate(layout, parent, false), clickCallback
|
||||
)
|
||||
|
@ -25,7 +25,7 @@ class HomeChildItemAdapter(
|
|||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||
when (holder) {
|
||||
is CardViewHolder -> {
|
||||
holder.bind(cardList[position])
|
||||
holder.bind(cardList[position], position)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,12 +34,21 @@ class HomeChildItemAdapter(
|
|||
return cardList.size
|
||||
}
|
||||
|
||||
override fun getItemId(position: Int): Long {
|
||||
return (cardList[position].id ?: position).toLong()
|
||||
}
|
||||
|
||||
class CardViewHolder
|
||||
constructor(itemView: View, private val clickCallback: (SearchClickCallback) -> Unit) :
|
||||
RecyclerView.ViewHolder(itemView) {
|
||||
|
||||
fun bind(card: SearchResponse) {
|
||||
fun bind(card: SearchResponse, index: Int) {
|
||||
SearchResultBuilder.bind(clickCallback, card, itemView)
|
||||
itemView.tag = index
|
||||
//val ani = ScaleAnimation(0.9f, 1.0f, 0.9f, 1f)
|
||||
//ani.fillAfter = true
|
||||
//ani.duration = 200
|
||||
//itemView.startAnimation(ani)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,10 +15,13 @@ import androidx.core.view.isVisible
|
|||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.LinearSnapHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.apis
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||
import com.lagradost.cloudstream3.mvvm.Resource
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
|
@ -39,10 +42,11 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
|
|||
import com.lagradost.cloudstream3.utils.Event
|
||||
import com.lagradost.cloudstream3.utils.HOMEPAGE_API
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.getGridIsCompact
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIcons
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||
import com.lagradost.cloudstream3.widget.CenterZoomLayoutManager
|
||||
import kotlinx.android.synthetic.main.fragment_home.*
|
||||
|
||||
const val HOME_BOOKMARK_VALUE = "home_bookmarked_last"
|
||||
|
@ -106,61 +110,32 @@ class HomeFragment : Fragment() {
|
|||
}
|
||||
|
||||
private var currentHomePage: HomePageResponse? = null
|
||||
var currentMainIndex = 0
|
||||
var currentMainList: ArrayList<SearchResponse> = ArrayList()
|
||||
|
||||
private fun toggleMainVisibility(visible: Boolean) {
|
||||
home_main_holder.isVisible = visible
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun chooseRandomMainPage(item: SearchResponse? = null): SearchResponse? {
|
||||
private fun chooseRandomMainPage() {
|
||||
val home = currentHomePage
|
||||
if (home != null && home.items.isNotEmpty()) {
|
||||
var random: SearchResponse? = item
|
||||
|
||||
var breakCount = 0
|
||||
val MAX_BREAK_COUNT = 10
|
||||
|
||||
while (random?.posterUrl == null) {
|
||||
try {
|
||||
random = home.items.random().list.random()
|
||||
} catch (e: Exception) {
|
||||
// probs Collection is empty.
|
||||
val randomItems = home.items.shuffled().flatMap { it.list }.distinctBy { it.url }.toList().shuffled()
|
||||
if (randomItems.isNullOrEmpty()) {
|
||||
toggleMainVisibility(false)
|
||||
} else {
|
||||
home_main_poster_recyclerview.adapter =
|
||||
HomeChildItemAdapter(randomItems, R.layout.home_result_big_grid) { callback ->
|
||||
handleSearchClickCallback(activity, callback)
|
||||
}
|
||||
|
||||
breakCount++
|
||||
if (breakCount > MAX_BREAK_COUNT) {
|
||||
break
|
||||
home_main_poster_recyclerview.post {
|
||||
(home_main_poster_recyclerview.layoutManager as CenterZoomLayoutManager?)?.updateSize(forceUpdate = true)
|
||||
}
|
||||
}
|
||||
|
||||
if (random?.posterUrl != null) {
|
||||
home_main_poster.setOnClickListener {
|
||||
activity.loadSearchResult(random)
|
||||
}
|
||||
home_main_play.setOnClickListener {
|
||||
activity.loadSearchResult(random, START_ACTION_RESUME_LATEST)
|
||||
}
|
||||
home_main_info.setOnClickListener {
|
||||
activity.loadSearchResult(random)
|
||||
}
|
||||
|
||||
home_main_text.text = random.name + if (random is AnimeSearchResponse && !random.dubStatus.isNullOrEmpty()) {
|
||||
random.dubStatus?.joinToString(prefix = " • ", separator = " | ") { it.name }
|
||||
} else ""
|
||||
home_main_poster?.setImage(random.posterUrl)
|
||||
|
||||
toggleMainVisibility(true)
|
||||
return random
|
||||
} else {
|
||||
toggleMainVisibility(false)
|
||||
return null
|
||||
}
|
||||
} else {
|
||||
toggleMainVisibility(false)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun fixGrid() {
|
||||
|
@ -214,39 +189,30 @@ class HomeFragment : Fragment() {
|
|||
}
|
||||
}*/
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
fixGrid()
|
||||
|
||||
home_reroll_next.setOnClickListener {
|
||||
currentMainIndex++
|
||||
if (currentMainIndex >= currentMainList.size) {
|
||||
val newItem = chooseRandomMainPage()
|
||||
if (newItem != null) {
|
||||
currentMainList.add(newItem)
|
||||
}
|
||||
currentMainIndex = currentMainList.size - 1
|
||||
}
|
||||
chooseRandomMainPage(currentMainList[currentMainIndex])
|
||||
}
|
||||
|
||||
home_reroll_prev.setOnClickListener {
|
||||
currentMainIndex--
|
||||
if (currentMainIndex < 0) {
|
||||
val newItem = chooseRandomMainPage()
|
||||
if (newItem != null) {
|
||||
currentMainList.add(0, newItem)
|
||||
}
|
||||
currentMainIndex = 0
|
||||
}
|
||||
chooseRandomMainPage(currentMainList[currentMainIndex])
|
||||
}
|
||||
|
||||
home_change_api.setOnClickListener(apiChangeClickListener)
|
||||
home_change_api_loading.setOnClickListener(apiChangeClickListener)
|
||||
|
||||
observe(homeViewModel.apiName) {
|
||||
context?.setKey(HOMEPAGE_API, it)
|
||||
observe(homeViewModel.apiName) { apiName ->
|
||||
context?.setKey(HOMEPAGE_API, apiName)
|
||||
home_provider_name?.text = apiName
|
||||
home_provider_meta_info?.isVisible = false
|
||||
|
||||
getApiFromNameNull(apiName)?.let { currentApi ->
|
||||
val typeChoices = listOf(
|
||||
Pair(R.string.movies, listOf(TvType.Movie)),
|
||||
Pair(R.string.tv_series, listOf(TvType.TvSeries)),
|
||||
Pair(R.string.cartoons, listOf(TvType.Cartoon)),
|
||||
Pair(R.string.anime, listOf(TvType.Anime, TvType.ONA, TvType.AnimeMovie)),
|
||||
Pair(R.string.torrent, listOf(TvType.Torrent)),
|
||||
).filter { item -> currentApi.supportedTypes.any { type -> item.second.contains(type) } }
|
||||
home_provider_meta_info?.text = typeChoices.joinToString(separator = " ") { getString(it.first) }
|
||||
home_provider_meta_info?.isVisible = true
|
||||
}
|
||||
}
|
||||
|
||||
observe(homeViewModel.page) { data ->
|
||||
|
@ -259,18 +225,14 @@ class HomeFragment : Fragment() {
|
|||
d.items.mapNotNull {
|
||||
try {
|
||||
HomePageList(it.name, it.list.filterSearchResponse())
|
||||
} catch (e : Exception) {
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
home_master_recycler?.adapter?.notifyDataSetChanged()
|
||||
currentMainList.clear()
|
||||
chooseRandomMainPage()?.let { response ->
|
||||
currentMainList.add(response)
|
||||
}
|
||||
currentMainIndex = 0
|
||||
chooseRandomMainPage()
|
||||
|
||||
home_loading.visibility = View.GONE
|
||||
home_loading_error.visibility = View.GONE
|
||||
|
@ -407,15 +369,35 @@ class HomeFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
|
||||
context?.fixPaddingStatusbar(home_root)
|
||||
context?.fixPaddingStatusbarView(home_statusbar)
|
||||
context?.fixPaddingStatusbar(home_loading_statusbar)
|
||||
|
||||
home_master_recycler.adapter = adapter
|
||||
home_master_recycler.layoutManager = GridLayoutManager(context, 1)
|
||||
|
||||
LinearSnapHelper().attachToRecyclerView(home_main_poster_recyclerview) // snap
|
||||
val centerLayoutManager = CenterZoomLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
|
||||
centerLayoutManager.setOnSizeListener { index ->
|
||||
(home_main_poster_recyclerview.adapter as HomeChildItemAdapter?)?.cardList?.get(index)?.let { random ->
|
||||
home_main_play.setOnClickListener {
|
||||
activity.loadSearchResult(random, START_ACTION_RESUME_LATEST)
|
||||
}
|
||||
home_main_info.setOnClickListener {
|
||||
activity.loadSearchResult(random)
|
||||
}
|
||||
|
||||
home_main_text.text =
|
||||
random.name + if (random is AnimeSearchResponse && !random.dubStatus.isNullOrEmpty()) {
|
||||
random.dubStatus.joinToString(prefix = " • ", separator = " | ") { it.name }
|
||||
} else ""
|
||||
}
|
||||
}
|
||||
home_main_poster_recyclerview.layoutManager = centerLayoutManager // scale
|
||||
|
||||
reloadStored()
|
||||
val apiName = context?.getKey<String>(HOMEPAGE_API)
|
||||
if(homeViewModel.apiName.value != apiName || apiName == null) {
|
||||
println("Caught home: " + homeViewModel.apiName.value + " at " + apiName)
|
||||
if (homeViewModel.apiName.value != apiName || apiName == null) {
|
||||
//println("Caught home: " + homeViewModel.apiName.value + " at " + apiName)
|
||||
homeViewModel.loadAndCancel(apiName)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ class ParentItemAdapter(
|
|||
private val moreInfo: FrameLayout = itemView.home_child_more_info
|
||||
fun bind(info: HomePageList) {
|
||||
title.text = info.name
|
||||
recyclerView.adapter = HomeChildItemAdapter(info.list, clickCallback)
|
||||
recyclerView.adapter = HomeChildItemAdapter(info.list, clickCallback = clickCallback)
|
||||
(recyclerView.adapter as HomeChildItemAdapter).notifyDataSetChanged()
|
||||
|
||||
moreInfo.setOnClickListener {
|
||||
|
|
|
@ -39,6 +39,7 @@ import com.lagradost.cloudstream3.MainActivity.Companion.getCastSession
|
|||
import com.lagradost.cloudstream3.MainActivity.Companion.showToast
|
||||
import com.lagradost.cloudstream3.mvvm.Resource
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD
|
||||
|
@ -310,7 +311,8 @@ class ResultFragment : Fragment() {
|
|||
CastButtonFactory.setUpMediaRouteButton(it, media_route_button)
|
||||
val castContext = CastContext.getSharedInstance(it.applicationContext)
|
||||
|
||||
if (castContext.castState != CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = VISIBLE
|
||||
if (castContext.castState != CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility =
|
||||
VISIBLE
|
||||
castContext.addCastStateListener { state ->
|
||||
if (media_route_button != null) {
|
||||
if (state == CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = GONE else {
|
||||
|
@ -318,7 +320,7 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
}
|
||||
} catch (e : Exception) {
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
}
|
||||
|
@ -535,6 +537,7 @@ class ResultFragment : Fragment() {
|
|||
val topFolder = "$folder"
|
||||
|
||||
withContext(Dispatchers.IO) {
|
||||
normalSafeApiCall {
|
||||
VideoDownloadManager.downloadThing(
|
||||
ctx,
|
||||
link,
|
||||
|
@ -552,6 +555,7 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val isLoaded = when (episodeClick.action) {
|
||||
ACTION_PLAY_EPISODE_IN_PLAYER -> true
|
||||
|
|
|
@ -19,11 +19,10 @@ object SearchResultBuilder {
|
|||
itemView: View
|
||||
) {
|
||||
val cardView: ImageView = itemView.imageView
|
||||
val cardText: TextView = itemView.imageText
|
||||
val cardText: TextView? = itemView.imageText
|
||||
|
||||
val textIsDub: TextView? = itemView.text_is_dub
|
||||
val textIsSub: TextView? = itemView.text_is_sub
|
||||
println(card.name)
|
||||
|
||||
val bg: CardView = itemView.backgroundCard
|
||||
|
||||
|
@ -37,7 +36,7 @@ object SearchResultBuilder {
|
|||
textIsDub?.visibility = View.GONE
|
||||
textIsSub?.visibility = View.GONE
|
||||
|
||||
cardText.text = card.name
|
||||
cardText?.text = card.name
|
||||
|
||||
//imageTextProvider.text = card.apiName
|
||||
cardView.setImage(card.posterUrl)
|
||||
|
@ -69,7 +68,7 @@ object SearchResultBuilder {
|
|||
playImg?.visibility = View.VISIBLE
|
||||
|
||||
if (!card.type.isMovieType()) {
|
||||
cardText.text = cardText.context.getNameFull(card.name, card.episode, card.season)
|
||||
cardText?.text = cardText?.context?.getNameFull(card.name, card.episode, card.season)
|
||||
}
|
||||
}
|
||||
is AnimeSearchResponse -> {
|
||||
|
|
|
@ -214,6 +214,12 @@ object UIHelper {
|
|||
v.setPadding(v.paddingLeft, v.paddingTop + getStatusBarHeight(), v.paddingRight, v.paddingBottom)
|
||||
}
|
||||
|
||||
fun Context.fixPaddingStatusbarView(v: View) {
|
||||
val params = v.layoutParams
|
||||
params.height = getStatusBarHeight()
|
||||
v.layoutParams = params
|
||||
}
|
||||
|
||||
fun Context.getNavigationBarHeight(): Int {
|
||||
var result = 0
|
||||
val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
package com.lagradost.cloudstream3.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.min
|
||||
|
||||
class CenterZoomLayoutManager : LinearLayoutManager {
|
||||
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(
|
||||
context, attrs, defStyleAttr, defStyleRes
|
||||
)
|
||||
|
||||
constructor(context: Context?) : super(context)
|
||||
constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super(
|
||||
context,
|
||||
orientation,
|
||||
reverseLayout
|
||||
)
|
||||
|
||||
private var itemListener: ((Int) -> Unit)? = null
|
||||
|
||||
// to not spam updates
|
||||
private var lastViewIndex: Int? = null
|
||||
|
||||
private val mShrinkAmount = 0.15f
|
||||
private val mShrinkDistance = 0.9f
|
||||
|
||||
fun updateSize(forceUpdate: Boolean = false) {
|
||||
val midpoint = width / 2f
|
||||
val d0 = 0f
|
||||
val d1 = mShrinkDistance * midpoint
|
||||
val s0 = 1f
|
||||
val s1 = 1f - mShrinkAmount
|
||||
|
||||
var largestTag: Int? = null
|
||||
var largestSize = 0f
|
||||
for (i in 0 until childCount) {
|
||||
getChildAt(i)?.let { child ->
|
||||
val childMidpoint = (getDecoratedRight(child) + getDecoratedLeft(child)) / 2f
|
||||
val d = min(d1, abs(midpoint - childMidpoint))
|
||||
val scale = s0 + (s1 - s0) * (d - d0) / (d1 - d0)
|
||||
child.scaleX = scale
|
||||
child.scaleY = scale
|
||||
|
||||
if (scale > largestSize) {
|
||||
(child.tag as Int?)?.let { tag ->
|
||||
largestSize = scale
|
||||
largestTag = tag
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
largestTag?.let { tag ->
|
||||
if (lastViewIndex != tag || forceUpdate) {
|
||||
lastViewIndex = tag
|
||||
itemListener?.invoke(tag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun setOnSizeListener(listener: (Int) -> Unit) {
|
||||
lastViewIndex = null
|
||||
itemListener = listener
|
||||
}
|
||||
|
||||
fun removeOnSizeListener() {
|
||||
itemListener = null
|
||||
}
|
||||
|
||||
override fun onLayoutCompleted(state: RecyclerView.State?) {
|
||||
super.onLayoutCompleted(state)
|
||||
updateSize()
|
||||
}
|
||||
|
||||
override fun scrollHorizontallyBy(dx: Int, recycler: RecyclerView.Recycler, state: RecyclerView.State): Int {
|
||||
val orientation = orientation
|
||||
return if (orientation == HORIZONTAL) {
|
||||
val scrolled = super.scrollHorizontallyBy(dx, recycler, state)
|
||||
updateSize()
|
||||
scrolled
|
||||
} else {
|
||||
0
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
<FrameLayout
|
||||
android:visibility="gone"
|
||||
tools:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:id="@+id/home_loading"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
@ -22,10 +22,14 @@
|
|||
android:layout_width="50dp"
|
||||
android:layout_height="50dp">
|
||||
</ProgressBar>
|
||||
<FrameLayout
|
||||
android:id="@+id/home_loading_statusbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp">
|
||||
<ImageView
|
||||
android:id="@+id/home_change_api_loading"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_gravity="end"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
|
||||
android:src="@drawable/ic_outline_settings_24"
|
||||
|
@ -34,10 +38,11 @@
|
|||
android:contentDescription="@string/home_change_provider_img_des">
|
||||
</ImageView>
|
||||
</FrameLayout>
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:visibility="gone"
|
||||
tools:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:id="@+id/home_loading_error"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="center"
|
||||
|
@ -47,6 +52,8 @@
|
|||
android:layout_gravity="center"
|
||||
style="@style/WhiteButton"
|
||||
|
||||
android:layout_margin="5dp"
|
||||
|
||||
app:icon="@drawable/ic_baseline_autorenew_24"
|
||||
android:text="@string/reload_error"
|
||||
android:id="@+id/home_reload_connectionerror"
|
||||
|
@ -57,6 +64,8 @@
|
|||
android:layout_gravity="center"
|
||||
style="@style/BlackButton"
|
||||
|
||||
android:layout_margin="5dp"
|
||||
|
||||
app:icon="@drawable/ic_baseline_public_24"
|
||||
android:text="@string/result_open_in_browser"
|
||||
android:id="@+id/home_reload_connection_open_in_browser"
|
||||
|
@ -74,7 +83,8 @@
|
|||
/>
|
||||
</LinearLayout>
|
||||
<androidx.core.widget.NestedScrollView
|
||||
tools:visibility="visible"
|
||||
android:background="?attr/primaryBlackBackground"
|
||||
tools:visibility="gone"
|
||||
android:visibility="gone"
|
||||
android:id="@+id/home_loaded"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -84,11 +94,56 @@
|
|||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<View
|
||||
android:background="?attr/darkBackground"
|
||||
android:id="@+id/home_statusbar"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/home_settings_bar"
|
||||
android:background="?attr/darkBackground"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp">
|
||||
<LinearLayout
|
||||
android:gravity="center"
|
||||
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
|
||||
android:paddingStart="10dp"
|
||||
android:paddingEnd="10dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginEnd="50dp"
|
||||
android:layout_height="match_parent">
|
||||
<TextView
|
||||
android:gravity="center_vertical"
|
||||
android:layout_gravity="center"
|
||||
android:id="@+id/home_provider_name"
|
||||
android:textColor="?attr/textColor"
|
||||
android:textSize="20sp"
|
||||
tools:text="Hello World"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
android:layout_height="wrap_content">
|
||||
</TextView>
|
||||
<TextView
|
||||
android:gravity="center_vertical"
|
||||
android:layout_gravity="center"
|
||||
android:id="@+id/home_provider_meta_info"
|
||||
android:textColor="?attr/grayTextColor"
|
||||
android:textSize="14sp"
|
||||
tools:text="Hello World"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
</TextView>
|
||||
</LinearLayout>
|
||||
|
||||
<ImageView
|
||||
android:nextFocusDown="@id/home_main_info"
|
||||
android:id="@+id/home_change_api"
|
||||
android:layout_margin="10dp"
|
||||
android:layout_gravity="end"
|
||||
android:layout_gravity="center|end"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
|
||||
android:src="@drawable/ic_outline_settings_24"
|
||||
|
@ -97,13 +152,25 @@
|
|||
android:contentDescription="@string/home_change_provider_img_des">
|
||||
<requestFocus/>
|
||||
</ImageView>
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_marginTop="-20dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:id="@+id/home_main_holder"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<ImageView
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:descendantFocusability="afterDescendants"
|
||||
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
android:id="@+id/home_main_poster_recyclerview"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
tools:listitem="@layout/home_result_grid"
|
||||
/>
|
||||
<!--<ImageView
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:id="@+id/home_main_poster"
|
||||
tools:src="@drawable/example_poster"
|
||||
|
@ -112,7 +179,7 @@
|
|||
android:layout_width="150dp"
|
||||
android:layout_height="212dp"
|
||||
android:contentDescription="@string/home_main_poster_img_des">
|
||||
</ImageView>
|
||||
</ImageView>-->
|
||||
<TextView
|
||||
android:id="@+id/home_main_text"
|
||||
android:layout_gravity="center"
|
||||
|
@ -123,31 +190,18 @@
|
|||
android:textSize="15sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:layout_height="40sp"/>
|
||||
<LinearLayout
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<ImageView
|
||||
android:nextFocusLeft="@id/home_reroll_next"
|
||||
android:nextFocusUp="@id/home_change_api"
|
||||
android:nextFocusRight="@id/home_main_play"
|
||||
android:nextFocusDown="@id/home_watch_child_more_info"
|
||||
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginEnd="2dp"
|
||||
android:id="@+id/home_reroll_prev"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:src="@drawable/ic_baseline_arrow_back_24"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:padding="10dp"
|
||||
android:contentDescription="@string/home_next_random_img_des">
|
||||
</ImageView>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:nextFocusLeft="@id/home_reroll_prev"
|
||||
android:nextFocusLeft="@id/home_main_info"
|
||||
android:nextFocusUp="@id/home_change_api"
|
||||
android:nextFocusRight="@id/home_main_info"
|
||||
android:nextFocusDown="@id/home_watch_child_more_info"
|
||||
|
@ -164,7 +218,7 @@
|
|||
<com.google.android.material.button.MaterialButton
|
||||
android:nextFocusLeft="@id/home_main_play"
|
||||
android:nextFocusUp="@id/home_change_api"
|
||||
android:nextFocusRight="@id/home_reroll_next"
|
||||
android:nextFocusRight="@id/home_main_play"
|
||||
android:nextFocusDown="@id/home_watch_child_more_info"
|
||||
|
||||
style="@style/BlackButton"
|
||||
|
@ -178,22 +232,6 @@
|
|||
android:focusable="true"
|
||||
android:layout_width="120dp">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
<ImageView
|
||||
android:nextFocusLeft="@id/home_main_info"
|
||||
android:nextFocusUp="@id/home_change_api"
|
||||
android:nextFocusRight="@id/home_reroll_prev"
|
||||
android:nextFocusDown="@id/home_watch_child_more_info"
|
||||
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginStart="2dp"
|
||||
android:id="@+id/home_reroll_next"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:src="@drawable/ic_baseline_arrow_forward_24"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:padding="10dp"
|
||||
android:contentDescription="@string/home_next_random_img_des">
|
||||
</ImageView>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -21,62 +21,35 @@
|
|||
android:id="@+id/result_loading_error"
|
||||
|
||||
android:visibility="gone"
|
||||
tools:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_reload_connectionerror"
|
||||
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="50dp"
|
||||
android:layout_margin="5dp"
|
||||
style="@style/WhiteButton"
|
||||
|
||||
android:visibility="visible"
|
||||
android:textStyle="bold"
|
||||
app:rippleColor="?attr/iconGrayBackground"
|
||||
android:textColor="?attr/iconGrayBackground"
|
||||
app:iconTint="?attr/iconGrayBackground"
|
||||
android:textAllCaps="false"
|
||||
app:iconGravity="textStart"
|
||||
app:strokeColor="?attr/iconGrayBackground"
|
||||
app:backgroundTint="?attr/textColor"
|
||||
android:layout_margin="5dp"
|
||||
|
||||
app:icon="@drawable/ic_baseline_autorenew_24"
|
||||
app:iconSize="20dp"
|
||||
android:text="@string/reload_error"
|
||||
android:textSize="15sp"
|
||||
app:cornerRadius="5dp"
|
||||
android:id="@+id/result_reload_connectionerror"
|
||||
android:layout_width="wrap_content"
|
||||
android:minWidth="200dp"
|
||||
>
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
/>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_reload_connection_open_in_browser"
|
||||
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="50dp"
|
||||
style="@style/BlackButton"
|
||||
|
||||
android:layout_margin="5dp"
|
||||
|
||||
app:iconGravity="textStart"
|
||||
app:strokeColor="?attr/textColor"
|
||||
android:backgroundTint="?attr/iconGrayBackground"
|
||||
app:rippleColor="?attr/textColor"
|
||||
android:textColor="?attr/textColor"
|
||||
app:iconTint="?attr/textColor"
|
||||
android:textAllCaps="false"
|
||||
android:textStyle="bold"
|
||||
|
||||
app:icon="@drawable/ic_baseline_public_24"
|
||||
app:iconSize="20dp"
|
||||
android:text="@string/result_open_in_browser"
|
||||
android:textSize="15sp"
|
||||
app:cornerRadius="5dp"
|
||||
android:id="@+id/result_reload_connection_open_in_browser"
|
||||
android:layout_width="wrap_content"
|
||||
android:minWidth="200dp"
|
||||
>
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
/>
|
||||
<TextView
|
||||
android:layout_margin="5dp"
|
||||
android:gravity="center"
|
||||
|
@ -322,7 +295,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:nextFocusUp="@id/result_descript"
|
||||
android:nextFocusDown="@id/result_download_movie"
|
||||
|
||||
|
@ -339,6 +312,7 @@
|
|||
<com.google.android.material.button.MaterialButton
|
||||
android:nextFocusUp="@id/result_play_movie"
|
||||
android:nextFocusDown="@id/result_season_button"
|
||||
android:layout_marginBottom="10dp"
|
||||
|
||||
android:id="@+id/result_download_movie"
|
||||
style="@style/BlackButton"
|
||||
|
|
64
app/src/main/res/layout/home_result_big_grid.xml
Normal file
64
app/src/main/res/layout/home_result_big_grid.xml
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!-- android:layout_width="114dp"
|
||||
android:layout_height="180dp"-->
|
||||
<androidx.cardview.widget.CardView
|
||||
android:foreground="@drawable/outline_drawable"
|
||||
android:layout_margin="2dp"
|
||||
android:layout_width="148dp"
|
||||
android:layout_height="234dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:elevation="10dp"
|
||||
app:cardCornerRadius="@dimen/roundedImageRadius"
|
||||
android:id="@+id/backgroundCard"
|
||||
app:cardBackgroundColor="@color/primaryGrayBackground"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<ImageView
|
||||
android:duplicateParentState="true"
|
||||
android:id="@+id/imageView"
|
||||
tools:src="@drawable/example_poster"
|
||||
android:scaleType="centerCrop"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/search_poster_img_des"/>
|
||||
<!--
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="end"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<TextView
|
||||
android:text="@string/app_dubbed_text"
|
||||
android:id="@+id/text_is_dub"
|
||||
android:textColor="@color/textColor"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingTop="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_gravity="end"
|
||||
android:paddingBottom="4dp"
|
||||
android:minWidth="50dp"
|
||||
android:gravity="center"
|
||||
android:background="@drawable/dub_bg_color"
|
||||
android:layout_width="wrap_content" android:layout_height="wrap_content">
|
||||
</TextView>
|
||||
<TextView
|
||||
android:id="@+id/text_is_sub"
|
||||
android:text="@string/app_subbed_text"
|
||||
android:layout_gravity="end"
|
||||
android:textColor="@color/textColor"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:minWidth="50dp"
|
||||
android:gravity="center"
|
||||
android:background="@drawable/sub_bg_color"
|
||||
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
-->
|
||||
</androidx.cardview.widget.CardView>
|
Loading…
Reference in a new issue