Local backups upgrade UI.

This commit is contained in:
Alex Hart
2026-01-30 10:13:36 -04:00
committed by Greyson Parrelli
parent 2e70ed14dd
commit 6c30f3d573
30 changed files with 2007 additions and 202 deletions

View File

@@ -18,6 +18,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.Toolbar;
import androidx.compose.ui.platform.ComposeView;
import androidx.core.text.HtmlCompat;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
@@ -38,9 +39,11 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.jobs.LocalBackupJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.preferences.widgets.UpgradeLocalBackupCard;
import org.thoughtcrime.securesms.service.LocalBackupListener;
import org.thoughtcrime.securesms.util.BackupUtil;
import org.thoughtcrime.securesms.util.JavaTimeExtensionsKt;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.thoughtcrime.securesms.util.StorageUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@@ -50,6 +53,7 @@ import java.util.Locale;
import java.util.Objects;
import kotlin.Pair;
import kotlin.Unit;
public class BackupsPreferenceFragment extends Fragment {
@@ -68,6 +72,7 @@ public class BackupsPreferenceFragment extends Fragment {
private TextView folderName;
private ProgressBar progress;
private TextView progressSummary;
private ComposeView upgradeCard;
private final NumberFormat formatter = NumberFormat.getInstance();
@@ -92,6 +97,7 @@ public class BackupsPreferenceFragment extends Fragment {
folderName = view.findViewById(R.id.fragment_backup_folder_name);
progress = view.findViewById(R.id.fragment_backup_progress);
progressSummary = view.findViewById(R.id.fragment_backup_progress_summary);
upgradeCard = view.findViewById(R.id.upgrade_to_improved_backups_card);
toggle.setOnClickListener(unused -> onToggleClicked());
create.setOnClickListener(unused -> onCreateClicked());
@@ -113,6 +119,7 @@ public class BackupsPreferenceFragment extends Fragment {
setBackupStatus();
setBackupSummary();
setInfo();
setUpdateState();
}
@Override
@@ -223,6 +230,24 @@ public class BackupsPreferenceFragment extends Fragment {
info.setMovementMethod(LinkMovementMethod.getInstance());
}
private void setUpdateState() {
if (SignalStore.settings().isBackupEnabled() && RemoteConfig.unifiedLocalBackups()) {
UpgradeLocalBackupCard.bind(upgradeCard, () -> {
Navigation.findNavController(requireView())
.navigate(BackupsPreferenceFragmentDirections.actionBackupsPreferenceFragmentToLocalBackupsFragment()
.setTriggerUpdateFlow(true));
return Unit.INSTANCE;
});
upgradeCard.setVisibility(View.VISIBLE);
} else {
upgradeCard.setVisibility(View.GONE);
}
if (SignalStore.backup().getNewLocalBackupsEnabled()) {
Navigation.findNavController(requireView()).popBackStack();
}
}
private void onToggleClicked() {
if (BackupUtil.isUserSelectionRequired(requireContext())) {
onToggleClickedApi29();

View File

@@ -0,0 +1,84 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.preferences.widgets
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
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.graphics.vector.ImageVector
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.Buttons
import org.signal.core.ui.compose.DayNightPreviews
import org.signal.core.ui.compose.Previews
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.SignalTheme
object UpgradeLocalBackupCard {
@JvmStatic
fun ComposeView.bind(
onClick: () -> Unit
) {
setContent {
SignalTheme {
UpgradeLocalBackupCardComponent(onClick = onClick)
}
}
}
}
@Composable
private fun UpgradeLocalBackupCardComponent(onClick: () -> Unit) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 12.dp)
.padding(top = 8.dp, bottom = 16.dp)
.border(width = 1.dp, color = MaterialTheme.colorScheme.outline.copy(alpha = 0.38f), shape = RoundedCornerShape(12.dp))
.padding(16.dp)
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.symbol_key_24),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(end = 16.dp)
)
Text(
text = stringResource(R.string.OnDeviceBackupsSettingsScreen__update_to_a_new_recovery_key),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(end = 8.dp).weight(1f)
)
Buttons.Small(
onClick = onClick
) {
Text(
text = stringResource(R.string.OnDeviceBackupsSettingsScreen__update)
)
}
}
}
@DayNightPreviews
@Composable
private fun UpgradeLocalBackupCardComponentPreview() {
Previews.Preview {
UpgradeLocalBackupCardComponent(onClick = {})
}
}