From bdc78d847da003d5460eeec03cf7491eeb973988 Mon Sep 17 00:00:00 2001 From: Manoj Date: Mon, 13 Mar 2023 11:40:03 +0530 Subject: [PATCH] ViewPagerActivity --- app/build.gradle | 1 - .../production/niveshfd/fd/util/Common.kt | 40 ++- .../fd/util/attacher/DotsIndicatorAttacher.kt | 33 +++ .../fd/util/attacher/ViewPagerAttacher.kt | 66 +++++ .../fd/util/dotIndicator/BaseDotsIndicator.kt | 227 ++++++++++++++++++ .../util/dotIndicator/DotsGradientDrawable.kt | 13 + .../fd/util/dotIndicator/DotsIndicator.kt | 205 ++++++++++++++++ .../fd/util/dotIndicator/Extensions.kt | 46 ++++ .../OnPageChangeListenerHelper.kt | 49 ++++ .../ui/activities1/RegisterActivity.kt | 32 ++- .../ui/activities1/ViewPagerActivity.kt | 2 + app/src/main/res/anim/slide_down.xml | 7 + app/src/main/res/anim/slide_up.xml | 4 + app/src/main/res/drawable/dot_background.xml | 6 + .../main/res/drawable/round_corner_top.xml | 9 + app/src/main/res/drawable/svg_close.xml | 25 +- app/src/main/res/drawable/svg_cross.xml | 20 ++ app/src/main/res/layout/activity_register.xml | 3 - .../main/res/layout/activity_viewpager.xml | 39 ++- app/src/main/res/layout/dot_layout.xml | 15 ++ .../res/layout/web_view_bottom_dialog.xml | 28 +++ app/src/main/res/values/style.xml | 52 ++++ 22 files changed, 901 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/DotsIndicatorAttacher.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/ViewPagerAttacher.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/BaseDotsIndicator.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsGradientDrawable.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsIndicator.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/Extensions.kt create mode 100644 app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/OnPageChangeListenerHelper.kt create mode 100644 app/src/main/res/anim/slide_down.xml create mode 100644 app/src/main/res/anim/slide_up.xml create mode 100644 app/src/main/res/drawable/dot_background.xml create mode 100644 app/src/main/res/drawable/round_corner_top.xml create mode 100644 app/src/main/res/drawable/svg_cross.xml create mode 100644 app/src/main/res/layout/dot_layout.xml create mode 100644 app/src/main/res/layout/web_view_bottom_dialog.xml diff --git a/app/build.gradle b/app/build.gradle index 5821c44..95d83d1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,5 +72,4 @@ dependencies { // Navigation Components implementation "androidx.navigation:navigation-fragment-ktx:2.5.3" implementation "androidx.navigation:navigation-ui-ktx:2.5.3" - } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/Common.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/Common.kt index 609b3d1..bd7763a 100644 --- a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/Common.kt +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/Common.kt @@ -2,13 +2,16 @@ package com.nivesh.production.niveshfd.fd.util import android.Manifest import android.annotation.SuppressLint +import android.app.ActionBar import android.app.Activity import android.app.AlertDialog +import android.app.Dialog import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.graphics.Color import android.graphics.drawable.GradientDrawable +import android.hardware.display.DisplayManager import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.Uri @@ -17,9 +20,18 @@ import android.provider.Settings import android.telephony.TelephonyManager import android.text.TextUtils import android.text.format.DateFormat +import android.util.DisplayMetrics import android.util.Log import android.util.Patterns +import android.view.Display +import android.view.Gravity +import android.view.Window +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.ImageView import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat.getSystemService +import androidx.core.hardware.display.DisplayManagerCompat import com.google.android.material.textfield.MaterialAutoCompleteTextView import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout @@ -136,6 +148,33 @@ class Common { builder.show() } + fun showWebViewDialogBottom(context: Context, url: String,height: Int){ + val dialog = Dialog(context) + dialog.window?.setBackgroundDrawableResource(android.R.color.transparent) + dialog.setContentView(R.layout.web_view_bottom_dialog) + + val webView: WebView = dialog.findViewById(R.id.webView) + val imageCross: ImageView = dialog.findViewById(R.id.imageCross) + + imageCross.setOnClickListener { + dialog.dismiss() + } + + webView.isScrollbarFadingEnabled = false + webView.isHorizontalScrollBarEnabled = false + webView.settings.javaScriptEnabled = true + webView.settings.userAgentString = "AndroidWebView" + webView.clearCache(true) + webView.loadUrl(url) + + dialog.show() + + val window: Window = dialog.window!! + window.setGravity(Gravity.BOTTOM) + window.setLayout(ActionBar.LayoutParams.MATCH_PARENT,(height-400)) + window.setWindowAnimations(R.style.DialogBottomAnimation) + } + fun showDialogWithTwoButtons(activity: Activity?, message: CharSequence?, title: String) { val builder = AlertDialog.Builder(activity) builder.setTitle(title) @@ -371,6 +410,5 @@ class Common { } return deviceInfo } - } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/DotsIndicatorAttacher.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/DotsIndicatorAttacher.kt new file mode 100644 index 0000000..af88811 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/DotsIndicatorAttacher.kt @@ -0,0 +1,33 @@ +package com.nivesh.production.niveshfd.fd.util.attacher + +import com.nivesh.production.niveshfd.fd.util.dotIndicator.BaseDotsIndicator + +internal abstract class DotsIndicatorAttacher { + fun setup(baseDotsIndicator: BaseDotsIndicator, attachable: Attachable) { + val adapter = getAdapterFromAttachable(attachable) + ?: throw IllegalStateException( + "Please set an adapter to the view pager (1 or 2) or the recycler before initializing the dots indicator" + ) + + registerAdapterDataChangedObserver(attachable, adapter) { + baseDotsIndicator.post { baseDotsIndicator.refreshDots() } + } + + baseDotsIndicator.pager = buildPager(attachable, adapter) + baseDotsIndicator.refreshDots() + } + + abstract fun getAdapterFromAttachable(attachable: Attachable): Adapter? + + abstract fun registerAdapterDataChangedObserver( + attachable: Attachable, + adapter: Adapter, + onChanged: () -> Unit + ) + + abstract fun buildPager( + attachable: Attachable, + adapter: Adapter, + ): BaseDotsIndicator.Pager +} + diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/ViewPagerAttacher.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/ViewPagerAttacher.kt new file mode 100644 index 0000000..82aa285 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/attacher/ViewPagerAttacher.kt @@ -0,0 +1,66 @@ +package com.nivesh.production.niveshfd.fd.util.attacher + +import android.database.DataSetObserver +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.nivesh.production.niveshfd.fd.util.dotIndicator.BaseDotsIndicator +import com.nivesh.production.niveshfd.fd.util.dotIndicator.OnPageChangeListenerHelper +import com.nivesh.production.niveshfd.fd.util.dotIndicator.isEmpty + +internal class ViewPagerAttacher : + DotsIndicatorAttacher() { + override fun getAdapterFromAttachable(attachable: ViewPager): PagerAdapter? = attachable.adapter + + override fun registerAdapterDataChangedObserver( + attachable: ViewPager, + adapter: PagerAdapter, + onChanged: () -> Unit + ) { + adapter.registerDataSetObserver(object : DataSetObserver() { + override fun onChanged() { + super.onChanged() + onChanged() + } + }) + } + + override fun buildPager(attachable: ViewPager, adapter: PagerAdapter): BaseDotsIndicator.Pager { + return object : BaseDotsIndicator.Pager { + var onPageChangeListener: ViewPager.OnPageChangeListener? = null + + override val isNotEmpty: Boolean get() = attachable.isEmpty + override val currentItem: Int get() = attachable.currentItem + override val isEmpty: Boolean get() = attachable.isEmpty + override val count: Int get() = attachable.adapter?.count ?: 0 + + override fun setCurrentItem(item: Int, smoothScroll: Boolean) { + attachable.setCurrentItem(item, smoothScroll) + } + + override fun removeOnPageChangeListener() { + onPageChangeListener?.let { attachable.removeOnPageChangeListener(it) } + } + + override fun addOnPageChangeListener( + onPageChangeListenerHelper: + OnPageChangeListenerHelper + ) { + onPageChangeListener = object : ViewPager.OnPageChangeListener { + override fun onPageScrolled( + position: Int, positionOffset: Float, + positionOffsetPixels: Int + ) { + onPageChangeListenerHelper.onPageScrolled(position, positionOffset) + } + + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageSelected(position: Int) { + } + } + attachable.addOnPageChangeListener(onPageChangeListener!!) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/BaseDotsIndicator.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/BaseDotsIndicator.kt new file mode 100644 index 0000000..32aaeaf --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/BaseDotsIndicator.kt @@ -0,0 +1,227 @@ +package com.nivesh.production.niveshfd.fd.util.dotIndicator + +import android.content.Context +import android.graphics.Color +import android.os.Build +import android.os.Parcelable +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import androidx.annotation.StyleableRes +import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2 +import com.nivesh.production.niveshfd.R +import com.nivesh.production.niveshfd.fd.util.attacher.ViewPagerAttacher + +abstract class BaseDotsIndicator @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + + companion object { + const val DEFAULT_POINT_COLOR = Color.CYAN + } + + enum class Type( + val defaultSize: Float, + val defaultSpacing: Float, + @StyleableRes val styleableId: IntArray, + @StyleableRes val dotsColorId: Int, + @StyleableRes val dotsSizeId: Int, + @StyleableRes val dotsSpacingId: Int, + @StyleableRes val dotsCornerRadiusId: Int, + @StyleableRes val dotsClickableId: Int + ) { + DEFAULT( + 16f, + 8f, + R.styleable.SpringDotsIndicator, + R.styleable.SpringDotsIndicator_dotsColor, + R.styleable.SpringDotsIndicator_dotsSize, + R.styleable.SpringDotsIndicator_dotsSpacing, + R.styleable.SpringDotsIndicator_dotsCornerRadius, + R.styleable.SpringDotsIndicator_dotsClickable + ), + SPRING( + 16f, + 4f, + R.styleable.DotsIndicator, + R.styleable.DotsIndicator_dotsColor, + R.styleable.DotsIndicator_dotsSize, + R.styleable.DotsIndicator_dotsSpacing, + R.styleable.DotsIndicator_dotsCornerRadius, + R.styleable.SpringDotsIndicator_dotsClickable + ), + WORM( + 16f, + 4f, + R.styleable.WormDotsIndicator, + R.styleable.WormDotsIndicator_dotsColor, + R.styleable.WormDotsIndicator_dotsSize, + R.styleable.WormDotsIndicator_dotsSpacing, + R.styleable.WormDotsIndicator_dotsCornerRadius, + R.styleable.SpringDotsIndicator_dotsClickable + ) + } + + @JvmField + protected val dots = ArrayList() + + var dotsClickable: Boolean = true + var dotsColor: Int = DEFAULT_POINT_COLOR + set(value) { + field = value + refreshDotsColors() + } + + protected var dotsSize = dpToPxF(type.defaultSize) + protected var dotsCornerRadius = dotsSize / 2f + protected var dotsSpacing = dpToPxF(type.defaultSpacing) + + init { + if (attrs != null) { + val a = context.obtainStyledAttributes(attrs, type.styleableId) + + dotsColor = a.getColor(type.dotsColorId, DEFAULT_POINT_COLOR) + dotsSize = a.getDimension(type.dotsSizeId, dotsSize) + dotsCornerRadius = a.getDimension(type.dotsCornerRadiusId, dotsCornerRadius) + dotsSpacing = a.getDimension(type.dotsSpacingId, dotsSpacing) + dotsClickable = a.getBoolean(type.dotsClickableId, true) + + a.recycle() + } + } + + var pager: Pager? = null + + interface Pager { + val isNotEmpty: Boolean + val currentItem: Int + val isEmpty: Boolean + val count: Int + fun setCurrentItem(item: Int, smoothScroll: Boolean) + fun removeOnPageChangeListener() + fun addOnPageChangeListener(onPageChangeListenerHelper: OnPageChangeListenerHelper) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + post { refreshDots() } + } + + private fun refreshDotsCount() { + if (dots.size < pager!!.count) { + addDots(pager!!.count - dots.size) + } else if (dots.size > pager!!.count) { + removeDots(dots.size - pager!!.count) + } + } + + protected fun refreshDotsColors() { + for (i in dots.indices) { + refreshDotColor(i) + } + } + + protected fun dpToPx(dp: Int): Int { + return (context.resources.displayMetrics.density * dp).toInt() + } + + protected fun dpToPxF(dp: Float): Float { + return context.resources.displayMetrics.density * dp + } + + protected fun addDots(count: Int) { + for (i in 0 until count) { + addDot(i) + } + } + + private fun removeDots(count: Int) { + for (i in 0 until count) { + removeDot() + } + } + + fun refreshDots() { + if (pager == null) { + return + } + post { + // Check if we need to refresh the dots count + refreshDotsCount() + refreshDotsColors() + refreshDotsSize() + refreshOnPageChangedListener() + } + } + + private fun refreshOnPageChangedListener() { + if (pager!!.isNotEmpty) { + pager!!.removeOnPageChangeListener() + val onPageChangeListenerHelper = buildOnPageChangedListener() + pager!!.addOnPageChangeListener(onPageChangeListenerHelper) + onPageChangeListenerHelper.onPageScrolled(pager!!.currentItem, 0f) + } + } + + private fun refreshDotsSize() { + dots.forEach { it.setWidth(dotsSize.toInt()) } + } + + // ABSTRACT METHODS AND FIELDS + + abstract fun refreshDotColor(index: Int) + abstract fun addDot(index: Int) + abstract fun removeDot() + abstract fun buildOnPageChangedListener(): OnPageChangeListenerHelper + abstract val type: Type + + // PUBLIC METHODS + + @Deprecated( + "Use setDotsColors(color) instead", ReplaceWith("setDotsColors(color)") + ) + fun setPointsColor(color: Int) { + dotsColor = color + refreshDotsColors() + } + + @Deprecated( + "Use attachTo(viewPager) instead", ReplaceWith("attachTo(viewPager)") + ) + fun setViewPager(viewPager: ViewPager) { + ViewPagerAttacher().setup(this, viewPager) + } + + @Deprecated( + "Use attachTo(viewPager) instead", ReplaceWith("attachTo(viewPager)") + ) +// fun setViewPager2(viewPager2: ViewPager2) { +// ViewPager2Attacher().setup(this, viewPager2) +// } + + fun attachTo(viewPager: ViewPager) { + ViewPagerAttacher().setup(this, viewPager) + } + +// fun attachTo(viewPager2: ViewPager2) { +// ViewPager2Attacher().setup(this, viewPager2) +// } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && layoutDirection == View.LAYOUT_DIRECTION_RTL) { + layoutDirection = View.LAYOUT_DIRECTION_LTR + rotation = 180f + requestLayout() + } + } + + override fun onRestoreInstanceState(state: Parcelable?) { + super.onRestoreInstanceState(state) + post { refreshDots() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsGradientDrawable.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsGradientDrawable.kt new file mode 100644 index 0000000..a90914f --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsGradientDrawable.kt @@ -0,0 +1,13 @@ +package com.nivesh.production.niveshfd.fd.util.dotIndicator + +import android.graphics.drawable.GradientDrawable + +class DotsGradientDrawable : GradientDrawable() { + var currentColor: Int = 0 + private set + + override fun setColor(argb: Int) { + super.setColor(argb) + currentColor = argb + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsIndicator.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsIndicator.kt new file mode 100644 index 0000000..c14e703 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/DotsIndicator.kt @@ -0,0 +1,205 @@ +package com.nivesh.production.niveshfd.fd.util.dotIndicator + +import android.animation.ArgbEvaluator +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import com.nivesh.production.niveshfd.R + +class DotsIndicator @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseDotsIndicator(context, attrs, defStyleAttr) { + + companion object { + const val DEFAULT_WIDTH_FACTOR = 2.5f + } + + private lateinit var linearLayout: LinearLayout + private var dotsWidthFactor: Float = 0f + private var progressMode: Boolean = false + private var dotsElevation: Float = 0f + + var selectedDotColor: Int = 0 + set(value) { + field = value + refreshDotsColors() + } + + private val argbEvaluator = ArgbEvaluator() + + init { + init(attrs) + } + + private fun init(attrs: AttributeSet?) { + linearLayout = LinearLayout(context) + linearLayout.orientation = LinearLayout.HORIZONTAL + addView(linearLayout, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + + dotsWidthFactor = DEFAULT_WIDTH_FACTOR + + if (attrs != null) { + val a = context.obtainStyledAttributes(attrs, R.styleable.DotsIndicator) + + selectedDotColor = + a.getColor(R.styleable.DotsIndicator_selectedDotColor, DEFAULT_POINT_COLOR) + + dotsWidthFactor = a.getFloat(R.styleable.DotsIndicator_dotsWidthFactor, 2.5f) + if (dotsWidthFactor < 1) { + Log.w( + "DotsIndicator", + "The dotsWidthFactor can't be set under 1.0f, please set an higher value" + ) + dotsWidthFactor = 1f + } + + progressMode = a.getBoolean(R.styleable.DotsIndicator_progressMode, false) + + dotsElevation = a.getDimension(R.styleable.DotsIndicator_dotsElevation, 0f) + + a.recycle() + } + + if (isInEditMode) { + addDots(5) + refreshDots() + } + + } + + override fun addDot(index: Int) { + val dot = LayoutInflater.from(context).inflate(R.layout.dot_layout, this, false) + val imageView = dot.findViewById(R.id.dot) + val params = imageView.layoutParams as LayoutParams + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + dot.layoutDirection = View.LAYOUT_DIRECTION_LTR + } + + params.height = dotsSize.toInt() + params.width = params.height + params.setMargins(dotsSpacing.toInt(), 0, dotsSpacing.toInt(), 0) + val background = DotsGradientDrawable() + background.cornerRadius = dotsCornerRadius + if (isInEditMode) { + background.setColor(if (0 == index) selectedDotColor else dotsColor) + } else { + background.setColor(if (pager!!.currentItem == index) selectedDotColor else dotsColor) + } + imageView.setBackgroundCompat(background) + + dot.setOnClickListener { + if (dotsClickable && index < pager?.count ?: 0) { + pager!!.setCurrentItem(index, true) + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + dot.setPaddingHorizontal((dotsElevation * 0.8f).toInt()) + dot.setPaddingVertical((dotsElevation * 2).toInt()) + imageView.elevation = dotsElevation + } + + dots.add(imageView) + linearLayout.addView(dot) + } + + override fun removeDot() { + linearLayout.removeViewAt(linearLayout.childCount - 1) + dots.removeAt(dots.size - 1) + } + + override fun buildOnPageChangedListener(): OnPageChangeListenerHelper { + return object : OnPageChangeListenerHelper() { + override fun onPageScrolled( + selectedPosition: Int, + nextPosition: Int, + positionOffset: Float + ) { + val selectedDot = dots[selectedPosition] + // Selected dot + val selectedDotWidth = + (dotsSize + dotsSize * (dotsWidthFactor - 1) * (1 - positionOffset)).toInt() + selectedDot.setWidth(selectedDotWidth) + + if (dots.isInBounds(nextPosition)) { + val nextDot = dots[nextPosition] + + val nextDotWidth = + (dotsSize + dotsSize * (dotsWidthFactor - 1) * positionOffset).toInt() + nextDot.setWidth(nextDotWidth) + + val selectedDotBackground = selectedDot.background as DotsGradientDrawable + val nextDotBackground = nextDot.background as DotsGradientDrawable + + if (selectedDotColor != dotsColor) { + val selectedColor = argbEvaluator.evaluate( + positionOffset, selectedDotColor, + dotsColor + ) as Int + val nextColor = argbEvaluator.evaluate( + positionOffset, dotsColor, + selectedDotColor + ) as Int + + nextDotBackground.setColor(nextColor) + + if (progressMode && selectedPosition <= pager!!.currentItem) { + selectedDotBackground.setColor(selectedDotColor) + } else { + selectedDotBackground.setColor(selectedColor) + } + } + } + + invalidate() + } + + override fun resetPosition(position: Int) { + dots[position].setWidth(dotsSize.toInt()) + refreshDotColor(position) + } + + override val pageCount: Int + get() = dots.size + } + } + + override fun refreshDotColor(index: Int) { + val elevationItem = dots[index] + val background = elevationItem.background as? DotsGradientDrawable? + + background?.let { + if (index == pager!!.currentItem || progressMode && index < pager!!.currentItem) { + background.setColor(selectedDotColor) + } else { + background.setColor(dotsColor) + } + } + + elevationItem.setBackgroundCompat(background) + elevationItem.invalidate() + } + + override val type get() = Type.DEFAULT + + //********************************************************* + // Users Methods + //********************************************************* + + @Deprecated("Use setSelectedDotColor() instead", ReplaceWith("setSelectedDotColor()")) + fun setSelectedPointColor(color: Int) { + selectedDotColor = color + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/Extensions.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/Extensions.kt new file mode 100644 index 0000000..9c0a23b --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/Extensions.kt @@ -0,0 +1,46 @@ +package com.nivesh.production.niveshfd.fd.util.dotIndicator + +import android.content.Context +import android.graphics.drawable.Drawable +import android.os.Build +import android.util.TypedValue +import android.view.View +import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2 +import com.nivesh.production.niveshfd.R + +internal fun View.setPaddingHorizontal(padding: Int) { + setPadding(padding, paddingTop, padding, paddingBottom) +} + +internal fun View.setPaddingVertical(padding: Int) { + setPadding(paddingLeft, padding, paddingRight, padding) +} + +internal fun View.setWidth(width: Int) { + layoutParams.apply { + this.width = width + requestLayout() + } +} + +internal fun ArrayList.isInBounds(index: Int) = index in 0 until size + +internal fun Context.getThemePrimaryColor(): Int { + val value = TypedValue() + this.theme.resolveAttribute(androidx.transition.R.attr.colorPrimary, value, true) + return value.data +} + +internal val ViewPager.isNotEmpty: Boolean get() = (adapter?.count ?: 0) > 0 +internal val ViewPager2.isNotEmpty: Boolean get() = (adapter?.itemCount ?: 0) > 0 +internal val ViewPager?.isEmpty: Boolean get() = this?.adapter?.count == 0 +internal val ViewPager2?.isEmpty: Boolean get() = this?.adapter?.itemCount == 0 + +fun View.setBackgroundCompat(background: Drawable?) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + this.background = background + } else { + setBackgroundDrawable(background) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/OnPageChangeListenerHelper.kt b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/OnPageChangeListenerHelper.kt new file mode 100644 index 0000000..8865f15 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/niveshfd/fd/util/dotIndicator/OnPageChangeListenerHelper.kt @@ -0,0 +1,49 @@ +package com.nivesh.production.niveshfd.fd.util.dotIndicator + +abstract class OnPageChangeListenerHelper { + private var lastLeftPosition: Int = -1 + private var lastRightPosition: Int = -1 + + internal abstract val pageCount: Int + + fun onPageScrolled(position: Int, positionOffset: Float) { + var offset = (position + positionOffset) + val lastPageIndex = (pageCount - 1).toFloat() + if (offset == lastPageIndex) { + offset = lastPageIndex - .0001f + } + val leftPosition = offset.toInt() + val rightPosition = leftPosition + 1 + + if (rightPosition > lastPageIndex || leftPosition < 0) { + return + } + + onPageScrolled(leftPosition, rightPosition, offset % 1) + + if (lastLeftPosition != -1) { + if (leftPosition > lastLeftPosition) { + (lastLeftPosition until leftPosition).forEach { + resetPosition(it) + } + } + + if (rightPosition < lastRightPosition) { + resetPosition(lastRightPosition) + ((rightPosition + 1)..lastRightPosition).forEach { + resetPosition(it) + } + } + } + + lastLeftPosition = leftPosition + lastRightPosition = rightPosition + } + + internal abstract fun onPageScrolled( + selectedPosition: Int, nextPosition: Int, + positionOffset: Float + ) + + internal abstract fun resetPosition(position: Int) +} diff --git a/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/RegisterActivity.kt b/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/RegisterActivity.kt index 73558a1..f529339 100644 --- a/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/RegisterActivity.kt +++ b/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/RegisterActivity.kt @@ -1,13 +1,20 @@ package com.nivesh.production.niveshfd.partnerOnBoarding.ui.activities1 import android.content.Intent +import android.os.Build import android.os.Bundle import android.text.Editable import android.text.TextWatcher +import android.util.DisplayMetrics +import android.util.Log +import android.view.Display +import androidx.core.hardware.display.DisplayManagerCompat +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.nivesh.production.niveshfd.databinding.ActivityLoginBinding import com.nivesh.production.niveshfd.databinding.ActivityRegisterBinding import com.nivesh.production.niveshfd.fd.ui.activity.BaseActivity import com.nivesh.production.niveshfd.fd.util.Common +import com.nivesh.production.niveshfd.fd.util.Common.Companion.showWebViewDialogBottom class RegisterActivity : BaseActivity() { lateinit var binding: ActivityRegisterBinding @@ -32,13 +39,36 @@ class RegisterActivity : BaseActivity() { startActivity(intent) } binding.btnDistributor.setOnClickListener{ - intent = Intent(this@RegisterActivity, RegisterActivity::class.java) + intent = Intent(this@RegisterActivity, ViewPagerActivity::class.java) startActivity(intent) } binding.btnReferrer.setOnClickListener{ intent = Intent(this@RegisterActivity, RegisterActivity::class.java) startActivity(intent) } + binding.imgInfo.setOnClickListener { + showWebViewDialogBottom(this@RegisterActivity,"https://smallbusiness.chron.com/create-dummy-webpage-51199.html",getScreenHeight()); + } + } + + private fun getScreenHeight(): Int { + var height = 0 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val defaultDisplay = + DisplayManagerCompat.getInstance(this).getDisplay(Display.DEFAULT_DISPLAY) + val displayContext = createDisplayContext(defaultDisplay!!) + height = displayContext.resources.displayMetrics.heightPixels + + } else { + + val displayMetrics = DisplayMetrics() + @Suppress("DEPRECATION") + windowManager.defaultDisplay.getMetrics(displayMetrics) + + val height = displayMetrics.heightPixels + val width = displayMetrics.widthPixels + } + return height } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/ViewPagerActivity.kt b/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/ViewPagerActivity.kt index 6cfe980..327df9a 100644 --- a/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/ViewPagerActivity.kt +++ b/app/src/main/java/com/nivesh/production/niveshfd/partnerOnBoarding/ui/activities1/ViewPagerActivity.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.nivesh.production.niveshfd.databinding.ActivityViewpagerBinding import com.nivesh.production.niveshfd.fd.ui.activity.BaseActivity +import com.nivesh.production.niveshfd.fd.util.dotIndicator.DotsIndicator import com.nivesh.production.niveshfd.partnerOnBoarding.adapters1.DisableAdapter1 import com.nivesh.production.niveshfd.partnerOnBoarding.adapters1.SectionsPagerAdapter1 import com.nivesh.production.niveshfd.partnerOnBoarding.ui.fragments1.StepOnePagerFragment @@ -44,6 +45,7 @@ class ViewPagerActivity : BaseActivity() { viewPager.adapter = sectionsPagerAdapter viewPager.setPagingEnabled(false) viewPager.offscreenPageLimit = 3 + viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled( position: Int, diff --git a/app/src/main/res/anim/slide_down.xml b/app/src/main/res/anim/slide_down.xml new file mode 100644 index 0000000..4be7711 --- /dev/null +++ b/app/src/main/res/anim/slide_down.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml new file mode 100644 index 0000000..e19132f --- /dev/null +++ b/app/src/main/res/anim/slide_up.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_background.xml b/app/src/main/res/drawable/dot_background.xml new file mode 100644 index 0000000..012bf8b --- /dev/null +++ b/app/src/main/res/drawable/dot_background.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_corner_top.xml b/app/src/main/res/drawable/round_corner_top.xml new file mode 100644 index 0000000..8d7cdeb --- /dev/null +++ b/app/src/main/res/drawable/round_corner_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_close.xml b/app/src/main/res/drawable/svg_close.xml index 844b6b6..5e8560a 100644 --- a/app/src/main/res/drawable/svg_close.xml +++ b/app/src/main/res/drawable/svg_close.xml @@ -1,5 +1,20 @@ - - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_cross.xml b/app/src/main/res/drawable/svg_cross.xml new file mode 100644 index 0000000..5e8560a --- /dev/null +++ b/app/src/main/res/drawable/svg_cross.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml index 14cd15f..9ae5680 100644 --- a/app/src/main/res/layout/activity_register.xml +++ b/app/src/main/res/layout/activity_register.xml @@ -5,7 +5,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_viewpager.xml b/app/src/main/res/layout/activity_viewpager.xml index d4e6fa9..d641012 100644 --- a/app/src/main/res/layout/activity_viewpager.xml +++ b/app/src/main/res/layout/activity_viewpager.xml @@ -5,18 +5,19 @@ android:layout_height="match_parent"> + android:background="@color/greyColor4" + app:layout_constraintTop_toTopOf="parent"> + android:orientation="horizontal" + android:visibility="gone"> - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dot_layout.xml b/app/src/main/res/layout/dot_layout.xml new file mode 100644 index 0000000..29e330c --- /dev/null +++ b/app/src/main/res/layout/dot_layout.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/web_view_bottom_dialog.xml b/app/src/main/res/layout/web_view_bottom_dialog.xml new file mode 100644 index 0000000..5a18688 --- /dev/null +++ b/app/src/main/res/layout/web_view_bottom_dialog.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml index 52c48e8..bef7373 100644 --- a/app/src/main/res/values/style.xml +++ b/app/src/main/res/values/style.xml @@ -99,4 +99,56 @@ @dimen/margin_10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file