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 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}