2021-05-31 06:06:02 +02:00
package org.thoughtcrime.securesms.conversation.v2
2021-06-28 08:28:00 +02:00
import android.Manifest
2021-06-16 07:49:39 +02:00
import android.animation.FloatEvaluator
import android.animation.ValueAnimator
2022-12-19 01:29:05 +01:00
import android.content.*
2021-06-17 02:53:56 +02:00
import android.content.res.Resources
2021-06-04 01:58:04 +02:00
import android.database.Cursor
2021-06-17 05:18:09 +02:00
import android.graphics.Rect
2021-06-24 02:18:52 +02:00
import android.graphics.Typeface
2021-06-28 02:00:18 +02:00
import android.net.Uri
2022-12-19 01:29:05 +01:00
import android.os.*
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
import android.provider.MediaStore
2021-06-29 02:05:39 +02:00
import android.text.TextUtils
2021-06-28 03:11:29 +02:00
import android.util.Pair
2021-06-24 02:04:43 +02:00
import android.util.TypedValue
2022-12-19 01:29:05 +01:00
import android.view.*
2021-07-01 02:02:02 +02:00
import android.widget.LinearLayout
2021-06-16 01:51:50 +02:00
import android.widget.RelativeLayout
2021-06-28 02:44:00 +02:00
import android.widget.Toast
2022-01-14 06:56:15 +01:00
import androidx.activity.viewModels
2021-07-01 02:02:02 +02:00
import androidx.annotation.DimenRes
2021-06-29 02:05:39 +02:00
import androidx.appcompat.app.AlertDialog
2022-09-04 13:03:32 +02:00
import androidx.core.view.drawToBitmap
2021-06-24 02:18:52 +02:00
import androidx.core.view.isVisible
2021-06-29 06:00:47 +02:00
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
2022-01-14 06:56:15 +01:00
import androidx.lifecycle.lifecycleScope
2021-06-04 01:58:04 +02:00
import androidx.loader.app.LoaderManager
import androidx.loader.content.Loader
2021-05-31 06:06:02 +02:00
import androidx.recyclerview.widget.LinearLayoutManager
2021-06-25 02:55:50 +02:00
import androidx.recyclerview.widget.RecyclerView
2021-06-28 08:28:00 +02:00
import com.annimon.stream.Stream
2021-10-04 09:51:19 +02:00
import dagger.hilt.android.AndroidEntryPoint
2022-03-04 07:46:39 +01:00
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2021-05-31 06:06:02 +02:00
import network.loki.messenger.R
2022-01-14 06:56:15 +01:00
import network.loki.messenger.databinding.ActivityConversationV2Binding
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
import network.loki.messenger.databinding.ViewVisibleMessageBinding
2021-06-24 03:43:51 +02:00
import nl.komponents.kovenant.ui.successUi
2022-09-04 13:03:32 +02:00
import org.session.libsession.messaging.MessagingModuleConfiguration
2021-06-24 06:21:05 +02:00
import org.session.libsession.messaging.contacts.Contact
2023-01-11 02:42:09 +01:00
import org.session.libsession.messaging.jobs.AttachmentDownloadJob
import org.session.libsession.messaging.jobs.JobQueue
2021-06-25 06:42:04 +02:00
import org.session.libsession.messaging.mentions.Mention
2021-06-18 03:00:52 +02:00
import org.session.libsession.messaging.mentions.MentionsManager
2021-06-28 08:28:00 +02:00
import org.session.libsession.messaging.messages.control.DataExtractionNotification
2022-09-13 07:06:46 +02:00
import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate
2021-06-28 02:00:18 +02:00
import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage
2021-06-25 07:20:54 +02:00
import org.session.libsession.messaging.messages.signal.OutgoingTextMessage
2022-09-04 13:03:32 +02:00
import org.session.libsession.messaging.messages.visible.Reaction
2021-06-25 07:20:54 +02:00
import org.session.libsession.messaging.messages.visible.VisibleMessage
2022-08-10 10:17:48 +02:00
import org.session.libsession.messaging.open_groups.OpenGroupApi
2022-09-04 13:03:32 +02:00
import org.session.libsession.messaging.open_groups.OpenGroupApi.Capability
2021-06-25 07:20:54 +02:00
import org.session.libsession.messaging.sending_receiving.MessageSender
2021-06-28 02:00:18 +02:00
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
2021-06-28 05:29:17 +02:00
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
2022-08-10 10:17:48 +02:00
import org.session.libsession.messaging.utilities.SessionId
2022-12-19 01:29:05 +01:00
import org.session.libsession.utilities.*
2021-06-29 03:14:58 +02:00
import org.session.libsession.utilities.Address.Companion.fromSerialized
2021-06-30 03:44:26 +02:00
import org.session.libsession.utilities.concurrent.SimpleTask
2021-06-29 03:14:58 +02:00
import org.session.libsession.utilities.recipients.Recipient
2021-06-30 02:45:31 +02:00
import org.session.libsession.utilities.recipients.RecipientModifiedListener
2021-07-19 05:52:50 +02:00
import org.session.libsignal.crypto.MnemonicCodec
2022-08-10 10:17:48 +02:00
import org.session.libsignal.utilities.IdPrefix
2021-06-28 02:44:00 +02:00
import org.session.libsignal.utilities.ListenableFuture
2022-09-13 07:06:46 +02:00
import org.session.libsignal.utilities.Log
2021-07-01 01:54:09 +02:00
import org.session.libsignal.utilities.guava.Optional
2021-07-19 05:52:50 +02:00
import org.session.libsignal.utilities.hexEncodedPrivateKey
2021-06-24 03:22:32 +02:00
import org.thoughtcrime.securesms.ApplicationContext
2022-09-13 07:06:46 +02:00
import org.thoughtcrime.securesms.ExpirationDialog
2021-05-31 06:06:02 +02:00
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
import org.thoughtcrime.securesms.attachments.ScreenshotObserver
2021-06-28 03:11:29 +02:00
import org.thoughtcrime.securesms.audio.AudioRecorder
2021-07-12 07:44:46 +02:00
import org.thoughtcrime.securesms.contacts.SelectContactsActivity.Companion.selectedContactsKey
2021-06-25 03:11:03 +02:00
import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnActionSelectedListener
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnReactionSelectedListener
2022-01-14 06:56:15 +01:00
import org.thoughtcrime.securesms.conversation.v2.dialogs.BlockedDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.LinkPreviewDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.SendSeedDialog
2021-06-17 06:34:50 +02:00
import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarButton
2021-06-16 01:51:50 +02:00
import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarDelegate
2021-06-17 08:07:11 +02:00
import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarRecordingViewDelegate
2021-06-18 03:00:52 +02:00
import org.thoughtcrime.securesms.conversation.v2.input_bar.mentions.MentionCandidatesView
2021-06-07 06:04:55 +02:00
import org.thoughtcrime.securesms.conversation.v2.menus.ConversationActionModeCallback
2021-06-28 08:28:00 +02:00
import org.thoughtcrime.securesms.conversation.v2.menus.ConversationActionModeCallbackDelegate
2021-06-07 06:04:55 +02:00
import org.thoughtcrime.securesms.conversation.v2.menus.ConversationMenuHelper
2022-01-14 06:56:15 +01:00
import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageViewDelegate
2021-06-29 06:00:47 +02:00
import org.thoughtcrime.securesms.conversation.v2.search.SearchBottomBar
import org.thoughtcrime.securesms.conversation.v2.search.SearchViewModel
2022-12-19 01:29:05 +01:00
import org.thoughtcrime.securesms.conversation.v2.utilities.*
2021-07-19 05:52:50 +02:00
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.crypto.MnemonicUtilities
2022-12-19 01:29:05 +01:00
import org.thoughtcrime.securesms.database.*
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.database.model.MessageId
2021-06-07 06:04:55 +02:00
import org.thoughtcrime.securesms.database.model.MessageRecord
2021-06-28 05:29:17 +02:00
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.database.model.ReactionRecord
2021-06-25 08:09:37 +02:00
import org.thoughtcrime.securesms.giph.ui.GiphyActivity
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.groups.OpenGroupManager
2021-06-24 07:46:36 +02:00
import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository
2021-06-29 07:48:40 +02:00
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil
2021-06-24 07:46:36 +02:00
import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel
import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel.LinkPreviewState
2021-06-25 08:09:37 +02:00
import org.thoughtcrime.securesms.mediasend.Media
import org.thoughtcrime.securesms.mediasend.MediaSendActivity
2022-12-19 01:29:05 +01:00
import org.thoughtcrime.securesms.mms.*
2021-06-28 08:28:00 +02:00
import org.thoughtcrime.securesms.permissions.Permissions
2022-09-04 13:03:32 +02:00
import org.thoughtcrime.securesms.reactions.ReactionsDialogFragment
import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiDialogFragment
2022-12-19 01:29:05 +01:00
import org.thoughtcrime.securesms.util.*
import java.util.*
2021-06-28 02:44:00 +02:00
import java.util.concurrent.ExecutionException
2022-02-07 07:06:27 +01:00
import java.util.concurrent.atomic.AtomicLong
import java.util.concurrent.atomic.AtomicReference
2021-10-04 09:51:19 +02:00
import javax.inject.Inject
2022-01-14 06:56:15 +01:00
import kotlin.math.abs
import kotlin.math.min
import kotlin.math.roundToInt
import kotlin.math.sqrt
2021-05-31 06:06:02 +02:00
2021-06-25 01:19:21 +02:00
// Some things that seemingly belong to the input bar (e.g. the voice message recording UI) are actually
// part of the conversation activity layout. This is just because it makes the layout a lot simpler. The
// price we pay is a bit of back and forth between the input bar and the conversation activity.
2021-10-04 09:51:19 +02:00
@AndroidEntryPoint
2021-06-23 06:48:29 +02:00
class ConversationActivityV2 : PassphraseRequiredActionBarActivity ( ) , InputBarDelegate ,
2022-09-04 13:03:32 +02:00
InputBarRecordingViewDelegate , AttachmentManager . AttachmentListener , ActivityDispatcher ,
ConversationActionModeCallbackDelegate , VisibleMessageViewDelegate , RecipientModifiedListener ,
SearchBottomBar . EventListener , LoaderManager . LoaderCallbacks < Cursor > ,
2022-09-13 07:06:46 +02:00
OnReactionSelectedListener , ReactWithAnyEmojiDialogFragment . Callback , ReactionsDialogFragment . Callback ,
ConversationMenuHelper . ConversationMenuListener {
2021-10-04 09:51:19 +02:00
2022-02-28 07:23:58 +01:00
private var binding : ActivityConversationV2Binding ? = null
2022-01-14 06:56:15 +01:00
@Inject lateinit var textSecurePreferences : TextSecurePreferences
2021-10-04 09:51:19 +02:00
@Inject lateinit var threadDb : ThreadDatabase
@Inject lateinit var mmsSmsDb : MmsSmsDatabase
@Inject lateinit var lokiThreadDb : LokiThreadDatabase
@Inject lateinit var sessionContactDb : SessionContactDatabase
@Inject lateinit var groupDb : GroupDatabase
2022-09-13 07:06:46 +02:00
@Inject lateinit var recipientDb : RecipientDatabase
2021-10-04 09:51:19 +02:00
@Inject lateinit var lokiApiDb : LokiAPIDatabase
@Inject lateinit var smsDb : SmsDatabase
@Inject lateinit var mmsDb : MmsDatabase
@Inject lateinit var lokiMessageDb : LokiMessageDatabase
2022-08-10 10:17:48 +02:00
@Inject lateinit var storage : Storage
2022-09-04 13:03:32 +02:00
@Inject lateinit var reactionDb : ReactionDatabase
2022-01-14 06:56:15 +01:00
@Inject lateinit var viewModelFactory : ConversationViewModel . AssistedFactory
2021-10-04 09:51:19 +02:00
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
private val screenshotObserver by lazy {
ScreenshotObserver ( this , Handler ( Looper . getMainLooper ( ) ) ) {
// post screenshot message
sendScreenshotNotification ( )
}
}
2021-06-18 07:54:24 +02:00
private val screenWidth = Resources . getSystem ( ) . displayMetrics . widthPixels
2022-01-14 06:56:15 +01:00
private val linkPreviewViewModel : LinkPreviewViewModel by lazy {
Add one on one calls over clearnet (#864)
* feat: adding basic webrtc deps and test activity
* more testing code
* feat: add protos and bump version
* feat: added basic call functionality
* feat: adding UI and flipping cameras
* feat: add stats and starting call bottom sheet
* feat: hanging up and bottom sheet behaviors should work now
* feat: add call stats report on frontend
* feat: add relay toggle for answer and offer
* fix: add keep screen on and more end call message on back pressed / on finish
* refactor: removing and replacing dagger 1 dep with android hilt
* feat: include latest proto
* feat: update to utilise call ID
* feat: add stun and turn
* refactor: playing around with deps and transport types
* feat: adding call service functionality and permissions for calls
* feat: add call manager and more static intent building functions for WebRtcCallService.kt
* feat: adding ringers and more audio boilerplate
* feat: audio manager call service boilerplate
* feat: update kotlin and add in call view model and more management functions
* refactor: moving call code around to service and viewmodel interactions
* feat: plugging CallManager.kt into view model and service, fixing up dependencies
* feat: implementing more WebRtcCallService.kt functions and handlers for actions as well as lifecycle
* feat: adding more lifecycle vm and callmanager / call service functionality
* feat: adding more command handlers in WebRtcCallService.kt
* feat: more commands handled, adding lock manager and bluetooth permissions
* feat: adding remainder of basic functionality to services and CallManager.kt
* feat: hooking up calls and fixing broken dependencies and compile errors
* fix: add timestamp to incoming call
* feat: some connection and service launching / ring lifecycle
* feat: call establishing and displaying
* fix: fixing call connect flows
* feat: ringers and better state handling
* feat: updating call layout
* feat: add fixes to bluetooth and begin the network renegotiation
* feat: add call related permissions and more network handover tests
* fix: don't display call option in conversation and don't show notification if option not enabled
* fix: incoming ringer fix on receiving call, call notification priorities and notification channel update
* build: update build number for testing
* fix: bluetooth auto-connection and re-connection fixes, removing finished todos, allowing self-send call messages for deduping answers
* feat: add pre-offer information and action handling in web rtc call service
* refactor: discard offer messages from non-matching pre-offers we are already expecting
* build: build numbers and version name update
* feat: handle discarding pending calls from linked devices
* feat: add signing props to release config build
* docs: fix comment on time being 300s (5m) instead of 30s
* feat: adding call messages for incoming/outgoing/missed
* refactor: handle in-thread call notifications better and replace deny button intent with denyCallIntent instead of hangup
* feat: add a hangup via data channel message
* feat: process microphone enabled events and remove debuggable from build.gradle
* feat: add first call notification
* refactor: set the buttons to match iOS in terms of enable disable and colours
* refactor: change the call logos in control messages
* refactor: more bluetooth improvements
* refactor: move start ringer and init of audio manager to CallManager.kt and string fix up
* build: remove debuggable for release build
* refactor: replace call icons
* feat: adding a call time display
* refactor: change the call time to update every second
* refactor: testing out the full screen intents
* refactor: wrapper use corrected session description, set title to recipient displayName, indicate session calls
* fix: crash on view with a parent already attached
* refactor: aspect ratio fit preserved
* refactor: add wantsToAnswer ability in pre-init for fullscreenintent
* refactor: prevent calls from non hasSent participants
* build: update gradle code
* refactor: replace timeout schedule with a seconds count
* fix: various bug fixes for calls
* fix: remove end call from busy
* refactor: use answerCall instead of manual intent building again
* build: new version
* feat: add silenced notifications for call notification builder. check pre-offer and connecting state for pending connection
* build: update build number
* fix: text color uses overridden style value
* fix: remove wrap content for renderers and look more at recovering from network switches
* build: update build number
* refactor: remove whitespace
* build: update build number
* refactor: used shared number for BatchMessageReceiveJob.kt parameter across pollers
* fix: glide in update crash
* fix: bug fixes for self-send answer / hangup messages
* build: update build number
* build: update build.gradle number
* refactor: compile errors and refactoring to view binding
* fix: set the content to binding.root view
* build: increase build number
* build: update build numbers
* feat: adding base for rotation and picking random subset of turn servers
* feat: starting the screen rotation processing
* feat: setting up rotation for the remote render view
* refactor: applying rotation and mirroring based on front / rear cameras that wraps nicely, only scale reworking needed
* refactor: calls video stretching but consistent
* refactor: state machine and tests for the transition events
* feat: new call state processing
* refactor: adding reconnecting logic and visuals
* feat: state machine reconnect logic wip
* feat: add reconnecting and merge fixes
* feat: check new session based off current state
* feat: reconnection logic works correctly now
* refactor: reduce TIMEOUT_SECONDS to 30 from 90
* feat: reset peer connection on DC to prevent ICE messages from old connection or stale state in reconnecting
* refactor: add null case
* fix: set approved on new outgoing threads, use approved more deeply and invalidate the options menu on recipient modified. Add approvedMe flag toggles for visible message receive
* fix: add name update in action bar on modified, change where approvedMe is set
* build: increment build number
* build: update build number
* fix: merge compile errors and increment build number
* refactor: remove negotiation based on which party dropped connection
* refactor: call reconnection improvement tested cross platform to re-establish
* refactor: failed and disconnect events only handled if either the reconnect or the timeout runnables are not set
* build: update version number
* fix: reduce timeout
* fix: fixes the incoming hangup logic for linked devices
* refactor: match iOS styling for call activity closer
* chore: upgrade build numbers
* feat: add in call settings dialog for if calls is disabled in conversation
* feat: add a first call missed control message and info popup with link to privacy settings
* fix: looking at crash for specific large transaction in NotificationManager
* refactor: removing the people in case transaction size reduces to fix notif crash
* fix: comment out the entire send multiple to see if it fixes the issue
* refactor: revert to including the full notification process in a try/catch to handle weird responses from NotificationManager
* fix: add in notification settings prompt for calls and try to fall back to dirty full screen intent / start activity if we're allowed
* build: upgrade build number
2022-04-19 06:25:40 +02:00
ViewModelProvider ( this , LinkPreviewViewModel . Factory ( LinkPreviewRepository ( ) ) )
2022-01-14 06:56:15 +01:00
. get ( LinkPreviewViewModel :: class . java )
}
private val viewModel : ConversationViewModel by viewModels {
var threadId = intent . getLongExtra ( THREAD _ID , - 1L )
if ( threadId == - 1L ) {
2022-08-10 10:17:48 +02:00
intent . getParcelableExtra < Address > ( ADDRESS ) ?. let { it ->
threadId = threadDb . getThreadIdIfExistsFor ( it . serialize ( ) )
if ( threadId == - 1L ) {
val sessionId = SessionId ( it . serialize ( ) )
val openGroup = lokiThreadDb . getOpenGroupChat ( intent . getLongExtra ( FROM _GROUP _THREAD _ID , - 1 ) )
val address = if ( sessionId . prefix == IdPrefix . BLINDED && openGroup != null ) {
storage . getOrCreateBlindedIdMapping ( sessionId . hexString , openGroup . server , openGroup . publicKey ) . sessionId ?. let {
fromSerialized ( it )
} ?: run {
val openGroupInboxId =
" ${openGroup.server} ! ${openGroup.publicKey} ! ${sessionId.hexString} " . toByteArray ( )
fromSerialized ( GroupUtil . getEncodedOpenGroupInboxID ( openGroupInboxId ) )
}
} else {
it
}
val recipient = Recipient . from ( this , address , false )
threadId = threadDb . getOrCreateThreadIdFor ( recipient )
}
2022-01-14 06:56:15 +01:00
} ?: finish ( )
}
2022-09-04 13:03:32 +02:00
viewModelFactory . create ( threadId , MessagingModuleConfiguration . shared . getUserED25519KeyPair ( ) )
2022-01-14 06:56:15 +01:00
}
2021-06-07 06:04:55 +02:00
private var actionMode : ActionMode ? = null
2021-06-25 06:42:04 +02:00
private var unreadCount = 0
// Attachments
2021-06-28 03:11:29 +02:00
private val audioRecorder = AudioRecorder ( this )
private val stopAudioHandler = Handler ( Looper . getMainLooper ( ) )
2021-06-28 03:26:13 +02:00
private val stopVoiceMessageRecordingTask = Runnable { sendVoiceMessage ( ) }
2021-06-25 07:53:47 +02:00
private val attachmentManager by lazy { AttachmentManager ( this , this ) }
2021-06-17 05:18:09 +02:00
private var isLockViewExpanded = false
2021-06-17 08:29:57 +02:00
private var isShowingAttachmentOptions = false
2021-06-25 06:42:04 +02:00
// Mentions
private val mentions = mutableListOf < Mention > ( )
2021-06-18 03:05:14 +02:00
private var mentionCandidatesView : MentionCandidatesView ? = null
2021-06-25 06:42:04 +02:00
private var previousText : CharSequence = " "
private var currentMentionStartIndex = - 1
private var isShowingMentionCandidatesView = false
2021-06-30 03:44:26 +02:00
// Search
2022-01-14 06:56:15 +01:00
val searchViewModel : SearchViewModel by viewModels ( )
2021-06-30 03:44:26 +02:00
var searchViewItem : MenuItem ? = null
2021-06-25 02:02:59 +02:00
2021-06-30 03:02:46 +02:00
private val isScrolledToBottom : Boolean
get ( ) {
2022-02-28 07:23:58 +01:00
val position = layoutManager ?. findFirstCompletelyVisibleItemPosition ( ) ?: 0
2021-06-30 03:02:46 +02:00
return position == 0
}
2021-06-25 02:02:59 +02:00
2022-02-28 07:23:58 +01:00
private val layoutManager : LinearLayoutManager ?
get ( ) { return binding ?. conversationRecyclerView ?. layoutManager as LinearLayoutManager ? }
2021-05-31 06:06:02 +02:00
2021-07-19 05:52:50 +02:00
private val seed by lazy {
var hexEncodedSeed = IdentityKeyUtil . retrieve ( this , IdentityKeyUtil . LOKI _SEED )
if ( hexEncodedSeed == null ) {
hexEncodedSeed = IdentityKeyUtil . getIdentityKeyPair ( this ) . hexEncodedPrivateKey // Legacy account
}
val loadFileContents : ( String ) -> String = { fileName ->
MnemonicUtilities . loadFileContents ( this , fileName )
}
MnemonicCodec ( loadFileContents ) . encode ( hexEncodedSeed !! , MnemonicCodec . Language . Configuration . english )
}
2021-06-04 01:58:04 +02:00
private val adapter by lazy {
2022-03-04 07:46:39 +01:00
val cursor = mmsSmsDb . getConversation ( viewModel . threadId , !is IncomingMessageRequestThread ( ) )
2021-06-07 06:04:55 +02:00
val adapter = ConversationAdapter (
this ,
cursor ,
2021-06-30 06:29:32 +02:00
onItemPress = { message , position , view , event ->
handlePress ( message , position , view , event )
2021-06-07 06:04:55 +02:00
} ,
2022-09-04 13:03:32 +02:00
onItemSwipeToReply = { message , _ ->
handleSwipeToReply ( message )
2021-06-09 03:37:50 +02:00
} ,
2022-09-04 13:03:32 +02:00
onItemLongPress = { message , position , view ->
if ( !is MessageRequestThread ( ) &&
( viewModel . openGroup == null || Capability . REACTIONS . name . lowercase ( ) in viewModel . serverCapabilities )
) {
showEmojiPicker ( message , view )
} else {
handleLongPress ( message , position )
}
2021-06-21 07:26:09 +02:00
} ,
2022-02-06 02:41:35 +01:00
onDeselect = { message , position ->
actionMode ?. let {
onDeselect ( message , position , it )
}
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
} ,
2023-01-11 02:42:09 +01:00
onAttachmentNeedsDownload = { attachmentId , mmsId ->
// Start download (on IO thread)
lifecycleScope . launch ( Dispatchers . IO ) {
JobQueue . shared . add ( AttachmentDownloadJob ( attachmentId , mmsId ) )
}
} ,
2022-09-04 13:03:32 +02:00
glide = glide ,
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
lifecycleCoroutineScope = lifecycleScope
2021-06-07 06:04:55 +02:00
)
2022-09-04 13:03:32 +02:00
adapter . visibleMessageViewDelegate = this
2021-06-04 01:58:04 +02:00
adapter
}
2021-06-01 08:17:14 +02:00
private val glide by lazy { GlideApp . with ( this ) }
2021-06-18 07:54:24 +02:00
private val lockViewHitMargin by lazy { toPx ( 40 , resources ) }
2021-06-17 07:20:19 +02:00
private val gifButton by lazy { InputBarButton ( this , R . drawable . ic _gif _white _24dp , hasOpaqueBackground = true , isGIFButton = true ) }
2021-06-17 06:34:50 +02:00
private val documentButton by lazy { InputBarButton ( this , R . drawable . ic _document _small _dark , hasOpaqueBackground = true ) }
private val libraryButton by lazy { InputBarButton ( this , R . drawable . ic _baseline _photo _library _24 , hasOpaqueBackground = true ) }
private val cameraButton by lazy { InputBarButton ( this , R . drawable . ic _baseline _photo _camera _24 , hasOpaqueBackground = true ) }
2022-02-07 07:06:27 +01:00
private val messageToScrollTimestamp = AtomicLong ( - 1 )
private val messageToScrollAuthor = AtomicReference < Address ? > ( null )
2021-06-17 02:53:56 +02:00
2022-09-04 13:03:32 +02:00
private lateinit var reactionDelegate : ConversationReactionDelegate
private val reactWithAnyEmojiStartPage = - 1
2021-05-31 06:06:02 +02:00
// region Settings
companion object {
2021-07-01 01:54:09 +02:00
// Extras
2021-05-31 06:06:02 +02:00
const val THREAD _ID = " thread_id "
2021-07-01 01:31:30 +02:00
const val ADDRESS = " address "
2022-08-10 10:17:48 +02:00
const val FROM _GROUP _THREAD _ID = " from_group_thread_id "
2022-02-07 07:06:27 +01:00
const val SCROLL _MESSAGE _ID = " scroll_message_id "
const val SCROLL _MESSAGE _AUTHOR = " scroll_message_author "
2021-07-01 01:54:09 +02:00
// Request codes
2021-06-25 07:53:47 +02:00
const val PICK _DOCUMENT = 2
const val TAKE _PHOTO = 7
const val PICK _GIF = 10
const val PICK _FROM _LIBRARY = 12
2021-06-29 03:14:58 +02:00
const val INVITE _CONTACTS = 124
2021-08-16 07:09:12 +02:00
2021-05-31 06:06:02 +02:00
}
// endregion
// region Lifecycle
override fun onCreate ( savedInstanceState : Bundle ? , isReady : Boolean ) {
super . onCreate ( savedInstanceState , isReady )
2022-01-14 06:56:15 +01:00
binding = ActivityConversationV2Binding . inflate ( layoutInflater )
2022-02-28 07:23:58 +01:00
setContentView ( binding !! . root )
2022-02-07 07:06:27 +01:00
// messageIdToScroll
messageToScrollTimestamp . set ( intent . getLongExtra ( SCROLL _MESSAGE _ID , - 1 ) )
messageToScrollAuthor . set ( intent . getParcelableExtra ( SCROLL _MESSAGE _AUTHOR ) )
2022-01-14 06:56:15 +01:00
val thread = threadDb . getRecipientForThreadId ( viewModel . threadId )
2021-07-09 01:38:45 +02:00
if ( thread == null ) {
Toast . makeText ( this , " This thread has been deleted. " , Toast . LENGTH _LONG ) . show ( )
return finish ( )
}
2021-05-31 06:06:02 +02:00
setUpRecyclerView ( )
2021-06-15 06:55:57 +02:00
setUpToolBar ( )
2021-06-17 06:34:50 +02:00
setUpInputBar ( )
2021-07-30 02:05:07 +02:00
setUpLinkPreviewObserver ( )
2021-06-22 08:23:47 +02:00
restoreDraftIfNeeded ( )
2022-01-14 06:56:15 +01:00
setUpUiStateObserver ( )
2022-02-28 07:23:58 +01:00
binding !! . scrollToBottomButton . setOnClickListener {
2023-01-19 23:19:29 +01:00
val layoutManager = ( binding ?. conversationRecyclerView ?. layoutManager as ? LinearLayoutManager ) ?: return @setOnClickListener
2021-09-21 06:50:25 +02:00
if ( layoutManager . isSmoothScrolling ) {
2022-02-28 07:23:58 +01:00
binding ?. conversationRecyclerView ?. scrollToPosition ( 0 )
2021-09-21 06:50:25 +02:00
} else {
2023-01-19 23:19:29 +01:00
// It looks like 'smoothScrollToPosition' will actually load all intermediate items in
// order to do the scroll, this can be very slow if there are a lot of messages so
// instead we check the current position and if there are more than 10 items to scroll
// we jump instantly to the 10th item and scroll from there (this should happen quick
// enough to give a similar scroll effect without having to load everything)
val position = layoutManager . findFirstVisibleItemPosition ( )
if ( position > 10 ) {
binding ?. conversationRecyclerView ?. scrollToPosition ( 10 )
}
binding ?. conversationRecyclerView ?. post {
binding ?. conversationRecyclerView ?. smoothScrollToPosition ( 0 )
}
2021-09-21 06:50:25 +02:00
}
}
2022-01-14 06:56:15 +01:00
unreadCount = mmsSmsDb . getUnreadCount ( viewModel . threadId )
2021-06-25 02:02:59 +02:00
updateUnreadCountIndicator ( )
2021-06-24 03:22:32 +02:00
setUpTypingObserver ( )
2021-06-30 02:45:31 +02:00
setUpRecipientObserver ( )
2021-06-24 03:38:06 +02:00
updateSubtitle ( )
2021-06-24 03:43:51 +02:00
getLatestOpenGroupInfoIfNeeded ( )
2021-06-24 06:21:05 +02:00
setUpBlockedBanner ( )
2022-02-28 07:23:58 +01:00
binding !! . searchBottomBar . setEventListener ( this )
2021-06-29 06:00:47 +02:00
setUpSearchResultObserver ( )
2021-06-25 02:18:04 +02:00
scrollToFirstUnreadMessageIfNeeded ( )
2021-06-30 06:05:30 +02:00
showOrHideInputIfNeeded ( )
2022-03-04 07:46:39 +01:00
setUpMessageRequestsBar ( )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
viewModel . recipient ?. let { recipient ->
2022-09-04 13:03:32 +02:00
if ( recipient . isOpenGroupRecipient && viewModel . openGroup == null ) {
Toast . makeText ( this , " This thread has been deleted. " , Toast . LENGTH _LONG ) . show ( )
return finish ( )
2021-07-09 01:38:45 +02:00
}
}
2022-09-04 13:03:32 +02:00
val reactionOverlayStub : Stub < ConversationReactionOverlay > =
ViewUtil . findStubById ( this , R . id . conversation _reaction _scrubber _stub )
reactionDelegate = ConversationReactionDelegate ( reactionOverlayStub )
reactionDelegate . setOnReactionSelectedListener ( this )
2021-05-31 06:06:02 +02:00
}
2021-06-23 03:54:17 +02:00
override fun onResume ( ) {
super . onResume ( )
2022-01-14 06:56:15 +01:00
ApplicationContext . getInstance ( this ) . messageNotifier . setVisibleThread ( viewModel . threadId )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2023-01-05 23:50:31 +01:00
lifecycleScope . launch ( Dispatchers . IO ) {
threadDb . markAllAsRead ( viewModel . threadId , recipient . isOpenGroupRecipient )
}
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
contentResolver . registerContentObserver (
MediaStore . Images . Media . EXTERNAL _CONTENT _URI ,
true ,
screenshotObserver
)
2021-06-23 03:54:17 +02:00
}
override fun onPause ( ) {
super . onPause ( )
ApplicationContext . getInstance ( this ) . messageNotifier . setVisibleThread ( - 1 )
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
contentResolver . unregisterContentObserver ( screenshotObserver )
2021-06-23 03:54:17 +02:00
}
2021-06-25 08:30:23 +02:00
override fun getSystemService ( name : String ) : Any ? {
if ( name == ActivityDispatcher . SERVICE ) {
return this
}
return super . getSystemService ( name )
}
2021-06-28 01:59:33 +02:00
override fun dispatchIntent ( body : ( Context ) -> Intent ? ) {
val intent = body ( this ) ?: return
2021-06-25 08:30:23 +02:00
push ( intent , false )
}
2021-07-09 07:13:43 +02:00
override fun showDialog ( baseDialog : BaseDialog , tag : String ? ) {
baseDialog . show ( supportFragmentManager , tag )
}
2021-06-25 08:30:23 +02:00
2022-03-09 23:54:18 +01:00
override fun onCreateLoader ( id : Int , bundle : Bundle ? ) : Loader < Cursor > {
return ConversationLoader ( viewModel . threadId , !is IncomingMessageRequestThread ( ) , this @ConversationActivityV2 )
}
override fun onLoadFinished ( loader : Loader < Cursor > , cursor : Cursor ? ) {
adapter . changeCursor ( cursor )
if ( cursor != null ) {
val messageTimestamp = messageToScrollTimestamp . getAndSet ( - 1 )
val author = messageToScrollAuthor . getAndSet ( null )
if ( author != null && messageTimestamp >= 0 ) {
jumpToMessage ( author , messageTimestamp , null )
}
}
}
override fun onLoaderReset ( cursor : Loader < Cursor > ) {
adapter . changeCursor ( null )
}
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-05-31 06:06:02 +02:00
private fun setUpRecyclerView ( ) {
2022-02-28 07:23:58 +01:00
binding !! . conversationRecyclerView . adapter = adapter
2022-03-09 23:54:18 +01:00
val layoutManager = LinearLayoutManager ( this , LinearLayoutManager . VERTICAL , !is IncomingMessageRequestThread ( ) )
2022-02-28 07:23:58 +01:00
binding !! . conversationRecyclerView . layoutManager = layoutManager
2021-06-07 01:48:01 +02:00
// Workaround for the fact that CursorRecyclerViewAdapter doesn't auto-update automatically (even though it says it will)
2022-03-09 23:54:18 +01:00
LoaderManager . getInstance ( this ) . restartLoader ( 0 , null , this )
2022-02-28 07:23:58 +01:00
binding !! . conversationRecyclerView . addOnScrollListener ( object : RecyclerView . OnScrollListener ( ) {
2021-06-25 02:55:50 +02:00
override fun onScrolled ( recyclerView : RecyclerView , dx : Int , dy : Int ) {
handleRecyclerViewScrolled ( )
}
} )
2021-05-31 06:06:02 +02:00
}
2021-06-01 08:17:14 +02:00
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-06-15 06:55:57 +02:00
private fun setUpToolBar ( ) {
2022-09-04 13:03:32 +02:00
setSupportActionBar ( binding ?. toolbar )
2022-03-09 23:54:18 +01:00
val actionBar = supportActionBar ?: return
2022-09-13 07:06:20 +02:00
val recipient = viewModel . recipient ?: return
2022-01-14 06:56:15 +01:00
actionBar . title = " "
2022-09-04 13:03:32 +02:00
actionBar . setDisplayHomeAsUpEnabled ( true )
actionBar . setHomeButtonEnabled ( true )
2022-09-13 07:06:20 +02:00
binding !! . toolbarContent . conversationTitleView . text = when {
recipient . isLocalNumber -> getString ( R . string . note _to _self )
else -> recipient . toShortString ( )
}
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
@DimenRes val sizeID : Int = if ( viewModel . recipient ?. isClosedGroupRecipient == true ) {
2022-01-14 06:56:15 +01:00
R . dimen . medium _profile _picture _size
2021-07-01 02:02:02 +02:00
} else {
2022-01-14 06:56:15 +01:00
R . dimen . small _profile _picture _size
2021-07-01 02:02:02 +02:00
}
val size = resources . getDimension ( sizeID ) . roundToInt ( )
2022-09-04 13:03:32 +02:00
binding !! . toolbarContent . profilePictureView . root . layoutParams = LinearLayout . LayoutParams ( size , size )
binding !! . toolbarContent . profilePictureView . root . glide = glide
2022-01-14 06:56:15 +01:00
MentionManagerUtilities . populateUserPublicKeyCacheIfNeeded ( viewModel . threadId , this )
2022-09-04 13:03:32 +02:00
val profilePictureView = binding !! . toolbarContent . profilePictureView . root
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
viewModel . recipient ?. let { recipient ->
profilePictureView . update ( recipient )
}
2021-06-01 08:17:14 +02:00
}
2021-06-07 01:48:01 +02:00
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-06-17 06:34:50 +02:00
private fun setUpInputBar ( ) {
2022-10-03 04:15:14 +02:00
binding !! . inputBar . isVisible = viewModel . openGroup == null || viewModel . openGroup ?. canWrite == true
2022-02-28 07:23:58 +01:00
binding !! . inputBar . delegate = this
binding !! . inputBarRecordingView . delegate = this
2021-06-17 06:34:50 +02:00
// GIF button
2022-02-28 07:23:58 +01:00
binding !! . gifButtonContainer . addView ( gifButton )
2021-06-17 06:34:50 +02:00
gifButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
2021-06-25 07:53:47 +02:00
gifButton . onUp = { showGIFPicker ( ) }
2021-06-29 08:01:02 +02:00
gifButton . snIsEnabled = false
2021-06-17 06:34:50 +02:00
// Document button
2022-02-28 07:23:58 +01:00
binding !! . documentButtonContainer . addView ( documentButton )
2021-06-17 06:34:50 +02:00
documentButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
2021-06-25 07:53:47 +02:00
documentButton . onUp = { showDocumentPicker ( ) }
2021-06-29 08:01:02 +02:00
documentButton . snIsEnabled = false
2021-06-17 06:34:50 +02:00
// Library button
2022-02-28 07:23:58 +01:00
binding !! . libraryButtonContainer . addView ( libraryButton )
2021-06-17 06:34:50 +02:00
libraryButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
2021-06-25 07:53:47 +02:00
libraryButton . onUp = { pickFromLibrary ( ) }
2021-06-29 08:01:02 +02:00
libraryButton . snIsEnabled = false
2021-06-17 06:34:50 +02:00
// Camera button
2022-02-28 07:23:58 +01:00
binding !! . cameraButtonContainer . addView ( cameraButton )
2021-06-17 06:34:50 +02:00
cameraButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
2021-06-25 07:53:47 +02:00
cameraButton . onUp = { showCamera ( ) }
2021-06-29 08:01:02 +02:00
cameraButton . snIsEnabled = false
2021-06-17 06:34:50 +02:00
}
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-06-22 08:23:47 +02:00
private fun restoreDraftIfNeeded ( ) {
2021-07-01 01:54:09 +02:00
val mediaURI = intent . data
val mediaType = AttachmentManager . MediaType . from ( intent . type )
if ( mediaURI != null && mediaType != null ) {
if ( AttachmentManager . MediaType . IMAGE == mediaType || AttachmentManager . MediaType . GIF == mediaType || AttachmentManager . MediaType . VIDEO == mediaType ) {
val media = Media ( mediaURI , MediaUtil . getMimeType ( this , mediaURI ) !! , 0 , 0 , 0 , 0 , Optional . absent ( ) , Optional . absent ( ) )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
startActivityForResult ( MediaSendActivity . buildEditorIntent ( this , listOf ( media ) , viewModel . recipient !! , " " ) , PICK _FROM _LIBRARY )
2021-07-01 01:54:09 +02:00
return
} else {
prepMediaForSending ( mediaURI , mediaType ) . addListener ( object : ListenableFuture . Listener < Boolean > {
override fun onSuccess ( result : Boolean ? ) {
sendAttachments ( attachmentManager . buildSlideDeck ( ) . asAttachments ( ) , null )
}
override fun onFailure ( e : ExecutionException ? ) {
Toast . makeText ( this @ConversationActivityV2 , R . string . activity _conversation _attachment _prep _failed , Toast . LENGTH _LONG ) . show ( )
}
} )
return
}
2021-07-12 07:44:46 +02:00
} else if ( intent . hasExtra ( Intent . EXTRA _TEXT ) ) {
val dataTextExtra = intent . getCharSequenceExtra ( Intent . EXTRA _TEXT ) ?: " "
2022-02-28 07:23:58 +01:00
binding !! . inputBar . text = dataTextExtra . toString ( )
2021-07-12 07:44:46 +02:00
} else {
2022-01-14 06:56:15 +01:00
viewModel . getDraft ( ) ?. let { text ->
2022-02-28 07:23:58 +01:00
binding !! . inputBar . text = text
2022-01-14 06:56:15 +01:00
}
2021-07-01 01:54:09 +02:00
}
2021-06-22 08:23:47 +02:00
}
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-06-24 03:22:32 +02:00
private fun setUpTypingObserver ( ) {
2022-01-14 06:56:15 +01:00
ApplicationContext . getInstance ( this ) . typingStatusRepository . getTypists ( viewModel . threadId ) . observe ( this ) { state ->
2021-06-24 03:22:32 +02:00
val recipients = if ( state != null ) state . typists else listOf ( )
2021-06-30 03:02:46 +02:00
// FIXME: Also checking isScrolledToBottom is a quick fix for an issue where the
// typing indicator overlays the recycler view when scrolled up
2022-02-28 07:23:58 +01:00
val viewContainer = binding ?. typingIndicatorViewContainer ?: return @observe
viewContainer . isVisible = recipients . isNotEmpty ( ) && isScrolledToBottom
viewContainer . setTypists ( recipients )
2021-06-24 03:22:32 +02:00
}
2022-01-14 06:56:15 +01:00
if ( textSecurePreferences . isTypingIndicatorsEnabled ( ) ) {
2022-02-28 07:23:58 +01:00
binding !! . inputBar . addTextChangedListener ( object : SimpleTextWatcher ( ) {
2021-06-25 03:11:03 +02:00
override fun onTextChanged ( text : String ? ) {
2022-01-14 06:56:15 +01:00
ApplicationContext . getInstance ( this @ConversationActivityV2 ) . typingStatusSender . onTypingStarted ( viewModel . threadId )
2021-06-25 03:11:03 +02:00
}
} )
}
2021-06-24 03:22:32 +02:00
}
2021-06-30 02:45:31 +02:00
private fun setUpRecipientObserver ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
viewModel . recipient ?. addListener ( this )
2021-06-30 02:45:31 +02:00
}
2022-02-28 07:23:58 +01:00
private fun tearDownRecipientObserver ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
viewModel . recipient ?. removeListener ( this )
2022-02-28 07:23:58 +01:00
}
2021-06-24 03:43:51 +02:00
private fun getLatestOpenGroupInfoIfNeeded ( ) {
2022-09-04 13:03:32 +02:00
viewModel . openGroup ?. let {
OpenGroupApi . getMemberCount ( it . room , it . server ) . successUi { updateSubtitle ( ) }
}
2021-06-24 03:43:51 +02:00
}
2022-02-28 07:23:58 +01:00
// called from onCreate
2021-06-24 06:21:05 +02:00
private fun setUpBlockedBanner ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
if ( recipient . isGroupRecipient ) { return }
val sessionID = recipient . address . toString ( )
2022-01-14 06:56:15 +01:00
val contact = sessionContactDb . getContactWithSessionID ( sessionID )
2021-06-24 06:21:05 +02:00
val name = contact ?. displayName ( Contact . ContactContext . REGULAR ) ?: sessionID
2022-02-28 07:23:58 +01:00
binding ?. blockedBannerTextView ?. text = resources . getString ( R . string . activity _conversation _blocked _banner _text , name )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
binding ?. blockedBanner ?. isVisible = recipient . isBlocked
2022-02-28 07:23:58 +01:00
binding ?. blockedBanner ?. setOnClickListener { viewModel . unblock ( ) }
2021-06-24 06:21:05 +02:00
}
2021-06-24 07:46:36 +02:00
private fun setUpLinkPreviewObserver ( ) {
2022-01-14 06:56:15 +01:00
if ( ! textSecurePreferences . isLinkPreviewsEnabled ( ) ) {
2021-06-24 07:46:36 +02:00
linkPreviewViewModel . onUserCancel ( ) ; return
}
2022-01-14 06:56:15 +01:00
linkPreviewViewModel . linkPreviewState . observe ( this ) { previewState : LinkPreviewState ? ->
2021-06-24 07:46:36 +02:00
if ( previewState == null ) return @observe
2022-01-14 06:56:15 +01:00
when {
previewState . isLoading -> {
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. draftLinkPreview ( )
2022-01-14 06:56:15 +01:00
}
previewState . linkPreview . isPresent -> {
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. updateLinkPreviewDraft ( glide , previewState . linkPreview . get ( ) )
2022-01-14 06:56:15 +01:00
}
else -> {
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. cancelLinkPreviewDraft ( )
2022-01-14 06:56:15 +01:00
}
2021-06-24 07:46:36 +02:00
}
2022-01-14 06:56:15 +01:00
}
}
private fun setUpUiStateObserver ( ) {
lifecycleScope . launchWhenStarted {
viewModel . uiState . collect { uiState ->
uiState . uiMessages . firstOrNull ( ) ?. let {
Toast . makeText ( this @ConversationActivityV2 , it . message , Toast . LENGTH _LONG ) . show ( )
viewModel . messageShown ( it . id )
}
2022-03-04 07:46:39 +01:00
if ( uiState . isMessageRequestAccepted == true ) {
binding ?. messageRequestBar ?. visibility = View . GONE
}
2022-01-14 06:56:15 +01:00
}
}
2021-06-24 07:46:36 +02:00
}
2021-06-25 02:18:04 +02:00
private fun scrollToFirstUnreadMessageIfNeeded ( ) {
2022-01-14 06:56:15 +01:00
val lastSeenTimestamp = threadDb . getLastSeenAndHasSent ( viewModel . threadId ) . first ( )
2021-06-25 01:38:26 +02:00
val lastSeenItemPosition = adapter . findLastSeenItemPosition ( lastSeenTimestamp ) ?: return
2021-06-25 02:18:04 +02:00
if ( lastSeenItemPosition <= 3 ) { return }
2022-02-28 07:23:58 +01:00
binding ?. conversationRecyclerView ?. scrollToPosition ( lastSeenItemPosition )
2021-06-25 01:38:26 +02:00
}
2021-06-07 01:48:01 +02:00
override fun onPrepareOptionsMenu ( menu : Menu ) : Boolean {
2022-09-13 07:06:46 +02:00
val recipient = viewModel . recipient ?: return false
2022-03-04 07:46:39 +01:00
if ( !is MessageRequestThread ( ) ) {
2022-09-13 07:06:46 +02:00
ConversationMenuHelper . onPrepareOptionsMenu (
menu ,
menuInflater ,
recipient ,
viewModel . threadId ,
this
) { onOptionsItemSelected ( it ) }
2022-03-04 07:46:39 +01:00
}
2021-06-07 06:04:55 +02:00
return true
2021-06-07 01:48:01 +02:00
}
2021-06-22 08:23:47 +02:00
override fun onDestroy ( ) {
2022-02-28 07:23:58 +01:00
viewModel . saveDraft ( binding ?. inputBar ?. text ?. trim ( ) ?: " " )
tearDownRecipientObserver ( )
2021-06-22 08:23:47 +02:00
super . onDestroy ( )
2022-02-28 07:23:58 +01:00
binding = null
2022-09-04 13:03:32 +02:00
// actionBarBinding = null
2021-06-22 08:23:47 +02:00
}
2021-06-01 08:17:14 +02:00
// endregion
2021-06-30 06:05:30 +02:00
// region Animation & Updating
2021-06-30 02:45:31 +02:00
override fun onModified ( recipient : Recipient ) {
2021-06-30 05:15:39 +02:00
runOnUiThread {
2022-09-13 07:06:20 +02:00
val threadRecipient = viewModel . recipient ?: return @runOnUiThread
if ( threadRecipient . isContactRecipient ) {
binding ?. blockedBanner ?. isVisible = threadRecipient . isBlocked
2021-06-30 05:15:39 +02:00
}
2022-03-17 03:01:33 +01:00
setUpMessageRequestsBar ( )
2022-03-09 23:54:18 +01:00
invalidateOptionsMenu ( )
2021-06-30 05:15:39 +02:00
updateSubtitle ( )
2021-06-30 06:05:30 +02:00
showOrHideInputIfNeeded ( )
2022-09-13 07:06:20 +02:00
binding ?. toolbarContent ?. profilePictureView ?. root ?. update ( threadRecipient )
2022-10-24 05:24:57 +02:00
binding ?. toolbarContent ?. conversationTitleView ?. text = when {
2022-09-13 07:06:20 +02:00
threadRecipient . isLocalNumber -> getString ( R . string . note _to _self )
else -> threadRecipient . toShortString ( )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
}
2021-06-30 06:05:30 +02:00
}
}
private fun showOrHideInputIfNeeded ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient
if ( recipient != null && recipient . isClosedGroupRecipient ) {
val group = groupDb . getGroup ( recipient . address . toGroupString ( ) ) . orNull ( )
2021-06-30 06:05:30 +02:00
val isActive = ( group ?. isActive == true )
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. showInput = isActive
2021-06-30 06:05:30 +02:00
} else {
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. showInput = true
2021-06-30 02:45:31 +02:00
}
}
2022-03-04 07:46:39 +01:00
private fun setUpMessageRequestsBar ( ) {
binding ?. inputBar ?. showMediaControls = !is OutgoingMessageRequestThread ( )
binding ?. messageRequestBar ?. isVisible = isIncomingMessageRequestThread ( )
binding ?. acceptMessageRequestButton ?. setOnClickListener {
acceptMessageRequest ( )
}
2022-09-13 07:06:46 +02:00
binding ?. messageRequestBlock ?. setOnClickListener {
block ( deleteThread = true )
}
2022-03-04 07:46:39 +01:00
binding ?. declineMessageRequestButton ?. setOnClickListener {
viewModel . declineMessageRequest ( )
lifecycleScope . launch ( Dispatchers . IO ) {
ConfigurationMessageUtilities . forceSyncConfigurationNowIfNeeded ( this @ConversationActivityV2 )
}
finish ( )
}
}
private fun acceptMessageRequest ( ) {
binding ?. messageRequestBar ?. isVisible = false
binding ?. conversationRecyclerView ?. layoutManager =
LinearLayoutManager ( this , LinearLayoutManager . VERTICAL , true )
2022-03-09 23:54:18 +01:00
adapter . notifyDataSetChanged ( )
2022-03-04 07:46:39 +01:00
viewModel . acceptMessageRequest ( )
2022-03-09 23:54:18 +01:00
LoaderManager . getInstance ( this ) . restartLoader ( 0 , null , this )
2022-03-04 07:46:39 +01:00
lifecycleScope . launch ( Dispatchers . IO ) {
ConfigurationMessageUtilities . forceSyncConfigurationNowIfNeeded ( this @ConversationActivityV2 )
}
}
private fun isMessageRequestThread ( ) : Boolean {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return false
return ! recipient . isGroupRecipient && ! recipient . isApproved
2022-03-04 07:46:39 +01:00
}
private fun isOutgoingMessageRequestThread ( ) : Boolean {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return false
return ! recipient . isGroupRecipient &&
! recipient . isLocalNumber &&
! ( recipient . hasApprovedMe ( ) || viewModel . hasReceived ( ) )
2022-03-04 07:46:39 +01:00
}
private fun isIncomingMessageRequestThread ( ) : Boolean {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return false
return ! recipient . isGroupRecipient &&
! recipient . isApproved &&
! recipient . isLocalNumber &&
2022-03-04 07:46:39 +01:00
! threadDb . getLastSeenAndHasSent ( viewModel . threadId ) . second ( ) &&
threadDb . getMessageCount ( viewModel . threadId ) > 0
}
2021-06-18 03:00:52 +02:00
override fun inputBarEditTextContentChanged ( newContent : CharSequence ) {
2022-02-28 07:23:58 +01:00
val inputBarText = binding ?. inputBar ?. text ?: return // TODO check if we should be referencing newContent here instead
2022-01-14 06:56:15 +01:00
if ( textSecurePreferences . isLinkPreviewsEnabled ( ) ) {
2022-02-28 07:23:58 +01:00
linkPreviewViewModel . onTextChanged ( this , inputBarText , 0 , 0 )
2021-06-29 07:48:40 +02:00
}
2021-06-25 06:42:04 +02:00
showOrHideMentionCandidatesIfNeeded ( newContent )
2021-06-29 07:48:40 +02:00
if ( LinkPreviewUtil . findWhitelistedUrls ( newContent . toString ( ) ) . isNotEmpty ( )
2022-01-14 06:56:15 +01:00
&& ! textSecurePreferences . isLinkPreviewsEnabled ( ) && ! textSecurePreferences . hasSeenLinkPreviewSuggestionDialog ( ) ) {
2021-06-29 07:48:40 +02:00
LinkPreviewDialog {
setUpLinkPreviewObserver ( )
2022-01-14 06:56:15 +01:00
linkPreviewViewModel . onEnabled ( )
2022-02-28 07:23:58 +01:00
linkPreviewViewModel . onTextChanged ( this , inputBarText , 0 , 0 )
2021-06-29 07:48:40 +02:00
} . show ( supportFragmentManager , " Link Preview Dialog " )
2022-01-14 06:56:15 +01:00
textSecurePreferences . setHasSeenLinkPreviewSuggestionDialog ( )
2021-06-29 07:48:40 +02:00
}
2021-06-18 03:00:52 +02:00
}
2021-06-25 06:42:04 +02:00
private fun showOrHideMentionCandidatesIfNeeded ( text : CharSequence ) {
2021-06-25 07:11:38 +02:00
if ( text . length < previousText . length ) {
2021-06-25 06:42:04 +02:00
currentMentionStartIndex = - 1
hideMentionCandidates ( )
val mentionsToRemove = mentions . filter { ! text . contains ( it . displayName ) }
mentions . removeAll ( mentionsToRemove )
2021-06-18 03:05:14 +02:00
}
2021-06-25 06:42:04 +02:00
if ( text . isNotEmpty ( ) ) {
val lastCharIndex = text . lastIndex
val lastChar = text [ lastCharIndex ]
2021-06-25 07:11:38 +02:00
// Check if there is whitespace before the '@' or the '@' is the first character
val isCharacterBeforeLastWhiteSpaceOrStartOfLine : Boolean
if ( text . length == 1 ) {
isCharacterBeforeLastWhiteSpaceOrStartOfLine = true // Start of line
} else {
val charBeforeLast = text [ lastCharIndex - 1 ]
isCharacterBeforeLastWhiteSpaceOrStartOfLine = Character . isWhitespace ( charBeforeLast )
}
if ( lastChar == '@' && isCharacterBeforeLastWhiteSpaceOrStartOfLine ) {
2021-06-25 06:42:04 +02:00
currentMentionStartIndex = lastCharIndex
showOrUpdateMentionCandidatesIfNeeded ( )
2021-06-25 07:11:38 +02:00
} else if ( Character . isWhitespace ( lastChar ) || lastChar == '@' ) { // the lastCharacter == "@" is to check for @@
2021-06-25 06:42:04 +02:00
currentMentionStartIndex = - 1
hideMentionCandidates ( )
} else if ( currentMentionStartIndex != - 1 ) {
val query = text . substring ( currentMentionStartIndex + 1 ) // + 1 to get rid of the "@"
showOrUpdateMentionCandidatesIfNeeded ( query )
}
2022-02-09 04:18:22 +01:00
} else {
currentMentionStartIndex = - 1
hideMentionCandidates ( )
2021-06-25 06:42:04 +02:00
}
previousText = text
}
private fun showOrUpdateMentionCandidatesIfNeeded ( query : String = " " ) {
2022-02-28 07:23:58 +01:00
val additionalContentContainer = binding ?. additionalContentContainer ?: return
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2021-06-25 06:42:04 +02:00
if ( !is ShowingMentionCandidatesView ) {
2022-02-28 07:23:58 +01:00
additionalContentContainer . removeAllViews ( )
2021-06-25 06:42:04 +02:00
val view = MentionCandidatesView ( this )
view . glide = glide
2021-06-25 07:11:38 +02:00
view . onCandidateSelected = { handleMentionSelected ( it ) }
2022-02-28 07:23:58 +01:00
additionalContentContainer . addView ( view )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val candidates = MentionsManager . getMentionCandidates ( query , viewModel . threadId , recipient . isOpenGroupRecipient )
2021-06-25 06:42:04 +02:00
this . mentionCandidatesView = view
2022-01-14 06:56:15 +01:00
view . show ( candidates , viewModel . threadId )
2021-06-25 06:42:04 +02:00
} else {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val candidates = MentionsManager . getMentionCandidates ( query , viewModel . threadId , recipient . isOpenGroupRecipient )
2021-06-25 06:42:04 +02:00
this . mentionCandidatesView !! . setMentionCandidates ( candidates )
}
isShowingMentionCandidatesView = true
2021-06-18 03:05:14 +02:00
}
private fun hideMentionCandidates ( ) {
2021-06-25 06:42:04 +02:00
if ( isShowingMentionCandidatesView ) {
val mentionCandidatesView = mentionCandidatesView ?: return
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , mentionCandidatesView . alpha , 0.0f )
animation . duration = 250L
animation . addUpdateListener { animator ->
mentionCandidatesView . alpha = animator . animatedValue as Float
2022-02-28 07:23:58 +01:00
if ( animator . animatedFraction == 1.0f ) { binding ?. additionalContentContainer ?. removeAllViews ( ) }
2021-06-25 06:42:04 +02:00
}
animation . start ( )
2021-06-18 03:05:14 +02:00
}
2021-06-25 06:42:04 +02:00
isShowingMentionCandidatesView = false
2021-06-18 03:00:52 +02:00
}
2021-06-17 08:29:57 +02:00
override fun toggleAttachmentOptions ( ) {
val targetAlpha = if ( isShowingAttachmentOptions ) 0.0f else 1.0f
2022-02-28 07:23:58 +01:00
val allButtonContainers = listOfNotNull (
binding ?. cameraButtonContainer ,
binding ?. libraryButtonContainer ,
binding ?. documentButtonContainer ,
binding ?. gifButtonContainer
)
2021-06-18 01:51:44 +02:00
val isReversed = isShowingAttachmentOptions // Run the animation in reverse
2021-06-29 08:01:02 +02:00
val count = allButtonContainers . size
allButtonContainers . indices . forEach { index ->
val view = allButtonContainers [ index ]
2021-06-17 08:29:57 +02:00
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , view . alpha , targetAlpha )
animation . duration = 250L
2021-06-18 01:51:44 +02:00
animation . startDelay = if ( isReversed ) 50L * ( count - index . toLong ( ) ) else 50L * index . toLong ( )
2021-06-17 08:29:57 +02:00
animation . addUpdateListener { animator ->
view . alpha = animator . animatedValue as Float
}
animation . start ( )
}
isShowingAttachmentOptions = !is ShowingAttachmentOptions
2021-06-29 08:01:02 +02:00
val allButtons = listOf ( cameraButton , libraryButton , documentButton , gifButton )
allButtons . forEach { it . snIsEnabled = isShowingAttachmentOptions }
2021-06-17 08:29:57 +02:00
}
2021-06-16 06:50:41 +02:00
override fun showVoiceMessageUI ( ) {
2022-02-28 07:23:58 +01:00
binding ?. inputBarRecordingView ?. show ( )
binding ?. inputBar ?. alpha = 0.0f
2021-06-17 08:07:11 +02:00
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , 1.0f , 0.0f )
animation . duration = 250L
animation . addUpdateListener { animator ->
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. alpha = animator . animatedValue as Float
2021-06-17 08:07:11 +02:00
}
animation . start ( )
}
2021-06-18 07:54:24 +02:00
private fun expandVoiceMessageLockView ( ) {
2022-02-28 07:23:58 +01:00
val lockView = binding ?. inputBarRecordingView ?. lockView ?: return
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , lockView . scaleX , 1.10f )
2021-06-18 07:54:24 +02:00
animation . duration = 250L
animation . addUpdateListener { animator ->
2022-02-28 07:23:58 +01:00
lockView . scaleX = animator . animatedValue as Float
lockView . scaleY = animator . animatedValue as Float
2021-06-18 07:54:24 +02:00
}
animation . start ( )
}
private fun collapseVoiceMessageLockView ( ) {
2022-02-28 07:23:58 +01:00
val lockView = binding ?. inputBarRecordingView ?. lockView ?: return
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , lockView . scaleX , 1.0f )
2021-06-18 07:54:24 +02:00
animation . duration = 250L
animation . addUpdateListener { animator ->
2022-02-28 07:23:58 +01:00
lockView . scaleX = animator . animatedValue as Float
lockView . scaleY = animator . animatedValue as Float
2021-06-18 07:54:24 +02:00
}
animation . start ( )
}
private fun hideVoiceMessageUI ( ) {
2022-02-28 07:23:58 +01:00
val chevronImageView = binding ?. inputBarRecordingView ?. chevronImageView ?: return
val slideToCancelTextView = binding ?. inputBarRecordingView ?. slideToCancelTextView ?: return
2021-06-18 07:54:24 +02:00
listOf ( chevronImageView , slideToCancelTextView ) . forEach { view ->
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , view . translationX , 0.0f )
animation . duration = 250L
animation . addUpdateListener { animator ->
view . translationX = animator . animatedValue as Float
}
animation . start ( )
}
2022-02-28 07:23:58 +01:00
binding ?. inputBarRecordingView ?. hide ( )
2021-06-18 07:54:24 +02:00
}
override fun handleVoiceMessageUIHidden ( ) {
2022-02-28 07:23:58 +01:00
val inputBar = binding ?. inputBar ?: return
inputBar . alpha = 1.0f
2021-06-17 08:07:11 +02:00
val animation = ValueAnimator . ofObject ( FloatEvaluator ( ) , 0.0f , 1.0f )
animation . duration = 250L
animation . addUpdateListener { animator ->
2022-02-28 07:23:58 +01:00
inputBar . alpha = animator . animatedValue as Float
2021-06-17 08:07:11 +02:00
}
animation . start ( )
2021-06-16 06:50:41 +02:00
}
2021-06-23 06:48:29 +02:00
2021-06-25 02:55:50 +02:00
private fun handleRecyclerViewScrolled ( ) {
2021-06-30 03:02:46 +02:00
// FIXME: Checking isScrolledToBottom is a quick fix for an issue where the
// typing indicator overlays the recycler view when scrolled up
2022-02-28 07:23:58 +01:00
val binding = binding ?: return
2022-01-14 06:56:15 +01:00
val wasTypingIndicatorVisibleBefore = binding . typingIndicatorViewContainer . isVisible
binding . typingIndicatorViewContainer . isVisible = wasTypingIndicatorVisibleBefore && isScrolledToBottom
2022-02-28 07:23:58 +01:00
binding . typingIndicatorViewContainer . isVisible
2022-09-04 13:03:32 +02:00
showOrHidScrollToBottomButton ( )
2022-02-28 07:23:58 +01:00
val firstVisiblePosition = layoutManager ?. findFirstVisibleItemPosition ( ) ?: - 1
unreadCount = min ( unreadCount , firstVisiblePosition ) . coerceAtLeast ( 0 )
2021-06-25 02:02:59 +02:00
updateUnreadCountIndicator ( )
2021-06-24 02:04:43 +02:00
}
2022-09-04 13:03:32 +02:00
private fun showOrHidScrollToBottomButton ( show : Boolean = true ) {
binding ?. scrollToBottomButton ?. isVisible = show && !is ScrolledToBottom && adapter . itemCount > 0
}
2021-06-25 02:02:59 +02:00
private fun updateUnreadCountIndicator ( ) {
2022-02-28 07:23:58 +01:00
val binding = binding ?: return
2022-01-18 12:32:20 +01:00
val formattedUnreadCount = if ( unreadCount < 10000 ) unreadCount . toString ( ) else " 9999+ "
2022-01-14 06:56:15 +01:00
binding . unreadCountTextView . text = formattedUnreadCount
2022-01-18 12:32:20 +01:00
val textSize = if ( unreadCount < 10000 ) 12.0f else 9.0f
2022-01-14 06:56:15 +01:00
binding . unreadCountTextView . setTextSize ( TypedValue . COMPLEX _UNIT _DIP , textSize )
binding . unreadCountTextView . setTypeface ( Typeface . DEFAULT , if ( unreadCount < 100 ) Typeface . BOLD else Typeface . NORMAL )
binding . unreadCountIndicator . isVisible = ( unreadCount != 0 )
2021-06-23 06:48:29 +02:00
}
2021-06-24 03:38:06 +02:00
private fun updateSubtitle ( ) {
2022-09-04 13:03:32 +02:00
val actionBarBinding = binding ?. toolbarContent ?: return
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
actionBarBinding . muteIconImageView . isVisible = recipient . isMuted
2022-01-14 06:56:15 +01:00
actionBarBinding . conversationSubtitleView . isVisible = true
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
if ( recipient . isMuted ) {
if ( recipient . mutedUntil != Long . MAX _VALUE ) {
actionBarBinding . conversationSubtitleView . text = getString ( R . string . ConversationActivity _muted _until _date , DateUtils . getFormattedDateTime ( recipient . mutedUntil , " EEE, MMM d, yyyy HH:mm " , Locale . getDefault ( ) ) )
2021-07-26 01:37:39 +02:00
} else {
2022-01-14 06:56:15 +01:00
actionBarBinding . conversationSubtitleView . text = getString ( R . string . ConversationActivity _muted _forever )
2021-07-26 01:37:39 +02:00
}
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
} else if ( recipient . isGroupRecipient ) {
2022-09-04 13:03:32 +02:00
viewModel . openGroup ?. let { openGroup ->
2021-10-04 09:51:19 +02:00
val userCount = lokiApiDb . getUserCount ( openGroup . room , openGroup . server ) ?: 0
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
actionBarBinding . conversationSubtitleView . text = getString ( R . string . ConversationActivity _active _member _count , userCount )
2022-09-04 13:03:32 +02:00
} ?: run {
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
val userCount = groupDb . getGroupMemberAddresses ( recipient . address . toGroupString ( ) , true ) . size
actionBarBinding . conversationSubtitleView . text = getString ( R . string . ConversationActivity _member _count , userCount )
2021-06-24 03:38:06 +02:00
}
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
viewModel
2021-06-24 03:38:06 +02:00
} else {
2022-01-14 06:56:15 +01:00
actionBarBinding . conversationSubtitleView . isVisible = false
2021-06-24 03:38:06 +02:00
}
2021-06-23 06:48:29 +02:00
}
2021-06-16 01:51:50 +02:00
// endregion
2021-06-01 08:17:14 +02:00
// region Interaction
2021-06-07 01:48:01 +02:00
override fun onOptionsItemSelected ( item : MenuItem ) : Boolean {
2021-06-29 08:05:40 +02:00
if ( item . itemId == android . R . id . home ) {
return false
}
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
return viewModel . recipient ?. let { recipient ->
ConversationMenuHelper . onOptionItemSelected ( this , item , recipient )
} ?: false
2021-06-01 08:17:14 +02:00
}
2021-06-04 05:15:43 +02:00
2022-09-13 07:06:46 +02:00
override fun block ( deleteThread : Boolean ) {
val title = R . string . RecipientPreferenceActivity _block _this _contact _question
val message = R . string . RecipientPreferenceActivity _you _will _no _longer _receive _messages _and _calls _from _this _contact
AlertDialog . Builder ( this )
. setTitle ( title )
. setMessage ( message )
. setNegativeButton ( android . R . string . cancel , null )
. setPositiveButton ( R . string . RecipientPreferenceActivity _block ) { _ , _ ->
viewModel . block ( )
if ( deleteThread ) {
viewModel . deleteThread ( )
finish ( )
}
} . show ( )
}
override fun copySessionID ( sessionId : String ) {
val clip = ClipData . newPlainText ( " Session ID " , sessionId )
val manager = getSystemService ( PassphraseRequiredActionBarActivity . CLIPBOARD _SERVICE ) as ClipboardManager
manager . setPrimaryClip ( clip )
Toast . makeText ( this , R . string . copied _to _clipboard , Toast . LENGTH _SHORT ) . show ( )
}
override fun showExpiringMessagesDialog ( thread : Recipient ) {
if ( thread . isClosedGroupRecipient ) {
val group = groupDb . getGroup ( thread . address . toGroupString ( ) ) . orNull ( )
if ( group ?. isActive == false ) { return }
}
ExpirationDialog . show ( this , thread . expireMessages ) { expirationTime : Int ->
recipientDb . setExpireMessages ( thread , expirationTime )
val message = ExpirationTimerUpdate ( expirationTime )
message . recipient = thread . address . serialize ( )
message . sentTimestamp = System . currentTimeMillis ( )
val expiringMessageManager = ApplicationContext . getInstance ( this ) . expiringMessageManager
expiringMessageManager . setExpirationTimer ( message )
MessageSender . send ( message , thread . address )
invalidateOptionsMenu ( )
}
}
override fun unblock ( ) {
val title = R . string . ConversationActivity _unblock _this _contact _question
val message = R . string . ConversationActivity _you _will _once _again _be _able _to _receive _messages _and _calls _from _this _contact
AlertDialog . Builder ( this )
. setTitle ( title )
. setMessage ( message )
. setNegativeButton ( android . R . string . cancel , null )
. setPositiveButton ( R . string . ConversationActivity _unblock ) { _ , _ ->
viewModel . unblock ( )
} . show ( )
}
2021-06-09 03:37:50 +02:00
// `position` is the adapter position; not the visual position
2021-06-30 06:29:32 +02:00
private fun handlePress ( message : MessageRecord , position : Int , view : VisibleMessageView , event : MotionEvent ) {
2021-06-07 06:04:55 +02:00
val actionMode = this . actionMode
if ( actionMode != null ) {
2022-02-06 02:41:35 +01:00
onDeselect ( message , position , actionMode )
2021-06-21 06:48:27 +02:00
} else {
2021-06-24 03:24:25 +02:00
// NOTE:
// We have to use onContentClick (rather than a click listener directly on
// the view) so as to not interfere with all the other gestures. Do not add
// onClickListeners directly to message content views.
2021-06-30 06:29:32 +02:00
view . onContentClick ( event )
2021-06-07 06:04:55 +02:00
}
}
2022-02-06 02:41:35 +01:00
private fun onDeselect ( message : MessageRecord , position : Int , actionMode : ActionMode ) {
adapter . toggleSelection ( message , position )
val actionModeCallback = ConversationActionModeCallback ( adapter , viewModel . threadId , this )
actionModeCallback . delegate = this
actionModeCallback . updateActionModeMenu ( actionMode . menu )
if ( adapter . selectedItems . isEmpty ( ) ) {
actionMode . finish ( )
this . actionMode = null
}
}
2021-06-09 03:37:50 +02:00
// `position` is the adapter position; not the visual position
2022-09-04 13:03:32 +02:00
private fun handleSwipeToReply ( message : MessageRecord ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
binding ?. inputBar ?. draftQuote ( recipient , message , glide )
2021-06-09 03:37:50 +02:00
}
// `position` is the adapter position; not the visual position
2021-06-07 06:04:55 +02:00
private fun handleLongPress ( message : MessageRecord , position : Int ) {
val actionMode = this . actionMode
2022-01-14 06:56:15 +01:00
val actionModeCallback = ConversationActionModeCallback ( adapter , viewModel . threadId , this )
2021-06-28 08:28:00 +02:00
actionModeCallback . delegate = this
2021-06-30 03:44:26 +02:00
searchViewItem ?. collapseActionView ( )
2021-06-07 06:04:55 +02:00
if ( actionMode == null ) { // Nothing should be selected if this is the case
adapter . toggleSelection ( message , position )
2022-01-14 06:56:15 +01:00
this . actionMode = startActionMode ( actionModeCallback , ActionMode . TYPE _PRIMARY )
2021-06-04 07:10:58 +02:00
} else {
2021-06-07 06:04:55 +02:00
adapter . toggleSelection ( message , position )
actionModeCallback . updateActionModeMenu ( actionMode . menu )
if ( adapter . selectedItems . isEmpty ( ) ) {
actionMode . finish ( )
this . actionMode = null
}
2021-06-04 07:10:58 +02:00
}
}
2021-06-17 02:53:56 +02:00
2022-09-04 13:03:32 +02:00
private fun showEmojiPicker ( message : MessageRecord , visibleMessageView : VisibleMessageView ) {
val messageContentBitmap = try {
visibleMessageView . messageContentView . drawToBitmap ( )
} catch ( e : Exception ) {
Log . e ( " Loki " , " Failed to show emoji picker " , e )
return
}
2022-09-13 06:17:47 +02:00
ViewUtil . hideKeyboard ( this , visibleMessageView )
2022-09-04 13:03:32 +02:00
binding ?. reactionsShade ?. isVisible = true
showOrHidScrollToBottomButton ( false )
binding ?. conversationRecyclerView ?. suppressLayout ( true )
reactionDelegate . setOnActionSelectedListener ( ReactionsToolbarListener ( message ) )
reactionDelegate . setOnHideListener ( object : ConversationReactionOverlay . OnHideListener {
override fun startHide ( ) {
binding ?. reactionsShade ?. let {
ViewUtil . fadeOut ( it , resources . getInteger ( R . integer . reaction _scrubber _hide _duration ) , View . GONE )
}
showOrHidScrollToBottomButton ( true )
}
override fun onHide ( ) {
binding ?. conversationRecyclerView ?. suppressLayout ( false )
WindowUtil . setLightStatusBarFromTheme ( this @ConversationActivityV2 ) ;
WindowUtil . setLightNavigationBarFromTheme ( this @ConversationActivityV2 ) ;
}
} )
val contentBounds = Rect ( )
visibleMessageView . messageContentView . getGlobalVisibleRect ( contentBounds )
val selectedConversationModel = SelectedConversationModel (
messageContentBitmap ,
contentBounds . left . toFloat ( ) ,
contentBounds . top . toFloat ( ) ,
visibleMessageView . messageContentView . width ,
message . isOutgoing ,
visibleMessageView . messageContentView
)
2022-09-13 06:17:47 +02:00
reactionDelegate . show ( this , message , selectedConversationModel , viewModel . blindedPublicKey )
2022-09-04 13:03:32 +02:00
}
override fun dispatchTouchEvent ( ev : MotionEvent ) : Boolean {
return reactionDelegate . applyTouchEvent ( ev ) || super . dispatchTouchEvent ( ev )
}
override fun onReactionSelected ( messageRecord : MessageRecord , emoji : String ) {
reactionDelegate . hide ( )
val oldRecord = messageRecord . reactions . find { it . author == textSecurePreferences . getLocalNumber ( ) }
if ( oldRecord != null && oldRecord . emoji == emoji ) {
sendEmojiRemoval ( emoji , messageRecord )
} else {
sendEmojiReaction ( emoji , messageRecord )
}
}
private fun sendEmojiReaction ( emoji : String , originalMessage : MessageRecord ) {
// Create the message
val recipient = viewModel . recipient ?: return
val reactionMessage = VisibleMessage ( )
val emojiTimestamp = System . currentTimeMillis ( )
reactionMessage . sentTimestamp = emojiTimestamp
val author = textSecurePreferences . getLocalNumber ( ) !!
// Put the message in the database
val reaction = ReactionRecord (
messageId = originalMessage . id ,
isMms = originalMessage . isMms ,
author = author ,
emoji = emoji ,
count = 1 ,
dateSent = emojiTimestamp ,
dateReceived = emojiTimestamp
)
2022-09-07 06:41:39 +02:00
reactionDb . addReaction ( MessageId ( originalMessage . id , originalMessage . isMms ) , reaction , false )
2022-09-05 03:29:47 +02:00
val originalAuthor = if ( originalMessage . isOutgoing ) {
fromSerialized ( viewModel . blindedPublicKey ?: textSecurePreferences . getLocalNumber ( ) !! )
} else originalMessage . individualRecipient . address
2022-09-04 13:03:32 +02:00
// Send it
2022-09-05 03:29:47 +02:00
reactionMessage . reaction = Reaction . from ( originalMessage . timestamp , originalAuthor . serialize ( ) , emoji , true )
2022-09-04 13:03:32 +02:00
if ( recipient . isOpenGroupRecipient ) {
val messageServerId = lokiMessageDb . getServerID ( originalMessage . id , ! originalMessage . isMms ) ?: return
viewModel . openGroup ?. let {
OpenGroupApi . addReaction ( it . room , it . server , messageServerId , emoji )
}
} else {
MessageSender . send ( reactionMessage , recipient . address )
}
LoaderManager . getInstance ( this ) . restartLoader ( 0 , null , this )
}
private fun sendEmojiRemoval ( emoji : String , originalMessage : MessageRecord ) {
val recipient = viewModel . recipient ?: return
val message = VisibleMessage ( )
val emojiTimestamp = System . currentTimeMillis ( )
message . sentTimestamp = emojiTimestamp
val author = textSecurePreferences . getLocalNumber ( ) !!
2022-09-07 06:41:39 +02:00
reactionDb . deleteReaction ( emoji , MessageId ( originalMessage . id , originalMessage . isMms ) , author , false )
2022-09-05 03:29:47 +02:00
val originalAuthor = if ( originalMessage . isOutgoing ) {
fromSerialized ( viewModel . blindedPublicKey ?: textSecurePreferences . getLocalNumber ( ) !! )
} else originalMessage . individualRecipient . address
message . reaction = Reaction . from ( originalMessage . timestamp , originalAuthor . serialize ( ) , emoji , false )
2022-09-04 13:03:32 +02:00
if ( recipient . isOpenGroupRecipient ) {
val messageServerId = lokiMessageDb . getServerID ( originalMessage . id , ! originalMessage . isMms ) ?: return
viewModel . openGroup ?. let {
OpenGroupApi . deleteReaction ( it . room , it . server , messageServerId , emoji )
}
} else {
MessageSender . send ( message , recipient . address )
}
LoaderManager . getInstance ( this ) . restartLoader ( 0 , null , this )
}
override fun onCustomReactionSelected ( messageRecord : MessageRecord , hasAddedCustomEmoji : Boolean ) {
val oldRecord = messageRecord . reactions . find { record -> record . author == textSecurePreferences . getLocalNumber ( ) }
if ( oldRecord != null && hasAddedCustomEmoji ) {
reactionDelegate . hide ( )
sendEmojiRemoval ( oldRecord . emoji , messageRecord )
} else {
reactionDelegate . hideForReactWithAny ( )
ReactWithAnyEmojiDialogFragment
. createForMessageRecord ( messageRecord , reactWithAnyEmojiStartPage )
. show ( supportFragmentManager , " BOTTOM " ) ;
}
}
override fun onReactWithAnyEmojiDialogDismissed ( ) {
reactionDelegate . hide ( )
}
override fun onReactWithAnyEmojiSelected ( emoji : String , messageId : MessageId ) {
reactionDelegate . hide ( )
val message = if ( messageId . mms ) {
mmsDb . getMessageRecord ( messageId . id )
} else {
smsDb . getMessageRecord ( messageId . id )
}
val oldRecord = reactionDb . getReactions ( messageId ) . find { it . author == textSecurePreferences . getLocalNumber ( ) }
if ( oldRecord ?. emoji == emoji ) {
sendEmojiRemoval ( emoji , message )
} else {
sendEmojiReaction ( emoji , message )
}
}
override fun onRemoveReaction ( emoji : String , messageId : MessageId ) {
val message = if ( messageId . mms ) {
mmsDb . getMessageRecord ( messageId . id )
} else {
smsDb . getMessageRecord ( messageId . id )
}
sendEmojiRemoval ( emoji , message )
}
override fun onClearAll ( emoji : String , messageId : MessageId ) {
reactionDb . deleteEmojiReactions ( emoji , messageId )
viewModel . openGroup ?. let { openGroup ->
lokiMessageDb . getServerID ( messageId . id , ! messageId . mms ) ?. let { serverId ->
OpenGroupApi . deleteAllReactions ( openGroup . room , openGroup . server , serverId , emoji )
}
}
threadDb . notifyThreadUpdated ( viewModel . threadId )
}
2021-06-17 02:53:56 +02:00
override fun onMicrophoneButtonMove ( event : MotionEvent ) {
val rawX = event . rawX
2022-02-28 07:23:58 +01:00
val chevronImageView = binding ?. inputBarRecordingView ?. chevronImageView ?: return
val slideToCancelTextView = binding ?. inputBarRecordingView ?. slideToCancelTextView ?: return
2021-06-17 02:53:56 +02:00
if ( rawX < screenWidth / 2 ) {
val translationX = rawX - screenWidth / 2
val sign = - 1.0f
val chevronDamping = 4.0f
val labelDamping = 3.0f
val chevronX = ( chevronDamping * ( sqrt ( abs ( translationX ) ) / sqrt ( chevronDamping ) ) ) * sign
val labelX = ( labelDamping * ( sqrt ( abs ( translationX ) ) / sqrt ( labelDamping ) ) ) * sign
chevronImageView . translationX = chevronX
slideToCancelTextView . translationX = labelX
} else {
chevronImageView . translationX = 0.0f
slideToCancelTextView . translationX = 0.0f
}
2021-06-17 05:18:09 +02:00
if ( isValidLockViewLocation ( event . rawX . roundToInt ( ) , event . rawY . roundToInt ( ) ) ) {
if ( !is LockViewExpanded ) {
2021-06-18 07:54:24 +02:00
expandVoiceMessageLockView ( )
2021-06-17 05:18:09 +02:00
isLockViewExpanded = true
}
} else {
if ( isLockViewExpanded ) {
2021-06-18 07:54:24 +02:00
collapseVoiceMessageLockView ( )
2021-06-17 05:18:09 +02:00
isLockViewExpanded = false
}
}
}
2021-06-17 02:53:56 +02:00
override fun onMicrophoneButtonCancel ( event : MotionEvent ) {
2021-06-18 07:54:24 +02:00
hideVoiceMessageUI ( )
2021-06-17 02:53:56 +02:00
}
override fun onMicrophoneButtonUp ( event : MotionEvent ) {
2021-06-28 03:26:13 +02:00
val x = event . rawX . roundToInt ( )
val y = event . rawY . roundToInt ( )
if ( isValidLockViewLocation ( x , y ) ) {
2022-02-28 07:23:58 +01:00
binding ?. inputBarRecordingView ?. lock ( )
2021-06-17 06:01:43 +02:00
} else {
2022-02-28 07:23:58 +01:00
val recordButtonOverlay = binding ?. inputBarRecordingView ?. recordButtonOverlay ?: return
2021-06-28 03:26:13 +02:00
val location = IntArray ( 2 ) { 0 }
recordButtonOverlay . getLocationOnScreen ( location )
val hitRect = Rect ( location [ 0 ] , location [ 1 ] , location [ 0 ] + recordButtonOverlay . width , location [ 1 ] + recordButtonOverlay . height )
if ( hitRect . contains ( x , y ) ) {
sendVoiceMessage ( )
} else {
cancelVoiceMessage ( )
}
2021-06-17 06:01:43 +02:00
}
2021-06-17 02:53:56 +02:00
}
2021-06-18 07:54:24 +02:00
private fun isValidLockViewLocation ( x : Int , y : Int ) : Boolean {
2021-06-23 05:57:13 +02:00
// We can be anywhere above the lock view and a bit to the side of it (at most `lockViewHitMargin`
// to the side)
2022-02-28 07:23:58 +01:00
val binding = binding ?: return false
2021-06-18 07:54:24 +02:00
val lockViewLocation = IntArray ( 2 ) { 0 }
2022-01-14 06:56:15 +01:00
binding . inputBarRecordingView . lockView . getLocationOnScreen ( lockViewLocation )
2021-06-18 07:54:24 +02:00
val hitRect = Rect ( lockViewLocation [ 0 ] - lockViewHitMargin , 0 ,
2022-01-14 06:56:15 +01:00
lockViewLocation [ 0 ] + binding . inputBarRecordingView . lockView . width + lockViewHitMargin , lockViewLocation [ 1 ] + binding . inputBarRecordingView . lockView . height )
2021-06-18 07:54:24 +02:00
return hitRect . contains ( x , y )
2021-06-17 02:53:56 +02:00
}
2021-06-24 06:21:05 +02:00
2021-06-25 07:11:38 +02:00
private fun handleMentionSelected ( mention : Mention ) {
2022-02-28 07:23:58 +01:00
val binding = binding ?: return
2021-06-25 07:11:38 +02:00
if ( currentMentionStartIndex == - 1 ) { return }
mentions . add ( mention )
2022-01-14 06:56:15 +01:00
val previousText = binding . inputBar . text
2021-06-25 07:11:38 +02:00
val newText = previousText . substring ( 0 , currentMentionStartIndex ) + " @ " + mention . displayName + " "
2022-01-14 06:56:15 +01:00
binding . inputBar . text = newText
binding . inputBar . setSelection ( newText . length )
2021-06-25 07:11:38 +02:00
currentMentionStartIndex = - 1
hideMentionCandidates ( )
this . previousText = newText
}
2021-06-30 02:30:10 +02:00
override fun scrollToMessageIfPossible ( timestamp : Long ) {
val lastSeenItemPosition = adapter . getItemPositionForTimestamp ( timestamp ) ?: return
2022-02-28 07:23:58 +01:00
binding ?. conversationRecyclerView ?. scrollToPosition ( lastSeenItemPosition )
2021-06-30 02:30:10 +02:00
}
2022-09-04 13:03:32 +02:00
override fun onReactionClicked ( emoji : String , messageId : MessageId , userWasSender : Boolean ) {
val message = if ( messageId . mms ) {
mmsDb . getMessageRecord ( messageId . id )
} else {
smsDb . getMessageRecord ( messageId . id )
}
if ( userWasSender ) {
sendEmojiRemoval ( emoji , message )
} else {
sendEmojiReaction ( emoji , message )
}
}
override fun onReactionLongClicked ( messageId : MessageId ) {
if ( viewModel . recipient ?. isGroupRecipient == true ) {
val isUserModerator = viewModel . openGroup ?. let { openGroup ->
val userPublicKey = textSecurePreferences . getLocalNumber ( ) ?: return @let false
OpenGroupManager . isUserModerator ( this , openGroup . id , userPublicKey , viewModel . blindedPublicKey )
} ?: false
val fragment = ReactionsDialogFragment . create ( messageId , isUserModerator )
fragment . show ( supportFragmentManager , null )
}
}
2021-07-14 01:37:18 +02:00
override fun playVoiceMessageAtIndexIfPossible ( indexInAdapter : Int ) {
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
if ( ! textSecurePreferences . autoplayAudioMessages ( ) ) return
2021-07-14 01:37:18 +02:00
if ( indexInAdapter < 0 || indexInAdapter >= adapter . itemCount ) { return }
2022-02-28 07:23:58 +01:00
val viewHolder = binding ?. conversationRecyclerView ?. findViewHolderForAdapterPosition ( indexInAdapter ) as ? ConversationAdapter . VisibleMessageViewHolder ?: return
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val visibleMessageView = ViewVisibleMessageBinding . bind ( viewHolder . view ) . visibleMessageView
visibleMessageView . playVoiceMessage ( )
2021-07-08 01:25:43 +02:00
}
2021-06-28 02:00:18 +02:00
override fun sendMessage ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
if ( recipient . isContactRecipient && recipient . isBlocked ) {
BlockedDialog ( recipient ) . show ( supportFragmentManager , " Blocked Dialog " )
2021-06-28 05:36:15 +02:00
return
}
2022-02-28 07:23:58 +01:00
val binding = binding ?: return
2022-01-14 06:56:15 +01:00
if ( binding . inputBar . linkPreview != null || binding . inputBar . quote != null ) {
sendAttachments ( listOf ( ) , getMessageBody ( ) , binding . inputBar . quote , binding . inputBar . linkPreview )
2021-06-28 05:29:17 +02:00
} else {
sendTextOnlyMessage ( )
}
}
2021-07-12 07:44:46 +02:00
override fun commitInputContent ( contentUri : Uri ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2021-07-12 07:44:46 +02:00
val media = Media ( contentUri , MediaUtil . getMimeType ( this , contentUri ) !! , 0 , 0 , 0 , 0 , Optional . absent ( ) , Optional . absent ( ) )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
startActivityForResult ( MediaSendActivity . buildEditorIntent ( this , listOf ( media ) , recipient , getMessageBody ( ) ) , PICK _FROM _LIBRARY )
2021-07-12 07:44:46 +02:00
}
2022-03-09 23:54:18 +01:00
private fun processMessageRequestApproval ( ) {
if ( isIncomingMessageRequestThread ( ) ) {
acceptMessageRequest ( )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
} else if ( viewModel . recipient ?. isApproved == false ) {
2022-03-09 23:54:18 +01:00
// edge case for new outgoing thread on new recipient without sending approval messages
viewModel . setRecipientApproved ( )
}
}
2021-07-19 05:52:50 +02:00
private fun sendTextOnlyMessage ( hasPermissionToSendSeed : Boolean = false ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2022-03-09 23:54:18 +01:00
processMessageRequestApproval ( )
2021-07-19 05:52:50 +02:00
val text = getMessageBody ( )
2022-01-14 06:56:15 +01:00
val userPublicKey = textSecurePreferences . getLocalNumber ( )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val isNoteToSelf = ( recipient . isContactRecipient && recipient . address . toString ( ) == userPublicKey )
2021-07-19 05:52:50 +02:00
if ( text . contains ( seed ) && !is NoteToSelf && ! hasPermissionToSendSeed ) {
val dialog = SendSeedDialog { sendTextOnlyMessage ( true ) }
return dialog . show ( supportFragmentManager , " Send Seed Dialog " )
}
2021-06-25 07:24:34 +02:00
// Create the message
2021-06-25 07:20:54 +02:00
val message = VisibleMessage ( )
message . sentTimestamp = System . currentTimeMillis ( )
2021-07-19 05:52:50 +02:00
message . text = text
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val outgoingTextMessage = OutgoingTextMessage . from ( message , recipient )
2021-06-25 07:24:34 +02:00
// Clear the input bar
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. text = " "
binding ?. inputBar ?. cancelQuoteDraft ( )
binding ?. inputBar ?. cancelLinkPreviewDraft ( )
2021-06-25 07:24:34 +02:00
// Clear mentions
previousText = " "
currentMentionStartIndex = - 1
mentions . clear ( )
// Put the message in the database
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
message . id = smsDb . insertMessageOutbox ( viewModel . threadId , outgoingTextMessage , false , message . sentTimestamp !! , null , true )
2021-06-25 07:24:34 +02:00
// Send it
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
MessageSender . send ( message , recipient . address )
2021-06-25 07:24:34 +02:00
// Send a typing stopped message
2022-01-14 06:56:15 +01:00
ApplicationContext . getInstance ( this ) . typingStatusSender . onTypingStopped ( viewModel . threadId )
2021-06-25 06:42:04 +02:00
}
2021-06-25 07:53:47 +02:00
2021-06-28 05:29:17 +02:00
private fun sendAttachments ( attachments : List < Attachment > , body : String ? , quotedMessage : MessageRecord ? = null , linkPreview : LinkPreview ? = null ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2022-03-09 23:54:18 +01:00
processMessageRequestApproval ( )
2021-06-28 02:00:18 +02:00
// Create the message
val message = VisibleMessage ( )
message . sentTimestamp = System . currentTimeMillis ( )
message . text = body
2021-06-28 05:29:17 +02:00
val quote = quotedMessage ?. let {
val quotedAttachments = ( it as ? MmsMessageRecord ) ?. slideDeck ?. asAttachments ( ) ?: listOf ( )
2022-09-05 03:29:47 +02:00
val sender = if ( it . isOutgoing ) {
fromSerialized ( viewModel . blindedPublicKey ?: textSecurePreferences . getLocalNumber ( ) !! )
} else it . individualRecipient . address
2021-07-05 07:48:46 +02:00
QuoteModel ( it . dateSent , sender , it . body , false , quotedAttachments )
2021-06-28 05:29:17 +02:00
}
2022-09-26 03:44:59 +02:00
val localQuote = quotedMessage ?. let {
val sender =
if ( it . isOutgoing ) fromSerialized ( textSecurePreferences . getLocalNumber ( ) !! )
else it . individualRecipient . address
quote ?. copy ( author = sender )
}
val outgoingTextMessage = OutgoingMediaMessage . from ( message , recipient , attachments , localQuote , linkPreview )
2021-06-28 02:00:18 +02:00
// Clear the input bar
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. text = " "
binding ?. inputBar ?. cancelQuoteDraft ( )
binding ?. inputBar ?. cancelLinkPreviewDraft ( )
2021-06-28 02:00:18 +02:00
// Clear mentions
previousText = " "
currentMentionStartIndex = - 1
mentions . clear ( )
// Reset the attachment manager
2021-06-28 02:44:00 +02:00
attachmentManager . clear ( )
// Reset attachments button if needed
if ( isShowingAttachmentOptions ) { toggleAttachmentOptions ( ) }
2021-06-28 02:00:18 +02:00
// Put the message in the database
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
message . id = mmsDb . insertMessageOutbox ( outgoingTextMessage , viewModel . threadId , false , null , runThreadUpdate = true )
2021-06-28 02:00:18 +02:00
// Send it
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
MessageSender . send ( message , recipient . address , attachments , quote , linkPreview )
2021-06-28 02:00:18 +02:00
// Send a typing stopped message
2022-01-14 06:56:15 +01:00
ApplicationContext . getInstance ( this ) . typingStatusSender . onTypingStopped ( viewModel . threadId )
2021-06-28 02:00:18 +02:00
}
2021-06-25 07:53:47 +02:00
private fun showGIFPicker ( ) {
2022-01-14 06:56:15 +01:00
val hasSeenGIFMetaDataWarning : Boolean = textSecurePreferences . hasSeenGIFMetaDataWarning ( )
2021-09-02 02:19:43 +02:00
if ( ! hasSeenGIFMetaDataWarning ) {
val builder = AlertDialog . Builder ( this )
builder . setTitle ( " Search GIFs? " )
builder . setMessage ( " You will not have full metadata protection when sending GIFs. " )
2022-01-14 06:56:15 +01:00
builder . setPositiveButton ( " OK " ) { dialog : DialogInterface , _ : Int ->
textSecurePreferences . setHasSeenGIFMetaDataWarning ( )
AttachmentManager . selectGif ( this , PICK _GIF )
2021-09-02 02:19:43 +02:00
dialog . dismiss ( )
}
builder . setNegativeButton (
" Cancel "
2022-01-14 06:56:15 +01:00
) { dialog : DialogInterface , _ : Int -> dialog . dismiss ( ) }
2021-09-02 02:19:43 +02:00
builder . create ( ) . show ( )
} else {
2022-01-14 06:56:15 +01:00
AttachmentManager . selectGif ( this , PICK _GIF )
2021-09-02 02:19:43 +02:00
}
2021-06-25 07:53:47 +02:00
}
private fun showDocumentPicker ( ) {
2022-01-14 06:56:15 +01:00
AttachmentManager . selectDocument ( this , PICK _DOCUMENT )
2021-06-25 07:53:47 +02:00
}
private fun pickFromLibrary ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2022-02-28 07:23:58 +01:00
binding ?. inputBar ?. text ?. trim ( ) ?. let { text ->
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
AttachmentManager . selectGallery ( this , PICK _FROM _LIBRARY , recipient , text )
2022-02-28 07:23:58 +01:00
}
2021-06-25 07:53:47 +02:00
}
private fun showCamera ( ) {
2022-01-14 06:56:15 +01:00
attachmentManager . capturePhoto ( this , TAKE _PHOTO , viewModel . recipient ) ;
2021-06-25 07:53:47 +02:00
}
override fun onAttachmentChanged ( ) {
2021-06-28 03:11:29 +02:00
// Do nothing
2021-06-25 07:53:47 +02:00
}
2021-06-25 08:09:37 +02:00
2021-07-13 07:17:30 +02:00
override fun onRequestPermissionsResult ( requestCode : Int , permissions : Array < out String > , grantResults : IntArray ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults )
Permissions . onRequestPermissionsResult ( this , requestCode , permissions , grantResults )
}
2021-06-25 08:09:37 +02:00
override fun onActivityResult ( requestCode : Int , resultCode : Int , intent : Intent ? ) {
super . onActivityResult ( requestCode , resultCode , intent )
2021-06-28 02:44:00 +02:00
val mediaPreppedListener = object : ListenableFuture . Listener < Boolean > {
override fun onSuccess ( result : Boolean ? ) {
sendAttachments ( attachmentManager . buildSlideDeck ( ) . asAttachments ( ) , null )
}
override fun onFailure ( e : ExecutionException ? ) {
Toast . makeText ( this @ConversationActivityV2 , R . string . activity _conversation _attachment _prep _failed , Toast . LENGTH _LONG ) . show ( )
}
}
2021-06-25 08:09:37 +02:00
when ( requestCode ) {
PICK _DOCUMENT -> {
2021-06-28 02:50:35 +02:00
val uri = intent ?. data ?: return
2021-06-28 02:44:00 +02:00
prepMediaForSending ( uri , AttachmentManager . MediaType . DOCUMENT ) . addListener ( mediaPreppedListener )
2021-06-25 08:09:37 +02:00
}
PICK _GIF -> {
2021-06-28 02:50:35 +02:00
intent ?: return
2021-06-28 02:00:18 +02:00
val uri = intent . data ?: return
2021-06-25 08:09:37 +02:00
val type = AttachmentManager . MediaType . GIF
val width = intent . getIntExtra ( GiphyActivity . EXTRA _WIDTH , 0 )
val height = intent . getIntExtra ( GiphyActivity . EXTRA _HEIGHT , 0 )
2021-06-28 02:44:00 +02:00
prepMediaForSending ( uri , type , width , height ) . addListener ( mediaPreppedListener )
2021-06-25 08:09:37 +02:00
}
2021-08-16 06:05:49 +02:00
PICK _FROM _LIBRARY ,
TAKE _PHOTO -> {
2021-06-28 02:50:35 +02:00
intent ?: return
2021-06-28 02:00:18 +02:00
val body = intent . getStringExtra ( MediaSendActivity . EXTRA _MESSAGE )
2021-06-25 08:09:37 +02:00
val media = intent . getParcelableArrayListExtra < Media > ( MediaSendActivity . EXTRA _MEDIA ) ?: return
val slideDeck = SlideDeck ( )
for ( item in media ) {
when {
MediaUtil . isVideoType ( item . mimeType ) -> {
slideDeck . addSlide ( VideoSlide ( this , item . uri , 0 , item . caption . orNull ( ) ) )
}
MediaUtil . isGif ( item . mimeType ) -> {
slideDeck . addSlide ( GifSlide ( this , item . uri , 0 , item . width , item . height , item . caption . orNull ( ) ) )
}
MediaUtil . isImageType ( item . mimeType ) -> {
slideDeck . addSlide ( ImageSlide ( this , item . uri , 0 , item . width , item . height , item . caption . orNull ( ) ) )
}
else -> {
Log . d ( " Loki " , " Asked to send an unexpected media type: ' " + item . mimeType + " '. Skipping. " )
}
}
}
2021-06-28 02:00:18 +02:00
sendAttachments ( slideDeck . asAttachments ( ) , body )
2021-06-25 08:09:37 +02:00
}
2021-06-29 03:14:58 +02:00
INVITE _CONTACTS -> {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
if ( viewModel . recipient ?. isOpenGroupRecipient != true ) { return }
2021-06-29 03:14:58 +02:00
val extras = intent ?. extras ?: return
2022-01-14 06:56:15 +01:00
if ( !in tent . hasExtra ( selectedContactsKey ) ) { return }
2021-06-29 03:14:58 +02:00
val selectedContacts = extras . getStringArray ( selectedContactsKey ) !!
2022-01-14 06:56:15 +01:00
val recipients = selectedContacts . map { contact ->
Recipient . from ( this , fromSerialized ( contact ) , true )
2021-06-29 03:14:58 +02:00
}
2022-01-14 06:56:15 +01:00
viewModel . inviteContacts ( recipients )
2021-06-29 03:14:58 +02:00
}
2021-06-25 08:09:37 +02:00
}
}
2021-06-28 02:00:18 +02:00
2021-06-28 02:44:00 +02:00
private fun prepMediaForSending ( uri : Uri , type : AttachmentManager . MediaType ) : ListenableFuture < Boolean > {
return prepMediaForSending ( uri , type , null , null )
2021-06-28 02:00:18 +02:00
}
2021-06-28 02:44:00 +02:00
private fun prepMediaForSending ( uri : Uri , type : AttachmentManager . MediaType , width : Int ? , height : Int ? ) : ListenableFuture < Boolean > {
return attachmentManager . setMedia ( glide , uri , type , MediaConstraints . getPushMediaConstraints ( ) , width ?: 0 , height ?: 0 )
2021-06-28 02:00:18 +02:00
}
2021-06-28 03:11:29 +02:00
override fun startRecordingVoiceMessage ( ) {
2021-06-30 02:30:10 +02:00
if ( Permissions . hasAll ( this , Manifest . permission . RECORD _AUDIO ) ) {
showVoiceMessageUI ( )
window . addFlags ( WindowManager . LayoutParams . FLAG _KEEP _SCREEN _ON )
audioRecorder . startRecording ( )
stopAudioHandler . postDelayed ( stopVoiceMessageRecordingTask , 60000 ) // Limit voice messages to 1 minute each
} else {
Permissions . with ( this )
. request ( Manifest . permission . RECORD _AUDIO )
. withRationaleDialog ( getString ( R . string . ConversationActivity _to _send _audio _messages _allow _signal _access _to _your _microphone ) , R . drawable . ic _baseline _mic _48 )
. withPermanentDenialDialog ( getString ( R . string . ConversationActivity _signal _requires _the _microphone _permission _in _order _to _send _audio _messages ) )
. execute ( )
}
2021-06-28 03:11:29 +02:00
}
2021-06-28 03:26:13 +02:00
override fun sendVoiceMessage ( ) {
hideVoiceMessageUI ( )
2021-06-28 03:11:29 +02:00
window . clearFlags ( WindowManager . LayoutParams . FLAG _KEEP _SCREEN _ON )
val future = audioRecorder . stopRecording ( )
stopAudioHandler . removeCallbacks ( stopVoiceMessageRecordingTask )
2021-07-06 08:53:44 +02:00
future . addListener ( object : ListenableFuture . Listener < Pair < Uri , Long > > {
2021-06-28 03:11:29 +02:00
2021-07-06 08:53:44 +02:00
override fun onSuccess ( result : Pair < Uri , Long > ) {
val audioSlide = AudioSlide ( this @ConversationActivityV2 , result . first , result . second , MediaTypes . AUDIO _AAC , true )
2021-06-28 03:11:29 +02:00
val slideDeck = SlideDeck ( )
slideDeck . addSlide ( audioSlide )
sendAttachments ( slideDeck . asAttachments ( ) , null )
}
override fun onFailure ( e : ExecutionException ) {
Toast . makeText ( this @ConversationActivityV2 , R . string . ConversationActivity _unable _to _record _audio , Toast . LENGTH _LONG ) . show ( )
}
} )
}
2021-06-28 03:26:13 +02:00
override fun cancelVoiceMessage ( ) {
hideVoiceMessageUI ( )
window . clearFlags ( WindowManager . LayoutParams . FLAG _KEEP _SCREEN _ON )
audioRecorder . stopRecording ( )
stopAudioHandler . removeCallbacks ( stopVoiceMessageRecordingTask )
}
2021-06-28 08:28:00 +02:00
2022-09-04 13:03:32 +02:00
override fun selectMessages ( messages : Set < MessageRecord > ) {
handleLongPress ( messages . first ( ) , 0 ) //TODO: begin selection mode
2021-06-28 08:28:00 +02:00
}
2021-08-11 07:17:53 +02:00
override fun deleteMessages ( messages : Set < MessageRecord > ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
2021-08-16 04:08:35 +02:00
val allSentByCurrentUser = messages . all { it . isOutgoing }
2021-10-04 09:51:19 +02:00
val allHasHash = messages . all { lokiMessageDb . getMessageServerHash ( it . id ) != null }
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
if ( recipient . isOpenGroupRecipient ) {
2022-09-04 13:03:32 +02:00
val messageCount = 1
2021-08-13 07:30:26 +02:00
val builder = AlertDialog . Builder ( this )
builder . setTitle ( resources . getQuantityString ( R . plurals . ConversationFragment _delete _selected _messages , messageCount , messageCount ) )
builder . setMessage ( resources . getQuantityString ( R . plurals . ConversationFragment _this _will _permanently _delete _all _n _selected _messages , messageCount , messageCount ) )
builder . setCancelable ( true )
builder . setPositiveButton ( R . string . delete ) { _ , _ ->
for ( message in messages ) {
2022-01-14 06:56:15 +01:00
viewModel . deleteForEveryone ( message )
2021-08-13 07:30:26 +02:00
}
endActionMode ( )
2021-06-29 02:05:39 +02:00
}
2021-08-13 07:30:26 +02:00
builder . setNegativeButton ( android . R . string . cancel ) { dialog , _ ->
dialog . dismiss ( )
endActionMode ( )
}
builder . show ( )
2021-08-17 07:11:53 +02:00
} else if ( allSentByCurrentUser && allHasHash ) {
2021-08-13 07:30:26 +02:00
val bottomSheet = DeleteOptionsBottomSheet ( )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
bottomSheet . recipient = recipient
2021-08-13 07:30:26 +02:00
bottomSheet . onDeleteForMeTapped = {
for ( message in messages ) {
2022-01-14 06:56:15 +01:00
viewModel . deleteLocally ( message )
2021-08-13 07:30:26 +02:00
}
bottomSheet . dismiss ( )
2021-08-13 07:49:05 +02:00
endActionMode ( )
2021-08-13 07:30:26 +02:00
}
bottomSheet . onDeleteForEveryoneTapped = {
for ( message in messages ) {
2022-01-14 06:56:15 +01:00
viewModel . deleteForEveryone ( message )
2021-08-13 07:30:26 +02:00
}
bottomSheet . dismiss ( )
2021-08-13 07:49:05 +02:00
endActionMode ( )
}
bottomSheet . onCancelTapped = {
bottomSheet . dismiss ( )
endActionMode ( )
2021-08-13 07:30:26 +02:00
}
bottomSheet . show ( supportFragmentManager , bottomSheet . tag )
2021-08-16 04:08:35 +02:00
} else {
2022-09-04 13:03:32 +02:00
val messageCount = 1
2021-08-16 04:08:35 +02:00
val builder = AlertDialog . Builder ( this )
builder . setTitle ( resources . getQuantityString ( R . plurals . ConversationFragment _delete _selected _messages , messageCount , messageCount ) )
builder . setMessage ( resources . getQuantityString ( R . plurals . ConversationFragment _this _will _permanently _delete _all _n _selected _messages , messageCount , messageCount ) )
builder . setCancelable ( true )
builder . setPositiveButton ( R . string . delete ) { _ , _ ->
for ( message in messages ) {
2022-01-14 06:56:15 +01:00
viewModel . deleteLocally ( message )
2021-08-16 04:08:35 +02:00
}
endActionMode ( )
}
builder . setNegativeButton ( android . R . string . cancel ) { dialog , _ ->
dialog . dismiss ( )
endActionMode ( )
}
builder . show ( )
2021-06-29 02:05:39 +02:00
}
2021-06-28 08:28:00 +02:00
}
override fun banUser ( messages : Set < MessageRecord > ) {
2021-06-29 02:05:39 +02:00
val builder = AlertDialog . Builder ( this )
builder . setTitle ( R . string . ConversationFragment _ban _selected _user )
2021-07-13 06:28:25 +02:00
builder . setMessage ( " This will ban the selected user from this room. It won't ban them from other rooms. " )
2021-06-29 02:05:39 +02:00
builder . setCancelable ( true )
builder . setPositiveButton ( R . string . ban ) { _ , _ ->
2022-01-14 06:56:15 +01:00
viewModel . banUser ( messages . first ( ) . individualRecipient )
2021-06-29 02:05:39 +02:00
endActionMode ( )
}
builder . setNegativeButton ( android . R . string . cancel ) { dialog , _ ->
dialog . dismiss ( )
endActionMode ( )
}
builder . show ( )
2021-06-28 08:28:00 +02:00
}
2021-07-13 06:28:25 +02:00
override fun banAndDeleteAll ( messages : Set < MessageRecord > ) {
val builder = AlertDialog . Builder ( this )
builder . setTitle ( R . string . ConversationFragment _ban _selected _user )
builder . setMessage ( " This will ban the selected user from this room and delete all messages sent by them. It won't ban them from other rooms or delete the messages they sent there. " )
builder . setCancelable ( true )
builder . setPositiveButton ( R . string . ban ) { _ , _ ->
2022-01-14 06:56:15 +01:00
viewModel . banAndDeleteAll ( messages . first ( ) . individualRecipient )
2021-07-13 06:28:25 +02:00
endActionMode ( )
2021-06-29 02:05:39 +02:00
}
builder . setNegativeButton ( android . R . string . cancel ) { dialog , _ ->
dialog . dismiss ( )
endActionMode ( )
}
builder . show ( )
2021-06-28 08:28:00 +02:00
}
2021-06-29 02:05:39 +02:00
override fun copyMessages ( messages : Set < MessageRecord > ) {
val sortedMessages = messages . sortedBy { it . dateSent }
2021-09-15 03:04:43 +02:00
val messageSize = sortedMessages . size
2021-06-29 02:05:39 +02:00
val builder = StringBuilder ( )
2021-09-15 03:04:43 +02:00
val messageIterator = sortedMessages . iterator ( )
while ( messageIterator . hasNext ( ) ) {
val message = messageIterator . next ( )
2022-01-14 06:56:15 +01:00
val body = MentionUtilities . highlightMentions ( message . body , viewModel . threadId , this )
2021-06-29 02:05:39 +02:00
if ( TextUtils . isEmpty ( body ) ) { continue }
2021-09-15 03:04:43 +02:00
if ( messageSize > 1 ) {
val formattedTimestamp = DateUtils . getDisplayFormattedTimeSpanString ( this , Locale . getDefault ( ) , message . timestamp )
builder . append ( " $formattedTimestamp : " )
}
builder . append ( body )
if ( messageIterator . hasNext ( ) ) {
builder . append ( '\n' )
}
2021-06-29 02:05:39 +02:00
}
if ( builder . isNotEmpty ( ) && builder [ builder . length - 1 ] == '\n' ) {
builder . deleteCharAt ( builder . length - 1 )
}
val result = builder . toString ( )
if ( TextUtils . isEmpty ( result ) ) { return }
val manager = getSystemService ( CLIPBOARD _SERVICE ) as ClipboardManager
manager . setPrimaryClip ( ClipData . newPlainText ( " Message Content " , result ) )
Toast . makeText ( this , R . string . copied _to _clipboard , Toast . LENGTH _SHORT ) . show ( )
endActionMode ( )
2021-06-28 08:28:00 +02:00
}
override fun copySessionID ( messages : Set < MessageRecord > ) {
val sessionID = messages . first ( ) . individualRecipient . address . toString ( )
val clip = ClipData . newPlainText ( " Session ID " , sessionID )
val manager = getSystemService ( CLIPBOARD _SERVICE ) as ClipboardManager
manager . setPrimaryClip ( clip )
Toast . makeText ( this , R . string . copied _to _clipboard , Toast . LENGTH _SHORT ) . show ( )
2021-06-29 02:05:39 +02:00
endActionMode ( )
2021-06-28 08:28:00 +02:00
}
override fun resendMessage ( messages : Set < MessageRecord > ) {
2022-02-07 07:06:27 +01:00
messages . iterator ( ) . forEach { messageRecord ->
2022-09-26 03:44:59 +02:00
ResendMessageUtilities . resend ( this , messageRecord , viewModel . blindedPublicKey )
2021-07-01 03:06:11 +02:00
}
endActionMode ( )
2021-06-28 08:28:00 +02:00
}
2021-07-13 06:42:16 +02:00
override fun showMessageDetail ( messages : Set < MessageRecord > ) {
2021-07-13 08:22:10 +02:00
val intent = Intent ( this , MessageDetailActivity :: class . java )
2022-09-04 13:03:32 +02:00
intent . putExtra ( MessageDetailActivity . MESSAGE _TIMESTAMP , messages . first ( ) . timestamp )
2021-07-13 08:22:10 +02:00
push ( intent )
endActionMode ( )
2021-07-13 06:42:16 +02:00
}
2021-06-28 08:28:00 +02:00
override fun saveAttachment ( messages : Set < MessageRecord > ) {
val message = messages . first ( ) as MmsMessageRecord
2021-06-29 02:05:39 +02:00
SaveAttachmentTask . showWarningDialog ( this , { _ , _ ->
2021-06-28 08:28:00 +02:00
Permissions . with ( this )
. request ( Manifest . permission . WRITE _EXTERNAL _STORAGE )
. maxSdkVersion ( Build . VERSION_CODES . P )
. withPermanentDenialDialog ( getString ( R . string . MediaPreviewActivity _signal _needs _the _storage _permission _in _order _to _write _to _external _storage _but _it _has _been _permanently _denied ) )
2021-06-29 02:05:39 +02:00
. onAnyDenied {
endActionMode ( )
Toast . makeText ( this @ConversationActivityV2 , R . string . MediaPreviewActivity _unable _to _write _to _external _storage _without _permission , Toast . LENGTH _LONG ) . show ( )
}
2021-06-28 08:28:00 +02:00
. onAllGranted {
2021-06-29 02:05:39 +02:00
endActionMode ( )
val attachments : List < SaveAttachmentTask . Attachment ? > = Stream . of ( message . slideDeck . slides )
2021-06-28 08:28:00 +02:00
. filter { s : Slide -> s . uri != null && ( s . hasImage ( ) || s . hasVideo ( ) || s . hasAudio ( ) || s . hasDocument ( ) ) }
. map { s : Slide -> SaveAttachmentTask . Attachment ( s . uri !! , s . contentType , message . dateReceived , s . fileName . orNull ( ) ) }
. toList ( )
if ( attachments . isNotEmpty ( ) ) {
val saveTask = SaveAttachmentTask ( this )
saveTask . executeOnExecutor ( AsyncTask . THREAD _POOL _EXECUTOR , * attachments . toTypedArray ( ) )
if ( ! message . isOutgoing ) {
sendMediaSavedNotification ( )
}
return @onAllGranted
}
Toast . makeText ( this ,
resources . getQuantityString ( R . plurals . ConversationFragment _error _while _saving _attachments _to _sd _card , 1 ) ,
Toast . LENGTH _LONG ) . show ( )
}
. execute ( )
} )
}
override fun reply ( messages : Set < MessageRecord > ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
binding ?. inputBar ?. draftQuote ( recipient , messages . first ( ) , glide )
2021-06-29 02:05:39 +02:00
endActionMode ( )
2021-06-28 08:28:00 +02:00
}
2022-12-19 01:29:05 +01:00
override fun destroyActionMode ( ) {
this . actionMode = null
}
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
private fun sendScreenshotNotification ( ) {
val recipient = viewModel . recipient ?: return
if ( recipient . isGroupRecipient ) return
val kind = DataExtractionNotification . Kind . Screenshot ( )
val message = DataExtractionNotification ( kind )
MessageSender . send ( message , recipient . address )
}
2021-06-28 08:28:00 +02:00
private fun sendMediaSavedNotification ( ) {
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
val recipient = viewModel . recipient ?: return
if ( recipient . isGroupRecipient ) { return }
2021-06-28 08:28:00 +02:00
val timestamp = System . currentTimeMillis ( )
val kind = DataExtractionNotification . Kind . MediaSaved ( timestamp )
val message = DataExtractionNotification ( kind )
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client
* refactor: refactoring batch message receives and pollers
* refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup
* refactor: caching lib with potential loader fixes and no-cache for giphy
* refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine
* refactor: queue trim thread jobs instead of add every message processed
* fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down
* fix: fixing the user contacts cache in ConversationAdapter.kt
* refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image.
* refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups
* feat: add OpenGroupDeleteJob.kt
* feat: add open group delete job to process deletions after batch adding
* feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed
* refactor: remove redundant inflation for profile image views throughout app
* refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* refactor(wip): refactoring group deletion to not iterate through and delete messages individually
* fix: group deletion optimisation
* build: bump build number
* build: bump build number and fix batch message receive retry logic
* fix: clear out open group deletes
* fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs
* fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group
* Rename .java to .kt
* refactor: change MmsDatabase to kotlin to make list operations easier
* fix: nullable type
* fix: compilation issues and constants in .kt instead of .java
* fix: bug fix expiration timer on closed group recipient
* feat: use the job queue properly across executors
* feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal
* refactor: removing redundant code and fixing jobqueue per opengroup
* fix: allow attachments in note to self
* fix: make the minWidth in quote view bind max of text / title and body, wrapped ?
* fix: fixing up layouts and code view layouts
* fix: remove TODO, remove timestamp binding
* feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt
* fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt
* refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer
* refactor: UI for groups and poller improvements
* fix: revert some changes in poller
* feat: add header back in for message requests
* refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently
* feat: try update the home adapter if we get a profile picture modified event
* feat: bump build numbers
* fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed
* fix: set channel to be conflated instead of no buffer
* fix: set unreads based off last local user message vs incrementing unreads to be all amount
* feat: add profile update flag, update build number
* fix: link preview thumbnails download on bind
* fix: centercrop placeholder in glide request
* feat: recycle the contact selection list and profile image in unbind
* fix: try to prevent user KP crash at weird times
* fix: remove additional log, improve attachment download success rate, fix share logs dialog issue
2022-06-08 09:12:34 +02:00
MessageSender . send ( message , recipient . address )
2021-06-28 08:28:00 +02:00
}
2021-06-29 02:05:39 +02:00
private fun endActionMode ( ) {
actionMode ?. finish ( )
actionMode = null
}
2021-05-31 06:06:02 +02:00
// endregion
2021-06-22 08:23:47 +02:00
// region General
2021-06-25 07:20:54 +02:00
private fun getMessageBody ( ) : String {
2022-02-28 07:23:58 +01:00
var result = binding ?. inputBar ?. text ?. trim ( ) ?: return " "
2021-06-25 06:42:04 +02:00
for ( mention in mentions ) {
try {
val startIndex = result . indexOf ( " @ " + mention . displayName )
val endIndex = startIndex + mention . displayName . count ( ) + 1 // + 1 to include the "@"
result = result . substring ( 0 , startIndex ) + " @ " + mention . publicKey + result . substring ( endIndex )
} catch ( exception : Exception ) {
Log . d ( " Loki " , " Failed to process mention due to error: $exception " )
}
}
2022-01-14 06:56:15 +01:00
return result
2021-06-22 08:23:47 +02:00
}
// endregion
2021-06-29 03:49:10 +02:00
// region Search
2021-06-29 06:00:47 +02:00
private fun setUpSearchResultObserver ( ) {
searchViewModel . searchResults . observe ( this , Observer { result : SearchViewModel . SearchResult ? ->
if ( result == null ) return @Observer
if ( result . getResults ( ) . isNotEmpty ( ) ) {
2021-06-29 07:35:53 +02:00
result . getResults ( ) [ result . position ] ?. let {
2022-12-19 01:29:05 +01:00
jumpToMessage ( it . messageRecipient . address , it . sentTimestampMs ) {
2022-09-04 13:03:32 +02:00
searchViewModel . onMissingResult ( ) }
2021-06-29 07:35:53 +02:00
}
2021-06-29 06:00:47 +02:00
}
2022-02-28 07:23:58 +01:00
binding ?. searchBottomBar ?. setData ( result . position , result . getResults ( ) . size )
2021-06-29 06:00:47 +02:00
} )
}
2022-01-14 06:56:15 +01:00
fun onSearchOpened ( ) {
searchViewModel . onSearchOpened ( )
2022-02-28 07:23:58 +01:00
binding ?. searchBottomBar ?. visibility = View . VISIBLE
binding ?. searchBottomBar ?. setData ( 0 , 0 )
New app theming (#913)
* feat: start new app theming feature
* feat: add some theming colours
* refactor: start refactoring themes and colours to use dynamic attributes
* feat: adding more colours and switching over default colours to be theme based instead of hard-coded or day/night specific
* refactor: take a look at ocean light and logo colour
* feat: global search colours for light and dark ocean
* feat: more styling
* feat: adding themes to conversation activity and refactoring the base theme to apply over the top of the activity's theme so it retains noActionBar etc
* feat: add dynamic accent color
* docs: add todo for changing how accent colour is applied
* feat: update new theming to use override primary style so that the regular colorAccent attribute can be used in existing layouts
* feat: coordinating styles across layouts, fixing up pinned icons and naming for conversation list items
* refactor: re-styling layouts to match new themes and attributes. Need to figure out action mode close button
* refactor: remove @color/text and replace with ?android:textColorPrimary to override in themes
* refactor: add context theme wrapper to bottom sheet dialog that references accent color
* fix: input bar bug fix and preference activity themes
* refactor: new settings menu options
* fix: crash for PNModeActivity.kt
refactor: move ordering in seed dialog to match designs, copy changes to match new settings menu
* feat: add new appearance settings activity
* refactor: title and VM changes
* fix: correct override
* feat: add theme appearance screen UI features and start VM implementation. re-add legacy theme utils to get default for migration
* fix: compile errors and missing themes from emoji features
* refactor: remove background shape alteration and old bottom sheet styles, re-add the theme mode attr
* feat: appearance screen wired up, just need to refresh theme
* feat: add theme state recreation and fix match system settings option
* refactor: add bottom margin
* feat: explore custom preference category
* feat: add the customized session theme for CorrectedPreferenceFragment
* feat: replace AppProtectionPreferenceFragment to extend ListSummaryPreferenceFragment
* refactor: change drawable style and remove explicit dividers
* refactor: remove divider in CorrectedPreferenceFragment
* feat: add theme state check on resume, might be jarring currently
* feat: add preference divider elements for settings menu
* refactor: settings menu redesigns
* refactor: change led preference to integer and refactor TextSecurePreferences.kt
* feat: add scroll parcel to save/restore hierarchy on restart with appearance changes
* feat: add the conversations blocked contacts and refactor preference order and copy
* feat: add blocked contacts activity, basic layout and vm
* feat: add unblock DB functions and storage protocol, start working on the DB query state flow, might have to just implement recipient on modified listener
* feat: add blocked contacts and notif recipient listeners
* feat: add recipient db reader
* feat: add blocked contact interactions and fix a theming crash for notifications
* feat: introduce better equals and hashcode implementations to recipient, replace home diff util content check with hashcode-based comparison
* feat: add settings menu vectors
* fix: preview compile error
* refactor: migrating settings menu to new designs
* feat: help menu
* refactor: simplify link opening
* refactor: remove space
* feat: refactor preferences and start theming for light mode options
* refactor: fixing dark and light modes with dialogs
* refactor: popup dialogs use proper themes now
* refactor: alert dialogs and media edit fragments use attribute references
* refactor: use input bar button attribute instead color control normal in vector tint
* refactor: transparency, dialog fixes, notification fix
* refactor: attrs and styles for buttons
* fix: use prominent button color on the outline button's border
* fix: fix the trash
* refactor: remove the appearance
* refactor: avatar placeholder generation, chips and element border styles
* refactor: use colors instead of style references
* refactor: theming changes to match designs and feedback
* refactor: the titles are bold and the categories are tertiary coloured now
* fix: appearance settings match preferences, search bottom bar uses themed attributes
* refactor: increase setting button height
* Update clear all data dialog
* Update seed dialog
* refactor: more qa feedback changes
* feat: add new TLs and fa-rIR TLs
* Update notification content dialog
* Fix message requests clear all button text color
* feat: re-add screenshot observer
* refactor: make send tint accent color
* feat: add unread background differences
* fix: change unread count indicator
* build: upgrade build numbers
* Fix message requests popupmenu background color
* fix: crash from attr reference in color attribute
* build: upgrade build number
* fix: message bubbles, thumbnail backgrounds, search bar visibility with input bar, attachment buttons
* fix: tertiary text for keyboard page search view
* fix: emoji overflow colour differences
* fix: reaction pill dialog background is now correct colour
* Add style to reactions tab layout
* fix: appearance activity reverting primary color at correct time
* fix: show call privacy warning every time instead of just once
* fix: gradient background(?) and audio autoplay disable
* fix: crash in all media containing documents
* fix: reaction dialog heading fixes
* Add style to reactions tab layout
* fix: remove gradient backgrounds
* fix: adding new reaction normal text attribute to try correct the tab layout
* fix: ocean dark unread/read colours
* build; update build number
* build: update build number
Co-authored-by: charles <charles@oxen.io>
2022-10-12 08:05:55 +02:00
binding ?. inputBar ?. visibility = View . INVISIBLE
2022-01-14 06:56:15 +01:00
}
fun onSearchClosed ( ) {
searchViewModel . onSearchClosed ( )
2022-02-28 07:23:58 +01:00
binding ?. searchBottomBar ?. visibility = View . GONE
binding ?. inputBar ?. visibility = View . VISIBLE
2022-01-14 06:56:15 +01:00
adapter . onSearchQueryUpdated ( null )
invalidateOptionsMenu ( )
}
fun onSearchQueryUpdated ( query : String ) {
searchViewModel . onQueryUpdated ( query , viewModel . threadId )
2022-02-28 07:23:58 +01:00
binding ?. searchBottomBar ?. showLoading ( )
2021-06-29 03:49:10 +02:00
adapter . onSearchQueryUpdated ( query )
}
2021-06-29 06:00:47 +02:00
override fun onSearchMoveUpPressed ( ) {
2022-01-14 06:56:15 +01:00
this . searchViewModel . onMoveUp ( )
2021-06-29 06:00:47 +02:00
}
override fun onSearchMoveDownPressed ( ) {
2022-01-14 06:56:15 +01:00
this . searchViewModel . onMoveDown ( )
2021-06-29 06:00:47 +02:00
}
2021-06-29 07:35:53 +02:00
private fun jumpToMessage ( author : Address , timestamp : Long , onMessageNotFound : Runnable ? ) {
SimpleTask . run ( lifecycle , {
2022-01-14 06:56:15 +01:00
mmsSmsDb . getMessagePositionInConversation ( viewModel . threadId , timestamp , author )
2021-06-29 07:35:53 +02:00
} ) { p : Int -> moveToMessagePosition ( p , onMessageNotFound ) }
}
private fun moveToMessagePosition ( position : Int , onMessageNotFound : Runnable ? ) {
if ( position >= 0 ) {
2022-02-28 07:23:58 +01:00
binding ?. conversationRecyclerView ?. scrollToPosition ( position )
2021-06-29 07:35:53 +02:00
} else {
onMessageNotFound ?. run ( )
}
}
2021-06-29 03:49:10 +02:00
// endregion
2022-09-04 13:03:32 +02:00
inner class ReactionsToolbarListener constructor ( val message : MessageRecord ) : OnActionSelectedListener {
override fun onActionSelected ( action : ConversationReactionOverlay . Action ) {
val selectedItems = setOf ( message )
when ( action ) {
ConversationReactionOverlay . Action . REPLY -> reply ( selectedItems )
ConversationReactionOverlay . Action . RESEND -> resendMessage ( selectedItems )
ConversationReactionOverlay . Action . DOWNLOAD -> saveAttachment ( selectedItems )
ConversationReactionOverlay . Action . COPY _MESSAGE -> copyMessages ( selectedItems )
ConversationReactionOverlay . Action . VIEW _INFO -> showMessageDetail ( selectedItems )
ConversationReactionOverlay . Action . SELECT -> selectMessages ( selectedItems )
ConversationReactionOverlay . Action . DELETE -> deleteMessages ( selectedItems )
2022-09-13 06:17:47 +02:00
ConversationReactionOverlay . Action . BAN _AND _DELETE _ALL -> banAndDeleteAll ( selectedItems )
ConversationReactionOverlay . Action . BAN _USER -> banUser ( selectedItems )
2022-12-19 01:29:05 +01:00
ConversationReactionOverlay . Action . COPY _SESSION _ID -> copySessionID ( selectedItems )
2022-09-04 13:03:32 +02:00
}
}
}
2021-05-31 06:06:02 +02:00
}