Android: ThemeUtils fails using reflection to access mCursorDrawable

Created on 18 May 2019  路  6Comments  路  Source: nextcloud/android

This happens when opening app on Android 9:

Note to self: verify what is going there.

2019-05-18 15:14:33.524 17229-17229/com.nextcloud.android.qa E/ThemeUtils: setTextViewCursorColor
    java.lang.NoSuchFieldException: No field mCursorDrawable in class Landroid/widget/Editor; (declaration of 'android.widget.Editor' appears in /system/framework/framework.jar!classes2.dex)
        at java.lang.Class.getDeclaredField(Native Method)
        at com.owncloud.android.utils.ThemeUtils.setTextViewCursorColor(ThemeUtils.java:585)
        at com.owncloud.android.utils.ThemeUtils.themeEditText(ThemeUtils.java:462)
        at com.owncloud.android.utils.ThemeUtils.themeSearchView(ThemeUtils.java:470)
        at com.owncloud.android.ui.fragment.ExtendedListFragment.onCreateOptionsMenu(ExtendedListFragment.java:197)
        at androidx.fragment.app.Fragment.performCreateOptionsMenu(Fragment.java:2561)
        at androidx.fragment.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:3321)
        at androidx.fragment.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:331)
        at androidx.fragment.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:379)
        at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2549)
        at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
        at androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:455)
        at androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:56)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6863)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
approved bug pr exists

All 6 comments

This is logged using

Log_OC.e(TAG, "setTextViewCursorColor", e);

so I guess we treat it as an error. It doesn't work on Android 9 apparently.

Correct also looping in @tobiasKaminsky and @dan0xii since both also worked on dynamic theming code (which I did also). The code themes the cursor while some (private) field names seems to have changed (or don't exist) in newer Android versions. So we need to either skip it for newer Android versions or find the right, new field name / way how to theme the cursor properly.

We may have trouble setting the cursor colour dynamically in API 28 and upwards: https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces

I've tested setting the cursor back to null and it still gives the effect below so that could be our alternative for now.

Screenshot_1559739726

I can reproduce this issue by clicking on media for a preview (F-Droid, 3.7.0 RC3):

06-20 15:48:44.549  9149  9149 V PreviewMediaFragment: onActivityCreated
06-20 15:48:44.550  9149  9149 V PreviewMediaFragment: onStart
06-20 15:48:44.550  9149  9149 D PreviewMediaFragment: Binding to MediaService...
06-20 15:48:44.552  9149  9149 V PreviewMediaFragment: onResume
06-20 15:48:44.576  9149  9149 E ThemeUtils: setTextViewCursorColor
06-20 15:48:44.576  9149  9149 E ThemeUtils: java.lang.NoSuchFieldException: No field mCursorDrawable in class Landroid/widget/Editor; (declaration of 'android.widget.Editor' appears in /system/framework/framework.jar!classes2.dex)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at java.lang.Class.getDeclaredField(Native Method)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.owncloud.android.utils.ThemeUtils.setTextViewCursorColor(ThemeUtils.java:585)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.owncloud.android.utils.ThemeUtils.themeEditText(ThemeUtils.java:462)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.owncloud.android.utils.ThemeUtils.themeSearchView(ThemeUtils.java:470)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.owncloud.android.ui.fragment.ExtendedListFragment.onCreateOptionsMenu(ExtendedListFragment.java:196)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.fragment.app.Fragment.performCreateOptionsMenu(Fragment.java:2561)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.fragment.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:3321)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.fragment.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:331)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.fragment.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:379)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2549)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:455)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:56)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.view.Choreographer.doFrame(Choreographer.java:693)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.os.Handler.handleCallback(Handler.java:873)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.os.Looper.loop(Looper.java:193)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at android.app.ActivityThread.main(ActivityThread.java:6718)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at java.lang.reflect.Method.invoke(Native Method)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
06-20 15:48:44.576  9149  9149 E ThemeUtils:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
06-20 15:48:44.604  9149  9149 D AndroidRuntime: Shutting down VM
06-20 15:48:44.605  9149  9149 E AndroidRuntime: FATAL EXCEPTION: main
06-20 15:48:44.605  9149  9149 E AndroidRuntime: Process: com.nextcloud.client, PID: 9149
06-20 15:48:44.605  9149  9149 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'boolean com.nextcloud.client.account.UserAccountManager.isMediaStreamingSupported(android.accounts.Account)' on a null object reference
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at com.owncloud.android.ui.preview.PreviewMediaFragment.onPrepareOptionsMenu(PreviewMediaFragment.java:391)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.fragment.app.Fragment.performPrepareOptionsMenu(Fragment.java:2575)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.fragment.app.FragmentManagerImpl.dispatchPrepareOptionsMenu(FragmentManager.java:3353)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.fragment.app.FragmentController.dispatchPrepareOptionsMenu(FragmentController.java:343)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.fragment.app.FragmentActivity.onPreparePanel(FragmentActivity.java:548)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.view.WindowCallbackWrapper.onPreparePanel(WindowCallbackWrapper.java:99)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onPreparePanel(AppCompatDelegateImpl.java:2576)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.view.WindowCallbackWrapper.onPreparePanel(WindowCallbackWrapper.java:99)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.app.ToolbarActionBar$ToolbarCallbackWrapper.onPreparePanel(ToolbarActionBar.java:522)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:456)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:56)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.view.Choreographer.doFrame(Choreographer.java:693)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:873)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:193)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6718)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
06-20 15:48:44.605  9149  9149 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
06-20 15:48:44.607  1359  3228 W ActivityManager:   Force finishing activity com.nextcloud.client/com.owncloud.android.ui.activity.FileDisplayActivity
06-20 15:48:44.611  9149  9149 I Process : Sending signal. PID: 9149 SIG: 9
06-20 15:48:44.627  1359  2329 W InputDispatcher: channel '74063d7 com.nextcloud.client/com.owncloud.android.ui.activity.FileDisplayActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
06-20 15:48:44.627  1359  2329 E InputDispatcher: channel '74063d7 com.nextcloud.client/com.owncloud.android.ui.activity.FileDisplayActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

This request did not receive an update in the last 4 weeks. Please take a look again and update the issue with new details, otherwise the issue will be automatically closed in 2 weeks. Thank you!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

AndyScherzinger picture AndyScherzinger  路  3Comments

ikke-t picture ikke-t  路  3Comments

JSoko picture JSoko  路  3Comments

JSoko picture JSoko  路  3Comments

ThaDaVos picture ThaDaVos  路  3Comments