AttachmentsSettingsFragment.java

  1package eu.siacs.conversations.ui.fragment.settings;
  2
  3import android.Manifest;
  4import android.content.Context;
  5import android.content.Intent;
  6import android.content.pm.PackageManager;
  7import android.os.Bundle;
  8import android.os.Build;
  9import android.os.storage.StorageManager;
 10import android.preference.PreferenceManager;
 11import android.widget.Toast;
 12
 13import androidx.activity.result.ActivityResultLauncher;
 14import androidx.activity.result.contract.ActivityResultContracts;
 15import androidx.annotation.Nullable;
 16import androidx.core.content.ContextCompat;
 17import androidx.preference.ListPreference;
 18import androidx.preference.PreferenceFragmentCompat;
 19
 20import com.cheogram.android.DownloadDefaultStickers;
 21
 22import eu.siacs.conversations.R;
 23import eu.siacs.conversations.utils.UIHelper;
 24
 25public class AttachmentsSettingsFragment extends XmppPreferenceFragment {
 26
 27    private final ActivityResultLauncher<String> requestStorageLauncher =
 28            registerForActivityResult(
 29                    new ActivityResultContracts.RequestPermission(),
 30                    isGranted -> {
 31                        if (isGranted) {
 32                            downloadStickers();
 33                        } else {
 34                            Toast.makeText(
 35                                            requireActivity(),
 36                                            getString(
 37                                                    R.string.no_storage_permission,
 38                                                    getString(R.string.app_name)),
 39                                            Toast.LENGTH_LONG)
 40                                    .show();
 41                        }
 42                    });
 43
 44    @Override
 45    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
 46        setPreferencesFromResource(R.xml.preferences_attachments, rootKey);
 47
 48        final var p = PreferenceManager.getDefaultSharedPreferences(requireActivity());
 49        final var stickerDir = findPreference("sticker_directory");
 50        stickerDir.setSummary(p.getString("sticker_directory", "Pictures/Stickers"));
 51        stickerDir.setOnPreferenceClickListener((pref) -> {
 52            final var intent = ((StorageManager) requireActivity().getSystemService(Context.STORAGE_SERVICE)).getPrimaryStorageVolume().createOpenDocumentTreeIntent();
 53            startActivityForResult(Intent.createChooser(intent, "Choose sticker location"), 0);
 54            return true;
 55        });
 56
 57        final var downloadDefaultStickers = findPreference("download_default_stickers");
 58        downloadDefaultStickers.setOnPreferenceClickListener((pref) -> {
 59            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
 60                if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 61                    requestStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 62                } else {
 63                    downloadStickers();
 64                }
 65            } else {
 66                downloadStickers();
 67            }
 68            return true;
 69        });
 70
 71        final var clearBlockedMedia = findPreference("clear_blocked_media");
 72        clearBlockedMedia.setOnPreferenceClickListener((pref) -> {
 73            requireService().clearBlockedMedia();
 74            runOnUiThread(() -> Toast.makeText(requireActivity(), "Blocked media will be displayed again", Toast.LENGTH_LONG).show());
 75            return true;
 76        });
 77
 78        final ListPreference autoAcceptFileSize = findPreference("auto_accept_file_size");
 79        if (autoAcceptFileSize == null) {
 80            throw new IllegalStateException("The preference resource file is missing preferences");
 81        }
 82        setValues(
 83                autoAcceptFileSize,
 84                R.array.file_size_values,
 85                value -> {
 86                    if (value <= 0) {
 87                        return getString(R.string.never);
 88                    } else {
 89                        return UIHelper.filesizeToString(value);
 90                    }
 91                });
 92    }
 93
 94    protected void downloadStickers() {
 95        final var intent = new Intent(requireActivity(), DownloadDefaultStickers.class);
 96        intent.putExtra("tor", requireService().useTorToConnect());
 97        ContextCompat.startForegroundService(requireActivity(), intent);
 98        runOnUiThread(() -> Toast.makeText(requireActivity(), "Sticker download started", Toast.LENGTH_LONG).show());
 99    }
100
101    @Override
102    public void onStart() {
103        super.onStart();
104        requireActivity().setTitle(R.string.pref_attachments);
105    }
106
107    @Override
108    public void onActivityResult(int requestCode, int resultCode, Intent data) {
109        if (data == null || data.getData() == null) return;
110
111        final var p = PreferenceManager.getDefaultSharedPreferences(requireActivity());
112        p.edit().putString("sticker_directory", data.getData().toString()).commit();
113        final var stickerDir = findPreference("sticker_directory");
114        stickerDir.setSummary(data.getData().toString());
115    }
116}