briar issueshttps://code.briarproject.org/groups/briar/-/issues2020-11-06T11:48:08Zhttps://code.briarproject.org/briar/briar/-/issues/68Allow private messages to be deleted2020-11-06T11:48:08ZakwizgranAllow private messages to be deletedFeedback from a user: "We should be able to delete our half of private messages. When the second party deletes their half of the conversation it should be completely deleted."
Private messages include invitations and responses in sharin...Feedback from a user: "We should be able to delete our half of private messages. When the second party deletes their half of the conversation it should be completely deleted."
Private messages include invitations and responses in sharing and introduction protocols. Forum, blog and private group clients all depend on the invitation message being available when the accept message is received, so they can get the group descriptor from the invitation message in order to add the group.
We can easily migrate that information into the session. For this we need a way for clients to run migrations. The first phase of the message deletion work would be to add some kind of client migration mechanism.
Android 1.2https://code.briarproject.org/briar/briar/-/issues/1625ConversationClient method for message deletion2019-10-07T14:45:20ZTorsten GroteConversationClient method for message deletionSubtask of #68
* [x] Add `ConversationManager` method for deleting all conversation messages which delegates to conversation clients
* [x] Add `ConversationClient` method for deleting all messages that returns true if all messages were ...Subtask of #68
* [x] Add `ConversationManager` method for deleting all conversation messages which delegates to conversation clients
* [x] Add `ConversationClient` method for deleting all messages that returns true if all messages were delete or false if not (because they are invitation/introduction messages that can't be deleted).
* [x] Add real implementation for `MessagingManager`, no-op implementations for other clients (just return false)Android 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1626UI for partial conversation message deletion2019-10-09T12:17:31ZTorsten GroteUI for partial conversation message deletionSubtask of #68
* [x] Add menu item for triggering deletion of all messages
* [x] Show dialog (if needed) explaining that invitation/introduction messages can't be deletedSubtask of #68
* [x] Add menu item for triggering deletion of all messages
* [x] Show dialog (if needed) explaining that invitation/introduction messages can't be deletedAndroid 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1627Delete all invitation/introduction messages for completed sessions2019-10-14T12:57:58ZTorsten GroteDelete all invitation/introduction messages for completed sessionsSubtask of #68
* [x] Implement the no-ops from #1625 in the remaining `ConversationClient`s that deletes all completed sessions. A session is complete if it is in a completed state and all messages have been ACKed.
* [x] Introductio...Subtask of #68
* [x] Implement the no-ops from #1625 in the remaining `ConversationClient`s that deletes all completed sessions. A session is complete if it is in a completed state and all messages have been ACKed.
* [x] Introductions: If the session isn't in the start state or there are sent-but-unacked messages, refuse to delete the session. Otherwise delete all messages and their metadata, but leave the session storage message
* [x] Blogs/Forums: If the session has an invite available to answer, refuse to delete the session. Otherwise delete all visible messages and their metadata, but leave invisible messages and the session storage message
* [x] Private Groups: If the session has an invite available to answer, refuse to delete the session. Otherwise delete all visible messages and their metadata, but leave invisible messages and the session storage message
* [x] Update UI dialog to explain that ongoing invitations/introductions can't be deleted
Implementation plan:
* look up all the message metadata
* look up all message states
* loop over all message states and create hash set of message ids that are sent but not acked
* loop over all the message metadata finding session storage objects messages and creating session objects
* loop over it again assigning protocol messages to their sessions
* loop over all sessions: If session state is completed and all messages were ACKed, delete entire session, else remember non-deletion
* return false if at least one session could not be deletedAndroid 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1628Multi-select conversion messages to delete2019-11-08T15:58:43ZTorsten GroteMulti-select conversion messages to deleteSubtask of #68
Add multi-selection of messages to conversation view and add a delete action for ActionMode.
If we migrated to AndroidX when working on this ticket, we could use the [androidx.recyclerview.selection](https://developer.an...Subtask of #68
Add multi-selection of messages to conversation view and add a delete action for ActionMode.
If we migrated to AndroidX when working on this ticket, we could use the [androidx.recyclerview.selection](https://developer.android.com/reference/androidx/recyclerview/selection/package-summary) library. Article: https://proandroiddev.com/a-guide-to-recyclerview-selection-3ed9f2381504Android 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1629Support for deleting a subset of all conversation messages2019-10-28T16:53:17ZTorsten GroteSupport for deleting a subset of all conversation messagesSubtask of #68
* [x] method to `ConversationClient` that returns a set of `MessageId`s it is responsible for
* [x] method to `ConversationClient` to delete a set of messages identified by `MessageId`
* [x] method to `ConversationManager...Subtask of #68
* [x] method to `ConversationClient` that returns a set of `MessageId`s it is responsible for
* [x] method to `ConversationClient` to delete a set of messages identified by `MessageId`
* [x] method to `ConversationManager` for deleting a set of messages identified by `MessageId`. This will intersect the IDs from the clients with IDs to be deleted and as the client to only delete this intersection
Implementation plan for deleting messages in ConversationClients builds on work done in #1627.
* parse message visibility for session's messages (true if visible in UI)
* when looping over all sessions check that all visible messages were selected for deletion, if not, do not delete sessionAndroid 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1656Explain better why messages can not be deleted2019-12-10T12:38:35ZTorsten GroteExplain better why messages can not be deletedCurrently, we show a long, but still incomplete list of reasons why not all messages maybe could not have been deleted. We should add some kind of enum or ORable number, so we can only show the reasons that actually apply to the current ...Currently, we show a long, but still incomplete list of reasons why not all messages maybe could not have been deleted. We should add some kind of enum or ORable number, so we can only show the reasons that actually apply to the current situation.Android 1.2Torsten GroteTorsten Grotehttps://code.briarproject.org/briar/briar/-/issues/1665Crash when deleting introduction message2020-03-24T17:35:17ZakwizgranCrash when deleting introduction message* Android version: 8.0.0
* Phone model: Sony F5321
* Briar version: 1.2.4 (debug build, no commit hash)
* User feedback: "Delete introduction message crash Briar."
Stacktrace:
```
java.lang.IllegalStateException: Range start point not s...* Android version: 8.0.0
* Phone model: Sony F5321
* Briar version: 1.2.4 (debug build, no commit hash)
* User feedback: "Delete introduction message crash Briar."
Stacktrace:
```
java.lang.IllegalStateException: Range start point not set.
at androidx.core.util.Preconditions.checkState(Preconditions.java:96)
at androidx.recyclerview.selection.DefaultSelectionTracker.extendProvisionalRange(DefaultSelectionTracker.java:281)
at androidx.recyclerview.selection.GestureSelectionHelper.extendSelection(GestureSelectionHelper.java:227)
at androidx.recyclerview.selection.GestureSelectionHelper.handleMoveEvent(GestureSelectionHelper.java:204)
at androidx.recyclerview.selection.GestureSelectionHelper.handleTouch(GestureSelectionHelper.java:151)
at androidx.recyclerview.selection.GestureSelectionHelper.onInterceptTouchEvent(GestureSelectionHelper.java:118)
at androidx.recyclerview.selection.TouchEventRouter.onInterceptTouchEvent(TouchEventRouter.java:91)
at androidx.recyclerview.widget.RecyclerView.findInterceptingOnItemTouchListener(RecyclerView.java:3149)
at androidx.recyclerview.widget.RecyclerView.dispatchToOnItemTouchListeners(RecyclerView.java:3120)
at androidx.recyclerview.widget.RecyclerView.onTouchEvent(RecyclerView.java:3281)
at android.view.View.dispatchTouchEvent(View.java:11731)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2955)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2636)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2650)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:453)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
at android.app.Activity.dispatchTouchEvent(Activity.java:3292)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:415)
at android.view.View.dispatchPointerEvent(View.java:11970)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4790)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4604)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4142)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4195)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4288)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4169)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4345)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4142)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4195)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4161)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4169)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4142)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6663)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6637)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6598)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6766)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:177)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6737)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6789)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
at android.view.Choreographer.doCallbacks(Choreographer.java:778)
at android.view.Choreographer.doFrame(Choreographer.java:707)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:251)
at android.app.ActivityThread.main(ActivityThread.java:6589)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
```Android 1.2Torsten GroteTorsten Grote