Still more insets work
Fixed insets for landscape manga info controller + using snackbars for adding and removing mangas
This commit is contained in:
parent
fee8ccab86
commit
197b5cf6a4
@ -27,7 +27,7 @@ interface GithubService {
|
||||
}
|
||||
}
|
||||
|
||||
@GET("/repos/inorichi/tachiyomi/releases/latest")
|
||||
@GET("/repos/Jays2Kings/tachiyomi/releases/latest")
|
||||
fun getLatestVersion(): Observable<GithubRelease>
|
||||
|
||||
}
|
||||
|
@ -375,9 +375,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
||||
presenter.requestNext()
|
||||
}
|
||||
}
|
||||
snack?.view?.doOnApplyWindowInsets { v, _, padding ->
|
||||
v.setPadding(padding.left,0,padding.right,0)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -379,9 +379,6 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
|
||||
presenter.addToLibrary()
|
||||
}
|
||||
}
|
||||
snack.view.doOnApplyWindowInsets { v, _, padding ->
|
||||
v.setPadding(padding.left,0,padding.right,0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,12 +6,12 @@ import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.customtabs.CustomTabsIntent
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v4.content.pm.ShortcutInfoCompat
|
||||
import android.support.v4.content.pm.ShortcutManagerCompat
|
||||
import android.support.v4.graphics.drawable.IconCompat
|
||||
@ -49,6 +49,7 @@ import uy.kohesive.injekt.injectLazy
|
||||
import java.text.DateFormat
|
||||
import java.text.DecimalFormat
|
||||
import java.util.Date
|
||||
import kotlin.math.max
|
||||
|
||||
/**
|
||||
* Fragment that shows manga information.
|
||||
@ -63,6 +64,13 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
*/
|
||||
private val preferences: PreferencesHelper by injectLazy()
|
||||
|
||||
/**
|
||||
* Snackbar containing an error message when a request fails.
|
||||
*/
|
||||
private var snack: Snackbar? = null
|
||||
|
||||
private var container:View? = null
|
||||
|
||||
init {
|
||||
setHasOptionsMenu(true)
|
||||
setOptionsMenuHidden(true)
|
||||
@ -85,7 +93,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
fab_favorite.clicks().subscribeUntilDestroy { onFabClick() }
|
||||
|
||||
// Set onLongClickListener to manage categories when FAB is clicked.
|
||||
fab_favorite.longClicks().subscribeUntilDestroy{ onFabLongClick() }
|
||||
fab_favorite.longClicks().subscribeUntilDestroy { onFabLongClick() }
|
||||
|
||||
// Set SwipeRefresh to refresh manga data.
|
||||
swipe_refresh.refreshes().subscribeUntilDestroy { fetchMangaFromSource() }
|
||||
@ -123,10 +131,24 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
manga_cover.longClicks().subscribeUntilDestroy {
|
||||
copyToClipboard(view.context.getString(R.string.title), presenter.manga.title)
|
||||
}
|
||||
|
||||
view.doOnApplyWindowInsets { v, insets, padding ->
|
||||
container = (view as ViewGroup).findViewById(R.id.manga_info_layout) as? View
|
||||
val bottomM = manga_genres_tags.marginBottom
|
||||
val fabBaseMarginBottom = fab_favorite.marginBottom
|
||||
container?.doOnApplyWindowInsets { v, insets, padding ->
|
||||
if (resources?.configuration?.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||
fab_favorite?.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
bottomMargin = fabBaseMarginBottom + insets.systemWindowInsetBottom
|
||||
}
|
||||
}
|
||||
else {
|
||||
manga_genres_tags?.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
bottomMargin = bottomM + +insets.systemWindowInsetBottom
|
||||
}
|
||||
}
|
||||
}
|
||||
info_scrollview.doOnApplyWindowInsets { v, insets, padding ->
|
||||
v.updatePaddingRelative(
|
||||
bottom = padding.bottom + insets.systemWindowInsetBottom
|
||||
bottom = max(padding.bottom, insets.systemWindowInsetBottom)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -245,6 +267,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
|
||||
override fun onDestroyView(view: View) {
|
||||
manga_genres_tags.setOnTagClickListener(null)
|
||||
snack?.dismiss()
|
||||
super.onDestroyView(view)
|
||||
}
|
||||
|
||||
@ -273,16 +296,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
* Toggles the favorite status and asks for confirmation to delete downloaded chapters.
|
||||
*/
|
||||
private fun toggleFavorite() {
|
||||
val view = view
|
||||
|
||||
val isNowFavorite = presenter.toggleFavorite()
|
||||
if (view != null && !isNowFavorite && presenter.hasDownloads()) {
|
||||
view.snack(view.context.getString(R.string.delete_downloads_for_manga)) {
|
||||
setAction(R.string.action_delete) {
|
||||
presenter.deleteDownloads()
|
||||
}
|
||||
}
|
||||
}
|
||||
presenter.toggleFavorite()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -398,9 +412,33 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
.showDialog(router)
|
||||
}
|
||||
}
|
||||
activity?.toast(activity?.getString(R.string.manga_added_library))
|
||||
showAddedSnack()
|
||||
} else {
|
||||
activity?.toast(activity?.getString(R.string.manga_removed_library))
|
||||
showRemovedSnack()
|
||||
}
|
||||
}
|
||||
|
||||
private fun showAddedSnack() {
|
||||
val view = container
|
||||
snack?.dismiss()
|
||||
snack = view?.snack(view.context.getString(R.string.manga_added_library), Snackbar
|
||||
.LENGTH_SHORT)
|
||||
}
|
||||
|
||||
private fun showRemovedSnack() {
|
||||
val view = container
|
||||
val hasDownloads = presenter.hasDownloads()
|
||||
snack?.dismiss()
|
||||
if (view != null) {
|
||||
val message = view.context.getString(R.string.manga_removed_library) +
|
||||
(if (hasDownloads) "\n" + view.context.getString(R.string
|
||||
.delete_downloads_for_manga) else "")
|
||||
snack = view.snack(message, (if (hasDownloads) Snackbar.LENGTH_INDEFINITE
|
||||
else Snackbar.LENGTH_SHORT)) {
|
||||
if (hasDownloads) setAction(R.string.action_delete) {
|
||||
presenter.deleteDownloads()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -411,7 +449,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
|
||||
val manga = presenter.manga
|
||||
if (!manga.favorite) {
|
||||
toggleFavorite()
|
||||
activity?.toast(activity?.getString(R.string.manga_added_library))
|
||||
showAddedSnack()
|
||||
}
|
||||
val categories = presenter.getCategories()
|
||||
if (categories.size <= 1) {
|
||||
|
@ -80,7 +80,7 @@ class SettingsAboutController : SettingsController() {
|
||||
}
|
||||
preference {
|
||||
title = "Github"
|
||||
val url = "https://github.com/inorichi/tachiyomi"
|
||||
val url = "https://github.com/Jays2Kings/tachiyomi"
|
||||
summary = url
|
||||
onClick {
|
||||
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
||||
|
@ -36,7 +36,8 @@ fun View.getCoordinates() = Point((left + right) / 2, (top + bottom) / 2)
|
||||
* @param length the duration of the snack.
|
||||
* @param f a function to execute in the snack, allowing for example to define a custom action.
|
||||
*/
|
||||
inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG, f: Snackbar.() -> Unit): Snackbar {
|
||||
fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG, f: (Snackbar.() ->
|
||||
Unit)? = null): Snackbar {
|
||||
val snack = Snackbar.make(this, message, length)
|
||||
val textView: TextView = snack.view.findViewById(android.support.design.R.id.snackbar_text)
|
||||
textView.setTextColor(Color.WHITE)
|
||||
@ -44,7 +45,12 @@ inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG, f: Sn
|
||||
Build.VERSION.SDK_INT >= 23 -> snack.config(context, rootWindowInsets.systemWindowInsetBottom)
|
||||
else -> snack.config(context)
|
||||
}
|
||||
snack.f()
|
||||
if (f != null) {
|
||||
snack.f()
|
||||
}
|
||||
snack.view.doOnApplyWindowInsets { v, _, padding ->
|
||||
v.setPadding(padding.left,0,padding.right,0)
|
||||
}
|
||||
snack.show()
|
||||
return snack
|
||||
}
|
||||
@ -53,7 +59,6 @@ fun Snackbar.config(context: Context, bottomMargin: Int = 0) {
|
||||
val params = this.view.layoutParams as ViewGroup.MarginLayoutParams
|
||||
params.setMargins(12, 12, 12, 12 + bottomMargin)
|
||||
this.view.layoutParams = params
|
||||
|
||||
this.view.background = context.getDrawable(R.drawable.bg_snackbar)
|
||||
|
||||
ViewCompat.setElevation(this.view, 6f)
|
||||
|
@ -8,12 +8,25 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
android:orientation="vertical"
|
||||
android:id="@+id/manga_info_layout">
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab_favorite"
|
||||
style="@style/Theme.Widget.FABFixed"
|
||||
app:srcCompat="@drawable/ic_bookmark_border_white_24dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_anchorGravity=""/>
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/manga_cover"
|
||||
@ -31,29 +44,23 @@
|
||||
app:layout_constraintVertical_bias="0.0"
|
||||
android:layout_marginStart="16dp"/>
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab_favorite"
|
||||
style="@style/Theme.Widget.FAB"
|
||||
app:srcCompat="@drawable/ic_bookmark_border_white_24dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"/>
|
||||
|
||||
<android.support.v4.widget.NestedScrollView
|
||||
android:id="@+id/info_scrollview"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginBottom="0dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:paddingTop="9dp"
|
||||
android:paddingBottom="16dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toRightOf="@+id/manga_cover"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp">
|
||||
android:layout_marginEnd="16dp"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
@ -261,4 +268,5 @@
|
||||
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</android.support.v4.widget.SwipeRefreshLayout>
|
||||
|
@ -7,13 +7,15 @@
|
||||
android:id="@id/swipe_refresh"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
android:orientation="vertical"
|
||||
android:id="@+id/manga_info_layout">
|
||||
|
||||
<android.support.constraint.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<View
|
||||
android:id="@+id/guideline"
|
||||
@ -302,4 +304,5 @@
|
||||
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</android.support.v4.widget.SwipeRefreshLayout>
|
||||
|
@ -146,6 +146,15 @@
|
||||
<item name="layout_behavior">eu.kanade.tachiyomi.widget.FABAnimationUpDown</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.Widget.FABFixed">
|
||||
<item name="android:layout_height">@dimen/fab_size</item>
|
||||
<item name="android:layout_width">@dimen/fab_size</item>
|
||||
<item name="android:layout_gravity">bottom|end</item>
|
||||
<item name="android:layout_margin">@dimen/fab_margin</item>
|
||||
<item name="android:scaleType">fitCenter</item>
|
||||
<item name="android:tint">@color/md_white_1000</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.Widget.CardView" parent="CardView">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
|
Loading…
Reference in New Issue
Block a user