Fix snackbar durations.

This commit is contained in:
Alex Hart
2026-01-05 12:38:44 -04:00
committed by jeffrey-signal
parent bb21363ca8
commit 305c32cfc5
13 changed files with 144 additions and 29 deletions

View File

@@ -43,7 +43,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.adaptive.layout.PaneAdaptedValue
@@ -83,6 +82,7 @@ import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.signal.core.ui.compose.Snackbars
import org.signal.core.util.concurrent.LifecycleDisposable
import org.signal.core.util.getSerializableCompat
import org.signal.core.util.logging.Log
@@ -325,7 +325,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
mainNavigationViewModel.snackbarRegistry.emit(
SnackbarState(
message = getString(R.string.CallQualitySheet__thanks_for_your_feedback),
duration = SnackbarDuration.Short,
duration = Snackbars.Duration.SHORT,
hostKey = MainSnackbarHostKey.Chat,
fallbackKey = MainSnackbarHostKey.MainChrome
)
@@ -903,7 +903,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
mainNavigationViewModel.snackbarRegistry.emit(
SnackbarState(
message = getString(R.string.VerifyBackupKey__backup_key_correct),
duration = SnackbarDuration.Short,
duration = Snackbars.Duration.SHORT,
hostKey = MainSnackbarHostKey.MainChrome
)
)

View File

@@ -7,7 +7,6 @@ import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.compose.material3.SnackbarDuration
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
@@ -22,6 +21,7 @@ import io.reactivex.rxjava3.core.BackpressureStrategy
import io.reactivex.rxjava3.kotlin.Flowables
import io.reactivex.rxjava3.kotlin.subscribeBy
import kotlinx.coroutines.launch
import org.signal.core.ui.compose.Snackbars
import org.signal.core.util.DimensionUnit
import org.signal.core.util.concurrent.LifecycleDisposable
import org.signal.core.util.concurrent.addTo
@@ -458,7 +458,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
mainNavigationViewModel.snackbarRegistry.emit(
SnackbarState(
message = snackbarMessage,
duration = SnackbarDuration.Short,
duration = Snackbars.Duration.SHORT,
hostKey = MainSnackbarHostKey.MainChrome
)
)

View File

@@ -13,7 +13,6 @@ import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import org.signal.core.util.AppUtil
import org.signal.core.util.ThreadUtil
import org.signal.core.util.concurrent.SignalExecutors
@@ -33,6 +32,8 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.app.privacy.advanced.AdvancedPrivacySettingsRepository
import org.thoughtcrime.securesms.components.settings.app.subscription.InAppPaymentsRepository
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.components.snackbars.SnackbarState
import org.thoughtcrime.securesms.components.snackbars.makeSnackbar
import org.thoughtcrime.securesms.conversation.ConversationIntents
import org.thoughtcrime.securesms.database.JobDatabase
import org.thoughtcrime.securesms.database.LocalMetricsDatabase
@@ -100,7 +101,11 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter
setFragmentResultListener(CallQualityBottomSheetFragment.REQUEST_KEY) { _, bundle ->
if (bundle.getBoolean(CallQualityBottomSheetFragment.REQUEST_KEY, false)) {
Snackbar.make(requireView(), R.string.CallQualitySheet__thanks_for_your_feedback, Snackbar.LENGTH_SHORT).show()
makeSnackbar(
SnackbarState(
message = getString(R.string.CallQualitySheet__thanks_for_your_feedback)
)
)
}
}
}

View File

@@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
@@ -31,7 +30,9 @@ import org.signal.core.ui.compose.Dividers
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.Rows
import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.Snackbars
import org.signal.core.ui.compose.Texts
import org.signal.core.ui.compose.showSnackbar
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
@@ -73,7 +74,7 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
lifecycleScope.launch {
snackbarHostState.showSnackbar(
message = snackbarMessage,
duration = SnackbarDuration.Short
duration = Snackbars.Duration.SHORT
)
}
}

View File

