Merged PR 264378: CalendarView/ DateTimePickerDialog Crash Fix
A crash is occurring when CalendarView or DateTimePickerDialog instances are created. This is caused by the ThreeTenABP library not being initialized. This PR fixes the crash by initializing the library within CalendarView and DateTimePickerDialog. Couple of things: - The initialization method, `AndroidTreeTen.init`, checks if the library has been initialized and does not initialize it again - Added defaults to DateTimePickerDialog's newInstance params for `dateTime` and `duration` which is why their order changed - ~~The library must be initialized by a consumer in their project if they want to set the time on the controls otherwise the current time will be used~~ - The library needs to be initialized in the Demo; however if consuming as an AAR module, initialization is not required Related work items: #718332
This commit is contained in:
Родитель
645381bdba
Коммит
efefffb1ae
|
@ -16,7 +16,6 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen
|
||||
import kotlinx.android.synthetic.main.activity_demo_list.*
|
||||
import kotlinx.android.synthetic.main.demo_list.*
|
||||
import kotlinx.android.synthetic.main.demo_list_content.view.*
|
||||
|
@ -33,8 +32,6 @@ class DemoListActivity : AppCompatActivity() {
|
|||
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
AndroidThreeTen.init(this)
|
||||
|
||||
setContentView(R.layout.activity_demo_list)
|
||||
|
||||
setSupportActionBar(toolbar)
|
||||
|
|
|
@ -8,6 +8,7 @@ package com.microsoft.officeuifabricdemo.demos
|
|||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.widget.Button
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen
|
||||
import com.microsoft.officeuifabric.datetimepicker.DateRangeMode
|
||||
import com.microsoft.officeuifabric.datetimepicker.DateTimePickerDialog
|
||||
import com.microsoft.officeuifabric.datetimepicker.DateTimePickerDialog.Mode
|
||||
|
@ -68,6 +69,11 @@ class DateTimePickerDialogActivity : DemoActivity(), OnDateTimePickedListener {
|
|||
field = value
|
||||
}
|
||||
|
||||
init {
|
||||
// Initialization of ThreeTenABP maybe required in order to set ZonedDateTime for DateTimePickerDialog
|
||||
AndroidThreeTen.init(this)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
|
@ -91,10 +97,10 @@ class DateTimePickerDialogActivity : DemoActivity(), OnDateTimePickedListener {
|
|||
dialogTag = picker.tag
|
||||
val dialog = DateTimePickerDialog.newInstance(
|
||||
this,
|
||||
getDateTime(),
|
||||
getDuration(),
|
||||
picker.mode,
|
||||
picker.dateRangeMode
|
||||
picker.dateRangeMode,
|
||||
getDateTime(),
|
||||
getDuration()
|
||||
)
|
||||
dialog.show(supportFragmentManager, picker.tag)
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ import android.util.AttributeSet
|
|||
import android.util.Property
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen
|
||||
|
||||
import com.microsoft.officeuifabric.R
|
||||
import org.threeten.bp.*
|
||||
|
@ -101,6 +102,10 @@ class CalendarView : LinearLayout, OnDateSelectedListener {
|
|||
}
|
||||
}
|
||||
|
||||
init {
|
||||
AndroidThreeTen.init(context)
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr) {
|
||||
dividerHeight = Math.round(resources.getDimension(R.dimen.uifabric_divider_height))
|
||||
|
|
|
@ -18,6 +18,7 @@ import android.view.LayoutInflater
|
|||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.jakewharton.threetenabp.AndroidThreeTen
|
||||
|
||||
import com.microsoft.officeuifabric.R
|
||||
import com.microsoft.officeuifabric.calendar.OnDateSelectedListener
|
||||
|
@ -41,22 +42,27 @@ class DateTimePickerDialog : ResizableDialog(), Toolbar.OnMenuItemClickListener,
|
|||
@JvmStatic
|
||||
fun newInstance(
|
||||
context: Context,
|
||||
dateTime: ZonedDateTime,
|
||||
duration: Duration,
|
||||
mode: Mode,
|
||||
dateRangeMode: DateRangeMode
|
||||
dateRangeMode: DateRangeMode,
|
||||
dateTime: ZonedDateTime = getDefaultDateTime(context),
|
||||
duration: Duration = Duration.ZERO
|
||||
): DateTimePickerDialog {
|
||||
val args = Bundle()
|
||||
args.putSerializable(DateTimePickerExtras.DATE_RANGE_MODE, dateRangeMode)
|
||||
args.putSerializable(DateTimePickerExtras.DISPLAY_MODE, getDisplayMode(context, dateTime, duration, mode))
|
||||
args.putSerializable(DateTimePickerExtras.DATE_TIME, dateTime)
|
||||
args.putSerializable(DateTimePickerExtras.DURATION, duration)
|
||||
args.putSerializable(DateTimePickerExtras.DISPLAY_MODE, getDisplayMode(context, dateTime, duration, mode))
|
||||
args.putSerializable(DateTimePickerExtras.DATE_RANGE_MODE, dateRangeMode)
|
||||
|
||||
val dialog = DateTimePickerDialog()
|
||||
dialog.arguments = args
|
||||
return dialog
|
||||
}
|
||||
|
||||
private fun getDefaultDateTime(context: Context): ZonedDateTime {
|
||||
AndroidThreeTen.init(context)
|
||||
return ZonedDateTime.now()
|
||||
}
|
||||
|
||||
private fun getDisplayMode(context: Context, dateTime: ZonedDateTime, duration: Duration, mode: Mode): DisplayMode {
|
||||
if (context.isAccessibilityEnabled) {
|
||||
return mode.accessibleMode
|
||||
|
|
Загрузка…
Ссылка в новой задаче