oppia / oppia-android

A free, online & offline learning platform to make quality education accessible for all.
https://www.oppia.org
Apache License 2.0
311 stars 514 forks source link

[BUG]: java.lang.IllegalStateException - focus search returned a view that wasn't able to take focus! #5448

Open seanlip opened 3 months ago

seanlip commented 3 months ago

Describe the bug

We are seeing this crash in Crashlytics after the release of 0.13-beta.

This issue has 1 crash event affecting 1 user in the span of 1 day.

Full stacktrace ``` Fatal Exception: java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus! at android.widget.TextView.onKeyUp(TextView.java:10199) at android.view.KeyEvent.dispatch(KeyEvent.java:3522) at android.view.View.dispatchKeyEvent(View.java:16061) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988) at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:764) at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1957) at android.app.Activity.dispatchKeyEvent(Activity.java:4474) at androidx.core.app.ComponentActivity.a(SourceFile:122) at B.m.a(SourceFile:84) at androidx.core.app.ComponentActivity.dispatchKeyEvent(SourceFile:140) at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(SourceFile:569) at f.n.dispatchKeyEvent(SourceFile:59) at androidx.appcompat.app.N.dispatchKeyEvent(SourceFile:3054) at f.n.dispatchKeyEvent(SourceFile:59) at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:678) at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:8377) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:8237) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7570) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7627) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7593) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7796) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7601) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7853) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7574) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7627) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7593) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7601) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7574) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:11103) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:10985) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:10941) at android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl(ViewRootImpl.java:7185) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:7050) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at android.app.ActivityThread.main(ActivityThread.java:8893) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) AsyncTask #29: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.SynchronousQueue$TransferStack$SNode.block(SynchronousQueue.java:288) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:397) at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:886) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) awaitEvenIfOnMainThread task continuation executor1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at cf.ao.a(SourceFile:60) at cf.d.run(SourceFile:27) at java.lang.Thread.run(Thread.java:1012) GoogleApiHandler: at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:187) at android.os.Looper.loop(Looper.java:319) at android.os.HandlerThread.run(HandlerThread.java:67) pool-10-thread-1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) ReferenceQueueDaemon: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.Object.wait(Object.java:524) at java.lang.Daemons$ReferenceQueueDaemon.runInternal(Daemons.java:239) at java.lang.Daemons$Daemon.run(Daemons.java:145) at java.lang.Thread.run(Thread.java:1012) glide-active-resources: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:210) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:231) at aj.a.a(SourceFile:128) at aj.d.run(SourceFile:61) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at aj.c.run(SourceFile:43) at java.lang.Thread.run(Thread.java:1012) InteractionJankMonitor-Worker: at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:187) at android.os.Looper.loop(Looper.java:319) at android.os.HandlerThread.run(HandlerThread.java:67) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) FinalizerWatchdogDaemon: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.Object.wait(Object.java:524) at java.lang.Daemons$FinalizerWatchdogDaemon.sleepUntilNeeded(Daemons.java:428) at java.lang.Daemons$FinalizerWatchdogDaemon.runInternal(Daemons.java:408) at java.lang.Daemons$Daemon.run(Daemons.java:145) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Crashlytics Exception Handler1: at dalvik.system.VMStack.getThreadStackTrace(VMStack.java) at java.lang.Thread.getStackTrace(Thread.java:1841) at java.lang.Thread.getAllStackTraces(Thread.java:1909) at cf.ae.a(SourceFile:1260) at cf.av.a(SourceFile:218) at cf.av.a(SourceFile:122) at cf.H.call(SourceFile:1395) at cf.m.a(SourceFile:106) at bt.r.run(SourceFile:1) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at cf.ao.a(SourceFile:60) at cf.d.run(SourceFile:27) at java.lang.Thread.run(Thread.java:1012) FinalizerDaemon: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:210) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:231) at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:309) at java.lang.Daemons$Daemon.run(Daemons.java:145) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) com.google.firebase.crashlytics.startup1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at cf.ao.a(SourceFile:60) at cf.d.run(SourceFile:27) at java.lang.Thread.run(Thread.java:1012) kotlinx.coroutines.DefaultExecutor: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252) at kotlinx.coroutines.ac.run(SourceFile:121) at java.lang.Thread.run(Thread.java:1012) ScionFrontendApi: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:460) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1070) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) pool-15-thread-1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) firebase-installations-executor-٥: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:460) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1070) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Measurement Worker: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at m.ky.run(:com.google.android.gms.dynamite_measurementdynamite@242334036@24.23.34 (190300-0):71) pool-15-thread-3: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) glide-source-thread-0: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at am.d.run(SourceFile:393) Answers Events Handler1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1176) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:905) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at dj.v.a(SourceFile:75) at dj.k.run(SourceFile:30) at java.lang.Thread.run(Thread.java:1012) InsetsAnimations: at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:187) at android.os.Looper.loop(Looper.java:319) at android.os.HandlerThread.run(HandlerThread.java:67) glide-source-thread-2: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at am.d.run(SourceFile:393) queued-work-looper-data: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) glide-source-thread-3: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at am.d.run(SourceFile:393) pool-15-thread-2: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) Crashlytics Exception Handler1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at dj.v.a(SourceFile:75) at dj.k.run(SourceFile:30) at java.lang.Thread.run(Thread.java:1012) Okio Watchdog: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.Object.wait(Object.java:524) at com.android.okhttp.okio.AsyncTimeout.awaitTimeout(AsyncTimeout.java:313) at com.android.okhttp.okio.AsyncTimeout.access$000(AsyncTimeout.java:42) at com.android.okhttp.okio.AsyncTimeout$Watchdog.run(AsyncTimeout.java:288) Queue: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at dk.m.a(SourceFile:1197) at dk.m.take(SourceFile:3065) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) queued-work-looper: at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:187) at android.os.Looper.loop(Looper.java:319) at android.os.HandlerThread.run(HandlerThread.java:67) glide-source-thread-1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at am.d.run(SourceFile:393) SurfaceSyncGroupTimer: at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loopOnce(Looper.java:187) at android.os.Looper.loop(Looper.java:319) at android.os.HandlerThread.run(HandlerThread.java:67) GmsDynamite: at java.lang.Object.wait(Object.java) at java.lang.Object.wait(Object.java:386) at java.lang.Object.wait(Object.java:524) at com.google.android.gms.dynamite.e.run(SourceFile:2) OkHttp ConnectionPool: at java.lang.Object.wait(Object.java) at com.android.okhttp.ConnectionPool$1.run(ConnectionPool.java:106) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) glide-disk-cache-thread-0: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.PriorityBlockingQueue.take(PriorityBlockingQueue.java:538) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at am.d.run(SourceFile:393) pool-16-thread-1: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) pool-15-thread-4: at jdk.internal.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:341) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:506) at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3466) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3437) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1623) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1071) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1131) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) ```

