Still more insets work

Fixed insets for landscape manga info controller + using snackbars for adding and removing mangas
This commit is contained in:
Jay 2019-10-28 02:27:01 -07:00
parent fee8ccab86
commit 197b5cf6a4
9 changed files with 108 additions and 51 deletions

View File

@ -27,7 +27,7 @@ interface GithubService {
} }
} }
@GET("/repos/inorichi/tachiyomi/releases/latest") @GET("/repos/Jays2Kings/tachiyomi/releases/latest")
fun getLatestVersion(): Observable<GithubRelease> fun getLatestVersion(): Observable<GithubRelease>
} }

View File

@ -375,9 +375,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
presenter.requestNext() presenter.requestNext()
} }
} }
snack?.view?.doOnApplyWindowInsets { v, _, padding ->
v.setPadding(padding.left,0,padding.right,0)
}
} }
/** /**

View File

@ -379,9 +379,6 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
presenter.addToLibrary() presenter.addToLibrary()
} }
} }
snack.view.doOnApplyWindowInsets { v, _, padding ->
v.setPadding(padding.left,0,padding.right,0)
}
} }
} }

View File

@ -6,12 +6,12 @@ import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle 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.ShortcutInfoCompat
import android.support.v4.content.pm.ShortcutManagerCompat import android.support.v4.content.pm.ShortcutManagerCompat
import android.support.v4.graphics.drawable.IconCompat import android.support.v4.graphics.drawable.IconCompat
@ -49,6 +49,7 @@ import uy.kohesive.injekt.injectLazy
import java.text.DateFormat import java.text.DateFormat
import java.text.DecimalFormat import java.text.DecimalFormat
import java.util.Date import java.util.Date
import kotlin.math.max
/** /**
* Fragment that shows manga information. * Fragment that shows manga information.
@ -63,6 +64,13 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
*/ */
private val preferences: PreferencesHelper by injectLazy() 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 { init {
setHasOptionsMenu(true) setHasOptionsMenu(true)
setOptionsMenuHidden(true) setOptionsMenuHidden(true)
@ -85,7 +93,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
fab_favorite.clicks().subscribeUntilDestroy { onFabClick() } fab_favorite.clicks().subscribeUntilDestroy { onFabClick() }
// Set onLongClickListener to manage categories when FAB is clicked. // 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. // Set SwipeRefresh to refresh manga data.
swipe_refresh.refreshes().subscribeUntilDestroy { fetchMangaFromSource() } swipe_refresh.refreshes().subscribeUntilDestroy { fetchMangaFromSource() }
@ -123,10 +131,24 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
manga_cover.longClicks().subscribeUntilDestroy { manga_cover.longClicks().subscribeUntilDestroy {
copyToClipboard(view.context.getString(R.string.title), presenter.manga.title) copyToClipboard(view.context.getString(R.string.title), presenter.manga.title)
} }
container = (view as ViewGroup).findViewById(R.id.manga_info_layout) as? View
view.doOnApplyWindowInsets { v, insets, padding -> 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( 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) { override fun onDestroyView(view: View) {
manga_genres_tags.setOnTagClickListener(null) manga_genres_tags.setOnTagClickListener(null)
snack?.dismiss()
super.onDestroyView(view) super.onDestroyView(view)
} }
@ -273,16 +296,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
* Toggles the favorite status and asks for confirmation to delete downloaded chapters. * Toggles the favorite status and asks for confirmation to delete downloaded chapters.
*/ */
private fun toggleFavorite() { private fun toggleFavorite() {
val view = view presenter.toggleFavorite()
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()
}
}
}
} }
/** /**
@ -398,9 +412,33 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
.showDialog(router) .showDialog(router)
} }
} }
activity?.toast(activity?.getString(R.string.manga_added_library)) showAddedSnack()
} else { } 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 val manga = presenter.manga
if (!manga.favorite) { if (!manga.favorite) {
toggleFavorite() toggleFavorite()
activity?.toast(activity?.getString(R.string.manga_added_library)) showAddedSnack()
} }
val categories = presenter.getCategories() val categories = presenter.getCategories()
if (categories.size <= 1) { if (categories.size <= 1) {

View File

@ -80,7 +80,7 @@ class SettingsAboutController : SettingsController() {
} }
preference { preference {
title = "Github" title = "Github"
val url = "https://github.com/inorichi/tachiyomi" val url = "https://github.com/Jays2Kings/tachiyomi"
summary = url summary = url
onClick { onClick {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))

View File

@ -36,7 +36,8 @@ fun View.getCoordinates() = Point((left + right) / 2, (top + bottom) / 2)
* @param length the duration of the snack. * @param length the duration of the snack.
* @param f a function to execute in the snack, allowing for example to define a custom action. * @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 snack = Snackbar.make(this, message, length)
val textView: TextView = snack.view.findViewById(android.support.design.R.id.snackbar_text) val textView: TextView = snack.view.findViewById(android.support.design.R.id.snackbar_text)
textView.setTextColor(Color.WHITE) 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) Build.VERSION.SDK_INT >= 23 -> snack.config(context, rootWindowInsets.systemWindowInsetBottom)
else -> snack.config(context) 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() snack.show()
return snack return snack
} }
@ -53,7 +59,6 @@ fun Snackbar.config(context: Context, bottomMargin: Int = 0) {
val params = this.view.layoutParams as ViewGroup.MarginLayoutParams val params = this.view.layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(12, 12, 12, 12 + bottomMargin) params.setMargins(12, 12, 12, 12 + bottomMargin)
this.view.layoutParams = params this.view.layoutParams = params
this.view.background = context.getDrawable(R.drawable.bg_snackbar) this.view.background = context.getDrawable(R.drawable.bg_snackbar)
ViewCompat.setElevation(this.view, 6f) ViewCompat.setElevation(this.view, 6f)

View File

@ -8,12 +8,25 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout <android.support.design.widget.CoordinatorLayout
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="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 <ImageView
android:id="@+id/manga_cover" android:id="@+id/manga_cover"
@ -31,29 +44,23 @@
app:layout_constraintVertical_bias="0.0" app:layout_constraintVertical_bias="0.0"
android:layout_marginStart="16dp"/> 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.support.v4.widget.NestedScrollView
android:id="@+id/info_scrollview" android:id="@+id/info_scrollview"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="16dp" android:layout_marginTop="0dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="0dp"
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" android:layout_marginRight="16dp"
android:paddingTop="9dp"
android:paddingBottom="16dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/manga_cover" app:layout_constraintLeft_toRightOf="@+id/manga_cover"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"> android:layout_marginEnd="16dp"
android:clipToPadding="false">
<android.support.constraint.ConstraintLayout <android.support.constraint.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -261,4 +268,5 @@
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout> </android.support.v4.widget.SwipeRefreshLayout>

View File

@ -7,13 +7,15 @@
android:id="@id/swipe_refresh" android:id="@id/swipe_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
<android.support.constraint.ConstraintLayout
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="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 <View
android:id="@+id/guideline" android:id="@+id/guideline"
@ -302,4 +304,5 @@
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout> </android.support.v4.widget.SwipeRefreshLayout>

View File

@ -146,6 +146,15 @@
<item name="layout_behavior">eu.kanade.tachiyomi.widget.FABAnimationUpDown</item> <item name="layout_behavior">eu.kanade.tachiyomi.widget.FABAnimationUpDown</item>
</style> </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"> <style name="Theme.Widget.CardView" parent="CardView">
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>