2017-01-02 12:09:23 +01:00
|
|
|
package eu.kanade.tachiyomi.widget
|
|
|
|
|
|
|
|
import android.annotation.SuppressLint
|
|
|
|
import android.content.Context
|
|
|
|
import android.util.AttributeSet
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.widget.*
|
2020-01-08 01:20:08 +01:00
|
|
|
import androidx.appcompat.widget.TintTypedArray
|
|
|
|
import androidx.core.view.ViewCompat
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import com.google.android.material.R
|
2020-01-05 17:29:27 +01:00
|
|
|
import com.google.android.material.internal.ScrimInsetsFrameLayout
|
2020-01-08 01:20:08 +01:00
|
|
|
import com.google.android.material.textfield.TextInputLayout
|
2020-02-27 00:03:34 +01:00
|
|
|
import eu.kanade.tachiyomi.R as TR
|
2020-02-03 04:22:54 +01:00
|
|
|
import eu.kanade.tachiyomi.util.view.inflate
|
2020-01-08 01:20:08 +01:00
|
|
|
import kotlin.math.min
|
2017-01-02 12:09:23 +01:00
|
|
|
|
|
|
|
@Suppress("LeakingThis")
|
2020-01-05 17:29:27 +01:00
|
|
|
@SuppressLint("PrivateResource", "RestrictedApi")
|
2017-01-02 12:09:23 +01:00
|
|
|
open class SimpleNavigationView @JvmOverloads constructor(
|
2020-02-27 00:03:34 +01:00
|
|
|
context: Context,
|
|
|
|
attrs: AttributeSet? = null,
|
|
|
|
defStyleAttr: Int = 0
|
|
|
|
) :
|
|
|
|
ScrimInsetsFrameLayout(context, attrs, defStyleAttr) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Max width of the navigation view.
|
|
|
|
*/
|
|
|
|
private var maxWidth: Int
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Recycler view containing all the items.
|
|
|
|
*/
|
|
|
|
protected val recycler = RecyclerView(context)
|
|
|
|
|
|
|
|
init {
|
|
|
|
// Custom attributes
|
|
|
|
val a = TintTypedArray.obtainStyledAttributes(context, attrs,
|
|
|
|
R.styleable.NavigationView, defStyleAttr,
|
|
|
|
R.style.Widget_Design_NavigationView)
|
|
|
|
|
|
|
|
ViewCompat.setBackground(
|
|
|
|
this, a.getDrawable(R.styleable.NavigationView_android_background))
|
|
|
|
|
|
|
|
if (a.hasValue(R.styleable.NavigationView_elevation)) {
|
|
|
|
ViewCompat.setElevation(this, a.getDimensionPixelSize(
|
|
|
|
R.styleable.NavigationView_elevation, 0).toFloat())
|
|
|
|
}
|
|
|
|
|
2017-10-28 19:12:17 +02:00
|
|
|
@Suppress("DEPRECATION")
|
2017-01-02 12:09:23 +01:00
|
|
|
ViewCompat.setFitsSystemWindows(this,
|
|
|
|
a.getBoolean(R.styleable.NavigationView_android_fitsSystemWindows, false))
|
|
|
|
|
|
|
|
maxWidth = a.getDimensionPixelSize(R.styleable.NavigationView_android_maxWidth, 0)
|
|
|
|
|
|
|
|
a.recycle()
|
|
|
|
|
|
|
|
recycler.layoutManager = LinearLayoutManager(context)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Overriden to measure the width of the navigation view.
|
|
|
|
*/
|
2017-10-28 19:12:17 +02:00
|
|
|
@SuppressLint("SwitchIntDef")
|
2017-01-02 12:09:23 +01:00
|
|
|
override fun onMeasure(widthSpec: Int, heightSpec: Int) {
|
|
|
|
val width = when (MeasureSpec.getMode(widthSpec)) {
|
|
|
|
MeasureSpec.AT_MOST -> MeasureSpec.makeMeasureSpec(
|
2020-01-08 01:20:08 +01:00
|
|
|
min(MeasureSpec.getSize(widthSpec), maxWidth), MeasureSpec.EXACTLY)
|
2017-01-02 12:09:23 +01:00
|
|
|
MeasureSpec.UNSPECIFIED -> MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.EXACTLY)
|
|
|
|
else -> widthSpec
|
|
|
|
}
|
|
|
|
// Let super sort out the height
|
|
|
|
super.onMeasure(width, heightSpec)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Base view holder.
|
|
|
|
*/
|
|
|
|
abstract class Holder(view: View) : RecyclerView.ViewHolder(view)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Separator view holder.
|
|
|
|
*/
|
2020-02-27 00:03:34 +01:00
|
|
|
class SeparatorHolder(parent: ViewGroup) :
|
|
|
|
Holder(parent.inflate(R.layout.design_navigation_item_separator))
|
2017-01-02 12:09:23 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Header view holder.
|
|
|
|
*/
|
2020-02-27 00:03:34 +01:00
|
|
|
class HeaderHolder(parent: ViewGroup) :
|
|
|
|
Holder(parent.inflate(TR.layout.navigation_view_group)) {
|
2018-02-16 15:23:15 +01:00
|
|
|
|
|
|
|
val title: TextView = itemView.findViewById(TR.id.title)
|
|
|
|
}
|
|
|
|
|
2017-01-02 12:09:23 +01:00
|
|
|
/**
|
|
|
|
* Clickable view holder.
|
|
|
|
*/
|
|
|
|
abstract class ClickableHolder(view: View, listener: View.OnClickListener?) : Holder(view) {
|
|
|
|
init {
|
|
|
|
itemView.setOnClickListener(listener)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Radio view holder.
|
|
|
|
*/
|
2020-02-27 00:03:34 +01:00
|
|
|
class RadioHolder(parent: ViewGroup, listener: View.OnClickListener?) :
|
|
|
|
ClickableHolder(parent.inflate(TR.layout.navigation_view_radio), listener) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
2017-09-23 17:14:04 +02:00
|
|
|
val radio: RadioButton = itemView.findViewById(TR.id.nav_view_item)
|
2017-01-02 12:09:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checkbox view holder.
|
|
|
|
*/
|
2020-02-27 00:03:34 +01:00
|
|
|
class CheckboxHolder(parent: ViewGroup, listener: View.OnClickListener?) :
|
|
|
|
ClickableHolder(parent.inflate(TR.layout.navigation_view_checkbox), listener) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
2017-09-23 17:14:04 +02:00
|
|
|
val check: CheckBox = itemView.findViewById(TR.id.nav_view_item)
|
2017-01-02 12:09:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Multi state view holder.
|
|
|
|
*/
|
2020-02-27 00:03:34 +01:00
|
|
|
class MultiStateHolder(parent: ViewGroup, listener: View.OnClickListener?) :
|
|
|
|
ClickableHolder(parent.inflate(TR.layout.navigation_view_checkedtext), listener) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
2017-09-23 17:14:04 +02:00
|
|
|
val text: CheckedTextView = itemView.findViewById(TR.id.nav_view_item)
|
2017-01-02 12:09:23 +01:00
|
|
|
}
|
|
|
|
|
2020-02-27 00:03:34 +01:00
|
|
|
class SpinnerHolder(parent: ViewGroup, listener: OnClickListener? = null) :
|
|
|
|
ClickableHolder(parent.inflate(TR.layout.navigation_view_spinner), listener) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
2017-09-23 17:14:04 +02:00
|
|
|
val text: TextView = itemView.findViewById(TR.id.nav_view_item_text)
|
|
|
|
val spinner: Spinner = itemView.findViewById(TR.id.nav_view_item)
|
2017-01-02 12:09:23 +01:00
|
|
|
}
|
|
|
|
|
2020-02-27 00:03:34 +01:00
|
|
|
class EditTextHolder(parent: ViewGroup) :
|
|
|
|
Holder(parent.inflate(TR.layout.navigation_view_text)) {
|
2017-01-02 12:09:23 +01:00
|
|
|
|
2017-09-23 17:14:04 +02:00
|
|
|
val wrapper: TextInputLayout = itemView.findViewById(TR.id.nav_view_item_wrapper)
|
|
|
|
val edit: EditText = itemView.findViewById(TR.id.nav_view_item)
|
2017-01-02 12:09:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected companion object {
|
|
|
|
const val VIEW_TYPE_HEADER = 100
|
|
|
|
const val VIEW_TYPE_SEPARATOR = 101
|
|
|
|
const val VIEW_TYPE_RADIO = 102
|
|
|
|
const val VIEW_TYPE_CHECKBOX = 103
|
|
|
|
const val VIEW_TYPE_MULTISTATE = 104
|
|
|
|
const val VIEW_TYPE_TEXT = 105
|
|
|
|
const val VIEW_TYPE_LIST = 106
|
|
|
|
}
|
2020-01-05 17:29:27 +01:00
|
|
|
}
|