mirror of
https://github.com/aniyomiorg/aniyomi.git
synced 2024-11-28 17:19:00 +03:00
commit
7dc77a7f8c
10 changed files with 58 additions and 21 deletions
|
@ -40,7 +40,8 @@ internal class UpdaterNotifier(private val context: Context) {
|
||||||
setContentText(context.getString(R.string.update_check_notification_update_available))
|
setContentText(context.getString(R.string.update_check_notification_update_available))
|
||||||
setSmallIcon(android.R.drawable.stat_sys_download_done)
|
setSmallIcon(android.R.drawable.stat_sys_download_done)
|
||||||
setContentIntent(pendingIntent)
|
setContentIntent(pendingIntent)
|
||||||
// Download action
|
|
||||||
|
clearActions()
|
||||||
addAction(
|
addAction(
|
||||||
android.R.drawable.stat_sys_download_done,
|
android.R.drawable.stat_sys_download_done,
|
||||||
context.getString(R.string.action_download),
|
context.getString(R.string.action_download),
|
||||||
|
@ -85,19 +86,20 @@ internal class UpdaterNotifier(private val context: Context) {
|
||||||
* @param uri path location of apk.
|
* @param uri path location of apk.
|
||||||
*/
|
*/
|
||||||
fun onDownloadFinished(uri: Uri) {
|
fun onDownloadFinished(uri: Uri) {
|
||||||
|
val installIntent = NotificationHandler.installApkPendingActivity(context, uri)
|
||||||
with(notificationBuilder) {
|
with(notificationBuilder) {
|
||||||
setContentText(context.getString(R.string.update_check_notification_download_complete))
|
setContentText(context.getString(R.string.update_check_notification_download_complete))
|
||||||
setSmallIcon(android.R.drawable.stat_sys_download_done)
|
setSmallIcon(android.R.drawable.stat_sys_download_done)
|
||||||
setOnlyAlertOnce(false)
|
setOnlyAlertOnce(false)
|
||||||
setProgress(0, 0, false)
|
setProgress(0, 0, false)
|
||||||
// Install action
|
setContentIntent(installIntent)
|
||||||
setContentIntent(NotificationHandler.installApkPendingActivity(context, uri))
|
|
||||||
|
clearActions()
|
||||||
addAction(
|
addAction(
|
||||||
R.drawable.ic_system_update_alt_white_24dp,
|
R.drawable.ic_system_update_alt_white_24dp,
|
||||||
context.getString(R.string.action_install),
|
context.getString(R.string.action_install),
|
||||||
NotificationHandler.installApkPendingActivity(context, uri)
|
installIntent
|
||||||
)
|
)
|
||||||
// Cancel action
|
|
||||||
addAction(
|
addAction(
|
||||||
R.drawable.ic_close_24dp,
|
R.drawable.ic_close_24dp,
|
||||||
context.getString(R.string.action_cancel),
|
context.getString(R.string.action_cancel),
|
||||||
|
@ -118,13 +120,13 @@ internal class UpdaterNotifier(private val context: Context) {
|
||||||
setSmallIcon(android.R.drawable.stat_sys_warning)
|
setSmallIcon(android.R.drawable.stat_sys_warning)
|
||||||
setOnlyAlertOnce(false)
|
setOnlyAlertOnce(false)
|
||||||
setProgress(0, 0, false)
|
setProgress(0, 0, false)
|
||||||
// Retry action
|
|
||||||
|
clearActions()
|
||||||
addAction(
|
addAction(
|
||||||
R.drawable.ic_refresh_24dp,
|
R.drawable.ic_refresh_24dp,
|
||||||
context.getString(R.string.action_retry),
|
context.getString(R.string.action_retry),
|
||||||
UpdaterService.downloadApkPendingService(context, url)
|
UpdaterService.downloadApkPendingService(context, url)
|
||||||
)
|
)
|
||||||
// Cancel action
|
|
||||||
addAction(
|
addAction(
|
||||||
R.drawable.ic_close_24dp,
|
R.drawable.ic_close_24dp,
|
||||||
context.getString(R.string.action_cancel),
|
context.getString(R.string.action_cancel),
|
||||||
|
|
|
@ -18,6 +18,7 @@ import com.google.android.material.tabs.TabLayout
|
||||||
import com.jakewharton.rxrelay.BehaviorRelay
|
import com.jakewharton.rxrelay.BehaviorRelay
|
||||||
import com.jakewharton.rxrelay.PublishRelay
|
import com.jakewharton.rxrelay.PublishRelay
|
||||||
import com.tfcporciuncula.flow.Preference
|
import com.tfcporciuncula.flow.Preference
|
||||||
|
import dev.chrisbanes.insetter.applyInsetter
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Category
|
import eu.kanade.tachiyomi.data.database.models.Category
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
@ -165,6 +166,11 @@ class LibraryController(
|
||||||
|
|
||||||
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
|
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
|
||||||
binding = LibraryControllerBinding.inflate(inflater)
|
binding = LibraryControllerBinding.inflate(inflater)
|
||||||
|
binding.actionToolbar.applyInsetter {
|
||||||
|
type(navigationBars = true) {
|
||||||
|
margin(bottom = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.marginTop
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.preference.PreferenceDialogController
|
import androidx.preference.PreferenceDialogController
|
||||||
|
@ -152,6 +153,9 @@ class MainActivity : BaseViewBindingActivity<MainActivityBinding>() {
|
||||||
val controller = router.getControllerWithTag(id.toString()) as? LibraryController
|
val controller = router.getControllerWithTag(id.toString()) as? LibraryController
|
||||||
controller?.showSettingsSheet()
|
controller?.showSettingsSheet()
|
||||||
}
|
}
|
||||||
|
R.id.nav_updates -> {
|
||||||
|
router.pushController(DownloadController().withFadeTransaction())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
|
@ -445,7 +449,7 @@ class MainActivity : BaseViewBindingActivity<MainActivityBinding>() {
|
||||||
fun fixViewToBottom(view: View) {
|
fun fixViewToBottom(view: View) {
|
||||||
val listener = AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
|
val listener = AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
|
||||||
val maxAbsOffset = appBarLayout.measuredHeight - binding.tabs.measuredHeight
|
val maxAbsOffset = appBarLayout.measuredHeight - binding.tabs.measuredHeight
|
||||||
view.translationY = -maxAbsOffset - verticalOffset.toFloat()
|
view.translationY = -maxAbsOffset - verticalOffset.toFloat() + appBarLayout.marginTop
|
||||||
}
|
}
|
||||||
binding.appbar.addOnOffsetChangedListener(listener)
|
binding.appbar.addOnOffsetChangedListener(listener)
|
||||||
fixedViewsToBottom[view] = listener
|
fixedViewsToBottom[view] = listener
|
||||||
|
|
|
@ -206,6 +206,11 @@ class MangaController :
|
||||||
padding()
|
padding()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
binding.actionToolbar.applyInsetter {
|
||||||
|
type(navigationBars = true) {
|
||||||
|
margin(bottom = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1003,9 +1008,10 @@ class MangaController :
|
||||||
// OVERFLOW MENU DIALOGS
|
// OVERFLOW MENU DIALOGS
|
||||||
|
|
||||||
private fun getUnreadChaptersSorted() = presenter.chapters
|
private fun getUnreadChaptersSorted() = presenter.chapters
|
||||||
|
.sortedWith(presenter.getChapterSort())
|
||||||
.filter { !it.read && it.status == Download.State.NOT_DOWNLOADED }
|
.filter { !it.read && it.status == Download.State.NOT_DOWNLOADED }
|
||||||
.distinctBy { it.name }
|
.distinctBy { it.name }
|
||||||
.sortedByDescending { it.source_order }
|
.reversed()
|
||||||
|
|
||||||
private fun downloadChapters(choice: Int) {
|
private fun downloadChapters(choice: Int) {
|
||||||
val chaptersToDownload = when (choice) {
|
val chaptersToDownload = when (choice) {
|
||||||
|
|
|
@ -429,7 +429,11 @@ class MangaPresenter(
|
||||||
observable = observable.filter { !it.bookmark }
|
observable = observable.filter { !it.bookmark }
|
||||||
}
|
}
|
||||||
|
|
||||||
val sortFunction: (Chapter, Chapter) -> Int = when (manga.sorting) {
|
return observable.toSortedList(getChapterSort())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getChapterSort(): (Chapter, Chapter) -> Int {
|
||||||
|
return when (manga.sorting) {
|
||||||
Manga.SORTING_SOURCE -> when (sortDescending()) {
|
Manga.SORTING_SOURCE -> when (sortDescending()) {
|
||||||
true -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
|
true -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
|
||||||
false -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
|
false -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
|
||||||
|
@ -444,8 +448,6 @@ class MangaPresenter(
|
||||||
}
|
}
|
||||||
else -> throw NotImplementedError("Unimplemented sorting method")
|
else -> throw NotImplementedError("Unimplemented sorting method")
|
||||||
}
|
}
|
||||||
|
|
||||||
return observable.toSortedList(sortFunction)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -472,7 +474,7 @@ class MangaPresenter(
|
||||||
* Returns the next unread chapter or null if everything is read.
|
* Returns the next unread chapter or null if everything is read.
|
||||||
*/
|
*/
|
||||||
fun getNextUnreadChapter(): ChapterItem? {
|
fun getNextUnreadChapter(): ChapterItem? {
|
||||||
return chapters.sortedByDescending { it.source_order }.find { !it.read }
|
return chapters.sortedWith(getChapterSort()).findLast { !it.read }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package eu.kanade.tachiyomi.ui.manga.chapter
|
package eu.kanade.tachiyomi.ui.manga.chapter
|
||||||
|
|
||||||
import android.text.SpannableString
|
|
||||||
import android.text.SpannableStringBuilder
|
import android.text.SpannableStringBuilder
|
||||||
import android.text.style.ForegroundColorSpan
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.core.text.buildSpannedString
|
||||||
|
import androidx.core.text.color
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
@ -59,8 +59,10 @@ class ChapterHolder(
|
||||||
descriptions.add(adapter.dateFormat.format(Date(chapter.date_upload)))
|
descriptions.add(adapter.dateFormat.format(Date(chapter.date_upload)))
|
||||||
}
|
}
|
||||||
if (!chapter.read && chapter.last_page_read > 0) {
|
if (!chapter.read && chapter.last_page_read > 0) {
|
||||||
val lastPageRead = SpannableString(itemView.context.getString(R.string.chapter_progress, chapter.last_page_read + 1)).apply {
|
val lastPageRead = buildSpannedString {
|
||||||
setSpan(ForegroundColorSpan(adapter.readColor), 0, length, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE)
|
color(adapter.readColor) {
|
||||||
|
append(itemView.context.getString(R.string.chapter_progress, chapter.last_page_read + 1))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
descriptions.add(lastPageRead)
|
descriptions.add(lastPageRead)
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,11 @@ class UpdatesController :
|
||||||
padding()
|
padding()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
binding.actionToolbar.applyInsetter {
|
||||||
|
type(navigationBars = true) {
|
||||||
|
margin(bottom = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,8 +139,10 @@ class WebViewActivity : BaseViewBindingActivity<WebviewActivityBinding>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
binding.webview?.destroy()
|
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
|
|
||||||
|
// Binding sometimes isn't actually instantiated yet somehow
|
||||||
|
binding?.webview?.destroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
|
|
@ -34,6 +34,7 @@ import androidx.core.net.toUri
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.util.lang.truncateCenter
|
import eu.kanade.tachiyomi.util.lang.truncateCenter
|
||||||
|
import timber.log.Timber
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
@ -69,10 +70,15 @@ fun Context.toast(text: String?, duration: Int = Toast.LENGTH_SHORT, block: (Toa
|
||||||
fun Context.copyToClipboard(label: String, content: String) {
|
fun Context.copyToClipboard(label: String, content: String) {
|
||||||
if (content.isBlank()) return
|
if (content.isBlank()) return
|
||||||
|
|
||||||
|
try {
|
||||||
val clipboard = getSystemService<ClipboardManager>()!!
|
val clipboard = getSystemService<ClipboardManager>()!!
|
||||||
clipboard.setPrimaryClip(ClipData.newPlainText(label, content))
|
clipboard.setPrimaryClip(ClipData.newPlainText(label, content))
|
||||||
|
|
||||||
toast(getString(R.string.copied_to_clipboard, content.truncateCenter(50)))
|
toast(getString(R.string.copied_to_clipboard, content.truncateCenter(50)))
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
Timber.e(e)
|
||||||
|
toast(R.string.clipboard_copy_error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -537,6 +537,7 @@
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="delete_downloads_for_manga">Delete downloaded chapters?</string>
|
<string name="delete_downloads_for_manga">Delete downloaded chapters?</string>
|
||||||
<string name="copied_to_clipboard">Copied to clipboard:\n%1$s</string>
|
<string name="copied_to_clipboard">Copied to clipboard:\n%1$s</string>
|
||||||
|
<string name="clipboard_copy_error">Failed to copy to clipboard</string>
|
||||||
<string name="source_not_installed">Source not installed: %1$s</string>
|
<string name="source_not_installed">Source not installed: %1$s</string>
|
||||||
<string name="snack_add_to_library">Add manga to library?</string>
|
<string name="snack_add_to_library">Add manga to library?</string>
|
||||||
|
|
||||||
|
@ -710,6 +711,7 @@
|
||||||
<!--UpdateCheck-->
|
<!--UpdateCheck-->
|
||||||
<string name="update_check_confirm">Download</string>
|
<string name="update_check_confirm">Download</string>
|
||||||
<string name="update_check_ignore">Ignore</string>
|
<string name="update_check_ignore">Ignore</string>
|
||||||
|
<string name="update_check_eol">This Android version is no longer supported</string>
|
||||||
<string name="update_check_no_new_updates">No new updates available</string>
|
<string name="update_check_no_new_updates">No new updates available</string>
|
||||||
<string name="update_check_look_for_updates">Searching for updates…</string>
|
<string name="update_check_look_for_updates">Searching for updates…</string>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue