You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.4 KiB
Kotlin
83 lines
2.4 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.home.sessioncontrol.viewholders.topsites
|
|
|
|
import android.content.Context
|
|
import android.util.AttributeSet
|
|
import android.util.TypedValue
|
|
import android.view.View
|
|
import android.widget.LinearLayout
|
|
import androidx.core.view.MarginLayoutParamsCompat
|
|
import org.mozilla.fenix.R
|
|
|
|
/**
|
|
* A pager indicator widget to display the number of pages and the current selected page.
|
|
*/
|
|
class PagerIndicator : LinearLayout {
|
|
|
|
constructor(context: Context) : super(context)
|
|
|
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
|
|
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
|
|
|
private var selectedIndex = 0
|
|
|
|
/**
|
|
* Set the number of pager dots to display.
|
|
*/
|
|
fun setSize(size: Int) {
|
|
if (childCount == size) {
|
|
return
|
|
}
|
|
if (selectedIndex >= size) {
|
|
selectedIndex = size - 1
|
|
}
|
|
|
|
removeAllViews()
|
|
for (i in 0 until size) {
|
|
val isLast = i == size - 1
|
|
addView(
|
|
View(context).apply {
|
|
setBackgroundResource(R.drawable.pager_dot)
|
|
isSelected = i == selectedIndex
|
|
},
|
|
LayoutParams(dpToPx(DOT_SIZE_IN_DP), dpToPx(DOT_SIZE_IN_DP)).apply {
|
|
if (!isLast) {
|
|
MarginLayoutParamsCompat.setMarginEnd(this, dpToPx(DOT_MARGIN))
|
|
}
|
|
}
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the current selected pager dot.
|
|
*/
|
|
fun setSelection(index: Int) {
|
|
if (selectedIndex == index) {
|
|
return
|
|
}
|
|
|
|
getChildAt(selectedIndex)?.run {
|
|
isSelected = false
|
|
}
|
|
getChildAt(index)?.run {
|
|
isSelected = true
|
|
}
|
|
selectedIndex = index
|
|
}
|
|
|
|
companion object {
|
|
private const val DOT_SIZE_IN_DP = 6f
|
|
private const val DOT_MARGIN = 4f
|
|
}
|
|
}
|
|
|
|
fun Context.dpToPx(value: Float): Int =
|
|
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, resources.displayMetrics).toInt()
|
|
|
|
fun View.dpToPx(value: Float): Int = context.dpToPx(value)
|