mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-09-14 04:37:34 +01:00
Remove obsolete delete sync education sheet.
This commit is contained in:
committed by
Cody Henthorne
parent
72b3f6a11b
commit
d318c3d9dc
-135
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* Copyright 2024 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.components.compose
|
||||
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.defaultMinSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.rxjava3.core.Completable
|
||||
import io.reactivex.rxjava3.subjects.CompletableSubject
|
||||
import org.signal.core.ui.compose.Buttons
|
||||
import org.signal.core.ui.compose.ComposeBottomSheetDialogFragment
|
||||
import org.signal.core.ui.compose.DayNightPreviews
|
||||
import org.signal.core.ui.compose.Previews
|
||||
import org.thoughtcrime.securesms.R
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
|
||||
/**
|
||||
* Show educational info about delete syncing to linked devices. This dialog uses a subject to convey when
|
||||
* it completes and will dismiss itself if that subject is null aka dialog is recreated by OS instead of being
|
||||
* shown by our code.
|
||||
*/
|
||||
class DeleteSyncEducationDialog : ComposeBottomSheetDialogFragment() {
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
fun shouldShow(): Boolean {
|
||||
return SignalStore.account.isMultiDevice && !SignalStore.uiHints.hasSeenDeleteSyncEducationSheet
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun show(fragmentManager: FragmentManager): Completable {
|
||||
val dialog = DeleteSyncEducationDialog()
|
||||
|
||||
dialog.show(fragmentManager, null)
|
||||
SignalStore.uiHints.hasSeenDeleteSyncEducationSheet = true
|
||||
|
||||
val subject = CompletableSubject.create()
|
||||
dialog.subject = subject
|
||||
|
||||
return subject
|
||||
.onErrorComplete()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
}
|
||||
}
|
||||
|
||||
override val peekHeightPercentage: Float = 1f
|
||||
|
||||
private var subject: CompletableSubject? = null
|
||||
|
||||
@Composable
|
||||
override fun SheetContent() {
|
||||
Sheet(dismiss = this::dismissAllowingStateLoss)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
if (subject == null || savedInstanceState != null) {
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDismiss(dialog: DialogInterface) {
|
||||
super.onDismiss(dialog)
|
||||
subject?.onComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Sheet(
|
||||
dismiss: () -> Unit = {}
|
||||
) {
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
modifier = Modifier
|
||||
.padding(24.dp)
|
||||
) {
|
||||
Image(
|
||||
painter = painterResource(id = R.drawable.delete_sync),
|
||||
contentDescription = null,
|
||||
modifier = Modifier
|
||||
.padding(top = 48.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.DeleteSyncEducation_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.padding(top = 24.dp, bottom = 12.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.DeleteSyncEducation_message),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
color = MaterialTheme.colorScheme.secondary
|
||||
)
|
||||
|
||||
Buttons.LargeTonal(
|
||||
onClick = dismiss,
|
||||
modifier = Modifier
|
||||
.padding(top = 64.dp)
|
||||
.defaultMinSize(minWidth = 132.dp)
|
||||
) {
|
||||
Text(text = stringResource(id = R.string.DeleteSyncEducation_acknowledge_button))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DayNightPreviews
|
||||
@Composable
|
||||
private fun SheetPreview() {
|
||||
Previews.Preview {
|
||||
Sheet()
|
||||
}
|
||||
}
|
||||
@@ -166,7 +166,6 @@ import org.thoughtcrime.securesms.components.SendButton
|
||||
import org.thoughtcrime.securesms.components.SignalProgressDialog
|
||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||
import org.thoughtcrime.securesms.components.compose.ActionModeTopBarView
|
||||
import org.thoughtcrime.securesms.components.compose.DeleteSyncEducationDialog
|
||||
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard
|
||||
import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel
|
||||
import org.thoughtcrime.securesms.components.location.SignalPlace
|
||||
@@ -3156,15 +3155,6 @@ class ConversationFragment :
|
||||
}
|
||||
|
||||
private fun handleDeleteMessages(messageParts: Set<MultiselectPart>) {
|
||||
if (DeleteSyncEducationDialog.shouldShow()) {
|
||||
DeleteSyncEducationDialog
|
||||
.show(childFragmentManager)
|
||||
.subscribe { handleDeleteMessages(messageParts) }
|
||||
.addTo(disposables)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
val records = messageParts.map(MultiselectPart::getMessageRecord).toSet()
|
||||
|
||||
disposables += DeleteDialog.show(
|
||||
|
||||
-10
@@ -105,7 +105,6 @@ import org.thoughtcrime.securesms.banner.banners.UnauthorizedBanner;
|
||||
import org.thoughtcrime.securesms.banner.banners.UsernameOutOfSyncBanner;
|
||||
import org.thoughtcrime.securesms.components.RatingManager;
|
||||
import org.thoughtcrime.securesms.components.SignalProgressDialog;
|
||||
import org.thoughtcrime.securesms.components.compose.DeleteSyncEducationDialog;
|
||||
import org.thoughtcrime.securesms.components.menu.ActionItem;
|
||||
import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar;
|
||||
import org.thoughtcrime.securesms.components.menu.SignalContextMenu;
|
||||
@@ -1194,15 +1193,6 @@ public class ConversationListFragment extends MainFragment implements Conversati
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private void handleDelete(@NonNull Collection<Long> ids, boolean containsActiveGroup) {
|
||||
if (DeleteSyncEducationDialog.shouldShow()) {
|
||||
lifecycleDisposable.add(
|
||||
DeleteSyncEducationDialog.show(getChildFragmentManager())
|
||||
.subscribe(() -> handleDelete(ids, containsActiveGroup))
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int conversationsCount = ids.size();
|
||||
MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(requireActivity());
|
||||
Context context = requireContext();
|
||||
|
||||
@@ -24,7 +24,6 @@ public class UiHintValues extends SignalStoreValues {
|
||||
private static final String HAS_COMPLETED_USERNAME_ONBOARDING = "uihints.has_completed_username_onboarding";
|
||||
private static final String HAS_SEEN_DOUBLE_TAP_EDIT_EDUCATION_SHEET = "uihints.has_seen_double_tap_edit_education_sheet";
|
||||
private static final String DISMISSED_CONTACTS_PERMISSION_BANNER = "uihints.dismissed_contacts_permission_banner";
|
||||
private static final String HAS_SEEN_DELETE_SYNC_EDUCATION_SHEET = "uihints.has_seen_delete_sync_education_sheet";
|
||||
private static final String LAST_SUPPORT_VERSION_SEEN = "uihints.last_support_version_seen";
|
||||
private static final String HAS_EVER_ENABLED_REMOTE_BACKUPS = "uihints.has_ever_enabled_remote_backups";
|
||||
private static final String HAS_SEEN_CHAT_FOLDERS_EDUCATION_SHEET = "uihints.has_seen_chat_folders_education_sheet";
|
||||
@@ -170,14 +169,6 @@ public class UiHintValues extends SignalStoreValues {
|
||||
return getBoolean(DISMISSED_CONTACTS_PERMISSION_BANNER, false);
|
||||
}
|
||||
|
||||
public void setHasSeenDeleteSyncEducationSheet(boolean seen) {
|
||||
putBoolean(HAS_SEEN_DELETE_SYNC_EDUCATION_SHEET, seen);
|
||||
}
|
||||
|
||||
public boolean getHasSeenDeleteSyncEducationSheet() {
|
||||
return getBoolean(HAS_SEEN_DELETE_SYNC_EDUCATION_SHEET, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the last version of the support article for delayed notifications that users have seen. Versions are increased in a remote config.
|
||||
*/
|
||||
|
||||
-16
@@ -39,7 +39,6 @@ import org.signal.core.ui.logging.LoggingFragment;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.components.SignalProgressDialog;
|
||||
import org.thoughtcrime.securesms.components.compose.DeleteSyncEducationDialog;
|
||||
import org.thoughtcrime.securesms.components.menu.ActionItem;
|
||||
import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar;
|
||||
import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController;
|
||||
@@ -452,25 +451,10 @@ public final class MediaOverviewPageFragment extends LoggingFragment
|
||||
}
|
||||
|
||||
private void handleDeleteSingleMedia(@NonNull MediaTable.MediaRecord mediaRecord) {
|
||||
if (DeleteSyncEducationDialog.shouldShow()) {
|
||||
lifecycleDisposable.add(
|
||||
DeleteSyncEducationDialog.show(getChildFragmentManager())
|
||||
.subscribe(() -> handleDeleteSingleMedia(mediaRecord))
|
||||
);
|
||||
return;
|
||||
}
|
||||
MediaActions.handleDeleteMedia(this, Collections.singleton(mediaRecord));
|
||||
}
|
||||
|
||||
private void handleDeleteSelectedMedia() {
|
||||
if (DeleteSyncEducationDialog.shouldShow()) {
|
||||
lifecycleDisposable.add(
|
||||
DeleteSyncEducationDialog.show(getChildFragmentManager())
|
||||
.subscribe(this::handleDeleteSelectedMedia)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
MediaActions.handleDeleteMedia(this, getListAdapter().getSelectedMedia());
|
||||
exitMultiSelect();
|
||||
}
|
||||
|
||||
@@ -47,14 +47,12 @@ import org.signal.core.models.media.Media
|
||||
import org.signal.core.ui.logging.LoggingFragment
|
||||
import org.signal.core.util.Debouncer
|
||||
import org.signal.core.util.concurrent.LifecycleDisposable
|
||||
import org.signal.core.util.concurrent.addTo
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.core.util.requireDrawable
|
||||
import org.thoughtcrime.securesms.R
|
||||
import org.thoughtcrime.securesms.attachments.AttachmentSaver
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
||||
import org.thoughtcrime.securesms.components.ViewBinderDelegate
|
||||
import org.thoughtcrime.securesms.components.compose.DeleteSyncEducationDialog
|
||||
import org.thoughtcrime.securesms.components.mention.MentionAnnotation
|
||||
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
|
||||
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs
|
||||
@@ -674,15 +672,6 @@ class MediaPreviewFragment :
|
||||
private fun deleteMedia(mediaItem: MediaTable.MediaRecord) {
|
||||
val attachment: DatabaseAttachment = mediaItem.attachment ?: return
|
||||
|
||||
if (DeleteSyncEducationDialog.shouldShow()) {
|
||||
DeleteSyncEducationDialog
|
||||
.show(childFragmentManager)
|
||||
.subscribe { deleteMedia(mediaItem) }
|
||||
.addTo(lifecycleDisposable)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
val messageRecord = SignalDatabase.messages.getMessageRecord(attachment.mmsId)
|
||||
val isNoteToSelf = messageRecord.isOutgoing && messageRecord.toRecipient.isSelf
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="140dp"
|
||||
android:height="92dp"
|
||||
android:viewportWidth="140"
|
||||
android:viewportHeight="92">
|
||||
<path
|
||||
android:pathData="M125.47,2C131.54,2 136.47,6.92 136.47,13L136.47,72.4C136.47,78.48 131.54,83.4 125.47,83.4L38.93,83.4C32.86,83.4 27.93,78.48 27.93,72.4L27.93,13C27.93,6.92 32.86,2 38.93,2L125.47,2Z"
|
||||
android:fillColor="#373D52"/>
|
||||
<path
|
||||
android:pathData="M125.47,0.17C132.55,0.17 138.3,5.91 138.3,13L138.3,72.4C138.3,79.49 132.55,85.24 125.47,85.24L38.93,85.24C31.84,85.24 26.1,79.49 26.1,72.4L26.1,13C26.1,5.91 31.84,0.17 38.93,0.17L125.47,0.17ZM134.63,13C134.63,7.94 130.53,3.84 125.47,3.84L38.93,3.84C33.87,3.84 29.77,7.94 29.77,13L29.77,72.4C29.77,77.46 33.87,81.57 38.93,81.57L125.47,81.57C130.53,81.57 134.63,77.46 134.63,72.4L134.63,13Z"
|
||||
android:fillColor="#B6C5FA"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M96,58C96,54.69 98.69,52 102,52H125C128.31,52 131,54.69 131,58V66C131,69.31 128.31,72 125,72H102C98.69,72 96,69.31 96,66V58Z"
|
||||
android:fillColor="#6A77DD"/>
|
||||
<path
|
||||
android:pathData="M40,36C40,32.69 42.69,30 46,30H62C65.31,30 68,32.69 68,36V41C68,44.31 65.31,47 62,47H46C42.69,47 40,44.31 40,41V36Z"
|
||||
android:fillColor="#D5D9FD"/>
|
||||
<path
|
||||
android:pathData="M35,17C35,13.69 37.69,11 41,11H77C80.31,11 83,13.69 83,17V22C83,25.31 80.31,28 77,28H41C37.69,28 35,25.31 35,22V17Z"
|
||||
android:fillColor="#D5D9FD"/>
|
||||
<path
|
||||
android:pathData="M3,35.47C3,29.94 7.48,25.47 13,25.47H33.33C38.86,25.47 43.33,29.94 43.33,35.47V80C43.33,85.52 38.86,90 33.33,90H13C7.48,90 3,85.52 3,80L3,35.47Z"
|
||||
android:fillColor="#373D52"/>
|
||||
<path
|
||||
android:pathData="M1.17,35.47C1.17,28.93 6.46,23.63 13,23.63L33.33,23.63C39.87,23.63 45.17,28.93 45.17,35.47V80C45.17,86.54 39.87,91.84 33.33,91.84H13C6.46,91.84 1.17,86.54 1.17,80L1.17,35.47ZM13,27.3C8.49,27.3 4.84,30.96 4.84,35.47L4.84,80C4.84,84.51 8.49,88.17 13,88.17H33.33C37.84,88.17 41.5,84.51 41.5,80V35.47C41.5,30.96 37.84,27.3 33.33,27.3H13Z"
|
||||
android:fillColor="#B6C5FA"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M19.13,70.07C19.13,67.31 21.37,65.07 24.13,65.07H33.93C36.69,65.07 38.93,67.31 38.93,70.07V74.73C38.93,77.49 36.69,79.73 33.93,79.73H24.13C21.37,79.73 19.13,77.49 19.13,74.73V70.07Z"
|
||||
android:fillColor="#6A77DD"/>
|
||||
<path
|
||||
android:pathData="M6.67,56.73C6.67,53.9 8.96,51.6 11.8,51.6H21.33C24.17,51.6 26.47,53.9 26.47,56.73V56.73C26.47,59.57 24.17,61.87 21.33,61.87H11.8C8.96,61.87 6.67,59.57 6.67,56.73V56.73Z"
|
||||
android:fillColor="#D5D9FD"/>
|
||||
<path
|
||||
android:pathData="M6.67,45.27C6.67,42.43 8.96,40.13 11.8,40.13H27.2C30.03,40.13 32.33,42.43 32.33,45.27V45.27C32.33,48.1 30.03,50.4 27.2,50.4H11.8C8.96,50.4 6.67,48.1 6.67,45.27V45.27Z"
|
||||
android:fillColor="#D5D9FD"/>
|
||||
</vector>
|
||||
@@ -1,38 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="140dp"
|
||||
android:height="92dp"
|
||||
android:viewportWidth="140"
|
||||
android:viewportHeight="92">
|
||||
<path
|
||||
android:pathData="M125.47,2C131.54,2 136.47,6.92 136.47,13L136.47,72.4C136.47,78.48 131.54,83.4 125.47,83.4L38.93,83.4C32.86,83.4 27.93,78.48 27.93,72.4L27.93,13C27.93,6.92 32.86,2 38.93,2L125.47,2Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M125.47,0.17C132.55,0.17 138.3,5.91 138.3,13L138.3,72.4C138.3,79.49 132.55,85.24 125.47,85.24L38.93,85.24C31.84,85.24 26.1,79.49 26.1,72.4L26.1,13C26.1,5.91 31.84,0.17 38.93,0.17L125.47,0.17ZM134.63,13C134.63,7.94 130.53,3.84 125.47,3.84L38.93,3.84C33.87,3.84 29.77,7.94 29.77,13L29.77,72.4C29.77,77.46 33.87,81.57 38.93,81.57L125.47,81.57C130.53,81.57 134.63,77.46 134.63,72.4L134.63,13Z"
|
||||
android:fillColor="#617092"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M96,58C96,54.69 98.69,52 102,52H125C128.31,52 131,54.69 131,58V66C131,69.31 128.31,72 125,72H102C98.69,72 96,69.31 96,66V58Z"
|
||||
android:fillColor="#B4BCFF"/>
|
||||
<path
|
||||
android:pathData="M40,36C40,32.69 42.69,30 46,30H62C65.31,30 68,32.69 68,36V41C68,44.31 65.31,47 62,47H46C42.69,47 40,44.31 40,41V36Z"
|
||||
android:fillColor="#E4E7FF"/>
|
||||
<path
|
||||
android:pathData="M35,17C35,13.69 37.69,11 41,11H77C80.31,11 83,13.69 83,17V22C83,25.31 80.31,28 77,28H41C37.69,28 35,25.31 35,22V17Z"
|
||||
android:fillColor="#E4E7FF"/>
|
||||
<path
|
||||
android:pathData="M3,35.47C3,29.94 7.48,25.47 13,25.47H33.33C38.86,25.47 43.33,29.94 43.33,35.47V80C43.33,85.52 38.86,90 33.33,90H13C7.48,90 3,85.52 3,80L3,35.47Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M1.17,35.47C1.17,28.93 6.46,23.63 13,23.63L33.33,23.63C39.87,23.63 45.17,28.93 45.17,35.47V80C45.17,86.54 39.87,91.84 33.33,91.84H13C6.46,91.84 1.17,86.54 1.17,80L1.17,35.47ZM13,27.3C8.49,27.3 4.84,30.96 4.84,35.47L4.84,80C4.84,84.51 8.49,88.17 13,88.17H33.33C37.84,88.17 41.5,84.51 41.5,80V35.47C41.5,30.96 37.84,27.3 33.33,27.3H13Z"
|
||||
android:fillColor="#617092"
|
||||
android:fillType="evenOdd"/>
|
||||
<path
|
||||
android:pathData="M19.13,70.07C19.13,67.31 21.37,65.07 24.13,65.07H33.93C36.69,65.07 38.93,67.31 38.93,70.07V74.73C38.93,77.49 36.69,79.73 33.93,79.73H24.13C21.37,79.73 19.13,77.49 19.13,74.73V70.07Z"
|
||||
android:fillColor="#B4BCFF"/>
|
||||
<path
|
||||
android:pathData="M6.67,56.73C6.67,53.9 8.96,51.6 11.8,51.6H21.33C24.17,51.6 26.47,53.9 26.47,56.73V56.73C26.47,59.57 24.17,61.87 21.33,61.87H11.8C8.96,61.87 6.67,59.57 6.67,56.73V56.73Z"
|
||||
android:fillColor="#E4E7FF"/>
|
||||
<path
|
||||
android:pathData="M6.67,45.27C6.67,42.43 8.96,40.13 11.8,40.13H27.2C30.03,40.13 32.33,42.43 32.33,45.27V45.27C32.33,48.1 30.03,50.4 27.2,50.4H11.8C8.96,50.4 6.67,48.1 6.67,45.27V45.27Z"
|
||||
android:fillColor="#E4E7FF"/>
|
||||
</vector>
|
||||
@@ -8717,13 +8717,6 @@
|
||||
<!-- Body of bottom sheet shown when opening a terminated group -->
|
||||
<string name="TerminatedGroupBottomSheet__you_can_no_longer_send_and_receive">You can no longer send and receive messages or calls in this group.</string>
|
||||
|
||||
<!-- Educational bottom sheet dialog title shown to notify about delete syncs causing deletes to happen across all devices -->
|
||||
<string name="DeleteSyncEducation_title">Deleting is now synced across all of your devices</string>
|
||||
<!-- Educational bottom sheet dialog message shown to notify about delete syncs causing deletes to happen across all devices -->
|
||||
<string name="DeleteSyncEducation_message">When you delete messages or chats, they will be deleted from your phone and linked devices.</string>
|
||||
<!-- Educational bottom sheet confirm/dismiss button text shown to notify about delete syncs causing deletes to happen across all devices -->
|
||||
<string name="DeleteSyncEducation_acknowledge_button">OK</string>
|
||||
|
||||
<!-- NoManualBackupBottomSheet -->
|
||||
<!-- Title for bottom sheet, placeholder is number of days. -->
|
||||
<plurals name="NoManualBackupBottomSheet__no_backup_for_d_days">
|
||||
|
||||
Reference in New Issue
Block a user