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:
William Do 2019-05-03 01:29:56 +00:00
Родитель 645381bdba
Коммит efefffb1ae
4 изменённых файлов: 25 добавлений и 11 удалений

Просмотреть файл

@ -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