@@ -5,9 +5,12 @@
package org.thoughtcrime.securesms.components.snackbars
import androidx.compose.material3.SnackbarDuration
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.signal.core.ui.compose.Snackbars
fun Fragment.makeSnackbar(state: SnackbarState) {
if (view == null) {
@@ -18,9 +21,10 @@ fun Fragment.makeSnackbar(state: SnackbarState) {
requireView(),
state.message,
when (state.duration) {
SnackbarDuration.Short -> Snackbar.LENGTH_SHORT
SnackbarDuration.Long -> Snackbar.LENGTH_LONG
SnackbarDuration.Indefinite -> Snackbar.LENGTH_INDEFINITE
Snackbars.Duration.SHORT -> Snackbar.LENGTH_SHORT
Snackbars.Duration.LONG -> Snackbar.LENGTH_LONG
Snackbars.Duration.INDEFINITE -> Snackbar.LENGTH_INDEFINITE
else -> Snackbar.LENGTH_INDEFINITE
}
)
@@ -30,4 +34,11 @@ fun Fragment.makeSnackbar(state: SnackbarState) {
}
snackbar.show()
if (state.duration is Snackbars.Duration.Custom) {
viewLifecycleOwner.lifecycleScope.launch {
delay(state.duration.duration)
snackbar.dismiss()
}
}
}

View File

@@ -6,7 +6,7 @@
package org.thoughtcrime.securesms.components.snackbars
import androidx.annotation.ColorRes
import androidx.compose.material3.SnackbarDuration
import org.signal.core.ui.compose.Snackbars
import org.thoughtcrime.securesms.R
/**
@@ -16,15 +16,15 @@ import org.thoughtcrime.securesms.R
* @property actionState Optional action button configuration.
* @property showProgress Whether to show a progress indicator in the snackbar.
* @property duration How long the snackbar should be displayed.
* @property hostKey The target host where this snackbar should be displayed.
* @property hostKey The target host where this snackbar should be displayed. Defaults to [SnackbarHostKey.Global]
* @property fallbackKey Optional host to fallback upon if the host key is not registered. Defaults to the Global key.
*/
data class SnackbarState(
val message: String,
val actionState: ActionState? = null,
val showProgress: Boolean = false,
val duration: SnackbarDuration = SnackbarDuration.Long,
val hostKey: SnackbarHostKey,
val duration: Snackbars.Duration = Snackbars.Duration.SHORT,
val hostKey: SnackbarHostKey = SnackbarHostKey.Global,
val fallbackKey: SnackbarHostKey? = SnackbarHostKey.Global
) {
/**

View File

@@ -26,7 +26,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.WorkerThread;
import androidx.compose.material3.SnackbarDuration;
import org.signal.core.ui.compose.Snackbars;
import androidx.recyclerview.widget.RecyclerView;
import org.signal.core.util.concurrent.LifecycleDisposable;
@@ -152,7 +152,7 @@ public class ConversationListArchiveFragment extends ConversationListFragment
}
),
false,
SnackbarDuration.Long,
Snackbars.Duration.LONG,
MainSnackbarHostKey.MainChrome.INSTANCE,
null
));

View File

@@ -42,7 +42,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.PluralsRes;
import androidx.annotation.WorkerThread;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.compose.material3.SnackbarDuration;
import org.signal.core.ui.compose.Snackbars;
import androidx.compose.ui.platform.ComposeView;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
@@ -991,7 +991,7 @@ public class ConversationListFragment extends MainFragment implements Conversati
}
),
showProgress,
SnackbarDuration.Long,
Snackbars.Duration.LONG,
MainSnackbarHostKey.MainChrome.INSTANCE,
null
));
@@ -1075,7 +1075,7 @@ public class ConversationListFragment extends MainFragment implements Conversati
getString(R.string.conversation_list__you_can_only_pin_up_to_d_chats, MAXIMUM_PINNED_CONVERSATIONS),
null,
false,
SnackbarDuration.Long,
Snackbars.Duration.LONG,
MainSnackbarHostKey.MainChrome.INSTANCE,
null
));
@@ -1441,7 +1441,7 @@ public class ConversationListFragment extends MainFragment implements Conversati
}
),
false,
SnackbarDuration.Long,
Snackbars.Duration.LONG,
MainSnackbarHostKey.MainChrome.INSTANCE,
null
));

View File

@@ -24,6 +24,7 @@ import org.signal.core.ui.compose.AllDevicePreviews
import org.signal.core.ui.compose.Dialogs
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.Snackbars
import org.signal.core.ui.compose.showSnackbar
import org.thoughtcrime.securesms.components.snackbars.SnackbarHostKey
import org.thoughtcrime.securesms.components.snackbars.SnackbarState
import org.thoughtcrime.securesms.components.snackbars.rememberSnackbarState

View File

@@ -9,7 +9,6 @@ import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -34,6 +33,7 @@ import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.Rows
import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.Snackbars
import org.signal.core.ui.compose.showSnackbar
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.backups.remote.BackupKeyDisplayFragment
import org.thoughtcrime.securesms.compose.ComposeFragment
@@ -146,7 +146,7 @@ class AdvancedPinSettingsFragment : ComposeFragment() {
viewLifecycleOwner.lifecycleScope.launch {
viewModel.snackbarHostState.showSnackbar(
message = getString(R.string.ApplicationPreferencesActivity_pin_disabled),
duration = SnackbarDuration.Long
duration = Snackbars.Duration.LONG
)
}
}

View File

@@ -31,7 +31,6 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SecondaryTabRow
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Tab
@@ -78,6 +77,7 @@ import org.signal.core.ui.compose.copied.androidx.compose.DragAndDropEvent
import org.signal.core.ui.compose.copied.androidx.compose.DraggableItem
import org.signal.core.ui.compose.copied.androidx.compose.dragContainer
import org.signal.core.ui.compose.copied.androidx.compose.rememberDragDropState
import org.signal.core.ui.compose.showSnackbar
import org.thoughtcrime.securesms.PassphraseRequiredActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.menu.ActionItem
@@ -625,7 +625,7 @@ private fun SnackbarHost(
if (snackbarMessage != null) {
val result = hostState.showSnackbar(
message = snackbarMessage,
duration = SnackbarDuration.Short,
duration = Snackbars.Duration.SHORT,
withDismissAction = false
)