From 49af5e7385adb61664f98a899043684e040bf996 Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Tue, 20 Apr 2021 09:23:46 -0700 Subject: [PATCH] Create and show DatePickerDialogFragment in UI thread Summary: Fix 'An Unexpected error occurred' in Messenger Kids caused by DatePickerDialog. Changelog: [Android][Fixed] - Create and show DatePickerDialogFragment in UI thread Differential Revision: D27882121 fbshipit-source-id: 2490a8178e5986222105bfbc16e7c0de471baa02 --- .../datepicker/DatePickerDialogModule.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java index 429fca86644..e6971464889 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java @@ -101,7 +101,7 @@ public class DatePickerDialogModule extends NativeDatePickerAndroidSpec { * If the action is dismiss, year, month and date are undefined. */ @Override - public void open(@Nullable final ReadableMap options, Promise promise) { + public void open(@Nullable final ReadableMap options, final Promise promise) { Activity raw_activity = getCurrentActivity(); if (raw_activity == null || !(raw_activity instanceof FragmentActivity)) { promise.reject( @@ -112,20 +112,26 @@ public class DatePickerDialogModule extends NativeDatePickerAndroidSpec { FragmentActivity activity = (FragmentActivity) raw_activity; - FragmentManager fragmentManager = activity.getSupportFragmentManager(); + final FragmentManager fragmentManager = activity.getSupportFragmentManager(); DialogFragment oldFragment = (DialogFragment) fragmentManager.findFragmentByTag(FRAGMENT_TAG); if (oldFragment != null) { oldFragment.dismiss(); } - DatePickerDialogFragment fragment = new DatePickerDialogFragment(); - if (options != null) { - final Bundle args = createFragmentArguments(options); - fragment.setArguments(args); - } - final DatePickerDialogListener listener = new DatePickerDialogListener(promise); - fragment.setOnDismissListener(listener); - fragment.setOnDateSetListener(listener); - fragment.show(fragmentManager, FRAGMENT_TAG); + activity.runOnUiThread( + new Runnable() { + @Override + public void run() { + DatePickerDialogFragment fragment = new DatePickerDialogFragment(); + if (options != null) { + final Bundle args = createFragmentArguments(options); + fragment.setArguments(args); + } + final DatePickerDialogListener listener = new DatePickerDialogListener(promise); + fragment.setOnDismissListener(listener); + fragment.setOnDateSetListener(listener); + fragment.show(fragmentManager, FRAGMENT_TAG); + } + }); } private Bundle createFragmentArguments(ReadableMap options) {