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.
iceraven-browser/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/PagerIndicator.kt

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)