From 6dc0229e7231c15a3cb2e774d73a7accc609ea2b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 24 Jul 2026 15:24:55 -0400 Subject: [PATCH] First pass at edge-to-edge support. --- .../securesms/AvatarPreviewActivity.java | 4 + .../thoughtcrime/securesms/BaseActivity.java | 2 + .../securesms/ContactSelectionActivity.java | 8 ++ .../MessageBackupsCheckoutActivity.kt | 8 -- .../v2/ui/verify/VerifyBackupKeyActivity.kt | 3 - .../featured/SelectFeaturedBadgeFragment.kt | 3 +- .../blocked/BlockedUsersActivity.java | 8 ++ .../securesms/calls/new/NewCallActivity.kt | 2 - .../securesms/chats/ChatsNavigation.kt | 2 - .../settings/DSLSettingsActivity.kt | 25 ++++ .../settings/DSLSettingsFragment.kt | 55 ++++++++- .../settings/app/AppSettingsFragment.kt | 5 +- .../app/account/AccountSettingsFragment.kt | 5 +- .../LinkedDeviceAccountSettingsFragment.kt | 2 - .../appearance/AppearanceSettingsFragment.kt | 2 - .../remote/RemoteBackupsSettingsFragment.kt | 18 +-- .../changenumber/ChangeNumberLockActivity.kt | 4 + .../app/chats/ChatsSettingsFragment.kt | 2 - .../data/DataAndStorageSettingsFragment.kt | 2 - .../profiles/AddAllowedMembersFragment.kt | 2 - .../AdvancedPrivacySettingsFragment.kt | 2 - .../pnp/PhoneNumberPrivacySettingsFragment.kt | 19 +-- .../donate/DonateToSignalFragment.kt | 2 +- .../donate/card/CreditCardFragment.kt | 8 ++ .../mandate/BankTransferMandateFragment.kt | 37 ++---- .../manage/ManageDonationsFragment.kt | 2 +- .../app/updates/AppUpdatesSettingsFragment.kt | 2 - .../main/QrImageSelectionActivity.kt | 4 +- .../main/UsernameQrScannerActivity.kt | 2 + .../ConversationSettingsFragment.kt | 8 +- .../webrtc/v2/ComposeCallScreenMediator.kt | 4 - .../compose/StatusBarColorAnimator.kt | 62 ---------- .../StatusBarColorNestedScrollConnection.kt | 108 ------------------ .../contactshare/ContactNameEditActivity.java | 10 ++ .../ContactShareEditActivity.java | 13 +++ .../SharedContactDetailsActivity.java | 7 +- .../BubbleConversationActivity.kt | 7 -- .../conversation/NewConversationActivity.kt | 2 - .../colors/ui/ChatColorSelectionFragment.kt | 9 ++ .../custom/CustomChatColorCreatorFragment.kt | 7 ++ .../CustomChatColorCreatorPageFragment.kt | 5 + .../DeviceTransferSetupFragment.java | 3 + .../NewDeviceTransferCompleteFragment.java | 3 + .../NewDeviceTransferInstructionsFragment.kt | 3 + .../OldDeviceTransferCompleteFragment.java | 3 + ...OldDeviceTransferInstructionsFragment.java | 3 + .../securesms/giph/ui/GiphyActivity.java | 5 + .../ui/addmembers/AddMembersActivity.kt | 2 - .../ui/addtogroup/AddToGroupsActivity.kt | 2 - .../chooseadmin/ChooseNewAdminActivity.java | 10 ++ .../ui/creategroup/CreateGroupActivity.kt | 2 - .../details/AddGroupDetailsFragment.java | 9 ++ .../ui/incommon/GroupsInCommonActivity.kt | 9 +- ...gePendingAndRequestingMembersActivity.java | 6 + .../invited/PendingMemberInvitesFragment.java | 5 + .../requesting/RequestingMembersFragment.java | 5 + .../securesms/lock/v2/BaseSvrPinFragment.java | 3 + .../securesms/lock/v2/SvrSplashFragment.java | 3 + .../logsubmit/SubmitDebugLogActivity.java | 10 ++ .../mediaoverview/MediaOverviewActivity.java | 5 + .../MediaOverviewPageFragment.java | 6 + .../mediapreview/MediaPreviewV2Activity.kt | 5 - .../mediapreview/MediaPreviewV2Fragment.kt | 2 +- .../mediasend/v2/MediaSelectionActivity.kt | 3 - .../v2/gallery/MediaGalleryFragment.kt | 3 +- .../mediasend/v3/MediaSendV3Activity.kt | 3 - .../megaphone/ClientDeprecatedActivity.java | 5 + ...alleeMustAcceptMessageRequestActivity.java | 4 + .../ApplicationMigrationActivity.java | 4 + .../securesms/nicknames/NicknameActivity.kt | 4 + .../deactivate/DeactivateWalletFragment.java | 6 + .../PaymentRecipientSelectionFragment.java | 6 + .../PaymentsAllActivityFragment.java | 5 + .../preferences/PaymentsHomeFragment.java | 7 ++ .../PaymentsPagerItemFragment.java | 4 + .../preferences/SetCurrencyFragment.java | 9 ++ .../addmoney/PaymentsAddMoneyFragment.java | 5 + .../details/PaymentDetailsFragment.java | 7 ++ .../PaymentsSecuritySetupFragment.kt | 8 ++ .../preferences/EditProxyFragment.java | 7 ++ .../profiles/edit/CreateProfileFragment.java | 3 + .../profiles/manage/EditAboutFragment.java | 3 + .../profiles/manage/EditProfileFragment.kt | 3 + .../manage/EditProfileNameFragment.java | 3 + .../profiles/manage/UsernameEditFragment.java | 3 + .../ratelimit/RecaptchaProofActivity.java | 10 ++ .../reactions/edit/EditReactionsActivity.kt | 8 -- .../reactions/edit/EditReactionsFragment.kt | 20 +--- .../recipients/ui/findby/FindByActivity.kt | 4 + .../ui/accountlocked/AccountLockedFragment.kt | 3 + .../ui/captcha/CaptchaFragment.kt | 2 + .../ui/entercode/EnterCodeFragment.kt | 2 + .../phonenumber/EnterPhoneNumberFragment.kt | 2 + .../RegistrationLockFragment.kt | 2 + .../ReRegisterWithPinFragment.kt | 3 + .../local/RestoreLocalBackupActivity.kt | 4 + .../ui/shared/RegistrationScreen.kt | 11 +- .../ui/welcome/WelcomeFragment.kt | 3 + .../choosebackup/ChooseBackupFragment.kt | 2 + .../devicetransfer/DeviceTransferFragment.kt | 2 + .../RestoreLocalBackupFragment.kt | 2 + .../revealable/ViewOnceMessageActivity.java | 9 ++ .../ShareInterstitialActivity.java | 7 ++ .../preview/StickerPackPreviewActivity.java | 7 ++ .../stories/archive/StoryArchiveActivity.kt | 2 - .../stories/viewer/StoryViewerActivity.kt | 3 - .../securesms/util/FullscreenHelper.java | 70 ++++++------ .../securesms/util/Material3OnScrollHelper.kt | 2 +- .../util/SystemWindowInsetsSetter.kt | 99 ++++++++++------ .../securesms/util/WindowUtil.java | 46 ++------ .../securesms/verify/VerifyScanFragment.kt | 12 ++ .../wallpaper/ChatWallpaperFragment.java | 11 ++ .../ChatWallpaperSelectionFragment.java | 8 ++ .../res/layout/activity_contact_name_edit.xml | 4 +- .../activity_shared_contact_details.xml | 11 +- .../layout/application_migration_activity.xml | 1 + .../main/res/layout/base_kbs_pin_fragment.xml | 1 + ...accept_message_request_dialog_fragment.xml | 1 + .../res/layout/change_passphrase_activity.xml | 3 +- .../res/layout/chat_wallpaper_fragment.xml | 1 + .../res/layout/client_deprecated_activity.xml | 1 + .../res/layout/deactivate_wallet_fragment.xml | 2 + .../layout/fragment_registration_captcha.xml | 1 + ...agment_registration_enter_phone_number.xml | 1 + .../res/layout/fragment_registration_lock.xml | 1 + ...ment_registration_pin_restore_entry_v2.xml | 1 + .../layout/fragment_restore_local_backup.xml | 1 + .../res/layout/payment_details_fragment.xml | 1 + .../payments_security_setup_fragment.xml | 2 + app/src/main/res/values/themes.xml | 3 - .../ComposeBottomSheetDialogFragment.kt | 3 + .../ComposeFullScreenDialogFragment.kt | 9 +- 132 files changed, 626 insertions(+), 469 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorAnimator.kt delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorNestedScrollConnection.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java index ff2e9a4ea0..4982c2605f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java @@ -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)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java index a7bf8c21fa..4d85f340bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java @@ -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(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java index ae205121a2..0adffd80cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -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() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsCheckoutActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsCheckoutActivity.kt index 9481139b30..efb1a2daeb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsCheckoutActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsCheckoutActivity.kt @@ -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) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/verify/VerifyBackupKeyActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/verify/VerifyBackupKeyActivity.kt index 18aed311a5..caa593c9a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/verify/VerifyBackupKeyActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/verify/VerifyBackupKeyActivity.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt index 88477ba66c..6c421dd342 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/featured/SelectFeaturedBadgeFragment.kt @@ -50,7 +50,8 @@ class SelectFeaturedBadgeFragment : DSLSettingsFragment( return Material3OnScrollHelper( activity = requireActivity(), views = listOf(scrollShadow), - lifecycleOwner = viewLifecycleOwner + lifecycleOwner = viewLifecycleOwner, + setStatusBarColor = {} ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java index 818082d291..22c823b1a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt index afe85c2565..e9e7406382 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/chats/ChatsNavigation.kt b/app/src/main/java/org/thoughtcrime/securesms/chats/ChatsNavigation.kt index bed12b9c05..0da00027d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/chats/ChatsNavigation.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/chats/ChatsNavigation.kt @@ -152,8 +152,6 @@ private fun ConversationSettingsEntry(route: MainNavigationDetailLocation.Chats. modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) - .statusBarsPadding() - .navigationBarsPadding() ) { fragment -> backPressedState.attach(fragment) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsActivity.kt index 59b7743999..88d53084dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsActivity.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt index e94f95ba48..e592652b47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt @@ -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 = {} ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt index 58bca577c4..e23280d691 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/AccountSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/AccountSettingsFragment.kt index 637725e6ce..0ac41c3a7a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/AccountSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/AccountSettingsFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/LinkedDeviceAccountSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/LinkedDeviceAccountSettingsFragment.kt index 1e5a5a8c8f..57b424f80d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/LinkedDeviceAccountSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/LinkedDeviceAccountSettingsFragment.kt @@ -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) }) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt index a4bf3dc441..79388aa17d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt index b6e4503930..21acabe0b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt index 232e967ac9..8e3c28ab73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt @@ -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() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt index 266000060c..04cc6f7a75 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt index d7dd7f6483..96517bf068 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/data/DataAndStorageSettingsFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt index 395c5cdb16..22fbe5cff7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/profiles/AddAllowedMembersFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt index e6b45f50de..fcd6f394df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/advanced/AdvancedPrivacySettingsFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt index c18fc691eb..b69cf14858 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt index d29e50c15b..9c2d46e151 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalFragment.kt @@ -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) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt index 72a97e5f8c..fffe60a29b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/card/CreditCardFragment.kt @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt index 2d8c074b54..30dadb5618 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/transfer/mandate/BankTransferMandateFragment.kt @@ -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( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt index aecea57a43..7468fa157c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt @@ -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) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/updates/AppUpdatesSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/updates/AppUpdatesSettingsFragment.kt index 7dfcac128a..0e05fd6c9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/updates/AppUpdatesSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/updates/AppUpdatesSettingsFragment.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt index 33c699eece..960882133d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/QrImageSelectionActivity.kt @@ -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) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameQrScannerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameQrScannerActivity.kt index ee21747222..a546d8cc7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameQrScannerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameQrScannerActivity.kt @@ -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 -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 7889be34a1..ad7b95f654 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt index 1e2d047314..1e89622629 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/ComposeCallScreenMediator.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorAnimator.kt b/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorAnimator.kt deleted file mode 100644 index 341530dc2e..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorAnimator.kt +++ /dev/null @@ -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() - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorNestedScrollConnection.kt b/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorNestedScrollConnection.kt deleted file mode 100644 index 7de3d7aad5..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/compose/StatusBarColorNestedScrollConnection.kt +++ /dev/null @@ -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 - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java index 8eb185e74f..d553c4c53a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java index 894f581dba..c7fbbc82f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java @@ -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(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java index 7f8f6421a6..d2d644c543 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java @@ -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); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/BubbleConversationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/BubbleConversationActivity.kt index 1d6aaf4044..dbaa42dea4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/BubbleConversationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/BubbleConversationActivity.kt @@ -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)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt index d716936f5c..c75f02bfcd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionFragment.kt index 5e55f5ca90..58701331cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/ChatColorSelectionFragment.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt index 660666be5d..09746d934c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorFragment.kt @@ -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() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt index 08ca86c8d1..c6088c99a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/ui/custom/CustomChatColorCreatorPageFragment.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java index e86370b986..4a3d820e17 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferCompleteFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferCompleteFragment.java index fff76077ab..2f3335ddd4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferCompleteFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferCompleteFragment.java @@ -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()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferInstructionsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferInstructionsFragment.kt index 9d6c5275a2..fe8808b9e2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferInstructionsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/newdevice/NewDeviceTransferInstructionsFragment.kt @@ -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(R.id.new_device_transfer_instructions_fragment_continue) .setOnClickListener { findNavController().safeNavigate(R.id.action_device_transfer_setup) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferCompleteFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferCompleteFragment.java index 8e0766e7b0..076ec71bdc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferCompleteFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferCompleteFragment.java @@ -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()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferInstructionsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferInstructionsFragment.java index 4310696c4b..4750b1046c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferInstructionsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferInstructionsFragment.java @@ -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()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java index b171647fcc..4e4f790cfb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.kt index 09563e6ec7..4d9dd94405 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.kt index d66c1e1d4f..7a1af4b1f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addtogroup/AddToGroupsActivity.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/chooseadmin/ChooseNewAdminActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/chooseadmin/ChooseNewAdminActivity.java index 1db22c45f3..e491afec99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/chooseadmin/ChooseNewAdminActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/chooseadmin/ChooseNewAdminActivity.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.kt index 0a9c933492..9ceec437c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.kt @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java index 5faeccc9c3..c35884db8f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java @@ -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))); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/incommon/GroupsInCommonActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/incommon/GroupsInCommonActivity.kt index c60a944e0c..1a1d47372a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/incommon/GroupsInCommonActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/incommon/GroupsInCommonActivity.kt @@ -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 ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/ManagePendingAndRequestingMembersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/ManagePendingAndRequestingMembersActivity.java index c701f49430..1b05e63f35 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/ManagePendingAndRequestingMembersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/ManagePendingAndRequestingMembersActivity.java @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java index bda659d69d..6fc51810c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java @@ -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()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java index 8c248b7a88..b84b0d6111 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java @@ -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 -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseSvrPinFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseSvrPinFragment.java index 228162c0e0..c873c36905 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseSvrPinFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/BaseSvrPinFragment.java @@ -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 @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner()); + initializeViews(view); viewModel = initializeViewModel(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/SvrSplashFragment.java b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/SvrSplashFragment.java index ec69cdff2b..996229ab60 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/lock/v2/SvrSplashFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/lock/v2/SvrSplashFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java index efa680ff95..ce0a3ece56 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java @@ -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(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java index 3ada954fa0..987d93c3d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java index 0ac344feb6..6296ca5dc1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt index 9b017367b3..7b06572f00 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Activity.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 89a58d68a6..667b6b6ed2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt index 30348fd85b..fb42156640 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/MediaSelectionActivity.kt @@ -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 = intent.getParcelableArrayListExtraCompat(MEDIA, Media::class.java) ?: listOf() val message: CharSequence? = if (shareToTextStory) null else draftText diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt index 2109f5cc3e..b0dec1ef9b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt @@ -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()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Activity.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Activity.kt index eb1bf18eca..2a73e551e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Activity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Activity.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java index 7aa4292475..e5a949df97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java @@ -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()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java index a250ac5af8..3994ff07cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrationActivity.java index a7889cfb0d..f1f6f21cd4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrationActivity.java @@ -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")); diff --git a/app/src/main/java/org/thoughtcrime/securesms/nicknames/NicknameActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/nicknames/NicknameActivity.kt index 6c8a190797..82e8fa6190 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/nicknames/NicknameActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/nicknames/NicknameActivity.kt @@ -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)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/deactivate/DeactivateWalletFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/deactivate/DeactivateWalletFragment.java index 74fa2329f2..c5a982952b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/deactivate/DeactivateWalletFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/deactivate/DeactivateWalletFragment.java @@ -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)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java index 168f809ea6..42b006c104 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentRecipientSelectionFragment.java @@ -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(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsAllActivityFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsAllActivityFragment.java index 04dd9ef330..75248bc404 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsAllActivityFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsAllActivityFragment.java @@ -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()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java index 130be5dd10..dbd513f06a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsHomeFragment.java @@ -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 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(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsPagerItemFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsPagerItemFragment.java index 111e62a402..564d7a2264 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsPagerItemFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/PaymentsPagerItemFragment.java @@ -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); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyFragment.java index f4e90f3212..a06f974743 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyFragment.java @@ -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(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyFragment.java index 68997e4d48..3b2d954bc7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java index c77ce68cd2..4bb5ece2d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt index 54f0696449..170a0c767f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/securitysetup/PaymentsSecuritySetupFragment.kt @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java index 95d1be5eba..fa4947e025 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java @@ -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()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java index 44853fc4c3..3915785e65 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java index 8d105e0621..fc15a4b135 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt index 0bcff0070a..c96a2f8627 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java index 3d9fd17a33..1c610d6bc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java index 506ecc5813..b58f858fb2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java index db3307f6d0..eef983ed46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java @@ -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); diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsActivity.kt index b35f35cb44..6d18b9582c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsActivity.kt @@ -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(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()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt index 6d35c1b959..4d80a29ea0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/edit/EditReactionsFragment.kt @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt index f99607c634..5d4c09559a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/accountlocked/AccountLockedFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/accountlocked/AccountLockedFragment.kt index 139c7d9348..434307525f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/accountlocked/AccountLockedFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/accountlocked/AccountLockedFragment.kt @@ -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(R.id.account_locked_description) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/captcha/CaptchaFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/captcha/CaptchaFragment.kt index 76cd2dd5ac..a5ba0bc705 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/captcha/CaptchaFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/captcha/CaptchaFragment.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt index d970e86f91..fab7863a1e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt @@ -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()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt index 8134f70afc..9207d060ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/phonenumber/EnterPhoneNumberFragment.kt @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/registrationlock/RegistrationLockFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/registrationlock/RegistrationLockFragment.kt index 701b78c1dc..43997f351e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/registrationlock/RegistrationLockFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/registrationlock/RegistrationLockFragment.kt @@ -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()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/reregisterwithpin/ReRegisterWithPinFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/reregisterwithpin/ReRegisterWithPinFragment.kt index 14f32307e8..83710787ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/reregisterwithpin/ReRegisterWithPinFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/reregisterwithpin/ReRegisterWithPinFragment.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/local/RestoreLocalBackupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/local/RestoreLocalBackupActivity.kt index 8075ec46e4..c3cf554cfa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/local/RestoreLocalBackupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/local/RestoreLocalBackupActivity.kt @@ -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() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/shared/RegistrationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/shared/RegistrationScreen.kt index 0e72870f9c..1d9c4284a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/shared/RegistrationScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/shared/RegistrationScreen.kt @@ -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() ) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/welcome/WelcomeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/welcome/WelcomeFragment.kt index 28eaf7d715..d7b9e9f215 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/welcome/WelcomeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/welcome/WelcomeFragment.kt @@ -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) diff --git a/app/src/main/java/org/thoughtcrime/securesms/restore/choosebackup/ChooseBackupFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/restore/choosebackup/ChooseBackupFragment.kt index 4631b82ec7..45a9cbe200 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/restore/choosebackup/ChooseBackupFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/restore/choosebackup/ChooseBackupFragment.kt @@ -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() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/restore/devicetransfer/DeviceTransferFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/restore/devicetransfer/DeviceTransferFragment.kt index 73e392fb5f..bf5f5a7d6f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/restore/devicetransfer/DeviceTransferFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/restore/devicetransfer/DeviceTransferFragment.kt @@ -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 { diff --git a/app/src/main/java/org/thoughtcrime/securesms/restore/restorelocalbackup/RestoreLocalBackupFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/restore/restorelocalbackup/RestoreLocalBackupFragment.kt index 36e687b601..ed8151ab8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/restore/restorelocalbackup/RestoreLocalBackupFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/restore/restorelocalbackup/RestoreLocalBackupFragment.kt @@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.restore.RestoreViewModel import org.thoughtcrime.securesms.service.LocalBackupListener import org.thoughtcrime.securesms.util.BackupUtil import org.thoughtcrime.securesms.util.DateUtils +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.ViewModelFactory import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible @@ -91,6 +92,7 @@ class RestoreLocalBackupFragment : LoggingFragment(R.layout.fragment_restore_loc override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + SystemWindowInsetsSetter.attach(view, viewLifecycleOwner) setDebugLogSubmitMultiTapView(binding.verifyHeader) Log.i(TAG, "Backup restore.") diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java index 6ebcae2c9a..c4d56a9faa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java @@ -14,6 +14,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import com.bumptech.glide.Glide; @@ -26,6 +27,8 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.MediaUtil; +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter; +import org.thoughtcrime.securesms.util.WindowUtil; import java.util.concurrent.TimeUnit; @@ -71,12 +74,18 @@ public class ViewOnceMessageActivity extends PassphraseRequiredActivity implemen super.onCreate(savedInstanceState, ready); setContentView(R.layout.view_once_message_activity); + WindowUtil.clearLightStatusBar(getWindow()); + WindowUtil.clearLightNavigationBar(getWindow()); + this.image = findViewById(R.id.view_once_image); this.video = findViewById(R.id.view_once_video); this.duration = findViewById(R.id.view_once_duration); this.closeButton = findViewById(R.id.view_once_close_button); this.uri = getIntent().getParcelableExtra(KEY_URI); + SystemWindowInsetsSetter.attach(closeButton, this, WindowInsetsCompat.Type.statusBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN); + SystemWindowInsetsSetter.attach(duration, this, WindowInsetsCompat.Type.statusBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN); + closeButton.setOnClickListener(v -> finish()); initViewModel(getIntent().getLongExtra(KEY_MESSAGE_ID, -1), uri); diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java index 1122e6984d..412e984e09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java @@ -4,9 +4,11 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; @@ -24,6 +26,7 @@ import org.thoughtcrime.securesms.sharing.MultiShareDialogs; import org.thoughtcrime.securesms.sharing.ShareFlowConstants; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +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; @@ -107,6 +110,10 @@ public class ShareInterstitialActivity extends PassphraseRequiredActivity { confirm.setOnClickListener(unused -> onConfirm()); + toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars()); + SystemWindowInsetsSetter.attach(confirm, this, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN); + SelectionAwareEmojiEditText text = findViewById(R.id.text); toolbar.setNavigationOnClickListener(unused -> finish()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewActivity.java index cda73256f3..320424cd71 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewActivity.java @@ -12,6 +12,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -36,6 +37,7 @@ import org.thoughtcrime.securesms.stickers.manage.StickerManagementRepository; import org.thoughtcrime.securesms.util.DeviceProperties; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter; import org.whispersystems.signalservice.api.util.OptionalUtil; import java.util.Collections; @@ -159,6 +161,9 @@ public final class StickerPackPreviewActivity extends PassphraseRequiredActivity this.shareButton = findViewById(R.id.sticker_install_share_button); this.shareButtonImage = findViewById(R.id.sticker_install_share_button_image); + SystemWindowInsetsSetter.attach(installButton, this, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN); + SystemWindowInsetsSetter.attach(removeButton, this, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN); + this.adapter = new StickerPackPreviewAdapter(Glide.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); this.layoutManager = new GridLayoutManager(this, 2); this.touchListener = new StickerRolloverTouchListener(this, Glide.with(this), this, this); @@ -172,6 +177,8 @@ public final class StickerPackPreviewActivity extends PassphraseRequiredActivity private void initToolbar() { Toolbar toolbar = findViewById(R.id.sticker_install_toolbar); + SystemWindowInsetsSetter.attach(toolbar, this, WindowInsetsCompat.Type.statusBars()); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(R.string.StickerPackPreviewActivity_stickers); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/archive/StoryArchiveActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/archive/StoryArchiveActivity.kt index d9f71d1981..7a0530dd9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/archive/StoryArchiveActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/archive/StoryArchiveActivity.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge import org.signal.core.ui.compose.theme.SignalTheme import org.thoughtcrime.securesms.PassphraseRequiredActivity @@ -17,7 +16,6 @@ class StoryArchiveActivity : PassphraseRequiredActivity() { } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { - enableEdgeToEdge() super.onCreate(savedInstanceState, ready) setContent { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt index 3916927806..ba36814aec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt @@ -8,7 +8,6 @@ import android.media.AudioManager import android.os.Bundle import android.view.KeyEvent import android.view.View -import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatDelegate import androidx.media.AudioManagerCompat @@ -46,8 +45,6 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { - enableEdgeToEdge() - if (savedInstanceState != null) { val cache: StoryViewStateCache? = savedInstanceState.getParcelableCompat(DATA_CACHE, StoryViewStateCache::class.java) if (cache != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java index 3cacd18854..36fc3f5140 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java @@ -12,6 +12,7 @@ import androidx.core.graphics.Insets; import androidx.core.view.DisplayCutoutCompat; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; /** * Encapsulates logic to properly show/hide system UI/chrome in a full screen setting. Also @@ -44,7 +45,7 @@ public final class FullscreenHelper { public void configureToolbarLayout(@NonNull View spacer, @NonNull View toolbar) { ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { - setSpacerHeight(view, insets.getSystemWindowInsetTop()); + setSpacerHeight(view, insets.getInsets(WindowInsetsCompat.Type.systemBars()).top); return insets; }); @@ -57,7 +58,7 @@ public final class FullscreenHelper { public static void configureBottomBarLayout(@NonNull Activity activity, @NonNull View spacer, @NonNull View bottomBar) { ViewCompat.setOnApplyWindowInsetsListener(spacer, (view, insets) -> { - setSpacerHeight(view, insets.getSystemWindowInsetBottom()); + setSpacerHeight(view, insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom); return insets; }); @@ -90,51 +91,54 @@ public final class FullscreenHelper { } public void showAndHideWithSystemUI(@NonNull Window window, @NonNull View... views) { - window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> { - boolean hide = (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + ViewCompat.setOnApplyWindowInsetsListener(window.getDecorView(), (view, insets) -> { + boolean hide = !insets.isVisible(WindowInsetsCompat.Type.systemBars()); - for (View view : views) { - if (view == null) { + for (View target : views) { + if (target == null) { continue; } - view.animate() - .alpha(hide ? 0 : 1) - .withStartAction(() -> { - if (!hide) { - view.setVisibility(View.VISIBLE); - } - }) - .withEndAction(() -> { - if (hide) { - view.setVisibility(View.INVISIBLE); - } - }) - .start(); + target.animate() + .alpha(hide ? 0 : 1) + .withStartAction(() -> { + if (!hide) { + target.setVisibility(View.VISIBLE); + } + }) + .withEndAction(() -> { + if (hide) { + target.setVisibility(View.INVISIBLE); + } + }) + .start(); } + + return insets; }); } public void toggleUiVisibility() { if (isSystemUiVisible()) { - showSystemUI(); - } else { hideSystemUI(); + } else { + showSystemUI(); } } public boolean isSystemUiVisible() { - int systemUiVisibility = activity.getWindow().getDecorView().getSystemUiVisibility(); - return (systemUiVisibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(activity.getWindow().getDecorView()); + return insets == null || insets.isVisible(WindowInsetsCompat.Type.systemBars()); } public void hideSystemUI() { - activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE | - View.SYSTEM_UI_FLAG_LAYOUT_STABLE | - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_FULLSCREEN); + hideSystemUI(activity.getWindow()); + } + + public static void hideSystemUI(@NonNull Window window) { + WindowInsetsControllerCompat controller = controller(window); + controller.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); + controller.hide(WindowInsetsCompat.Type.systemBars()); } public void showSystemUI() { @@ -142,8 +146,10 @@ public final class FullscreenHelper { } public static void showSystemUI(@NonNull Window window) { - window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + controller(window).show(WindowInsetsCompat.Type.systemBars()); + } + + private static @NonNull WindowInsetsControllerCompat controller(@NonNull Window window) { + return new WindowInsetsControllerCompat(window, window.getDecorView()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt index 965b37d35a..d5f08362c8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Material3OnScrollHelper.kt @@ -37,7 +37,7 @@ open class Material3OnScrollHelper( */ @JvmStatic fun create(activity: FragmentActivity, toolbar: View): Material3OnScrollHelper { - return Material3OnScrollHelper(activity = activity, views = listOf(toolbar), lifecycleOwner = activity) + return Material3OnScrollHelper(activity = activity, views = listOf(toolbar), lifecycleOwner = activity, setStatusBarColor = {}) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt index bff77e98c3..7ca0f58dee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.util import android.os.Build import android.view.View +import android.view.ViewGroup import androidx.core.graphics.Insets import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -9,45 +10,55 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner object SystemWindowInsetsSetter { + /** - * Updates the view whenever a layout occurs to properly set the system bar insets. setPadding is safe here because it will only trigger an extra layout - * call IF the values actually changed. + * How the resolved system-bar insets are applied to the target view. In both modes the view's + * original padding/margin (captured when [attach] is called) is preserved and the insets are + * added on top, so a view keeps its designed spacing and still clears the system bars. */ - fun attach(view: View, lifecycleOwner: LifecycleOwner, @WindowInsetsCompat.Type.InsetsType insetType: Int = WindowInsetsCompat.Type.systemBars()) { + enum class ApplyMode { + PADDING, + MARGIN + } + + /** + * Updates the view whenever a layout occurs to properly account for the system bar insets, added + * on top of the view's original padding ([ApplyMode.PADDING]) or margin ([ApplyMode.MARGIN]). + * This is safe to call repeatedly because it only triggers an extra layout pass IF the applied + * values actually changed. + */ + @JvmStatic + @JvmOverloads + fun attach( + view: View, + lifecycleOwner: LifecycleOwner, + @WindowInsetsCompat.Type.InsetsType insetType: Int = WindowInsetsCompat.Type.systemBars(), + applyMode: ApplyMode = ApplyMode.PADDING + ) { + val base: Insets = if (applyMode == ApplyMode.MARGIN) { + val params = view.layoutParams as? ViewGroup.MarginLayoutParams + Insets.of(params?.leftMargin ?: 0, params?.topMargin ?: 0, params?.rightMargin ?: 0, params?.bottomMargin ?: 0) + } else { + Insets.of(view.paddingLeft, view.paddingTop, view.paddingRight, view.paddingBottom) + } + val listener = view.doOnEachLayout { - val rootInsets = ViewCompat.getRootWindowInsets(view) - val insets: Insets? = rootInsets?.getInsets(insetType) - val canTrustInsets = Build.VERSION.SDK_INT > 29 || (WindowInsetsCompat.Type.ime() and insetType == 0) + val insets = resolveInsets(view, insetType) + val left = base.left + insets.left + val top = base.top + insets.top + val right = base.right + insets.right + val bottom = base.bottom + insets.bottom - if (canTrustInsets && insets != null && (!insets.isEmpty() || ViewUtil.isGestureNavigation(view.resources, rootInsets))) { - view.post { - view.setPadding( - insets.left, - insets.top, - insets.right, - insets.bottom - ) - } - } else { - val top = if (insetType and WindowInsetsCompat.Type.statusBars() != 0) { - ViewUtil.getStatusBarHeight(view) - } else { - 0 - } - - val bottom = if (insetType and WindowInsetsCompat.Type.navigationBars() != 0) { - ViewUtil.getNavigationBarHeight(view) - } else { - 0 - } - - view.post { - view.setPadding( - 0, - top, - 0, - bottom - ) + view.post { + when (applyMode) { + ApplyMode.PADDING -> view.setPadding(left, top, right, bottom) + ApplyMode.MARGIN -> { + val params = view.layoutParams as? ViewGroup.MarginLayoutParams ?: return@post + if (params.leftMargin != left || params.topMargin != top || params.rightMargin != right || params.bottomMargin != bottom) { + params.setMargins(left, top, right, bottom) + view.layoutParams = params + } + } } } } @@ -61,6 +72,24 @@ object SystemWindowInsetsSetter { lifecycleOwner.lifecycle.addObserver(lifecycleObserver) } + /** + * Resolves the insets to apply for [insetType], falling back to [ViewUtil] bar heights on the older + * API levels / IME cases where [ViewCompat.getRootWindowInsets] cannot be trusted. + */ + private fun resolveInsets(view: View, @WindowInsetsCompat.Type.InsetsType insetType: Int): Insets { + val rootInsets = ViewCompat.getRootWindowInsets(view) + val insets: Insets? = rootInsets?.getInsets(insetType) + val canTrustInsets = Build.VERSION.SDK_INT > 29 || (WindowInsetsCompat.Type.ime() and insetType == 0) + + if (canTrustInsets && insets != null && (!insets.isEmpty() || ViewUtil.isGestureNavigation(view.resources, rootInsets))) { + return insets + } + + val top = if (insetType and WindowInsetsCompat.Type.statusBars() != 0) ViewUtil.getStatusBarHeight(view) else 0 + val bottom = if (insetType and WindowInsetsCompat.Type.navigationBars() != 0) ViewUtil.getNavigationBarHeight(view) else 0 + return Insets.of(0, top, 0, bottom) + } + private fun Insets.isEmpty(): Boolean { return (top + bottom + right + left) == 0 } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java index 8a4d3b80c7..4bde120bae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/WindowUtil.java @@ -2,14 +2,12 @@ package org.thoughtcrime.securesms.util; import android.app.Activity; import android.content.Context; -import android.graphics.Rect; import android.os.Build; -import android.view.View; import android.view.Window; -import android.view.WindowManager; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; +import androidx.core.view.WindowInsetsControllerCompat; import org.signal.core.ui.util.ThemeUtil; @@ -34,17 +32,13 @@ public final class WindowUtil { public static void clearLightNavigationBar(@NonNull Window window) { if (Build.VERSION.SDK_INT < 27) return; - clearSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); - } - - public static void clearTranslucentNavigationBar(@NonNull Window window) { - window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + controller(window).setAppearanceLightNavigationBars(false); } public static void setLightNavigationBar(@NonNull Window window) { if (Build.VERSION.SDK_INT < 27) return; - setSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + controller(window).setAppearanceLightNavigationBars(true); } public static void setNavigationBarColor(@NonNull Activity activity, @ColorInt int color) { @@ -67,15 +61,11 @@ public final class WindowUtil { } public static void clearLightStatusBar(@NonNull Window window) { - clearSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + controller(window).setAppearanceLightStatusBars(false); } public static void setLightStatusBar(@NonNull Window window) { - setSystemUiFlags(window, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - } - - public static void clearTranslucentStatusBar(@NonNull Window window) { - window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + controller(window).setAppearanceLightStatusBars(true); } public static void setStatusBarColor(@NonNull Window window, @ColorInt int color) { @@ -86,29 +76,7 @@ public final class WindowUtil { return window.getStatusBarColor(); } - /** - * A sort of roundabout way of determining if the status bar is present by seeing if there's a - * vertical window offset. - */ - public static boolean isStatusBarPresent(@NonNull Window window) { - Rect rectangle = new Rect(); - window.getDecorView().getWindowVisibleDisplayFrame(rectangle); - return rectangle.top > 0; - } - - private static void clearSystemUiFlags(@NonNull Window window, int flags) { - View view = window.getDecorView(); - int uiFlags = view.getSystemUiVisibility(); - - uiFlags &= ~flags; - view.setSystemUiVisibility(uiFlags); - } - - private static void setSystemUiFlags(@NonNull Window window, int flags) { - View view = window.getDecorView(); - int uiFlags = view.getSystemUiVisibility(); - - uiFlags |= flags; - view.setSystemUiVisibility(uiFlags); + private static @NonNull WindowInsetsControllerCompat controller(@NonNull Window window) { + return new WindowInsetsControllerCompat(window, window.getDecorView()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyScanFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyScanFragment.kt index a5d998e547..12e57406a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyScanFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/verify/VerifyScanFragment.kt @@ -5,7 +5,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.TextView import androidx.core.view.OneShotPreDrawListener +import androidx.core.view.WindowInsetsCompat +import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.concurrent.LifecycleDisposable @@ -13,6 +16,7 @@ import org.signal.qr.QrScannerView import org.signal.qr.kitkat.ScanListener import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ShapeScrim +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.fragments.findListener @@ -34,6 +38,10 @@ class VerifyScanFragment : Fragment() { cameraView = view.findViewById(R.id.scanner) cameraScrim = view.findViewById(R.id.camera_scrim) cameraMarks = view.findViewById(R.id.camera_marks) + + if (!isDialogHosted()) { + SystemWindowInsetsSetter.attach(view.findViewById(R.id.information), viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN) + } OneShotPreDrawListener.add(cameraScrim) { val width = cameraScrim.scrimWidth val height = cameraScrim.scrimHeight @@ -52,4 +60,8 @@ class VerifyScanFragment : Fragment() { findListener()?.onQrDataFound(qrData) } } + + private fun isDialogHosted(): Boolean { + return generateSequence(this) { it.parentFragment }.any { it is DialogFragment && it.showsDialog } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java index d5bd975c85..0cd16b3cab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperFragment.java @@ -9,6 +9,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.ScrollView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -17,6 +18,7 @@ import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.core.widget.ImageViewCompat; import androidx.core.widget.TextViewCompat; import androidx.fragment.app.Fragment; @@ -31,6 +33,7 @@ import org.thoughtcrime.securesms.conversation.colors.ColorizerView; import org.signal.core.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.Projection; import org.signal.core.ui.util.ThemeUtil; +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; @@ -67,6 +70,14 @@ public class ChatWallpaperFragment extends Fragment { dimInNightMode = view.findViewById(R.id.chat_wallpaper_dark_theme_dims_wallpaper); + ScrollView scrollView = view.findViewById(R.id.chat_wallpaper_scroll); + + toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars()); + + scrollView.setClipToPadding(false); + SystemWindowInsetsSetter.attach(scrollView, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars()); + toolbar.setTitle(R.string.preferences__chat_color_and_wallpaper); toolbar.setNavigationOnClickListener(nav -> { if (!Navigation.findNavController(nav).popBackStack()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java index d8ebf330cd..ab5eb63586 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/ChatWallpaperSelectionFragment.java @@ -10,12 +10,14 @@ 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.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter; import org.thoughtcrime.securesms.wallpaper.crop.WallpaperImageSelectionActivity; public class ChatWallpaperSelectionFragment extends Fragment { @@ -35,6 +37,12 @@ public class ChatWallpaperSelectionFragment extends Fragment { View chooseFromPhotos = view.findViewById(R.id.chat_wallpaper_choose_from_photos); RecyclerView recyclerView = view.findViewById(R.id.chat_wallpaper_recycler); + toolbar.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + SystemWindowInsetsSetter.attach(toolbar, getViewLifecycleOwner(), WindowInsetsCompat.Type.statusBars()); + + recyclerView.setClipToPadding(false); + SystemWindowInsetsSetter.attach(recyclerView, getViewLifecycleOwner(), WindowInsetsCompat.Type.navigationBars()); + chooseFromPhotos.setOnClickListener(unused -> { startActivityForResult(WallpaperImageSelectionActivity.getIntent(requireContext(), viewModel.getRecipientId()), CHOOSE_WALLPAPER); }); diff --git a/app/src/main/res/layout/activity_contact_name_edit.xml b/app/src/main/res/layout/activity_contact_name_edit.xml index 77c319124b..18b06c3e87 100644 --- a/app/src/main/res/layout/activity_contact_name_edit.xml +++ b/app/src/main/res/layout/activity_contact_name_edit.xml @@ -18,8 +18,10 @@ app:titleTextAppearance="@style/Signal.Text.TitleLarge" /> + android:layout_height="match_parent" + android:clipToPadding="false"> + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + android:layout_height="wrap_content" + android:fitsSystemWindows="true"> + android:background="@color/signal_background_tertiary" + android:fitsSystemWindows="true" + app:statusBarScrim="@android:color/transparent"> \ No newline at end of file diff --git a/app/src/main/res/layout/application_migration_activity.xml b/app/src/main/res/layout/application_migration_activity.xml index a681bcaf56..627cbd1345 100644 --- a/app/src/main/res/layout/application_migration_activity.xml +++ b/app/src/main/res/layout/application_migration_activity.xml @@ -5,6 +5,7 @@ tools:viewBindingIgnore="true" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/application_migration_root" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> diff --git a/app/src/main/res/layout/base_kbs_pin_fragment.xml b/app/src/main/res/layout/base_kbs_pin_fragment.xml index 0e03df8f4d..14184e1040 100644 --- a/app/src/main/res/layout/base_kbs_pin_fragment.xml +++ b/app/src/main/res/layout/base_kbs_pin_fragment.xml @@ -5,6 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="?android:attr/windowBackground" + android:clipToPadding="false" android:fillViewport="true" tools:viewBindingIgnore="true"> diff --git a/app/src/main/res/layout/callee_must_accept_message_request_dialog_fragment.xml b/app/src/main/res/layout/callee_must_accept_message_request_dialog_fragment.xml index c5a5b8e8a4..e40dd99399 100644 --- a/app/src/main/res/layout/callee_must_accept_message_request_dialog_fragment.xml +++ b/app/src/main/res/layout/callee_must_accept_message_request_dialog_fragment.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" tools:viewBindingIgnore="true" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/callee_must_accept_root" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" diff --git a/app/src/main/res/layout/change_passphrase_activity.xml b/app/src/main/res/layout/change_passphrase_activity.xml index e8f6349dea..c163ec98a5 100644 --- a/app/src/main/res/layout/change_passphrase_activity.xml +++ b/app/src/main/res/layout/change_passphrase_activity.xml @@ -5,7 +5,8 @@ tools:viewBindingIgnore="true" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:fillViewport="true"> + android:fillViewport="true" + android:fitsSystemWindows="true"> diff --git a/app/src/main/res/layout/client_deprecated_activity.xml b/app/src/main/res/layout/client_deprecated_activity.xml index 0411a8d85d..138495e6b7 100644 --- a/app/src/main/res/layout/client_deprecated_activity.xml +++ b/app/src/main/res/layout/client_deprecated_activity.xml @@ -4,6 +4,7 @@ tools:viewBindingIgnore="true" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/client_deprecated_root" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingStart="32dp" diff --git a/app/src/main/res/layout/deactivate_wallet_fragment.xml b/app/src/main/res/layout/deactivate_wallet_fragment.xml index d15e0fbcc1..0bf5c9393d 100644 --- a/app/src/main/res/layout/deactivate_wallet_fragment.xml +++ b/app/src/main/res/layout/deactivate_wallet_fragment.xml @@ -19,8 +19,10 @@ app:titleTextAppearance="@style/Signal.Text.TitleLarge" /> diff --git a/app/src/main/res/layout/fragment_registration_lock.xml b/app/src/main/res/layout/fragment_registration_lock.xml index 4d4ab2889c..ec32e7ff76 100644 --- a/app/src/main/res/layout/fragment_registration_lock.xml +++ b/app/src/main/res/layout/fragment_registration_lock.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" android:fillViewport="true"> false - @color/core_ultramarine false - true false - true false false true diff --git a/core/ui/src/main/java/org/signal/core/ui/compose/ComposeBottomSheetDialogFragment.kt b/core/ui/src/main/java/org/signal/core/ui/compose/ComposeBottomSheetDialogFragment.kt index 2cc6d04d09..d4bd286bca 100644 --- a/core/ui/src/main/java/org/signal/core/ui/compose/ComposeBottomSheetDialogFragment.kt +++ b/core/ui/src/main/java/org/signal/core/ui/compose/ComposeBottomSheetDialogFragment.kt @@ -10,11 +10,13 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.ViewCompositionStrategy @@ -44,6 +46,7 @@ abstract class ComposeBottomSheetDialogFragment : FixedRoundedCornerBottomSheetD CompositionLocalProvider(LocalFragmentManager provides childFragmentManager) { SignalTheme(isDarkMode = isDark) { Surface( + modifier = Modifier.navigationBarsPadding(), shape = RoundedCornerShape(cornerRadius.dp, cornerRadius.dp), color = SignalTheme.colors.colorSurface1, contentColor = MaterialTheme.colorScheme.onSurface diff --git a/core/ui/src/main/java/org/signal/core/ui/compose/ComposeFullScreenDialogFragment.kt b/core/ui/src/main/java/org/signal/core/ui/compose/ComposeFullScreenDialogFragment.kt index 52f413e4a9..d1c663e1eb 100644 --- a/core/ui/src/main/java/org/signal/core/ui/compose/ComposeFullScreenDialogFragment.kt +++ b/core/ui/src/main/java/org/signal/core/ui/compose/ComposeFullScreenDialogFragment.kt @@ -9,7 +9,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.fragment.app.DialogFragment @@ -37,7 +42,9 @@ abstract class ComposeFullScreenDialogFragment : DialogFragment() { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { SignalTheme { - DialogContent() + Box(modifier = Modifier.windowInsetsPadding(WindowInsets.safeDrawing)) { + DialogContent() + } } } }