android-times-square
android-times-square copied to clipboard
This library crashes the app when running in pseudolocale
When I turned on pseudolocale for my app and tried to open the calendar picker view I got this crash:
2021-01-07 20:18:55.204 22755-22755/com.tripactions.internal E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tripactions.internal, PID: 22755
android.view.InflateException: Binary XML file line #89 in com.tripactions.internal:layout/fragment_calendar_date_selector: Binary XML file line #89 in com.tripactions.internal:layout/fragment_calendar_date_selector: Error inflating class com.squareup.timessquare.CalendarPickerView
Caused by: android.view.InflateException: Binary XML file line #89 in com.tripactions.internal:layout/fragment_calendar_date_selector: Error inflating class com.squareup.timessquare.CalendarPickerView
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:854)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
at com.tripactions.alpha.calendar.fragments.CalendarDateSelectorFragment.onCreateView(CalendarDateSelectorFragment.kt:138)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2699)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1199)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2181)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2004)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1959)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1861)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.lang.IllegalArgumentException: Illegal pattern character 'o'
at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:932)
at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:718)
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:689)
at com.squareup.timessquare.CalendarPickerView.<init>(CalendarPickerView.java:139)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:854)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
at com.tripactions.alpha.calendar.fragments.CalendarDateSelectorFragment.onCreateView(CalendarDateSelectorFragment.kt:138)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2699)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1199)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2181)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2004)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1959)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1861)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Solution is to set the date strings to not be translatable:
<string name="month_name_format" translatable="false">MMMM yyyy</string>
<string name="month_only_name_format" translatable="false">MMMM</string>
<string name="year_only_format" translatable="false">yyyy</string>
yeah....except we do want those to be translatable, for instance in Korean the month_name_format is:
https://github.com/square/android-times-square/blob/master/library/src/main/res/values-ko/strings.xml
@edenman so "translatable=false" would only affect pseudolocale setting but if the locale on the device is Korean then Android will still pick up the string that you did override in values-ko. I already have similar examples in my project and works perfectly fine but couldn't override the ones from this library.