android-times-square icon indicating copy to clipboard operation
android-times-square copied to clipboard

This library crashes the app when running in pseudolocale

Open KarimFikani opened this issue 4 years ago • 2 comments

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>

KarimFikani avatar Jan 08 '21 04:01 KarimFikani

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 avatar Jan 08 '21 04:01 edenman

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

KarimFikani avatar Jan 08 '21 05:01 KarimFikani