We're at 7 bottom sheets now Using vibrant color for manga cover backgroundpull/3117/head
parent
9a4894ba95
commit
1ce426d1c9
@ -0,0 +1,71 @@
|
|||||||
|
package eu.kanade.tachiyomi.ui.download
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
|
import eu.kanade.tachiyomi.data.download.model.DownloadQueue
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.Job
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Presenter of [DownloadBottomSheet].
|
||||||
|
*/
|
||||||
|
class DownloadBottomPresenter(val sheet: DownloadBottomSheet) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Download manager.
|
||||||
|
*/
|
||||||
|
val downloadManager: DownloadManager by injectLazy()
|
||||||
|
var items = listOf<DownloadItem>()
|
||||||
|
|
||||||
|
private var scope = CoroutineScope(Job() + Dispatchers.Default)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Property to get the queue from the download manager.
|
||||||
|
*/
|
||||||
|
val downloadQueue: DownloadQueue
|
||||||
|
get() = downloadManager.queue
|
||||||
|
|
||||||
|
fun getItems() {
|
||||||
|
scope.launch {
|
||||||
|
val items = downloadQueue.map(::DownloadItem)
|
||||||
|
val hasChanged = if (this@DownloadBottomPresenter.items.size != items.size) true
|
||||||
|
else {
|
||||||
|
val oldItemsIds = this@DownloadBottomPresenter.items.mapNotNull {
|
||||||
|
it.download.chapter.id
|
||||||
|
}.toLongArray()
|
||||||
|
val newItemsIds = items.mapNotNull { it.download.chapter.id }.toLongArray()
|
||||||
|
!oldItemsIds.contentEquals(newItemsIds)
|
||||||
|
}
|
||||||
|
this@DownloadBottomPresenter.items = items
|
||||||
|
if (hasChanged) {
|
||||||
|
withContext(Dispatchers.Main) { sheet.onNextDownloads(items) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pauses the download queue.
|
||||||
|
*/
|
||||||
|
fun pauseDownloads() {
|
||||||
|
downloadManager.pauseDownloads()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the download queue.
|
||||||
|
*/
|
||||||
|
fun clearQueue() {
|
||||||
|
downloadManager.clearQueue()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reorder(downloads: List<Download>) {
|
||||||
|
downloadManager.reorderQueue(downloads)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun cancelDownload(download: Download) {
|
||||||
|
downloadManager.deletePendingDownloads(download)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,272 @@
|
|||||||
|
package eu.kanade.tachiyomi.ui.download
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
|
import eu.kanade.tachiyomi.R
|
||||||
|
import eu.kanade.tachiyomi.data.download.DownloadService
|
||||||
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
|
import eu.kanade.tachiyomi.ui.extension.ExtensionDividerItemDecoration
|
||||||
|
import eu.kanade.tachiyomi.ui.recents.RecentsController
|
||||||
|
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
|
||||||
|
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets
|
||||||
|
import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
||||||
|
import kotlinx.android.synthetic.main.download_bottom_sheet.view.*
|
||||||
|
|
||||||
|
class DownloadBottomSheet @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? =
|
||||||
|
null
|
||||||
|
) : LinearLayout(context, attrs),
|
||||||
|
DownloadAdapter.DownloadItemListener {
|
||||||
|
lateinit var controller: RecentsController
|
||||||
|
var sheetBehavior: BottomSheetBehavior<*>? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapter containing the active downloads.
|
||||||
|
*/
|
||||||
|
private var adapter: DownloadAdapter? = null
|
||||||
|
|
||||||
|
private val presenter = DownloadBottomPresenter(this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the download queue is running or not.
|
||||||
|
*/
|
||||||
|
private var isRunning: Boolean = false
|
||||||
|
private var activity: Activity? = null
|
||||||
|
|
||||||
|
fun onCreate(controller: RecentsController) {
|
||||||
|
// Initialize adapter, scroll listener and recycler views
|
||||||
|
adapter = DownloadAdapter(this)
|
||||||
|
sheetBehavior = BottomSheetBehavior.from(this)
|
||||||
|
activity = controller.activity
|
||||||
|
// Create recycler and set adapter.
|
||||||
|
dl_recycler.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context)
|
||||||
|
dl_recycler.adapter = adapter
|
||||||
|
adapter?.isHandleDragEnabled = true
|
||||||
|
adapter?.isSwipeEnabled = true
|
||||||
|
dl_recycler.setHasFixedSize(true)
|
||||||
|
dl_recycler.addItemDecoration(ExtensionDividerItemDecoration(context))
|
||||||
|
dl_recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
|
||||||
|
this.controller = controller
|
||||||
|
updateDLTitle()
|
||||||
|
|
||||||
|
val attrsArray = intArrayOf(android.R.attr.actionBarSize)
|
||||||
|
val array = context.obtainStyledAttributes(attrsArray)
|
||||||
|
val headerHeight = array.getDimensionPixelSize(0, 0)
|
||||||
|
array.recycle()
|
||||||
|
dl_recycler.doOnApplyWindowInsets { _, windowInsets, _ ->
|
||||||
|
dl_recycler.updateLayoutParams<MarginLayoutParams> {
|
||||||
|
topMargin = windowInsets.systemWindowInsetTop + headerHeight - sheet_layout.height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sheet_layout.setOnClickListener {
|
||||||
|
if (sheetBehavior?.state != BottomSheetBehavior.STATE_EXPANDED) {
|
||||||
|
sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
|
||||||
|
} else {
|
||||||
|
sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update()
|
||||||
|
setBottomSheet()
|
||||||
|
|
||||||
|
if (sheetBehavior?.state != BottomSheetBehavior.STATE_EXPANDED && sheetBehavior?.isHideable == true) sheetBehavior?.state =
|
||||||
|
BottomSheetBehavior.STATE_HIDDEN
|
||||||
|
}
|
||||||
|
|
||||||
|
fun update() {
|
||||||
|
presenter.getItems()
|
||||||
|
onQueueStatusChange(!presenter.downloadManager.isPaused())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateDLTitle() {
|
||||||
|
val extCount = presenter.downloadQueue.firstOrNull()
|
||||||
|
title_text.text = if (extCount != null) resources.getString(
|
||||||
|
R.string.downloading_x, extCount.chapter.name
|
||||||
|
)
|
||||||
|
else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the queue's status has changed. Updates the visibility of the buttons.
|
||||||
|
*
|
||||||
|
* @param running whether the queue is now running or not.
|
||||||
|
*/
|
||||||
|
private fun onQueueStatusChange(running: Boolean) {
|
||||||
|
val oldRunning = isRunning
|
||||||
|
isRunning = running
|
||||||
|
if (oldRunning != running) {
|
||||||
|
activity?.invalidateOptionsMenu()
|
||||||
|
|
||||||
|
// Check if download queue is empty and update information accordingly.
|
||||||
|
setInformationView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called from the presenter to assign the downloads for the adapter.
|
||||||
|
*
|
||||||
|
* @param downloads the downloads from the queue.
|
||||||
|
*/
|
||||||
|
fun onNextDownloads(downloads: List<DownloadItem>) {
|
||||||
|
activity?.invalidateOptionsMenu()
|
||||||
|
setInformationView()
|
||||||
|
adapter?.updateDataSet(downloads)
|
||||||
|
setBottomSheet()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the progress of a download changes.
|
||||||
|
*
|
||||||
|
* @param download the download whose progress has changed.
|
||||||
|
*/
|
||||||
|
fun onUpdateProgress(download: Download) {
|
||||||
|
getHolder(download)?.notifyProgress()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a page of a download is downloaded.
|
||||||
|
*
|
||||||
|
* @param download the download whose page has been downloaded.
|
||||||
|
*/
|
||||||
|
fun onUpdateDownloadedPages(download: Download) {
|
||||||
|
getHolder(download)?.notifyDownloadedPages()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the holder for the given download.
|
||||||
|
*
|
||||||
|
* @param download the download to find.
|
||||||
|
* @return the holder of the download or null if it's not bound.
|
||||||
|
*/
|
||||||
|
private fun getHolder(download: Download): DownloadHolder? {
|
||||||
|
return dl_recycler?.findViewHolderForItemId(download.chapter.id!!) as? DownloadHolder
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set information view when queue is empty
|
||||||
|
*/
|
||||||
|
private fun setInformationView() {
|
||||||
|
updateDLTitle()
|
||||||
|
setBottomSheet()
|
||||||
|
if (presenter.downloadQueue.isEmpty()) {
|
||||||
|
empty_view?.show(
|
||||||
|
R.drawable.ic_file_download_black_128dp,
|
||||||
|
R.string.nothing_downloading)
|
||||||
|
} else {
|
||||||
|
empty_view?.hide()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun prepareMenu(menu: Menu) {
|
||||||
|
// Set start button visibility.
|
||||||
|
menu.findItem(R.id.start_queue)?.isVisible = !isRunning && !presenter.downloadQueue.isEmpty()
|
||||||
|
|
||||||
|
// Set pause button visibility.
|
||||||
|
menu.findItem(R.id.pause_queue)?.isVisible = isRunning && !presenter.downloadQueue.isEmpty()
|
||||||
|
|
||||||
|
// Set clear button visibility.
|
||||||
|
menu.findItem(R.id.clear_queue)?.isVisible = !presenter.downloadQueue.isEmpty()
|
||||||
|
|
||||||
|
// Set reorder button visibility.
|
||||||
|
menu.findItem(R.id.reorder)?.isVisible = !presenter.downloadQueue.isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
val context = activity ?: return false
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.start_queue -> DownloadService.start(context)
|
||||||
|
R.id.pause_queue -> {
|
||||||
|
DownloadService.stop(context)
|
||||||
|
presenter.pauseDownloads()
|
||||||
|
}
|
||||||
|
R.id.clear_queue -> {
|
||||||
|
DownloadService.stop(context)
|
||||||
|
presenter.clearQueue()
|
||||||
|
}
|
||||||
|
R.id.newest, R.id.oldest -> {
|
||||||
|
val adapter = adapter ?: return false
|
||||||
|
val items = adapter.currentItems.sortedBy { it.download.chapter.date_upload }
|
||||||
|
.toMutableList()
|
||||||
|
if (item.itemId == R.id.newest)
|
||||||
|
items.reverse()
|
||||||
|
adapter.updateDataSet(items)
|
||||||
|
val downloads = items.mapNotNull { it.download }
|
||||||
|
presenter.reorder(downloads)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dismiss() {
|
||||||
|
if (sheetBehavior?.isHideable == true) {
|
||||||
|
sheetBehavior?.state = BottomSheetBehavior.STATE_HIDDEN
|
||||||
|
} else {
|
||||||
|
sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setBottomSheet() {
|
||||||
|
val hasQueue = presenter.downloadQueue.isNotEmpty()
|
||||||
|
if (hasQueue) {
|
||||||
|
sheetBehavior?.skipCollapsed = !hasQueue
|
||||||
|
if (sheetBehavior?.state == BottomSheetBehavior.STATE_HIDDEN) sheetBehavior?.state =
|
||||||
|
BottomSheetBehavior.STATE_COLLAPSED
|
||||||
|
sheetBehavior?.isHideable = !hasQueue
|
||||||
|
} else {
|
||||||
|
sheetBehavior?.isHideable = !hasQueue
|
||||||
|
sheetBehavior?.skipCollapsed = !hasQueue
|
||||||
|
if (sheetBehavior?.state == BottomSheetBehavior.STATE_COLLAPSED) sheetBehavior?.state =
|
||||||
|
BottomSheetBehavior.STATE_HIDDEN
|
||||||
|
}
|
||||||
|
controller.setPadding(!hasQueue)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when an item is released from a drag.
|
||||||
|
*
|
||||||
|
* @param position The position of the released item.
|
||||||
|
*/
|
||||||
|
override fun onItemReleased(position: Int) {
|
||||||
|
val adapter = adapter ?: return
|
||||||
|
val downloads = (0 until adapter.itemCount).mapNotNull { adapter.getItem(it)?.download }
|
||||||
|
presenter.reorder(downloads)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onItemRemoved(position: Int) {
|
||||||
|
val download = adapter?.getItem(position)?.download ?: return
|
||||||
|
presenter.cancelDownload(download)
|
||||||
|
|
||||||
|
adapter?.removeItem(position)
|
||||||
|
val adapter = adapter ?: return
|
||||||
|
val downloads = (0 until adapter.itemCount).mapNotNull { adapter.getItem(it)?.download }
|
||||||
|
presenter.reorder(downloads)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the menu item of a download is pressed
|
||||||
|
*
|
||||||
|
* @param position The position of the item
|
||||||
|
* @param menuItem The menu Item pressed
|
||||||
|
*/
|
||||||
|
override fun onMenuItemClick(position: Int, menuItem: MenuItem) {
|
||||||
|
when (menuItem.itemId) {
|
||||||
|
R.id.move_to_top, R.id.move_to_bottom -> {
|
||||||
|
val items = adapter?.currentItems?.toMutableList() ?: return
|
||||||
|
val item = items[position]
|
||||||
|
items.remove(item)
|
||||||
|
if (menuItem.itemId == R.id.move_to_top)
|
||||||
|
items.add(0, item)
|
||||||
|
else
|
||||||
|
items.add(item)
|
||||||
|
adapter?.updateDataSet(items)
|
||||||
|
val downloads = items.mapNotNull { it.download }
|
||||||
|
presenter.reorder(downloads)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<eu.kanade.tachiyomi.ui.download.DownloadBottomSheet 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"
|
||||||
|
android:id="@+id/dl_bottom_sheet"
|
||||||
|
style="@style/BottomSheetDialogTheme"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/bg_bottom_sheet_dialog_fragment"
|
||||||
|
android:backgroundTint="?android:attr/colorBackground"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:behavior_peekHeight="48sp"
|
||||||
|
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/sheet_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:background="@drawable/bg_bottom_sheet_dialog_fragment"
|
||||||
|
android:backgroundTint="?attr/colorPrimaryVariant"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/pill"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:alpha="0.25"
|
||||||
|
android:contentDescription="@string/drag_handle"
|
||||||
|
android:src="@drawable/draggable_pill"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/title_text"
|
||||||
|
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:textColor="?actionBarTintColor"
|
||||||
|
android:textSize="18sp"
|
||||||
|
tools:text="Downloads" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:background="?android:attr/colorBackground"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/dl_recycler"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
tools:listitem="@layout/download_item"/>
|
||||||
|
|
||||||
|
<eu.kanade.tachiyomi.widget.EmptyView
|
||||||
|
android:id="@+id/empty_view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
</FrameLayout>
|
||||||
|
</eu.kanade.tachiyomi.ui.download.DownloadBottomSheet>
|
@ -1,88 +1,127 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout 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"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:paddingStart="0dp"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:paddingTop="@dimen/material_component_lists_padding_above_list">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<ImageView
|
<FrameLayout
|
||||||
android:id="@+id/reorder"
|
android:id="@+id/right_view"
|
||||||
android:layout_width="@dimen/material_component_lists_single_line_with_avatar_height"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="match_parent"
|
||||||
android:layout_alignParentStart="true"
|
android:visibility="gone"
|
||||||
android:layout_gravity="start"
|
android:background="@color/red_error">
|
||||||
android:contentDescription="@string/action_reorganize_by"
|
|
||||||
android:scaleType="center"
|
|
||||||
android:tint="?android:attr/textColorPrimary"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:srcCompat="@drawable/ic_reorder_grey_24dp" />
|
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:id="@+id/manga_full_title"
|
android:id="@+id/close_right"
|
||||||
android:layout_width="0dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="24dp"
|
||||||
android:layout_marginEnd="8dp"
|
android:tint="@color/md_white_1000"
|
||||||
android:layout_toEndOf="@id/reorder"
|
android:layout_gravity="end|center"
|
||||||
android:ellipsize="end"
|
android:layout_marginEnd="21dp"
|
||||||
android:maxLines="1"
|
android:src="@drawable/ic_close_white_24dp" />
|
||||||
android:textAppearance="@style/TextAppearance.Regular.Body1"
|
</FrameLayout>
|
||||||
app:layout_constraintEnd_toStartOf="@+id/download_progress_text"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/reorder"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
tools:text="Manga title" />
|
|
||||||
|
|
||||||
<TextView
|
<FrameLayout
|
||||||
android:id="@+id/chapter_title"
|
android:id="@+id/left_view"
|
||||||
android:layout_width="0dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginTop="4dp"
|
android:visibility="gone"
|
||||||
android:layout_toEndOf="@id/reorder"
|
android:background="@color/red_error">
|
||||||
android:ellipsize="end"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:textAppearance="@style/TextAppearance.Regular.Caption"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
|
||||||
app:layout_constraintStart_toStartOf="@+id/manga_full_title"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/manga_full_title"
|
|
||||||
tools:text="Chapter Title" />
|
|
||||||
|
|
||||||
<ProgressBar
|
<ImageView
|
||||||
android:id="@+id/download_progress"
|
android:id="@+id/close_left"
|
||||||
style="?android:attr/progressBarStyleHorizontal"
|
android:layout_width="24dp"
|
||||||
android:layout_width="0dp"
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="start|center"
|
||||||
|
android:layout_marginStart="21dp"
|
||||||
|
android:tint="@color/md_white_1000"
|
||||||
|
android:src="@drawable/ic_close_white_24dp" />
|
||||||
|
</FrameLayout>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:id="@+id/front_view"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
android:background="?android:attr/colorBackground"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
android:paddingTop="@dimen/material_component_lists_padding_above_list">
|
||||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/reorder"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/chapter_title" />
|
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:id="@+id/download_progress_text"
|
android:id="@+id/reorder"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="@dimen/material_component_lists_single_line_with_avatar_height"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="0dp"
|
||||||
android:layout_toEndOf="@id/manga_full_title"
|
android:layout_alignParentStart="true"
|
||||||
android:maxLines="1"
|
android:layout_gravity="start"
|
||||||
android:textAppearance="@style/TextAppearance.Regular.Caption.Hint"
|
android:contentDescription="@string/action_reorganize_by"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/manga_full_title"
|
android:scaleType="center"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
android:tint="?android:attr/textColorPrimary"
|
||||||
app:layout_constraintTop_toTopOf="@+id/manga_full_title"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
tools:text="(0/10)" />
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_reorder_grey_24dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/manga_full_title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:layout_toEndOf="@id/reorder"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textAppearance="@style/TextAppearance.Regular.Body1"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/download_progress_text"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/reorder"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:text="Manga title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/chapter_title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_toEndOf="@id/reorder"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textAppearance="@style/TextAppearance.Regular.Caption"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/manga_full_title"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/manga_full_title"
|
||||||
|
tools:text="Chapter Title" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/download_progress"
|
||||||
|
style="?android:attr/progressBarStyleHorizontal"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/reorder"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/chapter_title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/download_progress_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_toEndOf="@id/manga_full_title"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textAppearance="@style/TextAppearance.Regular.Caption.Hint"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/manga_full_title"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/manga_full_title"
|
||||||
|
tools:text="(0/10)" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/migration_menu"
|
android:id="@+id/migration_menu"
|
||||||
android:layout_width="44dp"
|
android:layout_width="44dp"
|
||||||
android:paddingStart="10dp"
|
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
|
||||||
android:paddingEnd="10dp"
|
android:layout_toEndOf="@id/download_progress_text"
|
||||||
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
|
android:contentDescription="@string/description_cover"
|
||||||
android:layout_toEndOf="@id/download_progress_text"
|
android:paddingStart="10dp"
|
||||||
android:contentDescription="@string/description_cover"
|
android:paddingEnd="10dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:srcCompat="@drawable/ic_more_vert_black_24dp" />
|
app:srcCompat="@drawable/ic_more_vert_black_24dp" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</FrameLayout>
|
@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/recents_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/frame_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?android:attr/colorBackground">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
tools:listitem="@layout/catalogue_main_controller_card" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/shadow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:alpha="0.5"
|
||||||
|
android:background="@drawable/shape_gradient_top_shadow"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
app:layout_anchorGravity="top"
|
||||||
|
app:layout_anchor="@id/dl_bottom_sheet" />
|
||||||
|
<!-- Adding bottom sheet after main content -->
|
||||||
|
<include layout="@layout/download_bottom_sheet"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/shadow2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="8dp"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
android:alpha="0.25"
|
||||||
|
android:background="@drawable/shape_gradient_top_shadow" />
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
Loading…
Reference in new issue