1package eu.siacs.conversations.ui.fragment.settings;
2
3import android.Manifest;
4import android.content.Intent;
5import android.content.pm.PackageManager;
6import android.os.Build;
7import android.os.Bundle;
8import android.widget.Toast;
9
10import androidx.activity.result.ActivityResultLauncher;
11import androidx.activity.result.contract.ActivityResultContracts;
12import androidx.annotation.Nullable;
13import androidx.core.content.ContextCompat;
14import androidx.preference.Preference;
15import androidx.preference.PreferenceFragmentCompat;
16
17import com.google.android.material.dialog.MaterialAlertDialogBuilder;
18import com.google.common.base.Strings;
19
20import eu.siacs.conversations.BuildConfig;
21import eu.siacs.conversations.R;
22import eu.siacs.conversations.persistance.FileBackend;
23import eu.siacs.conversations.services.ExportBackupService;
24
25public class MainSettingsFragment extends PreferenceFragmentCompat {
26
27 private static final String CREATE_BACKUP = "create_backup";
28
29 private final ActivityResultLauncher<String> requestStorageForBackupLauncher =
30 registerForActivityResult(
31 new ActivityResultContracts.RequestPermission(),
32 isGranted -> {
33 if (isGranted) {
34 startBackup();
35 } else {
36 Toast.makeText(
37 requireActivity(),
38 getString(
39 R.string.no_storage_permission,
40 getString(R.string.app_name)),
41 Toast.LENGTH_LONG)
42 .show();
43 }
44 });
45
46 @Override
47 public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
48 setPreferencesFromResource(R.xml.preferences_main, rootKey);
49 final var about = findPreference("about");
50 final var connection = findPreference("connection");
51 final var backup = findPreference(CREATE_BACKUP);
52 if (about == null || connection == null || backup == null) {
53 throw new IllegalStateException(
54 "The preference resource file is missing some preferences");
55 }
56 backup.setSummary(
57 getString(
58 R.string.pref_create_backup_summary,
59 FileBackend.getBackupDirectory(requireContext()).getAbsolutePath()));
60 backup.setOnPreferenceClickListener(this::onBackupPreferenceClicked);
61 about.setTitle(getString(R.string.title_activity_about_x, BuildConfig.APP_NAME));
62 about.setSummary(
63 String.format(
64 "%s %s %s @ %s · %s · %s",
65 BuildConfig.APP_NAME,
66 BuildConfig.VERSION_NAME,
67 im.conversations.webrtc.BuildConfig.WEBRTC_VERSION,
68 Strings.nullToEmpty(Build.MANUFACTURER),
69 Strings.nullToEmpty(Build.DEVICE),
70 Strings.nullToEmpty(Build.VERSION.RELEASE)));
71 if (ConnectionSettingsFragment.hideChannelDiscovery()) {
72 connection.setSummary(R.string.pref_connection_summary);
73 }
74 }
75
76 private boolean onBackupPreferenceClicked(final Preference preference) {
77 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
78 if (ContextCompat.checkSelfPermission(
79 requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
80 != PackageManager.PERMISSION_GRANTED) {
81 requestStorageForBackupLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
82 } else {
83 startBackup();
84 }
85 } else {
86 startBackup();
87 }
88 return true;
89 }
90
91 private void startBackup() {
92 ContextCompat.startForegroundService(
93 requireContext(), new Intent(requireContext(), ExportBackupService.class));
94 final MaterialAlertDialogBuilder builder =
95 new MaterialAlertDialogBuilder(requireActivity());
96 builder.setMessage(R.string.backup_started_message);
97 builder.setPositiveButton(R.string.ok, null);
98 builder.create().show();
99 }
100
101 @Override
102 public void onStart() {
103 super.onStart();
104 requireActivity().setTitle(R.string.title_activity_settings);
105 }
106}