Calvin-LL / AutoLinkText

A simple library that makes links, emails, and phone numbers clickable in text in Jetpack Compose and Kotlin Compose Multiplatform.
Apache License 2.0
57 stars 2 forks source link

Calendly ActivityNotFoundException #5

Open lawgimenez opened 1 day ago

lawgimenez commented 1 day ago

I'm receiving this crash from some of our users, I am debugging this on our end and see if we can get out a quick fix. Just want to put this here in case.

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://calendly.com/... }
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2100)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1747)
        at android.app.Activity.startActivityForResult(Activity.java:5473)
        at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity:704)
        at android.app.Activity.startActivityForResult(Activity.java:5431)
        at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity:683)
        at android.app.Activity.startActivity(Activity.java:5817)
        at android.app.Activity.startActivity(Activity.java:5770)
        at sh.calvin.autolinktext.MatchClickHandler_androidKt$getMatchClickHandlerDefaults$1$webUrl$1.invoke(MatchClickHandler_androidKt:22)
        at sh.calvin.autolinktext.MatchClickHandler_androidKt$getMatchClickHandlerDefaults$1$webUrl$1.invoke(MatchClickHandler_androidKt:14)
        at sh.calvin.autolinktext.AutoLinkTextKt$AutoLinkText$2.invoke(AutoLinkTextKt:71)
        at sh.calvin.autolinktext.AutoLinkTextKt$AutoLinkText$2.invoke(AutoLinkTextKt:61)
        at androidx.compose.foundation.text.ClickableTextKt$ClickableText$pressIndicator$1$1$1.invoke-k-4lQ0M(ClickableTextKt:89)
        at androidx.compose.foundation.text.ClickableTextKt$ClickableText$pressIndicator$1$1$1.invoke(ClickableTextKt:87)
        at A.ClickableTextKt$ClickableText$2$1.invoke(ClickableTextKt:2558)
        at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapGestures$2$1.invokeSuspend(TapGestureDetectorKt:138)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl:33)
        at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTaskKt:175)
        at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTaskKt:164)
        at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl:466)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl:500)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl:489)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl:364)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputModifierNodeImpl:719)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.dispatchPointerEvent(SuspendingPointerInputModifierNodeImpl:598)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNodeImpl.onPointerEvent-H0pRuoY(SuspendingPointerInputModifierNodeImpl:620)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:387)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:373)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:373)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:373)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:373)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(Node:373)
        at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(NodeParent:229)
        at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker:144)
        at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor:120)
        at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView:1994)
        at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView:1945)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView:1829)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3923)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3597)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3923)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3597)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3923)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3597)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3923)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3597)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:1015)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1962)
        at android.app.Activity.dispatchTouchEvent(Activity.java:4265)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:973)
        at android.view.View.dispatchPointerEvent(View.java:15335)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:7794)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7567)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6901)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6958)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6924)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7122)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6932)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7179)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6905)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6958)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6924)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6932)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6905)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:10354)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:10202)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:10158)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:10486)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:259)
        at android.os.MessageQueue.nativePollOnce(MessageQueue.java:-2)
        at android.os.MessageQueue.next(MessageQueue.java:335)
        at android.os.Looper.loopOnce(Looper.java:186)
        at android.os.Looper.loop(Looper.java:313)
        at android.app.ActivityThread.main(ActivityThread.java:8663)
        at java.lang.reflect.Method.invoke(Method.java:-2)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
Calvin-LL commented 1 day ago

I think that means no browser is installed on the device? At least nothing that can handle https links.

lawgimenez commented 1 day ago

Yes, I'm a bit surprised that users will go to lengths to remove their default browsers. Would it be alright to wrap it in try/catch or I could submit a PR. Crashes like this still affects our crash rate.

Thanks.