fondesa / kpermissions

A Kotlin library which helps to request runtime permissions in Android.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FragmentManager is already executing transactions only 2.0.0

NunciosChums opened this issue · comments

1.0.0 works well. However, 2.0.0 causes an error. Code is same.

Language: kotlin

KPermissions version: 2.0.0

Android version: 8.0.0

Android device: Samsung Galaxy S7 edge

How to reproduce it: request any permission

Block of code:

//  permissionsBuilder(Manifest.permission.CAMERA)
permissionsBuilder(Manifest.permission.WRITE_EXTERNAL_STORAGE)
  .build()
  .onAccepted { startScan() }
  .send()

Stack trace:

java.lang.RuntimeException: Unable to start activity ComponentInfo{kr.susemi99/kr.susemi99.ui.unlock.UnlockActivity}: java.lang.IllegalStateException: FragmentManager is already executing transactions
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
  at android.app.ActivityThread.-wrap11(Unknown Source:0)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
  at android.os.Handler.dispatchMessage(Handler.java:105)
  at android.os.Looper.loop(Looper.java:164)
  at android.app.ActivityThread.main(ActivityThread.java:6944)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
  at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManagerImpl.java:1650)
  at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1682)
  at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:299)
  at com.fondesa.kpermissions.request.runtime.FragmentRuntimePermissionHandlerProvider.provideHandler(FragmentRuntimePermissionHandlerProvider.kt:51)
  at com.fondesa.kpermissions.builder.CompatPermissionRequestBuilder.createRequest(CompatPermissionRequestBuilder.kt:49)
  at com.fondesa.kpermissions.builder.BasePermissionRequestBuilder.build(BasePermissionRequestBuilder.kt:66)
  at kr.susemi99.ui.unlock.scan.UnlockScanFragment.requestPermission(UnlockScanFragment.kt:85)
  at kr.susemi99.ui.unlock.scan.UnlockScanFragment.onActivityCreated(UnlockScanFragment.kt:53)
  at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2633)
  at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:897)
  at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2087)
  at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1861)
  at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1817)
  at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1717)
  at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2650)
  at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2600)
  at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2639)
  at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:897)
  at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1228)
  at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1293)
  at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2646)
  at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2600)
  at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
  at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
  at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1340)
  at android.app.Activity.performStart(Activity.java:7200)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
  at android.app.ActivityThread.-wrap11(Unknown Source:0) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
  at android.os.Handler.dispatchMessage(Handler.java:105) 
  at android.os.Looper.loop(Looper.java:164) 
  at android.app.ActivityThread.main(ActivityThread.java:6944) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

I'll look into it as soon as possible, thanks.

For the moment downgrade to the version 1.0.0 if possible.

BTW have you an idea of how I can reproduce this bug?

my sample project is here https://github.com/susemi99/TestKPermissions
press GO TO SCAN

@susemi99 Thanks for the sample. I figured out the problem.
Apparently that behavior changed with AndroidX.
The fix is not so easy but I'm working on it.
I should replace the calls to FragmentTransaction#commitNow() with FragmentTransaction#commit() inside the library.
The consequences are pretty big on the internal usage of fragments.

I'll keep you up to date.

@susemi99 Fixed in version 2.0.1