MainSettingsFragment.java

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