0

This my Activity

package com.example.calender


import android.annotation.SuppressLint
import java.util.*


import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable

import android.widget.Button

import androidx.core.util.Pair
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.DateValidatorPointBackward
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.RangeDateSelector


@SuppressLint("RestrictedApi")
class MainActivity() : AppCompatActivity() {

    private lateinit var datePicker: MaterialDatePicker<Pair<Long, Long>>


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val dateRangeButton = findViewById<Button>(R.id.dateRangeButton)
        dateRangeButton.setOnClickListener {
            showCustomDatePicker()
        }
    }

    @SuppressLint("RestrictedApi")
    private fun showCustomDatePicker() {
        val today = MaterialDatePicker.todayInUtcMilliseconds()
        val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
        calendar.timeInMillis = today
        // Set the start date as January 1st of the current year
        calendar.set(Calendar.MONTH, Calendar.JANUARY)
        calendar.set(Calendar.DAY_OF_MONTH, 1)
        val startOfYear = calendar.timeInMillis
        // Set the end date as the last day of the current month
        calendar.timeInMillis = today
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH))
        val endOfMonth = calendar.timeInMillis
        val constraintsBuilder = CalendarConstraints.Builder()
            .setStart(startOfYear)
            .setEnd(endOfMonth)
            .setOpenAt(endOfMonth)
            .setValidator(DateValidatorPointBackward.now())
        datePicker = MaterialDatePicker()
        val selector = CustomOnSelectionChangedListener(supportFragmentManager, datePicker)
        datePicker = MaterialDatePicker.Builder.customDatePicker(selector)
            .setCalendarConstraints(constraintsBuilder.build())
            .build()

        datePicker.show(supportFragmentManager, "DATE_RANGE_PICKER")
        // datePicker.dismiss()
    }


}

This my CustomActionListnerClass

package com.example.calender

import android.annotation.SuppressLint
import android.os.Handler
import android.os.Parcel
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.RangeDateSelector
import java.util.*
import androidx.core.util.Pair
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import com.google.android.material.datepicker.DateValidatorPointBackward

@SuppressLint("RestrictedApi")
class CustomOnSelectionChangedListener(
    private val fragmentManager: FragmentManager,
    private var datePicker: MaterialDatePicker<Pair<Long, Long>>?
) : RangeDateSelector() {

    private var first = true
    private var firstDate: Long? = null

    override fun select(selection: Long) {
        if (first || selection < firstDate!!) {
            super.select(selection)
            super.select(selection)
            firstDate = selection
            onSelectionOfFirstDate(firstDate)
            first = false
        } else {
            super.select(firstDate!!)
            super.select(selection)
            if (selection != firstDate) {
                first = true
            }
        }
    }

    @SuppressLint("SuspiciousIndentation")
    private fun onSelectionOfFirstDate(firstDate: Long?) {
        val calendar1 = Calendar.getInstance()
        calendar1.timeInMillis = firstDate!!

        // Add six days to the first date selection
        calendar1.add(Calendar.DAY_OF_MONTH, 6)

        val maxDate = calendar1.timeInMillis
        val today = MaterialDatePicker.todayInUtcMilliseconds()
        val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
        calendar.timeInMillis = today
        // Set the start date as January 1st of the current year
        calendar.set(Calendar.MONTH, Calendar.JANUARY)
        calendar.set(Calendar.DAY_OF_MONTH, 1)
        val startOfYear = calendar.timeInMillis
        // Set the end date as the last day of the current month
        calendar.timeInMillis = today
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH))
        val endOfMonth = calendar.timeInMillis
        val constraintsBuilder = CalendarConstraints.Builder()
            .setStart(startOfYear)
            .setEnd(endOfMonth)
            .setOpenAt(endOfMonth)
            .setValidator(DateValidatorPointBackward.before(maxDate))
            .build()
        val newDatePicker =
            MaterialDatePicker.Builder.customDatePicker(this@CustomOnSelectionChangedListener)
                .setCalendarConstraints(constraintsBuilder).build()
        //datePicker = newDatePicker
        Handler().post {
            if (datePicker!!.isVisible) {
                datePicker!!.dismiss()
            }
            datePicker = newDatePicker
        }
        datePicker = newDatePicker

        datePicker!!.show(fragmentManager, "Select Range")

    }

}

This is my XML Code:-

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/dateRangeTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Selected Date Range: " />


    <Button
        android:id="@+id/dateRangeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Select Date Range" />


</LinearLayout>

while i am select first range date from picker the dates after the 7 days of selection get disable and and i can select range with in that seven days after the save button click the first range picker is getting open how to resolve this issue

0 Answers0