Closed kidinov closed 2 years ago
Fails | |
---|---|
:no_entry_sign: | Please add a feature label to this issue. e.g. 'feature: stats' |
Generated by :no_entry_sign: dangerJS
Fixed by #5269
My bad, this is still happening, even though we are not targeting Android 12, the stacktrace is different though
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:558)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: com.stripe.stripeterminal.external.models.TerminalException: You must request bluetooth permissions before initializing the Terminal
at com.stripe.stripeterminal.PermissionsValidator.validatePermissions31(PermissionsValidator.kt:47)
at com.stripe.stripeterminal.PermissionsValidator.validatePermissions$core_publish(PermissionsValidator.kt:17)
at com.stripe.stripeterminal.Terminal$Companion.initTerminal(Terminal.kt:753)
at com.woocommerce.android.cardreader.internal.wrappers.TerminalWrapper.initTerminal(TerminalWrapper.kt:35)
at com.woocommerce.android.cardreader.internal.CardReaderManagerImpl.initStripeTerminal(CardReaderManagerImpl.kt:112)
at com.woocommerce.android.cardreader.internal.CardReaderManagerImpl.initialize(CardReaderManagerImpl.kt:70)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectViewModel.onBluetoothStateVerified(CardReaderConnectViewModel.kt:201)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectViewModel.onCheckBluetoothResult(CardReaderConnectViewModel.kt:189)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectViewModel.access$onCheckBluetoothResult(CardReaderConnectViewModel.kt:68)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectViewModel$onLocationStateVerified$1.invoke(CardReaderConnectViewModel.kt:173)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectViewModel$onLocationStateVerified$1.invoke(CardReaderConnectViewModel.kt:173)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectDialogFragment.observeEvents$lambda-8(CardReaderConnectDialogFragment.kt:194)
at com.woocommerce.android.ui.prefs.cardreader.connect.CardReaderConnectDialogFragment.lambda$1uV5SDVGRNZQs4NtrOiA14ljO1g(Unknown Source:0)
at com.woocommerce.android.ui.prefs.cardreader.connect.-$$Lambda$CardReaderConnectDialogFragment$1uV5SDVGRNZQs4NtrOiA14ljO1g.onChanged(Unknown Source:4)
at com.woocommerce.android.viewmodel.SingleLiveEvent.observe$lambda-0(SingleLiveEvent.kt:52)
at com.woocommerce.android.viewmodel.SingleLiveEvent.lambda$B2zauqpeSz_VYlwmzDz5fdMAYi0(Unknown Source:0)
at com.woocommerce.android.viewmodel.-$$Lambda$SingleLiveEvent$B2zauqpeSz_VYlwmzDz5fdMAYi0.onChanged(Unknown Source:4)
at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:151)
at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:468)
at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:425)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
at androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:88)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3060)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:587)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:279)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
2021-11-20 14:37:09.696 21998-21998/com.woocommerce.android.prealpha E/AndroidRuntime: at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1764)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1701)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:488)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
... 3 more
My guess is that the SDK is doing something weird in the function validatePermissions31
where they don't check the target SDK of the app.
I confirmed that the cause is an SDK's bug, the decompiled code of the com.stripe.stripeterminal.PermissionValidator has this:
public final void validatePermissions$core_publish() {
this.validatePermissionsPre31();
if (VERSION.SDK_INT >= 31) {
this.validatePermissions31();
}
}
...
private final void validatePermissions31() {
boolean bluetoothConnectGranted = this.isGranted("android.permission.BLUETOOTH_CONNECT");
boolean bluetoothScanGranted = this.isGranted("android.permission.BLUETOOTH_SCAN");
if (!bluetoothConnectGranted || !bluetoothScanGranted) {
throw new TerminalException(TerminalErrorCode.BLUETOOTH_PERMISSION_DENIED, "You must request bluetooth permissions before initializing the Terminal", (ApiError)null, 4, (DefaultConstructorMarker)null);
}
}
So they require the new permissions for all apps running on Android 12 regardless of the target SDK version.
https://developer.android.com/guide/topics/connectivity/bluetooth/permissions