SecurityException: Permission Denial for CLOSE_SYSTEM_DIALOGS
- Android version: 12
- Phone model: Google Pixel 3 XL (crosshatch)
- Briar version: 1.4.23 (070165f6)
- User feedback: "I wrote a message, then Briar shut down. This also happens frequently to other apps."
Stacktrace:
java.lang.SecurityException: Permission Denial: android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from org.briarproject.briar.android (pid=24174, uid=10004) requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at android.app.IActivityManager$Stub$Proxy.closeSystemDialogs(IActivityManager.java:7614)
at com.android.internal.policy.PhoneWindow.sendCloseSystemWindows(PhoneWindow.java:3791)
at com.android.internal.policy.PhoneFallbackEventHandler.sendCloseSystemWindows(PhoneFallbackEventHandler.java:323)
at com.android.internal.policy.PhoneFallbackEventHandler.startCallActivity(PhoneFallbackEventHandler.java:275)
at com.android.internal.policy.PhoneFallbackEventHandler.onKeyUp(PhoneFallbackEventHandler.java:261)
at com.android.internal.policy.PhoneFallbackEventHandler.dispatchKeyEvent(PhoneFallbackEventHandler.java:76)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6317)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6141)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5623)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5811)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5654)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5868)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5627)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5654)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5627)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5680)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5646)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5844)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6002)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3158)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2722)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2713)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3135)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
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: android.os.RemoteException: Remote stack trace:
at com.android.server.wm.ActivityTaskManagerService.checkCanCloseSystemDialogs(ActivityTaskManagerService.java:2955)
at com.android.server.wm.ActivityTaskManagerService.access$900(ActivityTaskManagerService.java:294)
at com.android.server.wm.ActivityTaskManagerService$LocalService.checkCanCloseSystemDialogs(ActivityTaskManagerService.java:5309)
at com.android.server.wm.ActivityTaskManagerService$LocalService.closeSystemDialogs(ActivityTaskManagerService.java:5783)
at com.android.server.am.ActivityManagerService.closeSystemDialogs(ActivityManagerService.java:3800)
Edited log:
04-02 10:16:30.039 I/BaseActivity: Starting ConversationActivity
04-02 10:16:30.041 I/BaseActivity: Resuming ConversationActivity
04-02 10:16:32.999 I/AutoDeleteManagerImpl: Sending message with auto-delete timer 604800000
04-02 10:16:33.045 I/DuplexOutgoingSession: Next send time decreased
04-02 10:16:33.052 I/DuplexOutgoingSession: Generated offer: true
04-02 10:16:33.052 I/DuplexOutgoingSession: Sent offer
04-02 10:16:33.061 I/DuplexOutgoingSession: Generated offer: false
04-02 10:16:33.495 I/DuplexOutgoingSession: Generated batch: true
04-02 10:16:33.495 I/ConversationActivity: Messages sent
04-02 10:16:33.495 I/DuplexOutgoingSession: Sent batch
04-02 10:16:33.504 I/DuplexOutgoingSession: Generated batch: false
04-02 10:16:34.069 I/ConversationActivity: Messages acked
04-02 10:16:42.127 I/DuplexOutgoingSession: Generated request: true
04-02 10:16:42.127 I/DuplexOutgoingSession: Sent request
04-02 10:16:42.128 I/DuplexOutgoingSession: Generated request: false
04-02 10:16:42.743 I/ValidationManagerImpl: Validating message for org.briarproject.briar.messaging
04-02 10:16:42.761 I/DuplexOutgoingSession: Generated ack: true
04-02 10:16:42.762 I/DuplexOutgoingSession: Sent ack
04-02 10:16:42.768 I/ValidationManagerImpl: Delivering message for org.briarproject.briar.messaging
04-02 10:16:42.770 I/AutoDeleteManagerImpl: Mirroring auto-delete timer 604800000
04-02 10:16:42.786 I/ConversationActivity: Message received, adding
04-02 10:16:42.791 I/DuplexOutgoingSession: Generated ack: false
04-02 10:17:12.763 I/DuplexOutgoingSession: Sending keepalive
04-02 10:17:33.484 I/DuplexOutgoingSession: Checking for retransmittable messages
04-02 10:17:33.514 I/DuplexOutgoingSession: Generated batch: false
04-02 10:17:33.520 I/DuplexOutgoingSession: Generated offer: false
As far as I can tell, the crash happens because PhoneFallbackEventHandler
is being called to handle a key event for KEYCODE_CALL
. The handler tries to start a call activity for the current app, which fails because Briar doesn't have permission to close system dialogs (which I guess is part of the process of launching the call activity).
So perhaps this is happening just because the user hits the call button on their device/keyboard, or perhaps it also requires some other circumstances, like an unusual device/keyboard config. Either way, it looks like a problem that's specific to this user and (based on their comment) not specific to Briar.