From ec25831a37a519517c4892794ae2489d1bbf6ecf Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 20 Jul 2023 13:50:32 -0400 Subject: [PATCH] Fixes for CFv2. - Status bar color being incorrect when entering a screen that changes it and then returning (e.g., Message Details) - Fix crash in enter sends mode - Fix warning about non-closed cursor - Prevent message abandonment (via trim thread) when it's the first in an inactive thread - Fix payment attachment button flashing on attachment keyboard open if payments disabled - Fix reactionDelegate crash - Fix attachment preview (file, mp3, location, etc) not getting cleared on send --- .../featured/SelectFeaturedBadgeFragment.kt | 2 +- .../settings/DSLSettingsFragment.kt | 2 +- .../donate/DonateToSignalFragment.kt | 2 +- .../manage/ManageDonationsFragment.kt | 2 +- .../ConversationSettingsFragment.kt | 2 +- .../ContactShareEditActivity.java | 2 +- .../ConversationParentFragment.java | 2 +- .../conversation/v2/ConversationFragment.kt | 21 +++++--- .../v2/ConversationToolbarOnScrollHelper.kt | 10 ++-- .../v2/data/ConversationDataSource.kt | 34 +++++++------ .../v2/keyboard/AttachmentKeyboardFragment.kt | 12 +++-- .../securesms/database/MessageTable.kt | 1 + .../securesms/database/ThreadTable.kt | 12 +++++ .../flow/ExportYourSmsMessagesFragment.kt | 2 +- .../main/MainActivityListHostFragment.kt | 3 +- .../v2/gallery/MediaGalleryFragment.kt | 6 ++- .../MessageDetailsFragment.java | 2 +- .../create/CreateStoryFlowDialogFragment.kt | 4 ++ .../create/CreateStoryWithViewersFragment.kt | 9 +++- .../securesms/util/Material3OnScrollHelper.kt | 50 +++++++++++++------ .../securesms/util/WindowUtil.java | 4 ++ 21 files changed, 128 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt index 7016ea3508..90f50eac4b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt @@ -47,7 +47,7 @@ class SelectFeaturedBadgeFragment : DSLSettingsFragment( } override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper? { - return Material3OnScrollHelper(requireActivity(), scrollShadow) + return Material3OnScrollHelper(requireActivity(), scrollShadow, viewLifecycleOwner) } override fun bindAdapter(adapter: MappingAdapter) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt index 7e0103bb41..99868096a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt @@ -83,7 +83,7 @@ abstract class DSLSettingsFragment( return null } - return Material3OnScrollHelper(requireActivity(), toolbar) + return Material3OnScrollHelper(requireActivity(), toolbar, viewLifecycleOwner) } open fun onToolbarNavigationClicked() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt index 2a93a91382..3e72b47549 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt @@ -99,7 +99,7 @@ class DonateToSignalFragment : } override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper { - return object : Material3OnScrollHelper(requireActivity(), toolbar!!) { + return object : Material3OnScrollHelper(requireActivity(), toolbar!!, viewLifecycleOwner) { override val activeColorSet: ColorSet = ColorSet(R.color.transparent, R.color.signal_colorBackground) override val inactiveColorSet: ColorSet = ColorSet(R.color.transparent, R.color.signal_colorBackground) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt index dc7eeeef3e..19c54a23ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt @@ -84,7 +84,7 @@ class ManageDonationsFragment : } override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper { - return object : Material3OnScrollHelper(requireActivity(), toolbar!!) { + return object : Material3OnScrollHelper(requireActivity(), toolbar!!, viewLifecycleOwner) { override val activeColorSet: ColorSet = ColorSet(R.color.transparent, R.color.signal_colorBackground) override val inactiveColorSet: ColorSet = ColorSet(R.color.transparent, R.color.signal_colorBackground) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index abb05eec06..6173e81802 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -207,7 +207,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( } override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper { - return object : Material3OnScrollHelper(requireActivity(), toolbar!!) { + return object : Material3OnScrollHelper(requireActivity(), toolbar!!, viewLifecycleOwner) { override val inactiveColorSet = ColorSet( toolbarColorRes = R.color.signal_colorBackground_0, statusBarColorRes = R.color.signal_colorBackground diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java index 5f6327e4ad..b3706a789e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java @@ -86,7 +86,7 @@ public class ContactShareEditActivity extends PassphraseRequiredActivity impleme Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(unused -> onBackPressed()); - Material3OnScrollHelper onScrollHelper = new Material3OnScrollHelper(this, Collections.singletonList(toolbar), Collections.emptyList()); + Material3OnScrollHelper onScrollHelper = new Material3OnScrollHelper(this, Collections.singletonList(toolbar), Collections.emptyList(), this); onScrollHelper.attach(contactList); ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(GlideApp.with(this), dynamicLanguage.getCurrentLocale(), this); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 899f0b7862..8e5a76235e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -1993,7 +1993,7 @@ public class ConversationParentFragment extends Fragment voiceNoteMediaController.getVoiceNotePlaybackState().observe(getViewLifecycleOwner(), inputPanel.getPlaybackStateObserver()); - material3OnScrollHelper = new Material3OnScrollHelper(requireActivity(), Collections.singletonList(toolbarBackground), Collections.emptyList()) { + material3OnScrollHelper = new Material3OnScrollHelper(requireActivity(), Collections.singletonList(toolbarBackground), Collections.emptyList(), getViewLifecycleOwner()) { @Override public @NonNull ColorSet getActiveColorSet() { return new ColorSet(getActiveToolbarColor(wallpaper.getDrawable() != null)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 4c864fa355..3423d200d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -58,6 +58,7 @@ import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager @@ -510,7 +511,8 @@ class ConversationFragment : val conversationToolbarOnScrollHelper = ConversationToolbarOnScrollHelper( requireActivity(), binding.toolbarBackground, - viewModel::wallpaperSnapshot + viewModel::wallpaperSnapshot, + viewLifecycleOwner ) conversationToolbarOnScrollHelper.attach(binding.conversationItemRecycler) presentWallpaper(args.wallpaper) @@ -561,8 +563,6 @@ class ConversationFragment : ApplicationDependencies.getMessageNotifier().setVisibleThread(ConversationId.forConversation(args.threadId)) } - motionEventRelay.setDrain(MotionEventRelayDrain()) - viewModel.updateIdentityRecordsInBackground() } @@ -581,7 +581,6 @@ class ConversationFragment : viewModel.markLastSeen() - motionEventRelay.setDrain(null) EventBus.getDefault().unregister(this) } @@ -870,6 +869,7 @@ class ConversationFragment : val conversationReactionStub = Stub(binding.conversationReactionScrubberStub) reactionDelegate = ConversationReactionDelegate(conversationReactionStub) reactionDelegate.setOnReactionSelectedListener(OnReactionsSelectedListener()) + motionEventRelay.setDrain(MotionEventRelayDrain(this)) voiceMessageRecordingDelegate = VoiceMessageRecordingDelegate( this, @@ -1698,6 +1698,7 @@ class ConversationFragment : onComplete = { if (clearCompose) { composeText.setText("") + attachmentManager.clear(GlideApp.with(this@ConversationFragment), false) inputPanel.clearQuote() } @@ -3030,9 +3031,15 @@ class ConversationFragment : } } - private inner class MotionEventRelayDrain : MotionEventRelay.Drain { + private inner class MotionEventRelayDrain(lifecycleOwner: LifecycleOwner) : MotionEventRelay.Drain { + private val lifecycle = lifecycleOwner.lifecycle + override fun accept(motionEvent: MotionEvent): Boolean { - return reactionDelegate.applyTouchEvent(motionEvent) + return if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { + reactionDelegate.applyTouchEvent(motionEvent) + } else { + false + } } } @@ -3406,7 +3413,7 @@ class ConversationFragment : sendMessage() } - override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent): Boolean { + override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean { if (actionId == EditorInfo.IME_ACTION_SEND) { if (inputPanel.isInEditMode) { sendEditButton.performClick() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper.kt index d94ed66d23..55968b8bbb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationToolbarOnScrollHelper.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation.v2 import android.app.Activity import android.view.View import androidx.annotation.ColorRes +import androidx.lifecycle.LifecycleOwner import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.util.Material3OnScrollHelper import org.thoughtcrime.securesms.wallpaper.ChatWallpaper @@ -13,11 +14,12 @@ import org.thoughtcrime.securesms.wallpaper.ChatWallpaper class ConversationToolbarOnScrollHelper( activity: Activity, toolbarBackground: View, - private val wallpaperProvider: () -> ChatWallpaper? + private val wallpaperProvider: () -> ChatWallpaper?, + lifecycleOwner: LifecycleOwner ) : Material3OnScrollHelper( - activity, - listOf(toolbarBackground), - emptyList() + activity = activity, + views = listOf(toolbarBackground), + lifecycleOwner = lifecycleOwner ) { override val activeColorSet: ColorSet get() = ColorSet(getActiveToolbarColor(wallpaperProvider() != null)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt index 42f60dfc15..e936aee939 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt @@ -44,6 +44,7 @@ sealed interface ConversationElementKey { private data class MessageBackedKey(val id: Long) : ConversationElementKey { override fun requireMessageId(): Long = id } + private object ThreadHeaderKey : ConversationElementKey /** @@ -107,24 +108,27 @@ class ConversationDataSource( val callHelper = CallHelper() val referencedIds = hashSetOf() - MessageTable.mmsReaderFor(SignalDatabase.messages.getConversation(threadId, start.toLong(), length.toLong())).forEach { record -> - if (cancellationSignal.isCanceled) { - return@forEach - } + MessageTable.mmsReaderFor(SignalDatabase.messages.getConversation(threadId, start.toLong(), length.toLong())) + .use { reader -> + reader.forEach { record -> + if (cancellationSignal.isCanceled) { + return@forEach + } - records.add(record) - mentionHelper.add(record) - quotedHelper.add(record) - reactionHelper.add(record) - attachmentHelper.add(record) - paymentHelper.add(record) - callHelper.add(record) + records.add(record) + mentionHelper.add(record) + quotedHelper.add(record) + reactionHelper.add(record) + attachmentHelper.add(record) + paymentHelper.add(record) + callHelper.add(record) - val updateDescription = record.getUpdateDisplayBody(context, null) - if (updateDescription != null) { - referencedIds.addAll(updateDescription.mentioned) + val updateDescription = record.getUpdateDisplayBody(context, null) + if (updateDescription != null) { + referencedIds.addAll(updateDescription.mentioned) + } + } } - } if (messageRequestData.includeWarningUpdateMessage() && (start + length >= totalSize)) { records.add(NoGroupsInCommon(threadId, messageRequestData.isGroup)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt index 3ed704207b..be32451800 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.recipients.Recipient +import java.util.function.Predicate /** * Fragment wrapped version of [AttachmentKeyboard] to help encapsulate logic the view @@ -44,6 +45,7 @@ class AttachmentKeyboardFragment : LoggingFragment(R.layout.attachment_keyboard_ private lateinit var attachmentKeyboardView: AttachmentKeyboard private val lifecycleDisposable = LifecycleDisposable() + private val removePaymentFilter: Predicate = Predicate { button -> button != AttachmentKeyboardButton.PAYMENT } @Suppress("ReplaceGetOrSet") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -51,8 +53,12 @@ class AttachmentKeyboardFragment : LoggingFragment(R.layout.attachment_keyboard_ lifecycleDisposable.bindTo(viewLifecycleOwner) attachmentKeyboardView = view.findViewById(R.id.attachment_keyboard) - - attachmentKeyboardView.setCallback(this) + attachmentKeyboardView.apply { + setCallback(this@AttachmentKeyboardFragment) + if (!SignalStore.paymentsValues().paymentsAvailability.isSendAllowed) { + filterAttachmentKeyboardButtons(removePaymentFilter) + } + } viewModel.getRecentMedia() .subscribeBy { @@ -97,7 +103,7 @@ class AttachmentKeyboardFragment : LoggingFragment(R.layout.attachment_keyboard_ ) { attachmentKeyboardView.filterAttachmentKeyboardButtons(null) } else { - attachmentKeyboardView.filterAttachmentKeyboardButtons { button -> button != AttachmentKeyboardButton.PAYMENT } + attachmentKeyboardView.filterAttachmentKeyboardButtons(removePaymentFilter) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index b1cd6b3567..4f74b43ea8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -3193,6 +3193,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return@withinTransaction kotlin.Pair(-1L, null) } + threads.markAsActiveEarly(threadId) SignalDatabase.mentions.insert(threadId, messageId, mentions) val insertedAttachments = SignalDatabase.attachments.insertAttachmentsForMessage(messageId, allAttachments, quoteAttachments) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 9e14f66150..6062f61483 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -1366,6 +1366,18 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } } + /** + * Set a thread as active prior to an [update] call. Useful when a thread is for sure active but + * hasn't had the update call yet. e.g., inserting a message in a new thread. + */ + fun markAsActiveEarly(threadId: Long) { + writableDatabase + .update(TABLE_NAME) + .values(ACTIVE to 1) + .where("$ID = ?", threadId) + .run() + } + fun update(threadId: Long, unarchive: Boolean): Boolean { return update( threadId = threadId, diff --git a/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportYourSmsMessagesFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportYourSmsMessagesFragment.kt index 76de188cc5..5458758602 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportYourSmsMessagesFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/exporter/flow/ExportYourSmsMessagesFragment.kt @@ -36,7 +36,7 @@ class ExportYourSmsMessagesFragment : Fragment(R.layout.export_your_sms_messages } } - Material3OnScrollHelper(requireActivity(), binding.toolbar).attach(binding.scrollView) + Material3OnScrollHelper(requireActivity(), binding.toolbar, viewLifecycleOwner).attach(binding.scrollView) } override fun onResume() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainActivityListHostFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainActivityListHostFragment.kt index 69476515df..d65bee1fac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainActivityListHostFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainActivityListHostFragment.kt @@ -377,7 +377,8 @@ class MainActivityListHostFragment : Fragment(R.layout.main_activity_list_host_f Material3OnScrollHelper( requireActivity(), listOf(_toolbarBackground), - listOf(_searchToolbar) + listOf(_searchToolbar), + viewLifecycleOwner ).attach(recyclerView) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt index 33e02f8817..5965d8815b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt @@ -77,7 +77,11 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { onBack() } - Material3OnScrollHelper(requireActivity(), listOf(binding.mediaGalleryToolbar, binding.mediaGalleryStatusBarBackground)).attach(binding.mediaGalleryGrid) + Material3OnScrollHelper( + activity = requireActivity(), + views = listOf(binding.mediaGalleryToolbar, binding.mediaGalleryStatusBarBackground), + lifecycleOwner = viewLifecycleOwner + ).attach(binding.mediaGalleryGrid) if (callbacks.isCameraEnabled()) { binding.mediaGalleryToolbar.setOnMenuItemClickListener { item -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java index 94f4008bfe..989b78beaf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java @@ -97,7 +97,7 @@ public final class MessageDetailsFragment extends FullScreenDialogFragment imple list.setAdapter(adapter); list.setItemAnimator(null); - new Material3OnScrollHelper(requireActivity(), toolbarShadow).attach(list); + new Material3OnScrollHelper(requireActivity(), toolbarShadow, getViewLifecycleOwner()).attach(list); } private void initializeViewModel() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryFlowDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryFlowDialogFragment.kt index 1938ec22a8..bc1638e23c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryFlowDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryFlowDialogFragment.kt @@ -32,4 +32,8 @@ class CreateStoryFlowDialogFragment : DialogFragment(R.layout.create_story_flow_ override fun setStatusBarColor(color: Int) { WindowUtil.setStatusBarColor(requireDialog().window!!, color) } + + override fun getStatusBarColor(): Int { + return WindowUtil.getStatusBarColor(requireDialog().window!!) + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryWithViewersFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryWithViewersFragment.kt index 1cd66ea734..50b911d497 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryWithViewersFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/create/CreateStoryWithViewersFragment.kt @@ -76,7 +76,13 @@ class CreateStoryWithViewersFragment : DSLSettingsFragment( } } - Material3OnScrollHelper(requireContext(), { requireListener().setStatusBarColor(it) }, listOf(binding.toolbar)).attach(binding.appBarLayout) + Material3OnScrollHelper( + context = requireContext(), + setStatusBarColor = { requireListener().setStatusBarColor(it) }, + getStatusBarColor = { requireListener().getStatusBarColor() }, + views = listOf(binding.toolbar), + lifecycleOwner = viewLifecycleOwner + ).attach(binding.appBarLayout) ViewUtil.focusAndShowKeyboard(binding.nameField.editText) } @@ -135,6 +141,7 @@ class CreateStoryWithViewersFragment : DSLSettingsFragment( interface Callback { fun setStatusBarColor(@ColorInt color: Int) + fun getStatusBarColor(): Int fun onDone(recipientId: RecipientId) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt index eaebd6b857..f8499e4b47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt @@ -8,6 +8,8 @@ import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import androidx.core.widget.NestedScrollView +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView import com.google.android.material.animation.ArgbEvaluatorCompat import com.google.android.material.appbar.AppBarLayout @@ -22,32 +24,40 @@ import org.thoughtcrime.securesms.util.views.Stub open class Material3OnScrollHelper( private val context: Context, private val setStatusBarColor: (Int) -> Unit, + private val getStatusBarColor: () -> Int, private val views: List, - private val viewStubs: List> = emptyList() + private val viewStubs: List> = emptyList(), + lifecycleOwner: LifecycleOwner ) { - constructor(activity: Activity, views: List, viewStubs: List>) : this(activity, { WindowUtil.setStatusBarColor(activity.window, it) }, views, viewStubs) + constructor(activity: Activity, view: View, lifecycleOwner: LifecycleOwner) : this(activity = activity, views = listOf(view), lifecycleOwner = lifecycleOwner) - constructor(activity: Activity, views: List) : this(activity, { WindowUtil.setStatusBarColor(activity.window, it) }, views, emptyList()) - - constructor(activity: Activity, view: View) : this(activity, { WindowUtil.setStatusBarColor(activity.window, it) }, listOf(view), emptyList()) - - /** - * A pair of colors tied to a specific state. - */ - data class ColorSet( - @ColorRes val toolbarColorRes: Int, - @ColorRes val statusBarColorRes: Int - ) { - constructor(@ColorRes color: Int) : this(color, color) - } + constructor(activity: Activity, views: List, viewStubs: List> = emptyList(), lifecycleOwner: LifecycleOwner) : this( + context = activity, + setStatusBarColor = { WindowUtil.setStatusBarColor(activity.window, it) }, + getStatusBarColor = { WindowUtil.getStatusBarColor(activity.window) }, + views = views, + viewStubs = viewStubs, + lifecycleOwner = lifecycleOwner + ) open val activeColorSet: ColorSet = ColorSet(R.color.signal_colorSurface2) open val inactiveColorSet: ColorSet = ColorSet(R.color.signal_colorBackground) + protected var previousStatusBarColor: Int = getStatusBarColor() + private var animator: ValueAnimator? = null private var active: Boolean? = null + init { + lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + animator?.cancel() + setStatusBarColor(previousStatusBarColor) + } + }) + } + fun attach(nestedScrollView: NestedScrollView) { nestedScrollView.setOnScrollChangeListener( OnScrollListener().apply { @@ -141,4 +151,14 @@ open class Material3OnScrollHelper( updateActiveState(v.canScrollVertically(-1)) } } + + /** + * A pair of colors tied to a specific state. + */ + data class ColorSet( + @ColorRes val toolbarColorRes: Int, + @ColorRes val statusBarColorRes: Int + ) { + constructor(@ColorRes color: Int) : this(color, color) + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java index f8b0cc62f5..a3885c5fb2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java @@ -82,6 +82,10 @@ public final class WindowUtil { window.setStatusBarColor(color); } + public static int getStatusBarColor(@NonNull Window window) { + return window.getStatusBarColor(); + } + /** * A sort of roundabout way of determining if the status bar is present by seeing if there's a * vertical window offset.