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        if (Build.VERSION.SDK_INT >= 29) {
 51            stickerDir.setSummary(p.getString("sticker_directory", "Pictures/Stickers"));
 52            stickerDir.setOnPreferenceClickListener((pref) -> {
 53                final var intent = ((StorageManager) requireActivity().getSystemService(Context.STORAGE_SERVICE)).getPrimaryStorageVolume().createOpenDocumentTreeIntent();
 54                startActivityForResult(Intent.createChooser(intent, "Choose sticker location"), 0);
 55                return true;
 56            });
 57        } else {
 58            stickerDir.setVisible(false);
 59        }
 60
 61        final var downloadDefaultStickers = findPreference("download_default_stickers");
 62        downloadDefaultStickers.setOnPreferenceClickListener((pref) -> {
 63            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
 64                if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 65                    requestStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
 66                } else {
 67                    downloadStickers();
 68                }
 69            } else {
 70                downloadStickers();
 71            }
 72            return true;
 73        });
 74
 75        final var clearBlockedMedia = findPreference("clear_blocked_media");
 76        clearBlockedMedia.setOnPreferenceClickListener((pref) -> {
 77            requireService().clearBlockedMedia();
 78            runOnUiThread(() -> Toast.makeText(requireActivity(), "Blocked media will be displayed again", Toast.LENGTH_LONG).show());
 79            return true;
 80        });
 81
 82        final ListPreference autoAcceptFileSize = findPreference("auto_accept_file_size");
 83        if (autoAcceptFileSize == null) {
 84            throw new IllegalStateException("The preference resource file is missing preferences");
 85        }
 86        setValues(
 87                autoAcceptFileSize,
 88                R.array.file_size_values,
 89                value -> {
 90                    if (value <= 0) {
 91                        return getString(R.string.never);
 92                    } else {
 93                        return UIHelper.filesizeToString(value);
 94                    }
 95                });
 96    }
 97
 98    protected void downloadStickers() {
 99        final var intent = new Intent(requireActivity(), DownloadDefaultStickers.class);
100        intent.putExtra("tor", requireService().useTorToConnect());
101        ContextCompat.startForegroundService(requireActivity(), intent);
102        runOnUiThread(() -> Toast.makeText(requireActivity(), "Sticker download started", Toast.LENGTH_LONG).show());
103    }
104
105    @Override
106    public void onStart() {
107        super.onStart();
108        requireActivity().setTitle(R.string.pref_attachments);
109    }
110
111    @Override
112    public void onActivityResult(int requestCode, int resultCode, Intent data) {
113        if (data == null || data.getData() == null) return;
114
115        final var p = PreferenceManager.getDefaultSharedPreferences(requireActivity());
116        p.edit().putString("sticker_directory", data.getData().toString()).commit();
117        final var stickerDir = findPreference("sticker_directory");
118        stickerDir.setSummary(data.getData().toString());
119    }
120}