Create DateFragmentPicker, which shows a dialog with a calendar where the user can select a date. This picker is used in TransactiondFragment's filter dialog to filter transactions by date. The picker looks nice in both day and night mode.
This commit is contained in:
parent
5470ca1523
commit
f62286747c
3 changed files with 120 additions and 39 deletions
|
@ -6,11 +6,13 @@ import android.content.res.Resources
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Message
|
import android.os.Message
|
||||||
|
import android.view.View
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import android.widget.*
|
import android.widget.*
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import cy.agorise.bitsybitshareswallet.R
|
import cy.agorise.bitsybitshareswallet.R
|
||||||
|
import cy.agorise.bitsybitshareswallet.views.DatePickerFragment
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.ClassCastException
|
import kotlin.ClassCastException
|
||||||
|
@ -39,7 +41,7 @@ class FilterOptionsDialog : DialogFragment() {
|
||||||
|
|
||||||
private var mCallback: OnFilterOptionsSelectedListener? = null
|
private var mCallback: OnFilterOptionsSelectedListener? = null
|
||||||
|
|
||||||
private var mDatePickerHandler: DatePickerHandler? = null
|
private lateinit var mDatePickerHandler: DatePickerHandler
|
||||||
|
|
||||||
private var dateFormat: SimpleDateFormat = SimpleDateFormat("d/MMM/yyyy",
|
private var dateFormat: SimpleDateFormat = SimpleDateFormat("d/MMM/yyyy",
|
||||||
Resources.getSystem().configuration.locale)
|
Resources.getSystem().configuration.locale)
|
||||||
|
@ -175,21 +177,21 @@ class FilterOptionsDialog : DialogFragment() {
|
||||||
|
|
||||||
// Initialize Date range
|
// Initialize Date range
|
||||||
cbDateRange = view.findViewById(R.id.cbDateRange)
|
cbDateRange = view.findViewById(R.id.cbDateRange)
|
||||||
// llDateRange = view.findViewById(R.id.llDateRange)
|
llDateRange = view.findViewById(R.id.llDateRange)
|
||||||
// cbDateRange.setOnCheckedChangeListener { _, isChecked ->
|
cbDateRange.setOnCheckedChangeListener { _, isChecked ->
|
||||||
// llDateRange.visibility = if(isChecked) View.GONE else View.VISIBLE }
|
llDateRange.visibility = if(isChecked) View.GONE else View.VISIBLE }
|
||||||
cbDateRange.isChecked = arguments!!.getBoolean(KEY_FILTER_DATE_RANGE_ALL, true)
|
cbDateRange.isChecked = arguments!!.getBoolean(KEY_FILTER_DATE_RANGE_ALL, true)
|
||||||
//
|
|
||||||
// tvStartDate = view.findViewById(R.id.tvStartDate)
|
tvStartDate = view.findViewById(R.id.tvStartDate)
|
||||||
// tvEndDate = view.findViewById(R.id.tvEndDate)
|
tvEndDate = view.findViewById(R.id.tvEndDate)
|
||||||
//
|
|
||||||
// startDate = arguments!!.getLong(KEY_FILTER_START_DATE, 0)
|
startDate = arguments!!.getLong(KEY_FILTER_START_DATE, 0)
|
||||||
// tvStartDate.setOnClickListener(mDateClickListener)
|
tvStartDate.setOnClickListener(mDateClickListener)
|
||||||
//
|
|
||||||
// endDate = arguments!!.getLong(KEY_FILTER_END_DATE, 0)
|
endDate = arguments!!.getLong(KEY_FILTER_END_DATE, 0)
|
||||||
// tvEndDate.setOnClickListener(mDateClickListener)
|
tvEndDate.setOnClickListener(mDateClickListener)
|
||||||
//
|
|
||||||
// updateDateTextViews()
|
updateDateTextViews()
|
||||||
|
|
||||||
// Initialize Cryptocurrency
|
// Initialize Cryptocurrency
|
||||||
cbCryptocurrency = view.findViewById(R.id.cbCryptocurrency)
|
cbCryptocurrency = view.findViewById(R.id.cbCryptocurrency)
|
||||||
|
@ -257,29 +259,29 @@ class FilterOptionsDialog : DialogFragment() {
|
||||||
// sCryptocurrency.setSelection(index)
|
// sCryptocurrency.setSelection(index)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// private val mDateClickListener = View.OnClickListener { v ->
|
private val mDateClickListener = View.OnClickListener { v ->
|
||||||
// val calendar = Calendar.getInstance()
|
val calendar = Calendar.getInstance()
|
||||||
//
|
|
||||||
// // Variable used to select that date on the calendar
|
// Variable used to select that date on the calendar
|
||||||
// var currentTime = calendar.timeInMillis
|
var currentTime = calendar.timeInMillis
|
||||||
// var maxTime = currentTime
|
var maxTime = currentTime
|
||||||
//
|
|
||||||
// var which = -1
|
var which = -1
|
||||||
// if (v.id == R.id.tvStartDate) {
|
if (v.id == R.id.tvStartDate) {
|
||||||
// which = START_DATE_PICKER
|
which = START_DATE_PICKER
|
||||||
// currentTime = startDate
|
currentTime = startDate
|
||||||
// calendar.timeInMillis = endDate
|
calendar.timeInMillis = endDate
|
||||||
// calendar.add(Calendar.MONTH, -1)
|
calendar.add(Calendar.MONTH, -1)
|
||||||
// maxTime = calendar.timeInMillis
|
maxTime = calendar.timeInMillis
|
||||||
// } else if (v.id == R.id.tvEndDate) {
|
} else if (v.id == R.id.tvEndDate) {
|
||||||
// which = END_DATE_PICKER
|
which = END_DATE_PICKER
|
||||||
// currentTime = endDate
|
currentTime = endDate
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// val datePickerFragment = DatePickerFragment.newInstance(which, currentTime,
|
val datePickerFragment = DatePickerFragment.newInstance(which, currentTime,
|
||||||
// maxTime, mDatePickerHandler)
|
maxTime, mDatePickerHandler)
|
||||||
// datePickerFragment.show(activity!!.supportFragmentManager, "date-picker")
|
datePickerFragment.show(activity!!.supportFragmentManager, "date-picker")
|
||||||
// }
|
}
|
||||||
|
|
||||||
private fun validateFields() {
|
private fun validateFields() {
|
||||||
val filterTransactionsDirection = when {
|
val filterTransactionsDirection = when {
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
package cy.agorise.bitsybitshareswallet.views
|
||||||
|
|
||||||
|
import android.app.DatePickerDialog
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Message
|
||||||
|
import android.widget.DatePicker
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
|
import cy.agorise.bitsybitshareswallet.fragments.FilterOptionsDialog
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val TAG = "DatePickerFragment"
|
||||||
|
|
||||||
|
const val KEY_WHICH = "key_which"
|
||||||
|
const val KEY_CURRENT = "key_current"
|
||||||
|
const val KEY_MAX = "key_max"
|
||||||
|
|
||||||
|
fun newInstance(
|
||||||
|
which: Int, currentTime: Long, maxTime: Long,
|
||||||
|
handler: FilterOptionsDialog.DatePickerHandler
|
||||||
|
): DatePickerFragment {
|
||||||
|
val f = DatePickerFragment()
|
||||||
|
val bundle = Bundle()
|
||||||
|
bundle.putInt(KEY_WHICH, which)
|
||||||
|
bundle.putLong(KEY_CURRENT, currentTime)
|
||||||
|
bundle.putLong(KEY_MAX, maxTime)
|
||||||
|
f.arguments = bundle
|
||||||
|
f.setHandler(handler)
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var which: Int = 0
|
||||||
|
private var mHandler: FilterOptionsDialog.DatePickerHandler? = null
|
||||||
|
|
||||||
|
fun setHandler(handler: FilterOptionsDialog.DatePickerHandler) {
|
||||||
|
mHandler = handler
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
which = arguments!!.getInt(KEY_WHICH)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
val currentTime = arguments!!.getLong(KEY_CURRENT)
|
||||||
|
val maxTime = arguments!!.getLong(KEY_MAX)
|
||||||
|
|
||||||
|
// Use the current date as the default date in the picker
|
||||||
|
val calendar = Calendar.getInstance()
|
||||||
|
calendar.timeInMillis = currentTime
|
||||||
|
|
||||||
|
val year = calendar.get(Calendar.YEAR)
|
||||||
|
val month = calendar.get(Calendar.MONTH)
|
||||||
|
val day = calendar.get(Calendar.DAY_OF_MONTH)
|
||||||
|
|
||||||
|
// Create a new instance of DatePickerDialog and return it
|
||||||
|
val datePicker = DatePickerDialog(activity!!, this, year, month, day)
|
||||||
|
|
||||||
|
// Set maximum date allowed to today
|
||||||
|
datePicker.datePicker.maxDate = maxTime
|
||||||
|
|
||||||
|
return datePicker
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
|
||||||
|
val msg = Message.obtain()
|
||||||
|
msg.arg1 = which
|
||||||
|
val calendar = GregorianCalendar()
|
||||||
|
calendar.set(year, month, day)
|
||||||
|
val bundle = Bundle()
|
||||||
|
bundle.putLong(FilterOptionsDialog.KEY_TIMESTAMP, calendar.time.time)
|
||||||
|
msg.data = bundle
|
||||||
|
mHandler!!.sendMessage(msg)
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
<style name="Theme.Bitsy.AppBarOverlay" parent="ThemeOverlay.MaterialComponents.Dark.ActionBar"/>
|
<style name="Theme.Bitsy.AppBarOverlay" parent="ThemeOverlay.MaterialComponents.Dark.ActionBar"/>
|
||||||
|
|
||||||
<!-- Base application dark theme. -->
|
<!-- Base application dark theme. -->
|
||||||
<style name="Theme.Bitsy.Dark" parent="Theme.MaterialComponents">
|
<style name="Theme.Bitsy.Dark" parent="Theme.MaterialComponents.Bridge">
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
|
Loading…
Reference in a new issue