diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 78f461918..cc2ca5eba 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,13 @@
+
+
+
+
+
+
+
: AppCompatActivity(), OnApplyWindo
override fun onCreate(savedInstanceState: Bundle?) {
if (get().isAmoledTheme) {
- setTheme(R.style.AppTheme_Amoled)
+ setTheme(R.style.AppTheme_AMOLED)
}
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
@@ -59,12 +59,12 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo
this.binding = binding
super.setContentView(binding.root)
(binding.root.findViewById(R.id.toolbar) as? Toolbar)?.let(this::setSupportActionBar)
- val params = (binding.root.findViewById(R.id.toolbar) as? Toolbar)?.layoutParams as AppBarLayout.LayoutParams
+ val params = (binding.root.findViewById(R.id.toolbar) as? Toolbar)?.layoutParams as? AppBarLayout.LayoutParams
ViewCompat.setOnApplyWindowInsetsListener(binding.root, this)
if (get().isToolbarHideWhenScrolling) {
- params.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS
+ params?.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS
} else {
- params.scrollFlags = SCROLL_FLAG_NO_SCROLL
+ params?.scrollFlags = SCROLL_FLAG_NO_SCROLL
}
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SectionItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SectionItemDecoration.kt
index b5ecb78a2..d8181e5c7 100644
--- a/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SectionItemDecoration.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/list/decor/SectionItemDecoration.kt
@@ -37,7 +37,7 @@ class SectionItemDecoration(
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
super.onDrawOver(c, parent, state)
- val textView = headerView ?: parent.inflate(R.layout.item_header).also {
+ val textView = headerView ?: parent.inflate(R.layout.item_filter_header).also {
headerView = it
}
fixLayoutSize(textView, parent)
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt
index 52ca53616..e766dbf08 100644
--- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt
@@ -4,16 +4,17 @@ import android.content.Context
import android.util.AttributeSet
import android.view.View.OnClickListener
import androidx.annotation.DrawableRes
+import androidx.core.content.ContextCompat
import androidx.core.view.children
-import com.google.android.material.R
import com.google.android.material.chip.Chip
+import com.google.android.material.chip.ChipDrawable
import com.google.android.material.chip.ChipGroup
-import org.koitharu.kotatsu.utils.ext.getThemeColor
+import org.koitharu.kotatsu.R
class ChipsView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
- defStyleAttr: Int = R.attr.chipGroupStyle
+ defStyleAttr: Int = com.google.android.material.R.attr.chipGroupStyle
) : ChipGroup(context, attrs, defStyleAttr) {
private var isLayoutSuppressedCompat = false
@@ -64,7 +65,9 @@ class ChipsView @JvmOverloads constructor(
private fun addChip(): Chip {
val chip = Chip(context)
- chip.setTextColor(context.getThemeColor(android.R.attr.textColorPrimary))
+ val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_Kotatsu_Chip)
+ chip.setChipDrawable(drawable)
+ chip.setTextColor(ContextCompat.getColor(context, R.color.blue_primary))
chip.isCloseIconVisible = false
chip.setEnsureMinTouchTargetSize(false)
chip.setOnClickListener(chipOnClickListener)
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/MaterialSearchView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/MaterialSearchView.kt
new file mode 100644
index 000000000..fcb18c4de
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/MaterialSearchView.kt
@@ -0,0 +1,231 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search
+
+import android.animation.LayoutTransition
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import androidx.coordinatorlayout.widget.CoordinatorLayout
+import androidx.core.content.ContextCompat
+import org.koitharu.kotatsu.R
+import org.koitharu.kotatsu.base.ui.widgets.search.internal.SearchLayout
+
+class MaterialSearchView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+ defStyleRes: Int = 0
+) : SearchLayout(context, attrs, defStyleAttr, defStyleRes), CoordinatorLayout.AttachedBehavior {
+
+ // *********************************************************************************************
+ private var mBehavior: CoordinatorLayout.Behavior<*> = SearchBehavior()
+ private var mTransition: LayoutTransition? = null
+ private var mStrokeWidth: Int = 0
+ private var mRadius: Float = 0f
+ private var mElevation: Float = 0f
+
+ // *********************************************************************************************
+ init {
+ inflate(context, R.layout.layout_search_view, this)
+ init()
+ setTransition()
+
+ val a = context.obtainStyledAttributes(
+ attrs, R.styleable.MaterialSearchView, defStyleAttr, defStyleRes
+ )
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_navigationIconSupport)) {
+ navigationIconSupport = a.getInt(
+ R.styleable.MaterialSearchView_search_navigationIconSupport,
+ NavigationIconSupport.NONE
+ )
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_navigationIcon)) {
+ setNavigationIconImageDrawable(a.getDrawable(R.styleable.MaterialSearchView_search_navigationIcon))
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_clearIcon)) {
+ setClearIconImageDrawable(a.getDrawable(R.styleable.MaterialSearchView_search_clearIcon))
+ } else {
+ setClearIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_clear
+ )
+ )
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_micIcon)) {
+ setMicIconImageDrawable(a.getDrawable(R.styleable.MaterialSearchView_search_micIcon))
+ } else {
+ setMicIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_mic_none
+ )
+ )
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_menuIcon)) {
+ setMicIconImageDrawable(a.getDrawable(R.styleable.MaterialSearchView_search_menuIcon))
+ } else {
+ setMicIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_more
+ )
+ )
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_dividerColor)) {
+ setDividerColor(a.getInt(R.styleable.MaterialSearchView_search_dividerColor, 0))
+ }
+
+ val defaultShadowColor = ContextCompat.getColor(context, R.color.shadow)
+ setShadowColor(
+ a.getInt(
+ R.styleable.MaterialSearchView_search_shadowColor,
+ defaultShadowColor
+ )
+ )
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_textHint)) {
+ setTextHint(a.getText(R.styleable.MaterialSearchView_search_textHint))
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_strokeColor)) {
+ setBackgroundStrokeColor(a.getInt(R.styleable.MaterialSearchView_search_strokeColor, 0))
+ }
+
+ if (a.hasValue(R.styleable.MaterialSearchView_search_strokeWidth)) {
+ setBackgroundStrokeWidth(a.getInt(R.styleable.MaterialSearchView_search_strokeWidth, 0))
+ }
+
+ val defaultTransitionDuration =
+ context.resources.getInteger(R.integer.search_animation_duration)
+ setTransitionDuration(
+ a.getInt(
+ R.styleable.MaterialSearchView_search_transitionDuration,
+ defaultTransitionDuration
+ ).toLong()
+ )
+
+ val defaultRadius = context.resources.getDimensionPixelSize(R.dimen.search_radius)
+ setBackgroundRadius(
+ a.getInt(R.styleable.MaterialSearchView_search_radius, defaultRadius).toFloat()
+ )
+
+ val defaultElevation = context.resources.getDimensionPixelSize(R.dimen.search_elevation)
+ elevation =
+ a.getInt(R.styleable.MaterialSearchView_android_elevation, defaultElevation).toFloat()
+
+ val imeOptions = a.getInt(R.styleable.MaterialSearchView_android_imeOptions, -1)
+ if (imeOptions != -1) {
+ setTextImeOptions(imeOptions)
+ }
+
+ val inputType = a.getInt(R.styleable.MaterialSearchView_android_inputType, -1)
+ if (inputType != -1) {
+ setTextInputType(inputType)
+ }
+
+ a.recycle()
+ }
+
+ // *********************************************************************************************
+ override fun addFocus() {
+ mOnFocusChangeListener?.onFocusChange(true)
+ showKeyboard()
+
+ mStrokeWidth = getBackgroundStrokeWidth()
+ mRadius = getBackgroundRadius()
+ mElevation = elevation
+
+ setBackgroundStrokeWidth(context.resources.getDimensionPixelSize(R.dimen.search_stroke_width_focus))
+ setBackgroundRadius(resources.getDimensionPixelSize(R.dimen.search_radius_focus).toFloat())
+ elevation =
+ context.resources.getDimensionPixelSize(R.dimen.search_elevation_focus).toFloat()
+
+ val left = context.resources.getDimensionPixelSize(R.dimen.search_dp_16)
+ val params = mSearchEditText?.layoutParams as LinearLayout.LayoutParams
+ params.setMargins(left, 0, 0, 0)
+ mSearchEditText?.layoutParams = params
+
+ margins = Margins.FOCUS
+ setLayoutHeight(context.resources.getDimensionPixelSize(R.dimen.search_layout_height_focus))
+
+ mViewShadow?.visibility = View.VISIBLE
+
+ mViewDivider?.visibility = View.VISIBLE
+ mViewAnim?.visibility = View.VISIBLE
+ mRecyclerView?.visibility = View.VISIBLE
+
+ // layoutTransition = null
+ }
+
+ override fun removeFocus() {
+ // layoutTransition = mTransition
+
+ mOnFocusChangeListener?.onFocusChange(false)
+ hideKeyboard()
+
+ val params = mSearchEditText?.layoutParams as LinearLayout.LayoutParams
+ params.setMargins(0, 0, 0, 0)
+ mSearchEditText?.layoutParams = params
+
+ setBackgroundStrokeWidth(mStrokeWidth)
+ setBackgroundRadius(mRadius)
+ elevation = mElevation
+
+ setLayoutHeight(context.resources.getDimensionPixelSize(R.dimen.search_layout_height))
+ margins = Margins.NO_FOCUS
+
+ mViewShadow?.visibility = View.GONE
+
+ mRecyclerView?.visibility = View.GONE
+ mViewAnim?.visibility = View.GONE
+ mViewDivider?.visibility = View.GONE
+ }
+
+ override fun getBehavior(): CoordinatorLayout.Behavior<*> {
+ return mBehavior
+ }
+
+ fun setBehavior(behavior: CoordinatorLayout.Behavior<*>) {
+ mBehavior = behavior
+ }
+
+ fun setTransitionDuration(duration: Long) {
+ mTransition?.setDuration(duration)
+ layoutTransition = mTransition
+ }
+
+ private fun setTransition() {
+ mTransition = LayoutTransition()
+ mTransition?.enableTransitionType(LayoutTransition.CHANGING)
+ mTransition?.addTransitionListener(object : LayoutTransition.TransitionListener {
+ override fun startTransition(
+ transition: LayoutTransition?,
+ container: ViewGroup?,
+ view: View?,
+ transitionType: Int
+ ) {
+
+ }
+
+ override fun endTransition(
+ transition: LayoutTransition?,
+ container: ViewGroup?,
+ view: View?,
+ transitionType: Int
+ ) {
+
+ }
+ })
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchArrowDrawable.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchArrowDrawable.kt
new file mode 100644
index 000000000..752c0071d
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchArrowDrawable.kt
@@ -0,0 +1,62 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search
+
+import android.animation.ObjectAnimator
+import android.content.Context
+import android.util.Property
+import android.view.animation.AccelerateDecelerateInterpolator
+import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
+import androidx.core.content.ContextCompat
+
+class SearchArrowDrawable constructor(context: Context) : DrawerArrowDrawable(context) {
+
+ var position: Float
+ get() = progress
+ set(position) {
+ progress = position
+ }
+
+ init {
+ color = ContextCompat.getColor(context, android.R.color.white)
+ }
+
+ fun animate(state: Float, duration: Long) {
+ val anim: ObjectAnimator = if (state == ARROW) {
+ ObjectAnimator.ofFloat(
+ this,
+ PROGRESS,
+ MENU,
+ state
+ )
+ } else {
+ ObjectAnimator.ofFloat(
+ this,
+ PROGRESS,
+ ARROW,
+ state
+ )
+ }
+ anim.interpolator = AccelerateDecelerateInterpolator()
+ anim.duration = duration
+ anim.start()
+ }
+
+ companion object {
+
+ const val MENU = 0.0f
+ const val ARROW = 1.0f
+
+ private val PROGRESS =
+ object : Property(Float::class.java, "progress") {
+ override fun set(obj: SearchArrowDrawable, value: Float?) {
+ obj.progress = value!!
+ }
+
+ override fun get(obj: SearchArrowDrawable): Float {
+ return obj.progress
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchBehavior.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchBehavior.kt
new file mode 100644
index 000000000..04e897837
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/SearchBehavior.kt
@@ -0,0 +1,54 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search
+
+import android.view.View
+import android.widget.LinearLayout
+import androidx.coordinatorlayout.widget.CoordinatorLayout
+import androidx.core.view.ViewCompat
+import com.google.android.material.appbar.AppBarLayout
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import org.koitharu.kotatsu.base.ui.widgets.search.internal.SearchLayout
+
+class SearchBehavior : CoordinatorLayout.Behavior() {
+
+ override fun layoutDependsOn(
+ parent: CoordinatorLayout,
+ child: S,
+ dependency: View
+ ): Boolean {
+ return if (dependency is AppBarLayout) {
+ true
+ } else
+ if (dependency is LinearLayout || dependency is BottomNavigationView) {
+ dependency.z = child.z + 1
+ true
+ } else {
+ super.layoutDependsOn(parent, child, dependency)
+ }
+ }
+
+ override fun onDependentViewChanged(
+ parent: CoordinatorLayout,
+ child: S,
+ dependency: View
+ ): Boolean {
+ if (dependency is AppBarLayout) {
+ child.translationY = dependency.getY()
+ return true
+ }
+ return super.onDependentViewChanged(parent, child, dependency)
+ }
+
+ override fun onStartNestedScroll(
+ coordinatorLayout: CoordinatorLayout,
+ child: S,
+ directTargetChild: View,
+ target: View,
+ axes: Int,
+ type: Int
+ ): Boolean {
+ return axes == ViewCompat.SCROLL_AXIS_VERTICAL
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchEditText.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchEditText.kt
new file mode 100644
index 000000000..312e59e9f
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchEditText.kt
@@ -0,0 +1,40 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search.internal
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.KeyEvent
+import androidx.annotation.AttrRes
+import androidx.appcompat.widget.AppCompatEditText
+
+class SearchEditText : AppCompatEditText {
+
+ var clearFocusOnBackPressed: Boolean = false
+
+ constructor(context: Context) : super(context)
+
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+
+ constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ )
+
+ override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP && clearFocusOnBackPressed) {
+ if (hasFocus()) {
+ clearFocus()
+ return true
+ }
+ }
+ return super.onKeyPreIme(keyCode, event)
+ }
+
+ override fun clearFocus() {
+ super.clearFocus()
+ text?.clear()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchLayout.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchLayout.kt
new file mode 100644
index 000000000..0c00f32de
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchLayout.kt
@@ -0,0 +1,725 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search.internal
+
+import android.content.Context
+import android.content.res.ColorStateList
+import android.graphics.ColorFilter
+import android.graphics.PorterDuff
+import android.graphics.Rect
+import android.graphics.Typeface
+import android.graphics.drawable.Drawable
+import android.os.Parcelable
+import android.text.Editable
+import android.text.TextUtils
+import android.text.TextWatcher
+import android.util.AttributeSet
+import android.view.View
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.FrameLayout
+import android.widget.ImageButton
+import android.widget.LinearLayout
+import androidx.annotation.*
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.DefaultItemAnimator
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.card.MaterialCardView
+import org.koitharu.kotatsu.R
+
+abstract class SearchLayout @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+ defStyleRes: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr, defStyleRes), View.OnClickListener {
+
+ // *********************************************************************************************
+ // Better way than enum class :-)
+ @IntDef(
+ NavigationIconSupport.NONE,
+ NavigationIconSupport.MENU,
+ NavigationIconSupport.ARROW,
+ NavigationIconSupport.SEARCH
+ )
+ @Retention(AnnotationRetention.SOURCE)
+ annotation class NavigationIconSupport {
+ companion object {
+ const val NONE = 0
+ const val MENU = 1
+ const val ARROW = 2
+ const val SEARCH = 3
+ }
+ }
+
+ @IntDef(
+ Margins.NO_FOCUS,
+ Margins.FOCUS
+ )
+ @Retention(AnnotationRetention.SOURCE)
+ internal annotation class Margins {
+ companion object {
+ const val NO_FOCUS = 4
+ const val FOCUS = 5
+ }
+ }
+
+ // *********************************************************************************************
+ private var mImageViewMic: ImageButton? = null
+ private var mImageViewMenu: ImageButton? = null
+ protected var mRecyclerView: RecyclerView? = null
+ private var mMaterialCardView: MaterialCardView? = null
+ var mSearchEditText: SearchEditText? = null
+ protected var mViewShadow: View? = null
+ protected var mViewDivider: View? = null
+ protected var mViewAnim: View? = null
+ protected var mOnFocusChangeListener: OnFocusChangeListener? = null
+
+ private var mLinearLayout: LinearLayout? = null
+ private var mImageViewNavigation: ImageButton? = null
+ private var mImageViewClear: ImageButton? = null
+ private var mOnQueryTextListener: OnQueryTextListener? = null
+ private var mOnNavigationClickListener: OnNavigationClickListener? = null
+ private var mOnMicClickListener: OnMicClickListener? = null
+ private var mOnMenuClickListener: OnMenuClickListener? = null
+ private var mOnClearClickListener: OnClearClickListener? = null
+
+ // *********************************************************************************************
+ @NavigationIconSupport
+ @get:NavigationIconSupport
+ var navigationIconSupport: Int = 0
+ set(@NavigationIconSupport navigationIconSupport) {
+ field = navigationIconSupport
+
+ when (navigationIconSupport) {
+ NavigationIconSupport.NONE
+ -> {
+ setNavigationIconImageDrawable(null)
+ }
+ NavigationIconSupport.MENU -> {
+ setNavigationIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_menu
+ )
+ )
+ }
+ NavigationIconSupport.ARROW -> {
+ setNavigationIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_arrow_back
+ )
+ )
+ }
+ NavigationIconSupport.SEARCH -> {
+ setNavigationIconImageDrawable(
+ ContextCompat.getDrawable(
+ context,
+ R.drawable.ic_search
+ )
+ )
+ }
+ }
+ }
+
+ @Margins
+ @get:Margins
+ protected var margins: Int = 0
+ set(@Margins margins) {
+ field = margins
+
+ val left: Int
+ val top: Int
+ val right: Int
+ val bottom: Int
+ val params = mMaterialCardView?.layoutParams as LayoutParams?
+
+ when (margins) {
+ Margins.NO_FOCUS -> {
+ left =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_left_right)
+ top =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_top_bottom)
+ right =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_left_right)
+ bottom =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_top_bottom)
+
+ params?.width = ViewGroup.LayoutParams.MATCH_PARENT
+ params?.height = ViewGroup.LayoutParams.WRAP_CONTENT
+ params?.setMargins(left, top, right, bottom)
+ mMaterialCardView?.layoutParams = params
+ }
+ Margins.FOCUS -> {
+ left =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_focus)
+ top =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_focus)
+ right =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_focus)
+ bottom =
+ context.resources.getDimensionPixelSize(R.dimen.search_margins_focus)
+
+ params?.width = ViewGroup.LayoutParams.MATCH_PARENT
+ params?.height = ViewGroup.LayoutParams.MATCH_PARENT
+ params?.setMargins(left, top, right, bottom)
+ mMaterialCardView?.layoutParams = params
+ }
+ }
+ }
+
+ // *********************************************************************************************
+ protected abstract fun addFocus()
+
+ protected abstract fun removeFocus()
+
+ // *********************************************************************************************
+ protected fun init() {
+ mLinearLayout = findViewById(R.id.search_linear_layout)
+
+ mImageViewNavigation = findViewById(R.id.search_image_view_navigation)
+ mImageViewNavigation?.setOnClickListener(this)
+
+ mImageViewMic = findViewById(R.id.search_image_view_mic)
+ mImageViewMic?.setOnClickListener(this)
+
+ mImageViewMenu = findViewById(R.id.search_image_view_menu)
+ mImageViewMenu?.setOnClickListener(this)
+
+ mImageViewClear = findViewById(R.id.search_image_view_clear)
+ mImageViewClear?.visibility = View.GONE
+ mImageViewClear?.setOnClickListener(this)
+
+ mSearchEditText = findViewById(R.id.search_search_edit_text)
+ mSearchEditText?.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
+ this@SearchLayout.onTextChanged(s)
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+
+ }
+ })
+ mSearchEditText?.setOnEditorActionListener { _, _, _ ->
+ onSubmitQuery()
+ return@setOnEditorActionListener true // true
+ }
+ mSearchEditText?.setOnFocusChangeListener { _, hasFocus ->
+ if (hasFocus) {
+ addFocus()
+ } else {
+ removeFocus()
+ }
+ }
+
+ mRecyclerView = findViewById(R.id.search_recycler_view)
+ mRecyclerView?.visibility = View.GONE
+ mRecyclerView?.layoutManager = LinearLayoutManager(context)
+ mRecyclerView?.isNestedScrollingEnabled = false
+ mRecyclerView?.itemAnimator = DefaultItemAnimator()
+ mRecyclerView?.overScrollMode = View.OVER_SCROLL_NEVER
+ mRecyclerView?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+ super.onScrollStateChanged(recyclerView, newState)
+ if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
+ hideKeyboard()
+ }
+ }
+ })
+
+ mViewShadow = findViewById(R.id.search_view_shadow)
+ mViewShadow?.visibility = View.GONE
+
+ mViewDivider = findViewById(R.id.search_view_divider)
+ mViewDivider?.visibility = View.GONE
+
+ mViewAnim = findViewById(R.id.search_view_anim)
+ mViewAnim?.visibility = View.GONE
+
+ mMaterialCardView = findViewById(R.id.search_material_card_view)
+ margins = Margins.NO_FOCUS
+
+ isClickable = true
+ isFocusable = true
+ isFocusableInTouchMode = true
+ }
+
+ // *********************************************************************************************
+ fun setNavigationIconVisibility(visibility: Int) {
+ mImageViewNavigation?.visibility = visibility
+ }
+
+ fun setNavigationIconImageResource(@DrawableRes resId: Int) {
+ mImageViewNavigation?.setImageResource(resId)
+ }
+
+ fun setNavigationIconImageDrawable(@Nullable drawable: Drawable?) {
+ mImageViewNavigation?.setImageDrawable(drawable)
+ }
+
+ fun setNavigationIconColorFilter(color: Int) {
+ mImageViewNavigation?.setColorFilter(color)
+ }
+
+ fun setNavigationIconColorFilter(color: Int, mode: PorterDuff.Mode) {
+ mImageViewNavigation?.setColorFilter(color, mode)
+ }
+
+ fun setNavigationIconColorFilter(cf: ColorFilter?) {
+ mImageViewNavigation?.colorFilter = cf
+ }
+
+ fun clearNavigationIconColorFilter() {
+ mImageViewNavigation?.clearColorFilter()
+ }
+
+ fun setNavigationIconContentDescription(contentDescription: CharSequence) {
+ mImageViewNavigation?.contentDescription = contentDescription
+ }
+
+ // *********************************************************************************************
+ fun setMicIconImageResource(@DrawableRes resId: Int) {
+ mImageViewMic?.setImageResource(resId)
+ }
+
+ fun setMicIconImageDrawable(@Nullable drawable: Drawable?) {
+ mImageViewMic?.setImageDrawable(drawable)
+ }
+
+ fun setMicIconColorFilter(color: Int) {
+ mImageViewMic?.setColorFilter(color)
+ }
+
+ fun setMicIconColorFilter(color: Int, mode: PorterDuff.Mode) {
+ mImageViewMic?.setColorFilter(color, mode)
+ }
+
+ fun setMicIconColorFilter(cf: ColorFilter?) {
+ mImageViewMic?.colorFilter = cf
+ }
+
+ fun clearMicIconColorFilter() {
+ mImageViewMic?.clearColorFilter()
+ }
+
+ fun setMicIconContentDescription(contentDescription: CharSequence) {
+ mImageViewMic?.contentDescription = contentDescription
+ }
+
+ // *********************************************************************************************
+ fun setMenuIconImageResource(@DrawableRes resId: Int) {
+ mImageViewMenu?.setImageResource(resId)
+ }
+
+ fun setMenuIconImageDrawable(@Nullable drawable: Drawable?) {
+ mImageViewMenu?.setImageDrawable(drawable)
+ }
+
+ fun setMenuIconColorFilter(color: Int) {
+ mImageViewMenu?.setColorFilter(color)
+ }
+
+ fun setMenuIconColorFilter(color: Int, mode: PorterDuff.Mode) {
+ mImageViewMenu?.setColorFilter(color, mode)
+ }
+
+ fun setMenuIconColorFilter(cf: ColorFilter?) {
+ mImageViewMenu?.colorFilter = cf
+ }
+
+ fun clearMenuIconColorFilter() {
+ mImageViewMenu?.clearColorFilter()
+ }
+
+ fun setMenuIconContentDescription(contentDescription: CharSequence) {
+ mImageViewMenu?.contentDescription = contentDescription
+ }
+
+ // *********************************************************************************************
+ fun setClearIconImageResource(@DrawableRes resId: Int) {
+ mImageViewClear?.setImageResource(resId)
+ }
+
+ fun setClearIconImageDrawable(@Nullable drawable: Drawable?) {
+ mImageViewClear?.setImageDrawable(drawable)
+ }
+
+ fun setClearIconColorFilter(color: Int) {
+ mImageViewClear?.setColorFilter(color)
+ }
+
+ fun setClearIconColorFilter(color: Int, mode: PorterDuff.Mode) {
+ mImageViewClear?.setColorFilter(color, mode)
+ }
+
+ fun setClearIconColorFilter(cf: ColorFilter?) {
+ mImageViewClear?.colorFilter = cf
+ }
+
+ fun clearClearIconColorFilter() {
+ mImageViewClear?.clearColorFilter()
+ }
+
+ fun setClearIconContentDescription(contentDescription: CharSequence) {
+ mImageViewClear?.contentDescription = contentDescription
+ }
+
+ // *********************************************************************************************
+ fun setAdapterLayoutManager(@Nullable layout: RecyclerView.LayoutManager?) {
+ mRecyclerView?.layoutManager = layout
+ }
+
+ // only when height == match_parent
+ fun setAdapterHasFixedSize(hasFixedSize: Boolean) {
+ mRecyclerView?.setHasFixedSize(hasFixedSize)
+ }
+
+ fun addAdapterItemDecoration(@NonNull decor: RecyclerView.ItemDecoration) {
+ mRecyclerView?.addItemDecoration(decor)
+ }
+
+ fun removeAdapterItemDecoration(@NonNull decor: RecyclerView.ItemDecoration) {
+ mRecyclerView?.removeItemDecoration(decor)
+ }
+
+ fun setAdapter(@Nullable adapter: RecyclerView.Adapter<*>?) {
+ mRecyclerView?.adapter = adapter
+ }
+
+ @Nullable
+ fun getAdapter(): RecyclerView.Adapter<*>? {
+ return mRecyclerView?.adapter
+ }
+
+ // *********************************************************************************************
+ /**
+ * Typeface.NORMAL
+ * Typeface.BOLD
+ * Typeface.ITALIC
+ * Typeface.BOLD_ITALIC
+ *
+ * Typeface.DEFAULT
+ * Typeface.DEFAULT_BOLD
+ * Typeface.SANS_SERIF
+ * Typeface.SERIF
+ * Typeface.MONOSPACE
+ *
+ * Typeface.create(Typeface.NORMAL, Typeface.DEFAULT)
+ */
+ fun setTextTypeface(@Nullable tf: Typeface?) {
+ mSearchEditText?.typeface = tf
+ }
+
+ fun getTextTypeface(): Typeface? {
+ return mSearchEditText?.typeface
+ }
+
+ fun setTextInputType(type: Int) {
+ mSearchEditText?.inputType = type
+ }
+
+ fun getTextInputType(): Int? {
+ return mSearchEditText?.inputType
+ }
+
+ fun setTextImeOptions(imeOptions: Int) {
+ mSearchEditText?.imeOptions = imeOptions
+ }
+
+ fun getTextImeOptions(): Int? {
+ return mSearchEditText?.imeOptions
+ }
+
+ fun setTextQuery(query: CharSequence?, submit: Boolean) {
+ mSearchEditText?.setText(query)
+ if (query != null) {
+ mSearchEditText?.setSelection(mSearchEditText?.length()!!)
+ }
+ if (submit && !TextUtils.isEmpty(query)) {
+ onSubmitQuery()
+ }
+ }
+
+ @Nullable
+ fun getTextQuery(): CharSequence? {
+ return mSearchEditText?.text
+ }
+
+ fun setTextHint(hint: CharSequence?) {
+ mSearchEditText?.hint = hint
+ }
+
+ fun getTextHint(): CharSequence? {
+ return mSearchEditText?.hint
+ }
+
+ fun setTextColor(@ColorInt color: Int) {
+ mSearchEditText?.setTextColor(color)
+ }
+
+ fun setTextSize(size: Float) {
+ mSearchEditText?.textSize = size
+ }
+
+ fun setTextGravity(gravity: Int) {
+ mSearchEditText?.gravity = gravity
+ }
+
+ fun setTextHint(@StringRes resid: Int) {
+ mSearchEditText?.setHint(resid)
+ }
+
+ fun setTextHintColor(@ColorInt color: Int) {
+ mSearchEditText?.setHintTextColor(color)
+ }
+
+ fun setClearFocusOnBackPressed(clearFocusOnBackPressed: Boolean) {
+ mSearchEditText?.clearFocusOnBackPressed = clearFocusOnBackPressed
+ }
+
+ // *********************************************************************************************
+ override fun setBackgroundColor(@ColorInt color: Int) {
+ mMaterialCardView?.setCardBackgroundColor(color)
+ }
+
+ fun setBackgroundColor(@Nullable color: ColorStateList?) {
+ mMaterialCardView?.setCardBackgroundColor(color)
+ }
+
+ override fun setElevation(elevation: Float) {
+ mMaterialCardView?.cardElevation = elevation
+ mMaterialCardView?.maxCardElevation = elevation
+ }
+
+ override fun getElevation(): Float {
+ return mMaterialCardView?.elevation!!
+ }
+
+ fun setBackgroundRadius(radius: Float) {
+ mMaterialCardView?.radius = radius
+ }
+
+ fun getBackgroundRadius(): Float {
+ return mMaterialCardView?.radius!!
+ }
+
+ fun setBackgroundRippleColor(@ColorRes rippleColorResourceId: Int) {
+ mMaterialCardView?.setRippleColorResource(rippleColorResourceId)
+ }
+
+ fun setBackgroundRippleColorResource(@Nullable rippleColor: ColorStateList?) {
+ mMaterialCardView?.rippleColor = rippleColor
+ }
+
+ fun setBackgroundStrokeColor(@ColorInt strokeColor: Int) {
+ mMaterialCardView?.strokeColor = strokeColor
+ }
+
+ fun setBackgroundStrokeColor(strokeColor: ColorStateList) {
+ mMaterialCardView?.setStrokeColor(strokeColor)
+ }
+
+ fun setBackgroundStrokeWidth(@Dimension strokeWidth: Int) {
+ mMaterialCardView?.strokeWidth = strokeWidth
+ }
+
+ @Dimension
+ fun getBackgroundStrokeWidth(): Int {
+ return mMaterialCardView?.strokeWidth!!
+ }
+
+ // *********************************************************************************************
+ fun setDividerColor(@ColorInt color: Int) {
+ mViewDivider?.setBackgroundColor(color)
+ }
+
+ fun setShadowColor(@ColorInt color: Int) {
+ mViewShadow?.setBackgroundColor(color)
+ }
+
+ // *********************************************************************************************
+ fun setOnFocusChangeListener(listener: OnFocusChangeListener) {
+ mOnFocusChangeListener = listener
+ }
+
+ fun setOnQueryTextListener(listener: OnQueryTextListener) {
+ mOnQueryTextListener = listener
+ }
+
+ fun setOnNavigationClickListener(listener: OnNavigationClickListener) {
+ mOnNavigationClickListener = listener
+ }
+
+ fun setOnMicClickListener(listener: OnMicClickListener) {
+ mOnMicClickListener = listener
+ }
+
+ fun setOnMenuClickListener(listener: OnMenuClickListener) {
+ mOnMenuClickListener = listener
+ }
+
+ fun setOnClearClickListener(listener: OnClearClickListener) {
+ mOnClearClickListener = listener
+ }
+
+ // *********************************************************************************************
+ fun showKeyboard() {
+ if (!isInEditMode) {
+ val inputMethodManager =
+ context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ inputMethodManager.showSoftInput(
+ mSearchEditText,
+ InputMethodManager.RESULT_UNCHANGED_SHOWN
+ )
+ }
+ }
+
+ fun hideKeyboard() {
+ if (!isInEditMode) {
+ val inputMethodManager =
+ context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ inputMethodManager.hideSoftInputFromWindow(
+ windowToken,
+ InputMethodManager.RESULT_UNCHANGED_SHOWN
+ )
+ }
+ }
+
+ // *********************************************************************************************
+ protected fun setLayoutHeight(height: Int) {
+ val params = mLinearLayout?.layoutParams
+ params?.height = height
+ params?.width = ViewGroup.LayoutParams.MATCH_PARENT
+ mLinearLayout?.layoutParams = params
+ }
+
+ // *********************************************************************************************
+ private fun onTextChanged(newText: CharSequence) {
+ if (!TextUtils.isEmpty(newText)) {
+ mImageViewMic?.visibility = View.GONE
+ mImageViewClear?.visibility = View.VISIBLE
+ } else {
+ mImageViewClear?.visibility = View.GONE
+ if (mSearchEditText?.hasFocus()!!) {
+ mImageViewMic?.visibility = View.VISIBLE
+ } else {
+ mImageViewMic?.visibility = View.GONE
+ }
+ }
+
+ if (mOnQueryTextListener != null) {
+ mOnQueryTextListener?.onQueryTextChange(newText)
+ }
+ }
+
+ private fun onSubmitQuery() {
+ val query = mSearchEditText?.text
+ if (query != null && TextUtils.getTrimmedLength(query) > 0) {
+ if (mOnQueryTextListener == null || !mOnQueryTextListener!!.onQueryTextSubmit(query.toString())) {
+ mSearchEditText?.text = query
+ }
+ }
+ }
+
+ // *********************************************************************************************
+ override fun onSaveInstanceState(): Parcelable? {
+ val superState = super.onSaveInstanceState()
+ val ss = SearchViewSavedState(superState!!)
+ if (mSearchEditText?.text!!.isNotEmpty()) {
+ ss.query = mSearchEditText?.text
+ }
+ ss.hasFocus = mSearchEditText?.hasFocus()!!
+ return ss
+ }
+
+ override fun onRestoreInstanceState(state: Parcelable?) {
+ if (state !is SearchViewSavedState) {
+ super.onRestoreInstanceState(state)
+ return
+ }
+ super.onRestoreInstanceState(state.superState)
+ if (state.hasFocus) {
+ mSearchEditText?.requestFocus()
+ }
+ if (state.query != null) {
+ setTextQuery(state.query, false)
+ }
+ requestLayout()
+ }
+
+ override fun requestFocus(direction: Int, previouslyFocusedRect: Rect?): Boolean {
+ return if (!isFocusable) {
+ false
+ } else {
+ mSearchEditText?.requestFocus(direction, previouslyFocusedRect)!!
+ }
+ }
+
+ override fun clearFocus() {
+ super.clearFocus()
+ mSearchEditText?.clearFocus()
+ }
+
+ override fun onClick(view: View?) {
+ if (view === mImageViewNavigation) {
+ if (mOnNavigationClickListener != null) {
+ mOnNavigationClickListener?.onNavigationClick(mSearchEditText?.hasFocus()!!)
+ }
+ } else if (view === mImageViewMic) {
+ if (mOnMicClickListener != null) {
+ mOnMicClickListener?.onMicClick()
+ }
+ } else if (view === mImageViewMenu) {
+ if (mOnMenuClickListener != null) {
+ mOnMenuClickListener?.onMenuClick()
+ }
+ } else if (view === mImageViewClear) {
+ if (mSearchEditText?.text!!.isNotEmpty()) {
+ mSearchEditText?.text!!.clear()
+ }
+ if (mOnClearClickListener != null) {
+ mOnClearClickListener?.onClearClick()
+ }
+ }
+ }
+
+ // *********************************************************************************************
+ interface OnFocusChangeListener {
+
+ fun onFocusChange(hasFocus: Boolean)
+ }
+
+ interface OnQueryTextListener {
+
+ fun onQueryTextChange(newText: CharSequence): Boolean
+
+ fun onQueryTextSubmit(query: CharSequence): Boolean
+ }
+
+ interface OnNavigationClickListener {
+
+ fun onNavigationClick(hasFocus: Boolean)
+ }
+
+ interface OnMicClickListener {
+
+ fun onMicClick()
+ }
+
+ interface OnMenuClickListener {
+
+ fun onMenuClick()
+ }
+
+ interface OnClearClickListener {
+
+ fun onClearClick()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchViewSavedState.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchViewSavedState.kt
new file mode 100644
index 000000000..394a770c9
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/internal/SearchViewSavedState.kt
@@ -0,0 +1,21 @@
+/*https://github.com/lapism/search*/
+
+package org.koitharu.kotatsu.base.ui.widgets.search.internal
+
+import android.os.Parcel
+import android.os.Parcelable
+import android.text.TextUtils
+import android.view.View
+
+internal class SearchViewSavedState(superState: Parcelable) : View.BaseSavedState(superState) {
+
+ var query: CharSequence? = null
+ var hasFocus: Boolean = false
+
+ override fun writeToParcel(out: Parcel, flags: Int) {
+ super.writeToParcel(out, flags)
+ TextUtils.writeToParcel(query, out, flags)
+ out.writeInt(if (hasFocus) 1 else 0)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/util/SearchUtils.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/util/SearchUtils.kt
new file mode 100644
index 000000000..ed93e0848
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/search/util/SearchUtils.kt
@@ -0,0 +1,37 @@
+package org.koitharu.kotatsu.base.ui.widgets.search.util
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.speech.RecognizerIntent
+
+object SearchUtils {
+
+ const val SPEECH_REQUEST_CODE = 300
+
+ @JvmStatic
+ fun setVoiceSearch(activity: Activity, text: String) {
+ val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
+ // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(
+ RecognizerIntent.EXTRA_LANGUAGE_MODEL,
+ RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
+ )
+ intent.putExtra(RecognizerIntent.EXTRA_PROMPT, text)
+ intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
+
+ activity.startActivityForResult(
+ intent,
+ SPEECH_REQUEST_CODE
+ )
+ }
+
+ @JvmStatic
+ fun isVoiceSearchAvailable(context: Context): Boolean {
+ val pm = context.packageManager
+ val activities =
+ pm.queryIntentActivities(Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0)
+ return activities.size != 0
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt
index 50a5d7302..b3d11d3df 100644
--- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt
@@ -61,16 +61,42 @@ class DetailsFragment : BaseFragment(), View.OnClickList
.enqueueWith(coil)
textViewTitle.text = manga.title
textViewSubtitle.textAndVisible = manga.altTitle
+ textViewAuthor.textAndVisible = manga.author
+ textViewSource.text = manga.source.title
textViewDescription.text =
manga.description?.parseAsHtml()?.takeUnless(Spanned::isBlank)
?: getString(R.string.no_description)
- if (manga.rating == Manga.NO_RATING) {
- ratingBar.isVisible = false
+ if (manga.chapters?.isNotEmpty() == true) {
+ chaptersContainer.isVisible = true
+ textViewChapters.text = manga.chapters.let {
+ resources.getQuantityString(
+ R.plurals.chapters,
+ it.size,
+ manga.chapters.size
+ )
+ }
} else {
- ratingBar.progress = (ratingBar.max * manga.rating).roundToInt()
- ratingBar.isVisible = true
+ chaptersContainer.isVisible = false
}
- imageViewFavourite.setOnClickListener(this@DetailsFragment)
+ if (manga.rating == Manga.NO_RATING) {
+ ratingContainer.isVisible = false
+ } else {
+ textViewRating.text = String.format("%.1f", manga.rating * 5)
+ ratingContainer.isVisible = true
+ }
+ val file = manga.url.toUri().toFileOrNull()
+ if (file != null) {
+ viewLifecycleScope.launch {
+ val size = withContext(Dispatchers.IO) {
+ file.length()
+ }
+ textViewSize.text = FileSizeUtils.formatBytes(requireContext(), size)
+ }
+ sizeContainer.isVisible = true
+ } else {
+ sizeContainer.isVisible = false
+ }
+ buttonFavorite.setOnClickListener(this@DetailsFragment)
buttonRead.setOnClickListener(this@DetailsFragment)
buttonRead.setOnLongClickListener(this@DetailsFragment)
buttonRead.isEnabled = !manga.chapters.isNullOrEmpty()
@@ -91,13 +117,13 @@ class DetailsFragment : BaseFragment(), View.OnClickList
}
private fun onFavouriteChanged(isFavourite: Boolean) {
- binding.imageViewFavourite.setImageResource(
+ with(binding.buttonFavorite) {
if (isFavourite) {
- R.drawable.ic_heart
+ this.setIconResource(R.drawable.ic_heart)
} else {
- R.drawable.ic_heart_outline
+ this.setIconResource(R.drawable.ic_heart_outline)
}
- )
+ }
}
private fun onLoadingStateChanged(isLoading: Boolean) {
@@ -107,7 +133,7 @@ class DetailsFragment : BaseFragment(), View.OnClickList
override fun onClick(v: View) {
val manga = viewModel.manga.value
when (v.id) {
- R.id.imageView_favourite -> {
+ R.id.button_favorite -> {
FavouriteCategoriesDialog.show(childFragmentManager, manga ?: return)
}
R.id.button_read -> {
@@ -163,31 +189,10 @@ class DetailsFragment : BaseFragment(), View.OnClickList
tagsJob?.cancel()
tagsJob = viewLifecycleScope.launch {
val tags = ArrayList(manga.tags.size + 2)
- if (manga.author != null) {
- tags += ChipsView.ChipModel(
- title = manga.author,
- icon = R.drawable.ic_chip_user
- )
- }
for (tag in manga.tags) {
tags += ChipsView.ChipModel(
title = tag.title,
- icon = R.drawable.ic_chip_tag
- )
- }
- val file = manga.url.toUri().toFileOrNull()
- if (file != null) {
- val size = withContext(Dispatchers.IO) {
- file.length()
- }
- tags += ChipsView.ChipModel(
- title = FileSizeUtils.formatBytes(requireContext(), size),
- icon = R.drawable.ic_chip_storage
- )
- } else {
- tags += ChipsView.ChipModel(
- title = manga.source.title,
- icon = R.drawable.ic_chip_web
+ icon = 0
)
}
binding.chipsTags.setChips(tags)
diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt
index da163f722..d75a627df 100644
--- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt
@@ -4,16 +4,15 @@ import android.os.Bundle
import android.view.*
import androidx.annotation.CallSuper
import androidx.appcompat.widget.PopupMenu
+import androidx.core.content.ContextCompat
import androidx.core.graphics.Insets
import androidx.core.view.GravityCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.drawerlayout.widget.DrawerLayout
-import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.launch
@@ -81,6 +80,10 @@ abstract class MangaListFragment : BaseFragment(),
addOnScrollListener(paginationListener!!)
}
with(binding.swipeRefreshLayout) {
+ setColorSchemeColors(
+ ContextCompat.getColor(context, R.color.color_primary),
+ ContextCompat.getColor(context, R.color.color_primary_variant)
+ )
setOnRefreshListener(this@MangaListFragment)
isEnabled = isSwipeRefreshEnabled
}
@@ -246,13 +249,9 @@ abstract class MangaListFragment : BaseFragment(),
when (mode) {
ListMode.LIST -> {
layoutManager = LinearLayoutManager(context)
- addItemDecoration(
- DividerItemDecoration(
- context,
- RecyclerView.VERTICAL
- )
- )
- updatePadding(left = 0, right = 0)
+ val spacing = resources.getDimensionPixelOffset(R.dimen.list_spacing)
+ addItemDecoration(SpacingItemDecoration(spacing))
+ updatePadding(left = spacing, right = spacing)
}
ListMode.DETAILED_LIST -> {
layoutManager = LinearLayoutManager(context)
diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt
index 9f3b2f561..b7a367591 100644
--- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListModelConversionExt.kt
@@ -6,7 +6,6 @@ import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
import org.koitharu.kotatsu.core.exceptions.resolve.ResolvableException
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.prefs.ListMode
-import kotlin.math.roundToInt
fun Manga.toListModel() = MangaListModel(
id = id,
@@ -20,7 +19,7 @@ fun Manga.toListDetailedModel() = MangaListDetailedModel(
id = id,
title = title,
subtitle = altTitle,
- rating = if (rating == Manga.NO_RATING) null else "${(rating * 10).roundToInt()}/10",
+ rating = if (rating == Manga.NO_RATING) null else String.format("%.1f", rating * 5),
tags = tags.joinToString(", ") { it.title },
coverUrl = coverUrl,
manga = this
diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt
index bfb806231..409041966 100644
--- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt
@@ -6,10 +6,7 @@ import android.content.res.Configuration
import android.graphics.Color
import android.os.Build
import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import android.view.ViewGroup
+import android.view.*
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.core.graphics.Insets
@@ -17,6 +14,7 @@ import androidx.core.view.*
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit
+import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
import com.google.android.material.navigation.NavigationView
import com.google.android.material.snackbar.Snackbar
@@ -28,6 +26,7 @@ import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.prefs.AppSection
import org.koitharu.kotatsu.databinding.ActivityMainBinding
+import org.koitharu.kotatsu.databinding.NavigationHeaderBinding
import org.koitharu.kotatsu.details.ui.DetailsActivity
import org.koitharu.kotatsu.favourites.ui.FavouritesContainerFragment
import org.koitharu.kotatsu.history.ui.HistoryListFragment
@@ -46,6 +45,7 @@ import org.koitharu.kotatsu.settings.onboard.OnboardDialogFragment
import org.koitharu.kotatsu.tracker.ui.FeedFragment
import org.koitharu.kotatsu.tracker.work.TrackWorker
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
+import org.koitharu.kotatsu.utils.ext.navigationItemBackground
import org.koitharu.kotatsu.utils.ext.resolveDp
class MainActivity : BaseActivity(),
@@ -57,12 +57,14 @@ class MainActivity : BaseActivity(),
mode = LazyThreadSafetyMode.NONE
)
+ private lateinit var navHeaderBinding: NavigationHeaderBinding
private lateinit var drawerToggle: ActionBarDrawerToggle
private var searchUi: SearchUI? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(ActivityMainBinding.inflate(layoutInflater))
+ navHeaderBinding = NavigationHeaderBinding.inflate(layoutInflater)
drawerToggle = ActionBarDrawerToggle(
this,
binding.drawer,
@@ -73,7 +75,18 @@ class MainActivity : BaseActivity(),
binding.drawer.addDrawerListener(drawerToggle)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
- binding.navigationView.setNavigationItemSelectedListener(this)
+ binding.navigationView.apply {
+ val menuView = findViewById(com.google.android.material.R.id.design_navigation_view)
+ navHeaderBinding.root.setOnApplyWindowInsetsListener { v, insets ->
+ v.updatePadding(top = insets.systemWindowInsetTop)
+ // NavigationView doesn't dispatch insets to the menu view, so pad the bottom here.
+ menuView.updatePadding(bottom = insets.systemWindowInsetBottom)
+ insets
+ }
+ addHeaderView(navHeaderBinding.root)
+ itemBackground = navigationItemBackground(context)
+ setNavigationItemSelectedListener(this@MainActivity)
+ }
with(binding.fab) {
imageTintList = ColorStateList.valueOf(Color.WHITE)
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
index 22d66a6c6..e34239b56 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt
@@ -38,7 +38,7 @@ import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState
import org.koitharu.kotatsu.reader.ui.pager.reversed.ReversedReaderFragment
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment
-import org.koitharu.kotatsu.reader.ui.pager.wetoon.WebtoonReaderFragment
+import org.koitharu.kotatsu.reader.ui.pager.webtoon.WebtoonReaderFragment
import org.koitharu.kotatsu.reader.ui.thumbnails.OnPageSelectListener
import org.koitharu.kotatsu.reader.ui.thumbnails.PagesThumbnailsSheet
import org.koitharu.kotatsu.utils.GridTouchHelper
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/ListPaginationListener.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/ListPaginationListener.kt
similarity index 95%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/ListPaginationListener.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/ListPaginationListener.kt
index bcd6ec292..a3879a762 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/ListPaginationListener.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/ListPaginationListener.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonAdapter.kt
similarity index 94%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonAdapter.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonAdapter.kt
index 34e3b4713..a089d4d17 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonAdapter.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonAdapter.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.view.LayoutInflater
import android.view.ViewGroup
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonFrameLayout.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt
similarity index 91%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonFrameLayout.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt
index cf0879e4c..2fe267156 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonFrameLayout.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.content.Context
import android.util.AttributeSet
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
similarity index 97%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonHolder.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
index f7ac4b541..fcb81c602 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonHolder.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.net.Uri
import android.view.View
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonImageView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt
similarity index 97%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonImageView.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt
index 88845b512..09cb044c0 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonImageView.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.content.Context
import android.graphics.PointF
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
similarity index 98%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonReaderFragment.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
index e1b1ab879..1cb0b1079 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonReaderFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.os.Bundle
import android.view.LayoutInflater
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt
similarity index 97%
rename from app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonRecyclerView.kt
rename to app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt
index 16287fbeb..f4535d7be 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/wetoon/WebtoonRecyclerView.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt
@@ -1,4 +1,4 @@
-package org.koitharu.kotatsu.reader.ui.pager.wetoon
+package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.content.Context
import android.util.AttributeSet
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
index 4abb468a9..99fd2bcd1 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
@@ -47,9 +47,6 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
feedAdapter = FeedAdapter(get(), viewLifecycleOwner, this)
with(binding.recyclerView) {
adapter = feedAdapter
- addItemDecoration(
- SpacingItemDecoration(resources.getDimensionPixelOffset(R.dimen.grid_spacing))
- )
setHasFixedSize(true)
addOnScrollListener(PaginationScrollListener(4, this@FeedFragment))
}
@@ -134,7 +131,7 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
return
}
val summaryText = getString(
- R.string.chapers_checking_progress,
+ R.string.chapters_checking_progress,
progress.value + 1,
progress.total
)
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt
index 75ffadd6d..2e3bdf446 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/adapter/FeedItemAD.kt
@@ -37,7 +37,7 @@ fun feedItemAD(
.lifecycle(lifecycleOwner)
.enqueueWith(coil)
binding.textViewTitle.text = item.title
- binding.textViewSubtitle.text = item.subtitle
+ binding.badge.text = item.subtitle
binding.textViewChapters.text = item.chapters
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt
index 87c7efd2f..29ebb4790 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/model/ListModelConversionExt.kt
@@ -1,10 +1,8 @@
package org.koitharu.kotatsu.tracker.ui.model
import android.content.res.Resources
-import android.text.format.DateUtils
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.TrackingLogItem
-import org.koitharu.kotatsu.utils.ext.formatRelative
fun TrackingLogItem.toFeedItem(resources: Resources): FeedItem {
val chaptersString = if (chapters.size > MAX_CHAPTERS) {
@@ -23,17 +21,7 @@ fun TrackingLogItem.toFeedItem(resources: Resources): FeedItem {
id = id,
imageUrl = manga.coverUrl,
title = manga.title,
- subtitle = buildString {
- append(createdAt.formatRelative(DateUtils.DAY_IN_MILLIS))
- append(" ")
- append(
- resources.getQuantityString(
- R.plurals.new_chapters,
- chapters.size,
- chapters.size
- )
- )
- },
+ subtitle = chapters.size.toString(),
chapters = chaptersString,
manga = manga
)
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt
index 5b3081d8e..e31e3e20b 100644
--- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt
@@ -12,6 +12,7 @@ import org.koitharu.kotatsu.core.network.CommonHeaders
@Suppress("NOTHING_TO_INLINE")
inline fun ImageView.newImageRequest(url: String) = ImageRequest.Builder(context)
.data(url)
+ .crossfade(true)
.target(this)
@Suppress("NOTHING_TO_INLINE")
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/UiExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/UiExt.kt
new file mode 100644
index 000000000..f66e9f880
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/UiExt.kt
@@ -0,0 +1,21 @@
+package org.koitharu.kotatsu.utils.ext
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.core.graphics.drawable.DrawableCompat
+import org.koitharu.kotatsu.R
+
+fun navigationItemBackground(context: Context): Drawable? {
+ // Need to inflate the drawable and CSL via AppCompatResources to work on Lollipop
+ // From Google I/O repo (https://github.com/google/iosched)
+ var background = AppCompatResources.getDrawable(context, R.drawable.navigation_item_background)
+ if (background != null) {
+ val tint = AppCompatResources.getColorStateList(
+ context, R.color.navigation_item_background_tint
+ )
+ background = DrawableCompat.wrap(background.mutate())
+ background.setTintList(tint)
+ }
+ return background
+}
\ No newline at end of file
diff --git a/app/src/main/res/color/navigation_item_background_tint.xml b/app/src/main/res/color/navigation_item_background_tint.xml
new file mode 100644
index 000000000..06c5673d1
--- /dev/null
+++ b/app/src/main/res/color/navigation_item_background_tint.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/selector_overlay.xml b/app/src/main/res/color/selector_overlay.xml
new file mode 100644
index 000000000..c99447ac2
--- /dev/null
+++ b/app/src/main/res/color/selector_overlay.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/color/stroke_color.xml b/app/src/main/res/color/stroke_color.xml
deleted file mode 100644
index daeffa86f..000000000
--- a/app/src/main/res/color/stroke_color.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/ic_totoro.webp b/app/src/main/res/drawable-hdpi/ic_totoro.webp
new file mode 100644
index 000000000..0430efcfc
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_totoro.webp differ
diff --git a/app/src/main/res/drawable-mdpi/ic_totoro.webp b/app/src/main/res/drawable-mdpi/ic_totoro.webp
new file mode 100644
index 000000000..bfc0242b2
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_totoro.webp differ
diff --git a/app/src/main/res/drawable-w600dp/tab_indicator.xml b/app/src/main/res/drawable-w600dp/tab_indicator.xml
new file mode 100644
index 000000000..e2b1ad5c9
--- /dev/null
+++ b/app/src/main/res/drawable-w600dp/tab_indicator.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/ic_totoro.webp b/app/src/main/res/drawable-xhdpi/ic_totoro.webp
new file mode 100644
index 000000000..2b0dde6ca
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_totoro.webp differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_totoro.webp b/app/src/main/res/drawable-xxhdpi/ic_totoro.webp
new file mode 100644
index 000000000..84698c144
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_totoro.webp differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_totoro.webp b/app/src/main/res/drawable-xxxhdpi/ic_totoro.webp
new file mode 100644
index 000000000..4193ce397
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_totoro.webp differ
diff --git a/app/src/main/res/drawable/badge.xml b/app/src/main/res/drawable/badge.xml
new file mode 100644
index 000000000..dc4263e17
--- /dev/null
+++ b/app/src/main/res/drawable/badge.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_arrow_back.xml b/app/src/main/res/drawable/ic_arrow_back.xml
new file mode 100644
index 000000000..2a31b2ef3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_book_page.xml b/app/src/main/res/drawable/ic_book_page.xml
index e53b1da5c..375e7b424 100644
--- a/app/src/main/res/drawable/ic_book_page.xml
+++ b/app/src/main/res/drawable/ic_book_page.xml
@@ -1,11 +1,10 @@
-
-
-
\ No newline at end of file
+
+
+
diff --git a/app/src/main/res/drawable/ic_chip_storage.xml b/app/src/main/res/drawable/ic_chip_storage.xml
deleted file mode 100644
index 6e8a580b1..000000000
--- a/app/src/main/res/drawable/ic_chip_storage.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_chip_tag.xml b/app/src/main/res/drawable/ic_chip_tag.xml
deleted file mode 100644
index d5df0cdda..000000000
--- a/app/src/main/res/drawable/ic_chip_tag.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_chip_user.xml b/app/src/main/res/drawable/ic_chip_user.xml
deleted file mode 100644
index 7766cafe5..000000000
--- a/app/src/main/res/drawable/ic_chip_user.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_chip_web.xml b/app/src/main/res/drawable/ic_chip_web.xml
deleted file mode 100644
index da38fecd3..000000000
--- a/app/src/main/res/drawable/ic_chip_web.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml
new file mode 100644
index 000000000..938bb9922
--- /dev/null
+++ b/app/src/main/res/drawable/ic_clear.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml
deleted file mode 100644
index 52e210215..000000000
--- a/app/src/main/res/drawable/ic_eye.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_eye_checkable.xml b/app/src/main/res/drawable/ic_eye_checkable.xml
deleted file mode 100644
index 7f35e1761..000000000
--- a/app/src/main/res/drawable/ic_eye_checkable.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_eye_off.xml b/app/src/main/res/drawable/ic_eye_off.xml
deleted file mode 100644
index e558a36c4..000000000
--- a/app/src/main/res/drawable/ic_eye_off.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml
index 220e1b503..0781a7c4a 100644
--- a/app/src/main/res/drawable/ic_lock.xml
+++ b/app/src/main/res/drawable/ic_lock.xml
@@ -2,7 +2,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:tint="#FFFFFF"
+ android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
+
+
diff --git a/app/src/main/res/drawable/ic_mic_none.xml b/app/src/main/res/drawable/ic_mic_none.xml
new file mode 100644
index 000000000..2810bc9a2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_mic_none.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml
index 753697107..0d7a0a664 100644
--- a/app/src/main/res/drawable/ic_settings.xml
+++ b/app/src/main/res/drawable/ic_settings.xml
@@ -1,11 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml
index 8ed8e7e87..6709b5625 100644
--- a/app/src/main/res/drawable/ic_share.xml
+++ b/app/src/main/res/drawable/ic_share.xml
@@ -1,5 +1,11 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml
new file mode 100644
index 000000000..0850e55fd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_star.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_star_manga_info.xml b/app/src/main/res/drawable/ic_star_manga_info.xml
new file mode 100644
index 000000000..e4f9e867d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_star_manga_info.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_star_rating.xml b/app/src/main/res/drawable/ic_star_rating.xml
deleted file mode 100644
index c96d7ace6..000000000
--- a/app/src/main/res/drawable/ic_star_rating.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_web.xml b/app/src/main/res/drawable/ic_web.xml
new file mode 100644
index 000000000..3f70646ba
--- /dev/null
+++ b/app/src/main/res/drawable/ic_web.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/list_selector.xml b/app/src/main/res/drawable/list_selector.xml
new file mode 100644
index 000000000..14508c152
--- /dev/null
+++ b/app/src/main/res/drawable/list_selector.xml
@@ -0,0 +1,42 @@
+
+
+ -
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/navigation_item_background.xml b/app/src/main/res/drawable/navigation_item_background.xml
new file mode 100644
index 000000000..8c635e7a3
--- /dev/null
+++ b/app/src/main/res/drawable/navigation_item_background.xml
@@ -0,0 +1,19 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tab_indicator.xml b/app/src/main/res/drawable/tab_indicator.xml
index 85211f67c..7f0ba0c38 100644
--- a/app/src/main/res/drawable/tab_indicator.xml
+++ b/app/src/main/res/drawable/tab_indicator.xml
@@ -4,6 +4,6 @@
android:shape="rectangle">
+ android:topRightRadius="3dp"/>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tabs_background.xml b/app/src/main/res/drawable/tabs_background.xml
index 6c1544f5f..d9df3de10 100644
--- a/app/src/main/res/drawable/tabs_background.xml
+++ b/app/src/main/res/drawable/tabs_background.xml
@@ -14,7 +14,7 @@
+ android:color="@color/list_divider" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/thumb.xml b/app/src/main/res/drawable/thumb.xml
index 71e0a8113..8d1b235a1 100644
--- a/app/src/main/res/drawable/thumb.xml
+++ b/app/src/main/res/drawable/thumb.xml
@@ -9,6 +9,6 @@
android:paddingLeft="22dp"
android:paddingRight="22dp" />
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-w600dp-land/fragment_details.xml b/app/src/main/res/layout-w600dp-land/fragment_details.xml
new file mode 100644
index 000000000..51f3213ed
--- /dev/null
+++ b/app/src/main/res/layout-w600dp-land/fragment_details.xml
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-w600dp-port/fragment_details.xml b/app/src/main/res/layout-w600dp-port/fragment_details.xml
new file mode 100644
index 000000000..107c5c57f
--- /dev/null
+++ b/app/src/main/res/layout-w600dp-port/fragment_details.xml
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-w600dp/activity_details.xml b/app/src/main/res/layout-w600dp/activity_details.xml
index e5fc1b45a..af351d3aa 100644
--- a/app/src/main/res/layout-w600dp/activity_details.xml
+++ b/app/src/main/res/layout-w600dp/activity_details.xml
@@ -9,29 +9,27 @@
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways">
+ app:tabGravity="center"
+ app:tabMode="fixed" />
diff --git a/app/src/main/res/layout-w600dp/activity_settings.xml b/app/src/main/res/layout-w600dp/activity_settings.xml
index 8d031bc79..3b6db9d0b 100644
--- a/app/src/main/res/layout-w600dp/activity_settings.xml
+++ b/app/src/main/res/layout-w600dp/activity_settings.xml
@@ -8,33 +8,33 @@
+ app:elevation="0dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+ app:layout_scrollFlags="scroll|enterAlways" />
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/appbar"
+ app:layout_constraintWidth_percent="0.6">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_browser.xml b/app/src/main/res/layout/activity_browser.xml
index 0c2add382..36b76f907 100644
--- a/app/src/main/res/layout/activity_browser.xml
+++ b/app/src/main/res/layout/activity_browser.xml
@@ -8,20 +8,20 @@
+ app:layout_scrollFlags="scroll|enterAlways" />
diff --git a/app/src/main/res/layout/activity_categories.xml b/app/src/main/res/layout/activity_categories.xml
index 57166010a..aa9a032e0 100644
--- a/app/src/main/res/layout/activity_categories.xml
+++ b/app/src/main/res/layout/activity_categories.xml
@@ -2,22 +2,22 @@
+ android:layout_height="match_parent">
+ app:elevation="0dp">
+ android:layout_height="wrap_content" />
@@ -25,9 +25,9 @@
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:clipToPadding="false"
android:orientation="vertical"
android:scrollbars="vertical"
- android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
@@ -36,13 +36,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:gravity="center"
- android:visibility="gone"
- tools:visibility="visible"
android:layout_margin="20dp"
+ android:gravity="center"
+ android:text="@string/text_categories_holder"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="?android:textColorSecondary"
- android:text="@string/text_categories_holder"/>
+ android:visibility="gone"
+ tools:visibility="visible" />
-
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways" />
+ app:tabGravity="fill"
+ app:tabMaxWidth="0dp"
+ app:tabMode="fixed" />
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 62aee8a5f..e9506d317 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,8 +6,7 @@
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".main.ui.MainActivity"
- tools:openDrawer="start">
+ tools:context=".main.ui.MainActivity">
+ app:elevation="0dp">
@@ -54,7 +54,7 @@
+ app:popupTheme="@style/ThemeOverlay.Kotatsu" />
@@ -50,7 +50,7 @@
android:layout_gravity="bottom"
android:background="@color/dim"
android:elevation="0dp"
- android:theme="@style/AppToolbarTheme"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="0dp"
tools:visibility="gone">
@@ -59,7 +59,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
- app:popupTheme="@style/AppPopupTheme" />
+ app:popupTheme="@style/ThemeOverlay.Kotatsu" />
diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml
index a12c6daf6..7a7a4ab76 100644
--- a/app/src/main/res/layout/activity_search.xml
+++ b/app/src/main/res/layout/activity_search.xml
@@ -7,17 +7,17 @@
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways">
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways" />
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 2fa97a72c..5c180d794 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -6,19 +6,19 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways" />
diff --git a/app/src/main/res/layout/activity_settings_simple.xml b/app/src/main/res/layout/activity_settings_simple.xml
index 4f6c56541..dd60a6ed2 100644
--- a/app/src/main/res/layout/activity_settings_simple.xml
+++ b/app/src/main/res/layout/activity_settings_simple.xml
@@ -7,17 +7,17 @@
+ app:elevation="0dp">
+ app:layout_scrollFlags="scroll|enterAlways" />
diff --git a/app/src/main/res/layout/activity_setup_protect.xml b/app/src/main/res/layout/activity_setup_protect.xml
index 7f3aae3c8..e061e7139 100644
--- a/app/src/main/res/layout/activity_setup_protect.xml
+++ b/app/src/main/res/layout/activity_setup_protect.xml
@@ -36,6 +36,7 @@
diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml
index 6c035d585..895bacb61 100644
--- a/app/src/main/res/layout/dialog_input.xml
+++ b/app/src/main/res/layout/dialog_input.xml
@@ -11,21 +11,16 @@
+ android:layout_height="wrap_content">
diff --git a/app/src/main/res/layout/dialog_list_mode.xml b/app/src/main/res/layout/dialog_list_mode.xml
index 01d5e426e..8fb04828e 100644
--- a/app/src/main/res/layout/dialog_list_mode.xml
+++ b/app/src/main/res/layout/dialog_list_mode.xml
@@ -18,7 +18,7 @@
+ tools:listitem="@layout/item_branch"
+ tools:visibility="visible" />
+ android:layout_height="match_parent"
+ android:scrollbars="vertical"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+ android:layout_height="match_parent">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintTop_toTopOf="parent">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@+id/buttons_layout" />
+
+
+ tools:text="@tools:sample/lorem/random[25]" />
diff --git a/app/src/main/res/layout/fragment_reader_webtoon.xml b/app/src/main/res/layout/fragment_reader_webtoon.xml
index ff906ec6e..bf60f0a5a 100644
--- a/app/src/main/res/layout/fragment_reader_webtoon.xml
+++ b/app/src/main/res/layout/fragment_reader_webtoon.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_header.xml b/app/src/main/res/layout/item_header.xml
index 7031727d6..27b1c2c37 100644
--- a/app/src/main/res/layout/item_header.xml
+++ b/app/src/main/res/layout/item_header.xml
@@ -5,10 +5,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|start"
- android:paddingStart="?android:listPreferredItemPaddingStart"
- android:paddingEnd="?android:listPreferredItemPaddingEnd"
- android:minHeight="@dimen/header_height"
+ android:paddingStart="4dp"
+ android:paddingEnd="4dp"
android:singleLine="true"
+ android:textAllCaps="true"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2"
android:textColor="?android:textColorSecondary"
android:textStyle="bold"
diff --git a/app/src/main/res/layout/item_manga_grid.xml b/app/src/main/res/layout/item_manga_grid.xml
index 9727f3b88..6a168ea68 100644
--- a/app/src/main/res/layout/item_manga_grid.xml
+++ b/app/src/main/res/layout/item_manga_grid.xml
@@ -1,38 +1,50 @@
-
+ android:background="@drawable/list_selector">
-
+
-
+ android:layout_margin="4dp"
+ app:cardCornerRadius="4dp"
+ app:cardElevation="4dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+
+
+
+ android:lineSpacingExtra="-2dp"
+ android:maxLines="2"
+ android:padding="4dp"
+ android:textStyle="bold"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/card"
+ tools:text="Sample name" />
-
+
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_manga_list.xml b/app/src/main/res/layout/item_manga_list.xml
index f6d964cdc..ed12b43af 100644
--- a/app/src/main/res/layout/item_manga_list.xml
+++ b/app/src/main/res/layout/item_manga_list.xml
@@ -1,24 +1,37 @@
-
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ app:cardCornerRadius="4dp"
+ app:cardElevation="4dp">
+
+
+
+
+ android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ tools:text="@tools:sample/lorem/random" />
+ android:textColor="?android:textColorSecondary"
+ tools:text="@tools:sample/lorem/random" />
diff --git a/app/src/main/res/layout/item_manga_list_details.xml b/app/src/main/res/layout/item_manga_list_details.xml
index 7257473f2..11ebedae3 100644
--- a/app/src/main/res/layout/item_manga_list_details.xml
+++ b/app/src/main/res/layout/item_manga_list_details.xml
@@ -1,96 +1,91 @@
-
+ android:background="@drawable/list_selector"
+ android:orientation="horizontal">
-
+ android:layout_height="wrap_content"
+ android:layout_margin="4dp"
+ app:cardElevation="4dp">
+
+
+
+
+ android:textAppearance="@style/TextAppearance.Kotatsu.ToolbarTitle"
+ android:textSize="18sp"
+ tools:text="@tools:sample/lorem/random" />
-
-
-
-
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:ellipsize="none"
+ android:gravity="center_vertical"
+ android:requiresFadingEdge="horizontal"
+ android:singleLine="true"
+ android:textSize="16sp"
+ tools:text="@tools:sample/lorem/random" />
+ android:orientation="horizontal">
+ android:singleLine="true"
+ tools:text="@tools:sample/lorem/random" />
+ android:paddingStart="6dp"
+ app:drawableEndCompat="@drawable/ic_star"
+ tools:text="9.6" />
@@ -98,4 +93,4 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_page.xml b/app/src/main/res/layout/item_page.xml
index cf4798de0..281625e76 100644
--- a/app/src/main/res/layout/item_page.xml
+++ b/app/src/main/res/layout/item_page.xml
@@ -3,9 +3,9 @@
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:background="?android:windowBackground"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:background="?android:windowBackground">
+ app:drawableTopCompat="@drawable/ic_error_large"
+ tools:text="@tools:sample/lorem[6]" />
-
-
+ app:zoomEnabled="false" />
+ app:drawableTopCompat="@drawable/ic_error_large"
+ tools:text="@tools:sample/lorem[6]" />
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_search_complete.xml b/app/src/main/res/layout/item_search_complete.xml
index 6bb124b06..d0ecbdc80 100644
--- a/app/src/main/res/layout/item_search_complete.xml
+++ b/app/src/main/res/layout/item_search_complete.xml
@@ -12,6 +12,6 @@
android:paddingEnd="?listPreferredItemPaddingEnd"
android:textAppearance="?textAppearanceListItemSmall"
android:textColor="?android:textColorPrimary"
- android:theme="@style/AppPopupTheme"
- tools:text="@tools:sample/full_names"
- app:drawableStartCompat="@drawable/ic_history" />
\ No newline at end of file
+ android:theme="@style/ThemeOverlay.Kotatsu"
+ app:drawableStartCompat="@drawable/ic_history"
+ tools:text="@tools:sample/full_names" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_source_config.xml b/app/src/main/res/layout/item_source_config.xml
index 69e2815f3..21a2bb0d9 100644
--- a/app/src/main/res/layout/item_source_config.xml
+++ b/app/src/main/res/layout/item_source_config.xml
@@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="?android:listPreferredItemHeightSmall"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?android:windowBackground"
android:gravity="center_vertical"
android:orientation="horizontal">
@@ -32,7 +31,7 @@
+ android:layout_height="wrap_content" />
-
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackground"
+ android:paddingEnd="16dp">
-
+
-
+ android:scaleType="centerCrop"
+ tools:src="@tools:sample/backgrounds/scenic" />
+
+
+
+
-
-
-
-
+ android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ tools:text="@tools:sample/lorem" />
+ android:layout_gravity="center"
+ android:background="@drawable/badge"
+ android:paddingHorizontal="6dp"
+ android:paddingVertical="2dp"
+ android:textColor="@android:color/white"
+ android:textSize="12sp"
+ android:textStyle="bold"
+ tools:text="54" />
-
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_search_view.xml b/app/src/main/res/layout/layout_search_view.xml
new file mode 100644
index 000000000..7686f1813
--- /dev/null
+++ b/app/src/main/res/layout/layout_search_view.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/navigation_header.xml b/app/src/main/res/layout/navigation_header.xml
new file mode 100644
index 000000000..cc5b83e5a
--- /dev/null
+++ b/app/src/main/res/layout/navigation_header.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/sheet_pages.xml b/app/src/main/res/layout/sheet_pages.xml
index 74573b6c2..2552723d5 100644
--- a/app/src/main/res/layout/sheet_pages.xml
+++ b/app/src/main/res/layout/sheet_pages.xml
@@ -43,6 +43,7 @@
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:clipToPadding="false"
android:padding="@dimen/grid_spacing"
android:scrollbars="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 926f62a66..f5a8f2613 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -75,7 +75,6 @@
Манхва
Рэжым чытання
Памер табліцы
- Вынікі пошуку па %s
Пошук па %s
Выдаліць мангу
Настаўленні чытання
@@ -96,7 +95,6 @@
Унутраны назапашвальнік
Знешняе сховішча
Дамен
- Безумоўна
Правяраць абнаўленне прыкладання
Даступна абнаўленне прыкладання
Паказваць апавяшчэнне пры наяўнасці новай версіі
@@ -194,7 +192,7 @@
Прайсці
Ачысціць кукi
Усе кукi выдалены
- Праверка новых частак: %1$d з %2$d
+ Праверка новых частак: %1$d з %2$d
Ачысціць стужку
Уся гісторыя абнаўленняў будзе ачышчана і яе нельга будзе вярнуць. Вы ўпэўненыя?
Праверка новых частак
@@ -208,4 +206,7 @@
Пацвярджаць
Пароль павінен змяшчаць не менш за 4 сімвалаў
Схаваць загаловак пры прагортцы
+ Пошук толькі па %s
+ Вы сапраўды хочаце выдаліць усе апошнія пошукавыя запыты? Гэта дзеянне не можа быць адменена.
+ Апісанне
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 8786b537d..071f78ac5 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -74,7 +74,6 @@
Webtoon
Modo de lectura
Tamaño de la cuadrícula
- Resultados de búsqueda en %s
Buscar en %s
Borrar manga
¿Realmente quieres borrar \"%s\" del almacenamiento local de tu teléfono? \nEsta operación no se puede deshacer.
@@ -95,7 +94,6 @@
Almacenamiento interno
Almacenamiento externo
Dominio
- Por defecto
Comprobar actualizaciones automáticamente
Una nueva versión de la aplicación está disponible
Mostrar notificación si la actualización está disponible
@@ -193,7 +191,7 @@
Resolver
Borrar cookies
Se han eliminado todas las cookies
- Buscando nuevos capítulos: %1$d de %2$d
+ Buscando nuevos capítulos: %1$d de %2$d
Limpiar feed
Todo el historial de actualizaciones se borrará y esta acción no se puede deshacer. ¿Está seguro?
Comprobación de nuevos capítulos
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
index 7a2753729..1bad6948a 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -1,10 +1,20 @@
- #1976D2
- #0D47A1
- #1A237E
- #FF8A65
- #99000000
- #E57373
- #5E636A
+
+ #1976D2
+ #1565C0
+ @android:color/black
+
+ #2EFFFFFF
+ #2a2b2e
+
+
+ #2EFFFFFF
+ #B3000000
+
+
+
+
+ #1fffffff
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
deleted file mode 100644
index 65256236f..000000000
--- a/app/src/main/res/values-night/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index d839f3aac..e4fc0c120 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,8 +1,13 @@
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-notnight-v23/bools.xml b/app/src/main/res/values-notnight-v23/bools.xml
new file mode 100644
index 000000000..3610539ef
--- /dev/null
+++ b/app/src/main/res/values-notnight-v23/bools.xml
@@ -0,0 +1,4 @@
+
+
+ true
+
\ No newline at end of file
diff --git a/app/src/main/res/values-notnight-v27/bools.xml b/app/src/main/res/values-notnight-v27/bools.xml
new file mode 100644
index 000000000..2ee1ed1bf
--- /dev/null
+++ b/app/src/main/res/values-notnight-v27/bools.xml
@@ -0,0 +1,4 @@
+
+
+ true
+
\ No newline at end of file
diff --git a/app/src/main/res/values-notnight-v27/colors.xml b/app/src/main/res/values-notnight-v27/colors.xml
new file mode 100644
index 000000000..8e4e067bf
--- /dev/null
+++ b/app/src/main/res/values-notnight-v27/colors.xml
@@ -0,0 +1,5 @@
+
+
+
+ @color/system_ui_scrim_light
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 4638416bc..6b7e4328d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -24,7 +24,7 @@
Читать
Добавить закладку
Добавьте интересующую Вас мангу в избренное, чтобы не потерять её
- Добавить в избранное
+ В избранное
Создать категорию
Добавить
Введите название
@@ -74,7 +74,6 @@
Манхва
Режим чтения
Размер таблицы
- Результаты поиска по %s
Поиск по %s
Удалить мангу
Вы уверены, что хотите удалить \"%s\" с устройства? \nЭто действие нельзя будет отменить.
@@ -95,7 +94,6 @@
Внутренний накопитель
Внешнее хранилище
Домен
- По умолчанию
Проверять обновление приложения
Доступно обновление приложения
Показывать уведомление при наличии новой версии
@@ -192,7 +190,7 @@
Пройти
Очистить куки
Все куки удалены
- Проверка новых глав: %1$d из %2$d
+ Проверка новых глав: %1$d из %2$d
Очистить ленту
Вся история обновлений будет очищена и её нельзя будет вернуть. Вы уверены?
Проверка новых глав
@@ -210,4 +208,6 @@
Другие
Languages
Welcome
+ Описание
+ Вы действительно хотите удалить все последние поисковые запросы? Это действие не может быть отменено.
\ No newline at end of file
diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml
new file mode 100644
index 000000000..0955e00db
--- /dev/null
+++ b/app/src/main/res/values-v23/themes.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-v29/themes.xml b/app/src/main/res/values-v29/themes.xml
index b8b075c5d..4ae0ef5db 100644
--- a/app/src/main/res/values-v29/themes.xml
+++ b/app/src/main/res/values-v29/themes.xml
@@ -1,15 +1,10 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml
index 442ae059a..044349fc7 100644
--- a/app/src/main/res/values-w600dp/dimens.xml
+++ b/app/src/main/res/values-w600dp/dimens.xml
@@ -1,6 +1,6 @@
- 4dp
+ 6dp
2dp
140dp
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 4c8767415..13b53d3c4 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,6 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml
index 07aafe1c4..735d84e13 100644
--- a/app/src/main/res/values/bools.xml
+++ b/app/src/main/res/values/bools.xml
@@ -1,4 +1,6 @@
false
+ false
+ false
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 5d1c1d8ba..6147fed95 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,13 +1,30 @@
+
+ #1976D2
+ #1565C0
+ @android:color/white
+
+ #39000000
+ #F8F9FA
+
+
+ #B3FFFFFF
+ #40000000
+ @color/system_ui_scrim_black
+
+
+ #1f000000>
+
+
+
#1976D2
#1565C0
- #283593
#EF5350
#424242
#212121
#99000000
#D32F2F
- #33000000
- #C3CFDD
+ #99000000
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index ee61388a6..6b0ba74bd 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,8 +1,22 @@
- 2.5dp
+
+
+ 16dp
+
+
+ 36dp
+ 24dp
+
+ 0dp
+ 100dp
+ 0dp
+ 8dp>
+
+ 6dp
+ 6dp
2dp
- 84dp
+ 78dp
120dp
46dp
120dp
@@ -10,4 +24,23 @@
16dp
48dp
16dp
+
+
+
+ 16dp
+ 16sp
+ 48dp
+ 56dp
+ 1dp
+ 0dp
+ 48dp
+ 56dp
+ 8dp
+ 0dp
+ 3dp
+ 0dp
+ 16dp
+ 8dp
+ 0dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml
new file mode 100644
index 000000000..5532e13df
--- /dev/null
+++ b/app/src/main/res/values/integers.xml
@@ -0,0 +1,6 @@
+
+
+
+ @android:integer/config_shortAnimTime
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8112a0029..e0bfcd8a6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -75,7 +75,6 @@
Webtoon
Read mode
Grid size
- Search results on %s
Search on %s
Delete manga
Do you really want to delete \"%s\" from your phone\'s local storage? \nThis operation cannot be undone.
@@ -96,7 +95,6 @@
Internal storage
External storage
Domain
- Default
Check for updates automatically
Application update is available
Show notification if update is available
@@ -194,7 +192,7 @@
Solve
Clear cookies
All cookies was removed
- Checking for new chapters: %1$d of %2$d
+ Checking for new chapters: %1$d of %2$d
Clear feed
All updates history will be cleared and this action cannot be undone. Are you sure?
New chapters checking
@@ -213,4 +211,5 @@
Other
Languages
Welcome
+ Description
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 161614112..b3a63cefa 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,6 +1,50 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index ec569d9c4..775f91e58 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,23 +1,54 @@
-
+
-
-
-
+
+
+
+
\ No newline at end of file