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 about.setCopyingEnabled(true);
72 if (ConnectionSettingsFragment.hideChannelDiscovery()) {
73 connection.setSummary(R.string.pref_connection_summary);
74 }
75 }
76
77 private boolean onBackupPreferenceClicked(final Preference preference) {
78 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
79 if (ContextCompat.checkSelfPermission(
80 requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
81 != PackageManager.PERMISSION_GRANTED) {
82 requestStorageForBackupLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
83 } else {
84 startBackup();
85 }
86 } else {
87 startBackup();
88 }
89 return true;
90 }
91
92 private void startBackup() {
93 ContextCompat.startForegroundService(
94 requireContext(), new Intent(requireContext(), ExportBackupService.class));
95 final MaterialAlertDialogBuilder builder =
96 new MaterialAlertDialogBuilder(requireActivity());
97 builder.setMessage(R.string.backup_started_message);
98 builder.setPositiveButton(R.string.ok, null);
99 builder.create().show();
100 }
101
102 @Override
103 public void onStart() {
104 super.onStart();
105 requireActivity().setTitle(R.string.title_activity_settings);
106 }
107}