Steps To Reproduce

Not sure; this happened in production.

Expected Behavior

The crash should not happen.

Screenshots/Videos

No response

What device/emulator are you using?

Samsung Galaxy A13

Which Android version is your device/emulator running?

Android 14

Which version of the Oppia Android app are you using?

0.13-beta-dcde7b359e

Additional Context

No response

adhiamboperes commented 3 months ago

This is caused by ImeOptions. We don't have many screens that implement that, but the focus should be on the ones that set IME_ACTION_NEXT(pin creation) because they likely try to automove to next edittext, while the softkeyboard is still showing.

See https://stackoverflow.com/a/47991577/11396524

elin4046 commented 2 months ago

I'm having some trouble reproducing this bug, can anyone assist? This is what I've investigated so far:

My understanding of how the bug can be reproduced is as follows:

Given a TextInputEditText with imeOptions set to actionNext Given another view below it that is not focusable, not visible, or disabled When a user focuses on TextInputEditText, bringing up the soft keyboard, and presses the '|->' action button in the bottom right corner of the keyboard Then the exception is thrown since the system attempts to jump to the other view which cannot be focused

Based on a code search query android:imeOptions="actionNext", I've identified 4 potential activities where this bug can take place:

Screenshot 2024-07-11 at 10 52 52 AM

Any next steps from here? I'm new to Android development, so I'm not sure what else I should be looking for to get a reproduction.

adhiamboperes commented 2 months ago

@elin4046, thanks for looking into this. Some reasons why a view may not be focussable are: Non-focusable Views: The view you are trying to focus on is not focusable. This can happen if the view’s focusable attribute is set to false or if the view is not focusable in touch mode.

Given that you have already investigated the first 3, and I tried looking a bit into Focus Order Issues, it maybe one of the other two. But those are situational and would be really difficult to reproduce, e.g if a device is low on storage or memory, then the app might slow down/freeze.

This indicates that this issue would rarely occur, and we can put off trying to fix it for now. If however, we receive more crash reports, then we can investigate further.

Would you like to select another issue, or would you like me to assign you something else?

elin4046 commented 2 months ago

Hi @adhiamboperes, thanks for the info, makes sense to depriortize this effort then. You can assign this issue to me, https://github.com/oppia/oppia-android/issues/4312, and I'll take a stab at it

subhajitxyz commented 1 month ago

Hi @adhiamboperes, I have tried but I wasn't able to reproduce the error.

In a ConstraintLayout, the arrangement and constraints of views can sometimes result in unexpected focus behavior. By using android:nextFocusForward="@+id/next_view_id", pressing the "Next" button on the soft keyboard moves the focus to the view specified by @+id/next_view_id.

However, in the pin_password_activity, there is no need to use the actionNext because there are no other views to focus on next. Instead, we can use actionDone.

If this solution makes sense, you could assign it to me. Thank you!