First pass at edge-to-edge support.

This commit is contained in:
Greyson Parrelli
2026-07-24 15:24:55 -04:00
committed by Michelle Tang
parent 338283eff5
commit 6dc0229e72
132 changed files with 626 additions and 469 deletions
@@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.FullscreenHelper;
import org.thoughtcrime.securesms.util.WindowUtil;
/**
* Activity for displaying avatars full screen.
@@ -77,6 +78,9 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity {
setTheme(R.style.TextSecure_MediaPreview);
setContentView(R.layout.contact_photo_preview_activity);
WindowUtil.clearLightStatusBar(getWindow());
WindowUtil.clearLightNavigationBar(getWindow());
postponeEnterTransition();
TransitionInflater inflater = TransitionInflater.from(this);
getWindow().setSharedElementEnterTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_enter_transition_set));
@@ -6,6 +6,7 @@ import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
@@ -34,6 +35,7 @@ public abstract class BaseActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
AppStartup.getInstance().onCriticalRenderEventStart();
logEvent("onCreate()");
EdgeToEdge.enable(this);
super.onCreate(savedInstanceState);
AppStartup.getInstance().onCriticalRenderEventEnd();
}
@@ -19,9 +19,11 @@ package org.thoughtcrime.securesms;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.signal.core.util.DimensionUnit;
@@ -34,6 +36,7 @@ import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import java.io.IOException;
import java.lang.ref.WeakReference;
@@ -110,11 +113,16 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActivit
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setIcon(null);
getSupportActionBar().setLogo(null);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
}
private void initializeResources() {
contactsFragment = (ContactSelectionListFragment) getSupportFragmentManager().findFragmentById(R.id.contact_selection_list_fragment);
contactsFragment.setOnRefreshListener(this);
SystemWindowInsetsSetter.attach(contactsFragment.requireView(), this, WindowInsetsCompat.Type.navigationBars());
}
private void initializeSearch() {
@@ -7,8 +7,6 @@ package org.thoughtcrime.securesms.backup.v2.ui.subscription
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContract
import androidx.core.content.IntentCompat
import androidx.core.os.bundleOf
@@ -42,12 +40,6 @@ class MessageBackupsCheckoutActivity : FragmentWrapperActivity() {
}
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
super.onCreate(savedInstanceState, ready)
enableEdgeToEdge()
}
override fun getFragment(): Fragment = MessageBackupsFlowFragment.create(
IntentCompat.getSerializableExtra(intent, TIER, MessageBackupTier::class.java)
)
@@ -5,7 +5,6 @@ import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
@@ -49,8 +48,6 @@ class VerifyBackupKeyActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
setContent {
SignalTheme {
val context = LocalContext.current
@@ -50,7 +50,8 @@ class SelectFeaturedBadgeFragment : DSLSettingsFragment(
return Material3OnScrollHelper(
activity = requireActivity(),
views = listOf(scrollShadow),
lifecycleOwner = viewLifecycleOwner
lifecycleOwner = viewLifecycleOwner,
setStatusBarColor = {}
)
}
@@ -4,11 +4,13 @@ import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
@@ -28,6 +30,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.signal.core.util.concurrent.LifecycleDisposable;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Optional;
@@ -63,6 +66,11 @@ public class BlockedUsersActivity extends PassphraseRequiredActivity implements
container = findViewById(R.id.fragment_container);
toolbar.setNavigationOnClickListener(unused -> onBackPressed());
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(container, this, WindowInsetsCompat.Type.navigationBars());
contactFilterView.setOnFilterChangedListener(query -> {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(CONTACT_SELECTION_FRAGMENT);
if (fragment != null) {
@@ -10,7 +10,6 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.compose.LocalActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -60,7 +59,6 @@ class NewCallActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
super.onCreate(savedInstanceState, ready)
val navigateBack = onBackPressedDispatcher::onBackPressed
@@ -152,8 +152,6 @@ private fun ConversationSettingsEntry(route: MainNavigationDetailLocation.Chats.
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
.statusBarsPadding()
.navigationBarsPadding()
) { fragment ->
backPressedState.attach(fragment)
}
@@ -1,7 +1,12 @@
package org.thoughtcrime.securesms.components.settings
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.activity.SystemBarStyle
import androidx.activity.enableEdgeToEdge
import androidx.core.content.ContextCompat
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.fragment.NavHostFragment
@@ -9,6 +14,7 @@ import org.thoughtcrime.securesms.PassphraseRequiredActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme
import org.thoughtcrime.securesms.util.DynamicTheme
import org.signal.core.ui.R as CoreUiR
/**
* The DSL API can be completely replaced by compose.
@@ -22,6 +28,8 @@ open class DSLSettingsActivity : PassphraseRequiredActivity() {
private set
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableSettingsEdgeToEdge()
setContentView(R.layout.dsl_settings_activity)
if (savedInstanceState == null) {
@@ -62,6 +70,23 @@ open class DSLSettingsActivity : PassphraseRequiredActivity() {
}
}
private fun enableSettingsEdgeToEdge() {
val navBarColor = ContextCompat.getColor(this, CoreUiR.color.signal_colorSurface2)
val isDark = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
if (Build.VERSION.SDK_INT >= 26) {
enableEdgeToEdge(
navigationBarStyle = if (isDark) {
SystemBarStyle.dark(navBarColor)
} else {
SystemBarStyle.light(navBarColor, navBarColor)
}
)
} else {
enableEdgeToEdge()
}
}
protected open fun onWillFinish() {}
protected open fun resolveNavGraphId(): Int = intent.getIntExtra(ARG_NAV_GRAPH, -1)
@@ -4,6 +4,7 @@ import android.content.Context
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.EdgeEffect
import androidx.annotation.CallSuper
import androidx.annotation.LayoutRes
@@ -11,12 +12,19 @@ import androidx.annotation.MenuRes
import androidx.annotation.StringRes
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import org.signal.core.ui.logging.LoggingFragment
import org.thoughtcrime.securesms.MainActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavHostFragment
import org.thoughtcrime.securesms.util.Material3OnScrollHelper
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
/**
@@ -70,6 +78,8 @@ abstract class DSLSettingsFragment(
}
}
applyEdgeToEdgeInsets()
when (settingsAdapter) {
is ConcatAdapter -> bindAdapters(settingsAdapter)
is MappingAdapter -> bindAdapter(settingsAdapter)
@@ -77,6 +87,48 @@ abstract class DSLSettingsFragment(
}
}
/**
* Activity windows are all edge-to-edge (enabled centrally in [org.thoughtcrime.securesms.BaseActivity]),
* so the toolbar tint must extend behind the (transparent) status bar and the list must scroll clear of
* the navigation bar. Skipped for dialog windows (not edge-to-edge) and for fragments embedded directly in
* [MainActivity]'s Compose scaffolding, which insets those containers itself — except the
* conversation-settings detail entry ([ConversationSettingsNavHostFragment]), which leaves insets to these
* fragments so the toolbar scroll tint can reach behind the status bar.
*/
private fun applyEdgeToEdgeInsets() {
if (isDialogHosted() || isInsetByMainActivityHost()) {
return
}
toolbar?.let { toolbar ->
toolbar.updateLayoutParams { height = ViewGroup.LayoutParams.WRAP_CONTENT }
SystemWindowInsetsSetter.attach(toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars())
}
recyclerView?.let { recycler ->
recycler.clipToPadding = false
SystemWindowInsetsSetter.attach(recycler, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars())
}
}
private fun isDialogHosted(): Boolean {
var fragment: Fragment? = this
while (fragment != null) {
if (fragment is DialogFragment && fragment.showsDialog) {
return true
}
fragment = fragment.parentFragment
}
return false
}
private fun isInsetByMainActivityHost(): Boolean {
if (activity !is MainActivity) {
return false
}
return generateSequence(parentFragment) { it.parentFragment }.none { it is ConversationSettingsNavHostFragment }
}
open fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper? {
if (toolbar == null) {
return null
@@ -85,7 +137,8 @@ abstract class DSLSettingsFragment(
return Material3OnScrollHelper(
activity = requireActivity(),
views = listOf(toolbar),
lifecycleOwner = viewLifecycleOwner
lifecycleOwner = viewLifecycleOwner,
setStatusBarColor = {}
)
}
@@ -74,7 +74,6 @@ import org.thoughtcrime.securesms.components.settings.app.routes.AppSettingsRout
import org.thoughtcrime.securesms.components.settings.app.subscription.BadgeImageMedium
import org.thoughtcrime.securesms.components.settings.app.subscription.InAppPaymentsRepository
import org.thoughtcrime.securesms.components.settings.app.subscription.completed.InAppPaymentsBottomSheetDelegate
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.database.model.InAppPaymentSubscriberRecord
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.profiles.ProfileName
@@ -219,9 +218,7 @@ private fun AppSettingsContent(
) {
bannerManager.Banner()
LazyColumn(
modifier = rememberStatusBarColorNestedScrollModifier()
) {
LazyColumn {
item {
BioRow(
self = self,
@@ -47,7 +47,6 @@ import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.Texts
import org.signal.core.util.ServiceUtil
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.keyvalue.SignalStore
@@ -265,9 +264,7 @@ fun AccountSettingsScreen(
) { contentPadding ->
LazyColumn(
modifier = Modifier
.padding(contentPadding)
.then(rememberStatusBarColorNestedScrollModifier())
.testTag(AccountSettingsTestTags.SCROLLER)
.padding(contentPadding).testTag(AccountSettingsTestTags.SCROLLER)
) {
item {
Texts.SectionHeader(
@@ -41,7 +41,6 @@ import org.signal.core.ui.compose.theme.SignalTheme
import org.signal.core.util.ServiceUtil
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.account.LinkedDeviceAccountSettingsState.OneTimeEvent
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.dependencies.AppDependencies
/**
@@ -92,7 +91,6 @@ private fun LinkedDeviceAccountSettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
LinkedDeviceCallout(onLearnMoreClick = { onEvent(LinkedDeviceAccountSettingsEvent.LearnMoreClicked) })
@@ -24,7 +24,6 @@ import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.SignalIcons
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.appearance.navbar.ChooseNavigationBarStyleFragment
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.keyvalue.SettingsValues
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -114,7 +113,6 @@ private fun AppearanceSettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
Rows.RadioListRow(
@@ -106,7 +106,6 @@ import org.thoughtcrime.securesms.components.compose.rememberBiometricsAuthentic
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
import org.thoughtcrime.securesms.components.settings.app.backups.BackupState
import org.thoughtcrime.securesms.components.settings.app.subscription.MessageBackupsCheckoutLauncher.createBackupsCheckoutLauncher
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
import org.thoughtcrime.securesms.help.HelpFragment
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.protos.ArchiveUploadProgressState
@@ -151,8 +150,7 @@ class RemoteBackupsSettingsFragment : ComposeFragment() {
backupRestoreState = restoreState,
backupDeleteState = deleteState,
contentCallbacks = callbacks,
backupProgress = backupProgress,
statusBarColorNestedScrollConnection = remember { StatusBarColorNestedScrollConnection(requireActivity()) }
backupProgress = backupProgress
)
}
@@ -360,8 +358,7 @@ private fun RemoteBackupsSettingsContent(
backupRestoreState: BackupRestoreState,
backupDeleteState: DeletionState,
contentCallbacks: ContentCallbacks,
backupProgress: ArchiveUploadProgressState?,
statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection?
backupProgress: ArchiveUploadProgressState?
) {
val context = LocalContext.current
val biometrics = rememberBiometricsAuthentication(
@@ -402,13 +399,6 @@ private fun RemoteBackupsSettingsContent(
)
},
modifier = Modifier
.then(
if (statusBarColorNestedScrollConnection != null) {
Modifier.nestedScroll(statusBarColorNestedScrollConnection)
} else {
Modifier
}
)
.nestedScroll(scrollBehavior.nestedScrollConnection),
snackbarHost = {
Snackbars.Host(snackbarHostState = snackbarHostState)
@@ -1885,7 +1875,6 @@ private fun RemoteBackupsSettingsContentPreview() {
hasRedemptionError = true,
isOutOfStorageSpace = true
),
statusBarColorNestedScrollConnection = null,
backupDeleteState = DeletionState.NONE,
backupRestoreState = BackupRestoreState.None,
contentCallbacks = ContentCallbacks.Empty,
@@ -1915,7 +1904,6 @@ private fun RemoteBackupsSettingsInternalUserContentPreview() {
internalUser = true,
includeDebuglog = true
),
statusBarColorNestedScrollConnection = null,
backupDeleteState = DeletionState.NONE,
backupRestoreState = BackupRestoreState.None,
contentCallbacks = ContentCallbacks.Empty,
@@ -1948,7 +1936,6 @@ private fun RemoteBackupsSettingsLinkedDevicePaidContentPreview() {
renewalTime = 1_752_710_400.seconds
)
),
statusBarColorNestedScrollConnection = null,
backupDeleteState = DeletionState.NONE,
backupRestoreState = BackupRestoreState.None,
contentCallbacks = ContentCallbacks.Empty,
@@ -1973,7 +1960,6 @@ private fun RemoteBackupsSettingsLinkedDeviceNotFoundContentPreview() {
backupMediaSize = 2300000,
backupState = BackupState.NotFound
),
statusBarColorNestedScrollConnection = null,
backupDeleteState = DeletionState.NONE,
backupRestoreState = BackupRestoreState.None,
contentCallbacks = ContentCallbacks.Empty,
@@ -10,6 +10,7 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.core.view.WindowInsetsCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.MainActivity
@@ -23,6 +24,7 @@ import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme
import org.thoughtcrime.securesms.util.DynamicTheme
import org.thoughtcrime.securesms.util.SignalE164Util
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
/**
* A captive activity that can determine if an interrupted/erred change number request
@@ -58,6 +60,8 @@ class ChangeNumberLockActivity : PassphraseRequiredActivity() {
setContentView(R.layout.activity_change_number_lock)
SystemWindowInsetsSetter.attach(findViewById(R.id.change_number_lock_scroll), this, WindowInsetsCompat.Type.systemBars())
reattemptChange()
}
@@ -28,7 +28,6 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.backup.isIdle
import org.thoughtcrime.securesms.backup.v2.ui.status.BackupCreationProgressRow
import org.thoughtcrime.securesms.components.compose.rememberBiometricsAuthentication
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.keyvalue.protos.LocalBackupCreationProgress
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -162,7 +161,6 @@ private fun ChatsSettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
Rows.ToggleRow(
@@ -27,7 +27,6 @@ import org.signal.core.ui.compose.Texts
import org.signal.core.util.bytes
import org.signal.mediasend.SentMediaQuality
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.util.AttachmentUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.webrtc.CallDataMode
@@ -135,7 +134,6 @@ private fun DataAndStorageSettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
Rows.TextRow(
@@ -39,7 +39,6 @@ import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.emoji.EmojiStrings
import org.thoughtcrime.securesms.components.settings.app.notifications.profiles.AddAllowedMembersViewModel.NotificationProfileAndRecipients
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfileId
@@ -168,7 +167,6 @@ private fun AddAllowedMembersContent(
LazyColumn(
modifier = Modifier
.weight(1f)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
Text(
@@ -43,7 +43,6 @@ import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.SignalIcons
import org.signal.core.ui.compose.Texts
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.viewModel
@@ -193,7 +192,6 @@ private fun AdvancedPrivacySettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
item {
Rows.ToggleRow(
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.components.settings.app.privacy.pnp
import android.content.res.Configuration
import android.os.Bundle
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
@@ -14,7 +13,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
@@ -34,23 +32,11 @@ 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.StatusBarColorNestedScrollConnection
import org.signal.core.ui.R as CoreUiR
class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
private val viewModel: PhoneNumberPrivacySettingsViewModel by viewModels()
private lateinit var statusBarNestedScrollConnection: StatusBarColorNestedScrollConnection
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
statusBarNestedScrollConnection = StatusBarColorNestedScrollConnection(requireActivity())
}
override fun onResume() {
super.onResume()
statusBarNestedScrollConnection.setColorImmediate()
}
@Composable
override fun FragmentContent() {
@@ -62,7 +48,6 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() {
state = state,
snackbarHostState = snackbarHostState,
onNavigationClick = { findNavController().popBackStack() },
statusBarNestedScrollConnection = statusBarNestedScrollConnection,
onEveryoneCanSeeMyNumberClicked = viewModel::setEveryoneCanSeeMyNumber,
onNobodyCanSeeMyNumberClicked = viewModel::setNobodyCanSeeMyNumber,
onEveryoneCanFindMeByNumberClicked = viewModel::setEveryoneCanFindMeByMyNumber,
@@ -96,7 +81,6 @@ private fun Screen(
state: PhoneNumberPrivacySettingsState,
snackbarHostState: SnackbarHostState = SnackbarHostState(),
onNavigationClick: () -> Unit = {},
statusBarNestedScrollConnection: StatusBarColorNestedScrollConnection? = null,
onEveryoneCanSeeMyNumberClicked: () -> Unit = {},
onNobodyCanSeeMyNumberClicked: () -> Unit = {},
onEveryoneCanFindMeByNumberClicked: () -> Unit = {},
@@ -109,8 +93,7 @@ private fun Screen(
navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close),
snackbarHost = {
SnackbarHost(snackbarHostState)
},
modifier = statusBarNestedScrollConnection?.let { Modifier.nestedScroll(it) } ?: Modifier
}
) { contentPadding ->
Box(modifier = Modifier.padding(contentPadding)) {
LazyColumn {
@@ -114,7 +114,7 @@ class DonateToSignalFragment :
}
override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper {
return object : Material3OnScrollHelper(activity = requireActivity(), views = listOf(toolbar!!), lifecycleOwner = viewLifecycleOwner) {
return object : Material3OnScrollHelper(activity = requireActivity(), views = listOf(toolbar!!), lifecycleOwner = viewLifecycleOwner, setStatusBarColor = {}) {
override val activeColorSet: ColorSet = ColorSet(R.color.transparent, CoreUiR.color.signal_colorBackground)
override val inactiveColorSet: ColorSet = ColorSet(R.color.transparent, CoreUiR.color.signal_colorBackground)
}
@@ -3,9 +3,12 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.c
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResult
@@ -33,6 +36,7 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.donate.st
import org.thoughtcrime.securesms.database.InAppPaymentTable
import org.thoughtcrime.securesms.databinding.CreditCardFragmentBinding
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.viewModel
@@ -55,6 +59,10 @@ class CreditCardFragment : Fragment(R.layout.credit_card_fragment), InAppPayment
TemporaryScreenshotSecurity.bindToViewLifecycleOwner(this)
InAppPaymentCheckoutDelegate.ErrorHandler().attach(this, this, args.inAppPaymentId)
binding.toolbar.updateLayoutParams { height = ViewGroup.LayoutParams.WRAP_CONTENT }
SystemWindowInsetsSetter.attach(binding.toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars())
SystemWindowInsetsSetter.attach(binding.continueButton, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN)
setFragmentResultListener(StripePaymentInProgressFragment.REQUEST_KEY) { _, bundle ->
val result: InAppPaymentProcessorActionResult = bundle.getParcelableCompat(StripePaymentInProgressFragment.REQUEST_KEY, InAppPaymentProcessorActionResult::class.java)!!
if (result.status == InAppPaymentProcessorActionResult.Status.SUCCESS) {
@@ -5,9 +5,6 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.mandate
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
@@ -60,7 +57,6 @@ import org.signal.core.ui.compose.Texts
import org.signal.core.ui.compose.theme.SignalTheme
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.subscription.donate.transfer.DonationTransferTestTags
import org.thoughtcrime.securesms.compose.StatusBarColorAnimator
import org.thoughtcrime.securesms.database.model.databaseprotos.InAppPaymentData
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -76,17 +72,6 @@ class BankTransferMandateFragment : ComposeFragment() {
BankTransferMandateViewModel(args.inAppPaymentId)
}
private lateinit var statusBarColorAnimator: StatusBarColorAnimator
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
statusBarColorAnimator = StatusBarColorAnimator(requireActivity())
}
override fun onResume() {
super.onResume()
statusBarColorAnimator.setColorImmediate()
}
@Composable
override fun FragmentContent() {
val mandate by viewModel.mandate
@@ -97,8 +82,7 @@ class BankTransferMandateFragment : ComposeFragment() {
failedToLoadMandate = failedToLoadMandate,
onNavigationClick = this::onNavigationClick,
onContinueClick = this::onContinueClick,
onLearnMoreClick = this::onLearnMoreClick,
onCanScrollUp = statusBarColorAnimator::setCanScrollUp
onLearnMoreClick = this::onLearnMoreClick
)
}
@@ -136,22 +120,19 @@ fun BankTransferScreenPreview() {
failedToLoadMandate = false,
onNavigationClick = {},
onContinueClick = {},
onLearnMoreClick = {},
onCanScrollUp = {}
onLearnMoreClick = {}
)
}
}
@OptIn(ExperimentalMaterial3Api::class)
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun BankTransferScreen(
bankMandate: String,
failedToLoadMandate: Boolean,
onNavigationClick: () -> Unit,
onContinueClick: () -> Unit,
onLearnMoreClick: () -> Unit,
onCanScrollUp: (Boolean) -> Unit
onLearnMoreClick: () -> Unit
) {
val listState = rememberLazyListState()
val scope = rememberCoroutineScope()
@@ -182,17 +163,19 @@ fun BankTransferScreen(
colors = if (listState.canScrollBackward) TopAppBarDefaults.topAppBarColors(containerColor = SignalTheme.colors.colorSurface2) else TopAppBarDefaults.topAppBarColors()
)
}
) {
onCanScrollUp(listState.canScrollBackward)
Column(horizontalAlignment = CenterHorizontally, modifier = Modifier.fillMaxSize()) {
) { paddingValues ->
Column(
horizontalAlignment = CenterHorizontally,
modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
) {
LazyColumn(
state = listState,
horizontalAlignment = CenterHorizontally,
modifier = Modifier
.fillMaxWidth()
.weight(1f, true)
.padding(top = 64.dp)
) {
item {
Image(
@@ -137,7 +137,7 @@ class ManageDonationsFragment :
}
override fun getMaterial3OnScrollHelper(toolbar: Toolbar?): Material3OnScrollHelper {
return object : Material3OnScrollHelper(activity = requireActivity(), views = listOf(toolbar!!), lifecycleOwner = viewLifecycleOwner) {
return object : Material3OnScrollHelper(activity = requireActivity(), views = listOf(toolbar!!), lifecycleOwner = viewLifecycleOwner, setStatusBarColor = {}) {
override val activeColorSet: ColorSet = ColorSet(R.color.transparent, CoreUiR.color.signal_colorBackground)
override val inactiveColorSet: ColorSet = ColorSet(R.color.transparent, CoreUiR.color.signal_colorBackground)
}
@@ -22,7 +22,6 @@ import org.signal.core.ui.compose.Rows
import org.signal.core.ui.compose.Scaffolds
import org.signal.core.ui.compose.SignalIcons
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.rememberStatusBarColorNestedScrollModifier
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.jobs.ApkUpdateJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
@@ -92,7 +91,6 @@ private fun AppUpdatesSettingsScreen(
LazyColumn(
modifier = Modifier
.padding(paddingValues)
.then(rememberStatusBarColorNestedScrollModifier())
) {
if (Build.VERSION.SDK_INT >= 31) {
item {
@@ -9,7 +9,7 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.WindowManager
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContract
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
@@ -29,7 +29,7 @@ class QrImageSelectionActivity : AppCompatActivity(), MediaGalleryFragment.Callb
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
enableEdgeToEdge()
setContentView(R.layout.username_qr_image_selection_activity)
}
@@ -14,6 +14,7 @@ import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
@@ -67,6 +68,7 @@ class UsernameQrScannerActivity : AppCompatActivity() {
}
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
val galleryLauncher = registerForActivityResult(QrImageSelectionActivity.Contract()) { uri ->
@@ -29,7 +29,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import io.reactivex.rxjava3.kotlin.subscribeBy
import kotlinx.coroutines.launch
import org.signal.core.ui.isSplitPane
import org.signal.core.ui.permissions.Permissions
import org.signal.core.util.DimensionUnit
import org.signal.core.util.Result
@@ -117,7 +116,6 @@ import org.thoughtcrime.securesms.util.ExpirationUtil
import org.thoughtcrime.securesms.util.Material3OnScrollHelper
import org.thoughtcrime.securesms.util.RemoteConfig
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.WindowUtil
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
@@ -275,11 +273,7 @@ class ConversationSettingsFragment :
activity = requireActivity(),
views = listOf(toolbar!!),
lifecycleOwner = viewLifecycleOwner,
setStatusBarColor = { color ->
if (!resources.isSplitPane() || activity is ConversationSettingsActivity) {
WindowUtil.setStatusBarColor(requireActivity().window, color)
}
}
setStatusBarColor = {}
) {
override val inactiveColorSet = ColorSet(
toolbarColorRes = CoreUiR.color.signal_colorBackground_0,
@@ -50,7 +50,6 @@ import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDial
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.service.webrtc.links.UpdateCallLinkResult
import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState
import org.thoughtcrime.securesms.util.WindowUtil
import org.thoughtcrime.securesms.webrtc.CallParticipantsViewState
import kotlin.time.Duration.Companion.seconds
@@ -76,9 +75,6 @@ class ComposeCallScreenMediator(private val activity: WebRtcCallActivity, viewMo
private val lifecycleDisposable = LifecycleDisposable()
init {
WindowUtil.clearTranslucentNavigationBar(activity.window)
WindowUtil.clearTranslucentStatusBar(activity.window)
activity.enableEdgeToEdge(
statusBarStyle = SystemBarStyle.dark(Color.TRANSPARENT),
navigationBarStyle = SystemBarStyle.dark(Color.TRANSPARENT)
@@ -1,62 +0,0 @@
package org.thoughtcrime.securesms.compose
import android.animation.ValueAnimator
import android.app.Activity
import androidx.core.content.ContextCompat
import com.google.android.material.animation.ArgbEvaluatorCompat
import org.thoughtcrime.securesms.util.WindowUtil
import org.signal.core.ui.R as CoreUiR
/**
* Controls status-bar color based off ability to scroll up
*/
class StatusBarColorAnimator(
private val activity: Activity
) {
private var animator: ValueAnimator? = null
private var previousCanScrollUp: Boolean = false
private val normalColor = ContextCompat.getColor(activity, CoreUiR.color.signal_colorBackground)
private val scrollColor = ContextCompat.getColor(activity, CoreUiR.color.signal_colorSurface2)
fun setCanScrollUp(canScrollUp: Boolean) {
if (previousCanScrollUp == canScrollUp) {
return
}
previousCanScrollUp = canScrollUp
applyState(canScrollUp)
}
fun setColorImmediate() {
val end = when {
previousCanScrollUp -> scrollColor
else -> normalColor
}
animator?.cancel()
WindowUtil.setStatusBarColor(
activity.window,
end
)
}
private fun applyState(canScrollUp: Boolean) {
val (start, end) = when {
canScrollUp -> normalColor to scrollColor
else -> scrollColor to normalColor
}
animator?.cancel()
animator = ValueAnimator.ofFloat(0f, 1f).apply {
duration = 200
addUpdateListener {
WindowUtil.setStatusBarColor(
activity.window,
ArgbEvaluatorCompat.getInstance().evaluate(it.animatedFraction, start, end)
)
}
start()
}
}
}
@@ -1,108 +0,0 @@
package org.thoughtcrime.securesms.compose
import android.animation.ValueAnimator
import android.app.Activity
import androidx.activity.compose.LocalActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.Velocity
import androidx.core.content.ContextCompat
import com.google.android.material.animation.ArgbEvaluatorCompat
import org.thoughtcrime.securesms.util.WindowUtil
import kotlin.math.abs
import org.signal.core.ui.R as CoreUiR
/**
* Controls status-bar color based off a nested scroll
*
* Recommended to use this with [rememberStatusBarColorNestedScrollModifier] since it'll prevent you from having to wire through
* an activity or the connection to subcomponents.
*/
class StatusBarColorNestedScrollConnection(
private val activity: Activity
) : NestedScrollConnection {
private var animator: ValueAnimator? = null
private val normalColor = ContextCompat.getColor(activity, CoreUiR.color.signal_colorBackground)
private val scrollColor = ContextCompat.getColor(activity, CoreUiR.color.signal_colorSurface2)
private var contentOffset = 0f
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
return Velocity.Zero
}
override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
val oldContentOffset = contentOffset
if (consumed.y == 0f && available.y > 0f) {
contentOffset = 0f
} else {
contentOffset += consumed.y
}
if (oldContentOffset.isNearZero() xor contentOffset.isNearZero()) {
applyState()
}
return Offset.Zero
}
fun setColorImmediate() {
val end = when {
contentOffset.isNearZero() -> normalColor
else -> scrollColor
}
animator?.cancel()
WindowUtil.setStatusBarColor(
activity.window,
end
)
}
private fun applyState() {
val (start, end) = when {
contentOffset.isNearZero() -> scrollColor to normalColor
else -> normalColor to scrollColor
}
animator?.cancel()
animator = ValueAnimator.ofFloat(0f, 1f).apply {
duration = 200
addUpdateListener {
WindowUtil.setStatusBarColor(
activity.window,
ArgbEvaluatorCompat.getInstance().evaluate(it.animatedFraction, start, end)
)
}
start()
}
}
private fun Float.isNearZero(): Boolean = abs(this) < 0.001
}
/**
* Remembers the nested scroll modifier to ensure the proper status bar coloring behavior.
*
* This is only required if the screen you are modifying does not utilize edgeToEdge.
*/
@Composable
fun rememberStatusBarColorNestedScrollModifier(): Modifier {
val activity = LocalActivity.current as? AppCompatActivity
return remember {
if (activity != null) {
Modifier.nestedScroll(StatusBarColorNestedScrollConnection(activity))
} else {
Modifier
}
}
}
@@ -3,16 +3,20 @@ package org.thoughtcrime.securesms.contactshare;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import static org.thoughtcrime.securesms.contactshare.Contact.Name;
@@ -69,6 +73,9 @@ public class ContactNameEditActivity extends PassphraseRequiredActivity {
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
toolbar.setTitle("");
toolbar.setNavigationOnClickListener(v -> {
Intent resultIntent = new Intent();
@@ -80,6 +87,9 @@ public class ContactNameEditActivity extends PassphraseRequiredActivity {
}
private void initializeViews(@NonNull Name name) {
ScrollView scrollView = findViewById(R.id.scroll_view);
SystemWindowInsetsSetter.attach(scrollView, this, WindowInsetsCompat.Type.navigationBars());
TextView givenName = findViewById(R.id.name_edit_given_name);
TextView familyName = findViewById(R.id.name_edit_family_name);
TextView middleName = findViewById(R.id.name_edit_middle_name);
@@ -9,6 +9,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.ColorInt;
@@ -16,10 +17,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import com.bumptech.glide.Glide;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
@@ -90,6 +94,8 @@ public class ContactShareEditActivity extends PassphraseRequiredActivity impleme
Material3OnScrollHelper onScrollHelper = Material3OnScrollHelper.create(this, toolbar);
onScrollHelper.attach(contactList);
applyEdgeToEdgeInsets(toolbar, contactList, sendButton);
ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(Glide.with(this), dynamicLanguage.getCurrentLocale(), this);
contactList.setAdapter(contactAdapter);
@@ -103,6 +109,13 @@ public class ContactShareEditActivity extends PassphraseRequiredActivity impleme
viewModel.getEvents().observe(this, this::presentEvent);
}
private void applyEdgeToEdgeInsets(@NonNull Toolbar toolbar, @NonNull RecyclerView list, @NonNull View sendButton) {
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(list, this, WindowInsetsCompat.Type.navigationBars());
SystemWindowInsetsSetter.attach(sendButton, this, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN);
}
@Override
protected void onResume() {
super.onResume();
@@ -14,7 +14,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.WindowUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import java.util.ArrayList;
import java.util.Collections;
@@ -118,8 +118,6 @@ public class SharedContactDetailsActivity extends PassphraseRequiredActivity {
getSupportActionBar().setLogo(null);
getSupportActionBar().setTitle("");
toolbar.setNavigationOnClickListener(v -> onBackPressed());
WindowUtil.setStatusBarColor(getWindow(), ContextCompat.getColor(this, R.color.shared_contact_details_titlebar));
}
private void initViews() {
@@ -137,6 +135,7 @@ public class SharedContactDetailsActivity extends PassphraseRequiredActivity {
RecyclerView list = findViewById(R.id.contact_details_fields);
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(contactFieldAdapter);
SystemWindowInsetsSetter.attach(list, this, WindowInsetsCompat.Type.navigationBars());
requestManager = Glide.with(this);
}
@@ -1,7 +1,5 @@
package org.thoughtcrime.securesms.conversation
import android.os.Bundle
import androidx.core.view.WindowCompat
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.conversation.v2.ConversationActivity
import org.thoughtcrime.securesms.util.ViewUtil
@@ -15,11 +13,6 @@ import org.thoughtcrime.securesms.util.ViewUtil
*/
class BubbleConversationActivity : ConversationActivity() {
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
WindowCompat.setDecorFitsSystemWindows(window, false)
super.onCreate(savedInstanceState, ready)
}
override fun onPause() {
super.onPause()
ViewUtil.hideKeyboard(this, findViewById(R.id.fragment_container))
@@ -12,7 +12,6 @@ import android.os.Bundle
import androidx.activity.compose.LocalActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
@@ -77,7 +76,6 @@ class NewConversationActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
super.onCreate(savedInstanceState, ready)
val navigateBack = onBackPressedDispatcher::onBackPressed
@@ -2,13 +2,17 @@ package org.thoughtcrime.securesms.conversation.colors.ui
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.conversation.colors.ChatColors
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
class ChatColorSelectionFragment : Fragment(R.layout.chat_color_selection_fragment) {
@@ -28,6 +32,11 @@ class ChatColorSelectionFragment : Fragment(R.layout.chat_color_selection_fragme
Callbacks(args, view)
)
toolbar.updateLayoutParams { height = ViewGroup.LayoutParams.WRAP_CONTENT }
SystemWindowInsetsSetter.attach(toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars())
SystemWindowInsetsSetter.attach(recycler, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars())
recycler.itemAnimator = null
recycler.adapter = adapter
@@ -2,13 +2,17 @@ package org.thoughtcrime.securesms.conversation.colors.ui.custom
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
class CustomChatColorCreatorFragment : Fragment(R.layout.custom_chat_color_creator_fragment) {
@@ -27,6 +31,9 @@ class CustomChatColorCreatorFragment : Fragment(R.layout.custom_chat_color_creat
)
}
toolbar.updateLayoutParams { height = ViewGroup.LayoutParams.WRAP_CONTENT }
SystemWindowInsetsSetter.attach(toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars())
toolbar.setNavigationOnClickListener {
Navigation.findNavController(it).popBackStack()
}
@@ -23,6 +23,7 @@ import androidx.annotation.Dimension
import androidx.appcompat.widget.AppCompatSeekBar
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.Navigation
@@ -33,6 +34,7 @@ import org.thoughtcrime.securesms.conversation.colors.ChatColors
import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorPreviewView
import org.thoughtcrime.securesms.conversation.colors.ui.ChatColorSelectionViewModel
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.customizeOnDraw
@@ -69,6 +71,9 @@ class CustomChatColorCreatorPageFragment :
val save: View = view.findViewById(R.id.save)
val scrollView: ScrollView = view.findViewById(R.id.scroll_view)
scrollView.clipToPadding = false
SystemWindowInsetsSetter.attach(scrollView, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars())
if (page == SINGLE_PAGE) {
gradientTool.visibility = View.GONE
} else {
@@ -38,6 +38,7 @@ import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity;
import org.signal.core.ui.permissions.Permissions;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Locale;
@@ -71,6 +72,8 @@ public abstract class DeviceTransferSetupFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Group progressGroup = view.findViewById(R.id.device_transfer_setup_fragment_progress_group);
@@ -10,6 +10,7 @@ import androidx.annotation.Nullable;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.restore.RestoreActivity;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
/**
* Shown after the new device successfully completes receiving a backup from the old device.
@@ -21,6 +22,8 @@ public final class NewDeviceTransferCompleteFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
view.findViewById(R.id.new_device_transfer_complete_fragment_continue_registration)
.setOnClickListener(v -> ((RestoreActivity) requireActivity()).onBackupCompletedSuccessfully());
}
@@ -7,6 +7,7 @@ import org.greenrobot.eventbus.EventBus
import org.signal.core.ui.logging.LoggingFragment
import org.signal.devicetransfer.TransferStatus
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
/**
@@ -14,6 +15,8 @@ import org.thoughtcrime.securesms.util.navigation.safeNavigate
*/
class NewDeviceTransferInstructionsFragment : LoggingFragment(R.layout.new_device_transfer_instructions_fragment) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
view
.findViewById<View>(R.id.new_device_transfer_instructions_fragment_continue)
.setOnClickListener { findNavController().safeNavigate(R.id.action_device_transfer_setup) }
@@ -9,6 +9,7 @@ import androidx.annotation.Nullable;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
/**
* Shown after the old device successfully completes sending a backup to the new device.
@@ -20,6 +21,8 @@ public final class OldDeviceTransferCompleteFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
view.findViewById(R.id.old_device_transfer_complete_fragment_close)
.setOnClickListener(v -> close());
}
@@ -17,6 +17,7 @@ import org.signal.devicetransfer.DeviceToDeviceTransferService;
import org.signal.devicetransfer.TransferStatus;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
/**
@@ -30,6 +31,8 @@ public final class OldDeviceTransferInstructionsFragment extends LoggingFragment
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
Toolbar toolbar = view.findViewById(R.id.old_device_transfer_instructions_fragment_toolbar);
toolbar.setNavigationOnClickListener(v -> showConfirmExitDialog());
@@ -9,6 +9,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
@@ -28,6 +29,7 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
@@ -98,6 +100,9 @@ public class GiphyActivity extends PassphraseRequiredActivity implements Keyboar
searchView.setCallbacks(this);
searchView.enableBackNavigation(true);
ViewUtil.focusAndShowKeyboard(searchView);
SystemWindowInsetsSetter.attach(findViewById(R.id.giphy_toolbar), this, WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(findViewById(R.id.giphy_logo), this, WindowInsetsCompat.Type.navigationBars());
}
private void handleGiphyMp4SaveResult(@NonNull GiphyMp4SaveResult result) {
@@ -13,7 +13,6 @@ import android.os.Bundle
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.compose.foundation.layout.fillMaxSize
@@ -80,7 +79,6 @@ class AddMembersActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
super.onCreate(savedInstanceState, ready)
setContent {
@@ -10,7 +10,6 @@ import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SnackbarHostState
@@ -71,7 +70,6 @@ class AddToGroupsActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
super.onCreate(savedInstanceState, ready)
val navigateBack = onBackPressedDispatcher::onBackPressed
@@ -5,10 +5,12 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import java.util.stream.Collectors;
@@ -25,6 +27,7 @@ import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
import java.util.Objects;
@@ -61,6 +64,9 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
try {
groupId = GroupId.parse(Objects.requireNonNull(getIntent().getStringExtra(EXTRA_GROUP_ID))).requireV2();
} catch (BadGroupIdException e) {
@@ -70,6 +76,10 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
groupList = findViewById(R.id.choose_new_admin_group_list);
done = findViewById(R.id.choose_new_admin_done);
groupList.setClipToPadding(false);
SystemWindowInsetsSetter.attach(groupList, this, WindowInsetsCompat.Type.navigationBars());
SystemWindowInsetsSetter.attach(done, this, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN);
initializeViewModel();
groupList.initializeAdapter(this);
@@ -11,7 +11,6 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
@@ -74,7 +73,6 @@ class CreateGroupActivity : PassphraseRequiredActivity() {
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
super.onCreate(savedInstanceState, ready)
val navigateBack = onBackPressedDispatcher::onBackPressed
@@ -21,6 +21,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
@@ -52,6 +53,7 @@ import org.thoughtcrime.securesms.recipients.ui.disappearingmessages.RecipientDi
import org.signal.core.util.bitmaps.BitmapUtil;
import org.thoughtcrime.securesms.util.ExpirationUtil;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
@@ -109,6 +111,13 @@ public class AddGroupDetailsFragment extends LoggingFragment {
View addLater = view.findViewById(R.id.add_later);
TextView disappearingMessageValue = view.findViewById(R.id.group_disappearing_messages_value);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
members.setClipToPadding(false);
SystemWindowInsetsSetter.attach(members, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
SystemWindowInsetsSetter.attach(create, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN);
members.initializeAdapter(getViewLifecycleOwner());
avatarPlaceholder = Objects.requireNonNull(VectorDrawableCompat.create(getResources(), R.drawable.ic_camera_outline_24, requireActivity().getTheme()));
avatarPlaceholder.setColorFilter(new SimpleColorFilter(ContextCompat.getColor(requireContext(), R.color.signal_icon_tint_primary)));
@@ -5,7 +5,6 @@
package org.thoughtcrime.securesms.groups.ui.incommon
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -29,7 +28,6 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -48,7 +46,6 @@ import org.signal.core.util.getParcelableExtraCompat
import org.thoughtcrime.securesms.PassphraseRequiredActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.avatar.AvatarImage
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.util.CommunicationActions
@@ -85,7 +82,6 @@ class GroupsInCommonActivity : PassphraseRequiredActivity() {
setContent {
SignalTheme {
GroupsInCommonScreen(
activity = this,
viewModel = viewModel,
onNavigateBack = ::supportFinishAfterTransition,
onNavigateToConversation = ::navigateToConversation
@@ -107,19 +103,16 @@ class GroupsInCommonActivity : PassphraseRequiredActivity() {
@Composable
private fun GroupsInCommonScreen(
activity: Activity,
viewModel: GroupsInCommonViewModel,
onNavigateBack: () -> Unit = {},
onNavigateToConversation: (recipient: Recipient) -> Unit = {}
) {
val groups by viewModel.groups.collectAsStateWithLifecycle()
val nestedScrollConnection = remember { StatusBarColorNestedScrollConnection(activity) }
GroupsInCommonContent(
groups = groups,
onBackPress = onNavigateBack,
onRowClick = onNavigateToConversation,
modifier = Modifier.nestedScroll(nestedScrollConnection)
onRowClick = onNavigateToConversation
)
}
@@ -3,9 +3,11 @@ package org.thoughtcrime.securesms.groups.ui.invitesandrequests;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@@ -21,6 +23,7 @@ import org.thoughtcrime.securesms.groups.ui.invitesandrequests.invited.PendingMe
import org.thoughtcrime.securesms.groups.ui.invitesandrequests.requesting.RequestingMembersFragment;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
public class ManagePendingAndRequestingMembersActivity extends PassphraseRequiredActivity {
@@ -66,6 +69,9 @@ public class ManagePendingAndRequestingMembersActivity extends PassphraseRequire
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
requireSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
}
private static class ViewPagerAdapter extends FragmentStateAdapter {
@@ -7,6 +7,7 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
@@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.groups.ui.AdminActionsListener;
import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.signal.core.ui.BottomSheetUtil;
import java.util.Objects;
@@ -49,6 +51,9 @@ public class PendingMemberInvitesFragment extends Fragment {
youInvitedEmptyState = view.findViewById(R.id.no_pending_from_you);
othersInvitedEmptyState = view.findViewById(R.id.no_pending_from_others);
((ViewGroup) view).setClipToPadding(false);
SystemWindowInsetsSetter.attach(view, this, WindowInsetsCompat.Type.navigationBars());
youInvited.initializeAdapter(getViewLifecycleOwner());
othersInvited.initializeAdapter(getViewLifecycleOwner());
@@ -8,6 +8,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
@@ -18,6 +19,7 @@ import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
import org.thoughtcrime.securesms.groups.v2.GroupLinkUrlAndStatus;
import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.signal.core.ui.BottomSheetUtil;
import java.util.Objects;
@@ -52,6 +54,9 @@ public class RequestingMembersFragment extends Fragment {
noRequestingMessage = view.findViewById(R.id.no_requesting);
requestingExplanation = view.findViewById(R.id.requesting_members_explain);
((ViewGroup) view).setClipToPadding(false);
SystemWindowInsetsSetter.attach(view, this, WindowInsetsCompat.Type.navigationBars());
requestingMembers.initializeAdapter(getViewLifecycleOwner());
requestingMembers.setRecipientClickListener(recipient -> {
@@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.pin.PinOptOutDialog;
import org.thoughtcrime.securesms.registration.util.RegistrationUtil;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
@@ -58,6 +59,8 @@ public abstract class BaseSvrPinFragment<ViewModel extends BaseSvrPinViewModel>
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
initializeViews(view);
viewModel = initializeViewModel();
@@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.pin.PinOptOutDialog;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
public final class SvrSplashFragment extends Fragment {
@@ -47,6 +48,8 @@ public final class SvrSplashFragment extends Fragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
title = view.findViewById(R.id.kbs_splash_title);
description = view.findViewById(R.id.kbs_splash_description);
primaryAction = view.findViewById(R.id.kbs_splash_primary_action);
@@ -21,6 +21,9 @@ import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ShareCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -99,6 +102,13 @@ public class SubmitDebugLogActivity extends BaseActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.HelpSettingsFragment__debug_log);
// Insets are re-dispatched by appcompat's ActionBarOverlayLayout with the action bar height folded into the top inset.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, insets) -> {
Insets bars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(bars.left, bars.top, bars.right, bars.bottom);
return WindowInsetsCompat.CONSUMED;
});
this.viewModel = new ViewModelProvider(this, new SubmitDebugLogViewModel.Factory()).get(SubmitDebugLogViewModel.class);
initView();
@@ -27,6 +27,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -47,6 +48,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.signal.core.util.concurrent.SimpleTask;
import java.util.ArrayList;
@@ -196,6 +198,9 @@ public final class MediaOverviewActivity extends PassphraseRequiredActivity {
}
private void initializeToolbar() {
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars());
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -19,6 +19,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.Observer;
@@ -57,6 +58,7 @@ import org.thoughtcrime.securesms.util.BottomOffsetDecoration;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.OffloadedMediaDialogUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.json.JSONArray;
@@ -172,6 +174,10 @@ public final class MediaOverviewPageFragment extends LoggingFragment
this,
sorting.isRelatedToFileSize(),
threadId == MediaTable.ALL_THREADS);
this.recyclerView.setClipToPadding(false);
SystemWindowInsetsSetter.attach(recyclerView, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
SystemWindowInsetsSetter.attach(bottomActionBar, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN);
this.recyclerView.setAdapter(adapter);
this.recyclerView.setLayoutManager(gridManager);
this.recyclerView.setHasFixedSize(true);
@@ -7,7 +7,6 @@ import android.view.ViewGroup.LayoutParams
import android.widget.ImageView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import androidx.core.transition.addListener
import androidx.core.view.animation.PathInterpolatorCompat
import androidx.core.view.updateLayoutParams
@@ -21,7 +20,6 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController
import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaControllerOwner
import org.thoughtcrime.securesms.util.WindowUtil
import org.signal.core.ui.R as CoreUiR
class MediaPreviewV2Activity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner {
@@ -127,9 +125,6 @@ class MediaPreviewV2Activity : PassphraseRequiredActivity(), VoiceNoteMediaContr
voiceNoteMediaController = VoiceNoteMediaController(this, false)
val systemBarColor = ContextCompat.getColor(this, CoreUiR.color.signal_dark_colorSurface)
window.statusBarColor = systemBarColor
window.navigationBarColor = systemBarColor
WindowUtil.clearLightStatusBar(window)
WindowUtil.clearLightNavigationBar(window)
@@ -485,7 +485,7 @@ class MediaPreviewV2Fragment :
}
private fun crossfadeViewIn(view: View, duration: Long = 200): Boolean {
return if (!view.isVisible && !fullscreenHelper.isSystemUiVisible) {
return if (!view.isVisible && fullscreenHelper.isSystemUiVisible) {
val viewPropertyAnimator = view.animate()
.alpha(1f)
.setDuration(duration)
@@ -8,7 +8,6 @@ import android.view.KeyEvent
import android.view.WindowManager
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.foundation.layout.navigationBarsPadding
@@ -99,8 +98,6 @@ class MediaSelectionActivity :
}
override fun onPreCreate() {
enableEdgeToEdge()
val sendType: MessageSendType = requireNotNull(intent.getParcelableExtraCompat(MESSAGE_SEND_TYPE, MessageSendType::class.java))
val initialMedia: List<Media> = intent.getParcelableArrayListExtraCompat(MEDIA, Media::class.java) ?: listOf()
val message: CharSequence? = if (shareToTextStory) null else draftText
@@ -115,7 +115,8 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) {
Material3OnScrollHelper(
activity = requireActivity(),
views = listOf(binding.mediaGalleryToolbar, binding.mediaGalleryStatusBarBackground),
lifecycleOwner = viewLifecycleOwner
lifecycleOwner = viewLifecycleOwner,
setStatusBarColor = {}
).attach(binding.mediaGalleryGrid)
if (callbacks.isCameraEnabled()) {
@@ -7,7 +7,6 @@ package org.thoughtcrime.securesms.mediasend.v3
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
@@ -36,8 +35,6 @@ import org.thoughtcrime.securesms.util.CommunicationActions
class MediaSendV3Activity : PassphraseRequiredActivity() {
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
enableEdgeToEdge()
val contractArgs = MediaSendActivityContract.Args.fromIntent(intent)
setContent {
@@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.megaphone;
import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.core.view.WindowInsetsCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.ThreadUtil;
@@ -12,6 +14,7 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.PlayStoreUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
/**
* Shown when a users build fully expires. Controlled by {@link Megaphones.Event#CLIENT_DEPRECATED}.
@@ -24,6 +27,8 @@ public class ClientDeprecatedActivity extends PassphraseRequiredActivity {
protected void onCreate(Bundle savedInstanceState, boolean ready) {
setContentView(R.layout.client_deprecated_activity);
SystemWindowInsetsSetter.attach(findViewById(R.id.client_deprecated_root), this, WindowInsetsCompat.Type.systemBars());
findViewById(R.id.client_deprecated_update_button).setOnClickListener(v -> onUpdateClicked());
findViewById(R.id.client_deprecated_dont_update_button).setOnClickListener(v -> onDontUpdateClicked());
}
@@ -12,6 +12,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import com.bumptech.glide.Glide;
@@ -20,6 +21,7 @@ import org.thoughtcrime.securesms.BaseActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import java.util.concurrent.TimeUnit;
@@ -50,6 +52,8 @@ public class CalleeMustAcceptMessageRequestActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.callee_must_accept_message_request_dialog_fragment);
SystemWindowInsetsSetter.attach(findViewById(R.id.callee_must_accept_root), this, WindowInsetsCompat.Type.systemBars());
boolean callingFixedToPortrait = getResources().getConfiguration().densityDpi < 480;
if (callingFixedToPortrait) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
@@ -19,9 +19,12 @@ package org.thoughtcrime.securesms.migrations;
import android.os.Bundle;
import androidx.core.view.WindowInsetsCompat;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BaseActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
/**
* An activity that can be shown to block access to the rest of the app when a long-running or
@@ -43,6 +46,7 @@ public class ApplicationMigrationActivity extends BaseActivity {
if (running) {
Log.i(TAG, "UI-blocking migration is in progress. Showing spinner.");
setContentView(R.layout.application_migration_activity);
SystemWindowInsetsSetter.attach(findViewById(R.id.application_migration_root), this, WindowInsetsCompat.Type.systemBars());
} else {
Log.i(TAG, "UI-blocking migration is no-longer in progress. Finishing.");
startActivity(getIntent().getParcelableExtra("next_intent"));
@@ -13,7 +13,9 @@ import androidx.activity.result.contract.ActivityResultContract
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
@@ -219,6 +221,8 @@ private fun NicknameContent(
Column(
modifier = Modifier
.padding(paddingValues)
.consumeWindowInsets(paddingValues)
.imePadding()
.padding(horizontal = dimensionResource(id = CoreUiR.dimen.gutter))
) {
LazyColumn(modifier = Modifier.weight(1f)) {
@@ -11,6 +11,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
@@ -20,6 +21,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.payments.MoneyView;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
@@ -38,6 +40,10 @@ public class DeactivateWalletFragment extends Fragment {
View deactivateWithoutTransfer = view.findViewById(R.id.deactivate_wallet_fragment_deactivate);
LearnMoreTextView notice = view.findViewById(R.id.deactivate_wallet_fragment_notice);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(view.findViewById(R.id.deactivate_wallet_fragment_scroll_view), getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
notice.setLearnMoreVisible(true);
notice.setLink(getString(R.string.DeactivateWalletFragment__learn_more__we_recommend_transferring_your_funds));
@@ -2,10 +2,12 @@ package org.thoughtcrime.securesms.payments.preferences;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.Navigation;
@@ -24,6 +26,7 @@ import org.thoughtcrime.securesms.payments.CanNotSendPaymentDialog;
import org.thoughtcrime.securesms.payments.preferences.model.PayeeParcelable;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.signal.core.util.ExpiringProfileCredentialUtil;
@@ -47,6 +50,9 @@ public class PaymentRecipientSelectionFragment extends LoggingFragment implement
toolbar = view.findViewById(R.id.payment_recipient_selection_fragment_toolbar);
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(v).popBackStack());
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
contactFilterView = view.findViewById(R.id.contact_filter_edit_text);
Bundle arguments = new Bundle();
@@ -6,6 +6,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -16,6 +17,7 @@ import com.google.android.material.tabs.TabLayout;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
public class PaymentsAllActivityFragment extends LoggingFragment {
@@ -28,6 +30,9 @@ public class PaymentsAllActivityFragment extends LoggingFragment {
ViewPager viewPager = view.findViewById(R.id.payments_all_activity_fragment_view_pager);
TabLayout tabLayout = view.findViewById(R.id.payments_all_activity_fragment_tabs);
Toolbar toolbar = view.findViewById(R.id.payments_all_activity_fragment_toolbar);
View appBar = view.findViewById(R.id.payments_activity_fragment_appbar);
SystemWindowInsetsSetter.attach(appBar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(v).popBackStack());
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.payments.preferences;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
@@ -12,6 +13,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.compose.ui.platform.ComposeView;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import androidx.navigation.fragment.NavHostFragment;
@@ -41,6 +43,7 @@ import org.thoughtcrime.securesms.payments.preferences.model.PaymentItem;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.PlayStoreUtil;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
@@ -100,6 +103,10 @@ public class PaymentsHomeFragment extends LoggingFragment {
LottieAnimationView refreshAnimation = view.findViewById(R.id.payments_home_fragment_header_refresh_animation);
Stub<ComposeView> bannerView = ViewUtil.findStubById(view, R.id.banner_compose_view);
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(recycler, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
toolbar.setNavigationOnClickListener(v -> {
viewModel.markAllPaymentsSeen();
requireActivity().finish();
@@ -5,6 +5,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
@@ -14,6 +15,7 @@ import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.PaymentPreferencesDirections;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.payments.preferences.model.PaymentItem;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
public class PaymentsPagerItemFragment extends LoggingFragment {
@@ -56,6 +58,8 @@ public class PaymentsPagerItemFragment extends LoggingFragment {
PaymentsHomeAdapter adapter = new PaymentsHomeAdapter(new Callbacks());
recycler.setAdapter(adapter);
recycler.setClipToPadding(false);
SystemWindowInsetsSetter.attach(recycler, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
viewModel.getList().observe(getViewLifecycleOwner(), adapter::submitList);
}
@@ -2,10 +2,12 @@ package org.thoughtcrime.securesms.payments.preferences;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView;
@@ -13,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.settings.BaseSettingsAdapter;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import java.util.Currency;
@@ -31,6 +34,12 @@ public final class SetCurrencyFragment extends LoggingFragment {
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(v).popBackStack());
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
list.setClipToPadding(false);
SystemWindowInsetsSetter.attach(list, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
SetCurrencyViewModel viewModel = new ViewModelProvider(this, new SetCurrencyViewModel.Factory()).get(SetCurrencyViewModel.class);
BaseSettingsAdapter adapter = new BaseSettingsAdapter();
@@ -5,6 +5,7 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
@@ -17,6 +18,7 @@ import androidx.navigation.Navigation;
import org.signal.core.ui.logging.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.qr.QrView;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
public final class PaymentsAddMoneyFragment extends LoggingFragment {
@@ -28,6 +30,9 @@ public final class PaymentsAddMoneyFragment extends LoggingFragment {
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
((ViewGroup) view).setClipToPadding(false);
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
PaymentsAddMoneyViewModel viewModel = new ViewModelProvider(this, new PaymentsAddMoneyViewModel.Factory()).get(PaymentsAddMoneyViewModel.class);
Toolbar toolbar = view.findViewById(R.id.payments_add_money_toolbar);
@@ -8,6 +8,7 @@ import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
@@ -16,6 +17,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.Group;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
@@ -35,6 +37,7 @@ import org.thoughtcrime.securesms.payments.State;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
import org.whispersystems.signalservice.api.payments.Money;
@@ -55,6 +58,10 @@ public final class PaymentDetailsFragment extends LoggingFragment {
toolbar.setNavigationOnClickListener(v -> Navigation.findNavController(v).popBackStack());
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
SystemWindowInsetsSetter.attach(view.findViewById(R.id.payments_details_scroll_view), getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars());
PaymentDetailsParcelable details = PaymentDetailsFragmentArgs.fromBundle(requireArguments()).getPaymentDetails();
AvatarImageView avatar = view.findViewById(R.id.payments_details_avatar);
@@ -2,13 +2,17 @@ package org.thoughtcrime.securesms.payments.securitysetup
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.databinding.PaymentsSecuritySetupFragmentBinding
import org.thoughtcrime.securesms.payments.preferences.PaymentsHomeFragmentDirections
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
/**
@@ -19,6 +23,10 @@ class PaymentsSecuritySetupFragment : Fragment(R.layout.payments_security_setup_
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = PaymentsSecuritySetupFragmentBinding.bind(view)
binding.toolbar.updateLayoutParams { height = ViewGroup.LayoutParams.WRAP_CONTENT }
SystemWindowInsetsSetter.attach(binding.toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars())
SystemWindowInsetsSetter.attach(binding.paymentsSecuritySetupScrollView, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars())
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
object : OnBackPressedCallback(true) {
@@ -13,6 +13,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ShareCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
@@ -25,6 +26,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.signal.core.util.concurrent.LifecycleDisposable;
import org.thoughtcrime.securesms.util.SignalProxyUtil;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.signal.core.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
@@ -63,6 +65,9 @@ public class EditProxyFragment extends Fragment {
}
});
toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars());
this.proxySwitch = view.findViewById(R.id.edit_proxy_switch);
this.proxyTitle = view.findViewById(R.id.edit_proxy_address_title);
this.proxyText = view.findViewById(R.id.edit_proxy_host);
@@ -70,6 +75,8 @@ public class EditProxyFragment extends Fragment {
this.saveButton = view.findViewById(R.id.edit_proxy_save);
this.shareButton = view.findViewById(R.id.edit_proxy_share);
SystemWindowInsetsSetter.attach(saveButton, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN);
lifecycleDisposable = new LifecycleDisposable();
lifecycleDisposable.bindTo(getViewLifecycleOwner());
@@ -40,6 +40,7 @@ import org.thoughtcrime.securesms.profiles.edit.pnp.WhoCanFindMeByPhoneNumberFra
import org.thoughtcrime.securesms.profiles.manage.EditProfileNameFragment;
import org.thoughtcrime.securesms.util.CommunicationActions;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
@@ -89,6 +90,8 @@ public class CreateProfileFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(binding.container, getViewLifecycleOwner());
GroupId groupId = GroupId.parseNullableOrThrow(requireArguments().getString(GROUP_ID, null));
initializeViewModel(requireArguments().getBoolean(EXCLUDE_SYSTEM, false), groupId, savedInstanceState != null);
@@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiUtil;
import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.adapter.AlwaysChangedDiffUtil;
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
@@ -76,6 +77,8 @@ public class EditAboutFragment extends Fragment implements EditProfileActivity.E
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
this.emojiView = view.findViewById(R.id.edit_about_emoji);
this.bodyView = view.findViewById(R.id.edit_about_body);
this.countView = view.findViewById(R.id.edit_about_count);
@@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.registration.ui.RegistrationActivity
import org.thoughtcrime.securesms.util.NameUtil.getAbbreviation
import org.thoughtcrime.securesms.util.PlayStoreUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
@@ -72,6 +73,8 @@ class EditProfileFragment : LoggingFragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
disposables = LifecycleDisposable()
disposables.bindTo(viewLifecycleOwner)
@@ -22,6 +22,7 @@ import org.signal.core.util.StringUtil;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.profiles.ProfileName;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
@@ -45,6 +46,8 @@ public class EditProfileNameFragment extends Fragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
this.givenName = view.findViewById(R.id.edit_profile_name_given_name);
this.familyName = view.findViewById(R.id.edit_profile_name_family_name);
this.saveButton = view.findViewById(R.id.edit_profile_name_save);
@@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher;
import org.thoughtcrime.securesms.databinding.UsernameEditFragmentBinding;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.FragmentResultContract;
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter;
import org.thoughtcrime.securesms.util.UsernameUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
@@ -69,6 +70,8 @@ public class UsernameEditFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner());
Bundle bundle = getArguments();
if (bundle != null) {
args = UsernameEditFragmentArgs.fromBundle(bundle);
@@ -13,6 +13,9 @@ import android.widget.Toast;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import org.signal.core.util.concurrent.SimpleTask;
import org.signal.core.util.logging.Log;
@@ -54,6 +57,13 @@ public class RecaptchaProofActivity extends PassphraseRequiredActivity {
requireSupportActionBar().setDisplayHomeAsUpEnabled(true);
requireSupportActionBar().setTitle(R.string.RecaptchaProofActivity_complete_verification);
// Insets are re-dispatched by appcompat's ActionBarOverlayLayout with the action bar height folded into the top inset.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, insets) -> {
Insets bars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(bars.left, bars.top, bars.right, bars.bottom);
return WindowInsetsCompat.CONSUMED;
});
WebView webView = findViewById(R.id.recaptcha_webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.clearCache(true);
@@ -1,14 +1,10 @@
package org.thoughtcrime.securesms.reactions.edit
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import org.thoughtcrime.securesms.PassphraseRequiredActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme
import org.thoughtcrime.securesms.util.DynamicTheme
import org.thoughtcrime.securesms.util.WindowUtil
class EditReactionsActivity : PassphraseRequiredActivity() {
@@ -21,10 +17,6 @@ class EditReactionsActivity : PassphraseRequiredActivity() {
}
theme.onCreate(this)
@Suppress("DEPRECATION")
findViewById<View>(android.R.id.content).systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
WindowUtil.setStatusBarColor(window, ContextCompat.getColor(this, R.color.transparent))
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(android.R.id.content, EditReactionsFragment())
@@ -8,7 +8,7 @@ import android.view.animation.AnimationUtils
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.ViewModelProvider
import androidx.transition.ChangeBounds
import androidx.transition.Transition
@@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.animation.transitions.AlphaTransition
import org.thoughtcrime.securesms.components.emoji.EmojiImageView
import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
private val SELECTED_SIZE = ViewUtil.dpToPx(36)
@@ -45,7 +46,7 @@ class EditReactionsFragment : LoggingFragment(R.layout.edit_reactions_fragment),
toolbar.setNavigationOnClickListener {
requireActivity().onBackPressed()
}
configureToolbar()
configureInsets(view)
reactionViews = listOf(
view.findViewById(R.id.reaction_1),
@@ -88,18 +89,9 @@ class EditReactionsFragment : LoggingFragment(R.layout.edit_reactions_fragment),
view.setOnClickListener { viewModel.setSelection(EditReactionsViewModel.NO_SELECTION) }
}
private fun configureToolbar() {
@Suppress("DEPRECATION")
ViewCompat.setOnApplyWindowInsetsListener(toolbar) { _, insets ->
updateToolbarTopMargin(insets.systemWindowInsetTop)
insets
}
}
private fun updateToolbarTopMargin(topMargin: Int) {
val layoutParams = toolbar.layoutParams as ConstraintLayout.LayoutParams
layoutParams.topMargin = topMargin
toolbar.layoutParams = layoutParams
private fun configureInsets(view: View) {
SystemWindowInsetsSetter.attach(toolbar, viewLifecycleOwner, WindowInsetsCompat.Type.statusBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN)
SystemWindowInsetsSetter.attach(view.findViewById(R.id.edit_reactions_fragment_save), viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN)
}
private fun select(emojiImageView: EmojiImageView) {
@@ -18,10 +18,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -311,6 +313,8 @@ private fun Content(
Column(
modifier = Modifier
.padding(paddingValues)
.consumeWindowInsets(paddingValues)
.imePadding()
.fillMaxSize()
) {
val onNextAction = remember(state.isLookupInProgress) {
@@ -16,6 +16,7 @@ import org.signal.core.ui.logging.LoggingFragment
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegate.setDebugLogSubmitMultiTapView
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import kotlin.time.Duration.Companion.milliseconds
/**
@@ -26,6 +27,8 @@ class AccountLockedFragment : LoggingFragment(R.layout.account_locked_fragment)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
setDebugLogSubmitMultiTapView(view.findViewById(R.id.account_locked_title))
val description = view.findViewById<TextView>(R.id.account_locked_description)
@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.ViewBinderDelegate
import org.thoughtcrime.securesms.databinding.FragmentRegistrationCaptchaBinding
import org.thoughtcrime.securesms.registration.fragments.RegistrationConstants
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
abstract class CaptchaFragment : LoggingFragment(R.layout.fragment_registration_captcha) {
@@ -25,6 +26,7 @@ abstract class CaptchaFragment : LoggingFragment(R.layout.fragment_registration_
@SuppressLint("SetJavaScriptEnabled")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
binding.registrationCaptchaWebView.settings.javaScriptEnabled = true
binding.registrationCaptchaWebView.clearCache(true)
@@ -40,6 +40,7 @@ import org.thoughtcrime.securesms.registration.fragments.SignalStrengthPhoneStat
import org.thoughtcrime.securesms.registration.sms.ReceivedSmsEvent
import org.thoughtcrime.securesms.registration.ui.RegistrationCheckpoint
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.visible
@@ -67,6 +68,7 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
setDebugLogSubmitMultiTapView(binding.verifyHeader)
phoneStateListener = SignalStrengthPhoneStateListener(this, PhoneStateCallback())
@@ -68,6 +68,7 @@ import org.thoughtcrime.securesms.util.Dialogs
import org.thoughtcrime.securesms.util.SignalE164Util
import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.SupportEmailUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.livedata.LiveDataObserverCallback
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -99,6 +100,7 @@ class EnterPhoneNumberFragment : LoggingFragment(R.layout.fragment_registration_
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
setDebugLogSubmitMultiTapView(binding.verifyHeader)
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
@@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegat
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.SupportEmailUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import java.util.concurrent.TimeUnit
@@ -43,6 +44,7 @@ class RegistrationLockFragment : LoggingFragment(R.layout.fragment_registration_
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
setDebugLogSubmitMultiTapView(view.findViewById(R.id.kbs_lock_pin_title))
val args: RegistrationLockFragmentArgs = RegistrationLockFragmentArgs.fromBundle(requireArguments())
@@ -27,6 +27,7 @@ import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.registration.ui.phonenumber.EnterPhoneNumberMode
import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.SupportEmailUtil
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate
@@ -44,6 +45,8 @@ class ReRegisterWithPinFragment : LoggingFragment(R.layout.fragment_registration
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
RegistrationViewDelegate.setDebugLogSubmitMultiTapView(binding.pinRestorePinTitle)
binding.pinRestorePinDescription.setText(R.string.RegistrationLockFragment__enter_the_pin_you_created_for_your_account)
@@ -15,11 +15,14 @@ import androidx.activity.viewModels
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@@ -221,6 +224,7 @@ private fun RestoreLocalBackupScreen(
BoxWithConstraints(
modifier = Modifier
.fillMaxSize()
.windowInsetsPadding(WindowInsets.safeDrawing)
.horizontalGutters()
) {
val totalHeightPx = with(density) { maxHeight.roundToPx() }
@@ -14,10 +14,16 @@ import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
@@ -112,6 +118,7 @@ fun RegistrationScreen(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.imePadding()
) {
val scrollState = rememberScrollState()
val context = LocalContext.current
@@ -120,8 +127,9 @@ fun RegistrationScreen(
Column(
modifier = Modifier
.verticalScroll(scrollState)
.weight(weight = 1f, fill = false)
.windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal))
.verticalScroll(scrollState)
.padding(bottom = 16.dp)
.horizontalGutters()
) {
@@ -160,6 +168,7 @@ fun RegistrationScreen(
) {
Box(
modifier = Modifier
.windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom))
.padding(top = 8.dp, bottom = 24.dp)
.horizontalGutters()
) {
@@ -27,6 +27,7 @@ import org.thoughtcrime.securesms.registration.ui.permissions.GrantPermissionsFr
import org.thoughtcrime.securesms.registration.ui.phonenumber.EnterPhoneNumberMode
import org.thoughtcrime.securesms.util.BackupUtil
import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.visible
@@ -45,6 +46,8 @@ class WelcomeFragment : LoggingFragment(R.layout.fragment_registration_welcome_v
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
setDebugLogSubmitMultiTapView(binding.image)
setDebugLogSubmitMultiTapView(binding.title)
@@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.databinding.FragmentChooseBackupBinding
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.registration.fragments.RegistrationViewDelegate
import org.thoughtcrime.securesms.restore.RestoreViewModel
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.navigation.safeNavigate
/**
@@ -44,6 +45,7 @@ class ChooseBackupFragment : LoggingFragment(R.layout.fragment_choose_backup) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
RegistrationViewDelegate.setDebugLogSubmitMultiTapView(binding.chooseBackupFragmentTitle)
binding.chooseBackupFragmentButton.setOnClickListener { onChooseBackupSelected() }
@@ -21,6 +21,7 @@ import org.signal.devicetransfer.TransferStatus
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.ViewBinderDelegate
import org.thoughtcrime.securesms.databinding.FragmentDeviceTransferBinding
import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter
import org.thoughtcrime.securesms.util.visible
/**
@@ -63,6 +64,7 @@ abstract class DeviceTransferFragment : LoggingFragment(R.layout.fragment_device
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
SystemWindowInsetsSetter.attach(view, viewLifecycleOwner)
requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
binding.deviceTransferFragmentCancel.setOnClickListener {

Some files were not shown because too many files have changed in this diff Show More