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;
17
18import com.cheogram.android.DownloadDefaultStickers;
19
20import eu.siacs.conversations.R;
21
22public class AttachmentsSettingsFragment extends XmppPreferenceFragment {
23
24    private final ActivityResultLauncher<String> requestStorageLauncher =
25            registerForActivityResult(
26                    new ActivityResultContracts.RequestPermission(),
27                    isGranted -> {
28                        if (isGranted) {
29                            downloadStickers();
30                        } else {
31                            Toast.makeText(
32                                            requireActivity(),
33                                            getString(
34                                                    R.string.no_storage_permission,
35                                                    getString(R.string.app_name)),
36                                            Toast.LENGTH_LONG)
37                                    .show();
38                        }
39                    });
40
41    @Override
42    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
43        setPreferencesFromResource(R.xml.preferences_attachments, rootKey);
44
45        final var p = PreferenceManager.getDefaultSharedPreferences(requireActivity());
46        final var stickerDir = findPreference("sticker_directory");
47        stickerDir.setSummary(p.getString("sticker_directory", "Pictures/Stickers"));
48        stickerDir.setOnPreferenceClickListener((pref) -> {
49            final var intent = ((StorageManager) requireActivity().getSystemService(Context.STORAGE_SERVICE)).getPrimaryStorageVolume().createOpenDocumentTreeIntent();
50            startActivityForResult(Intent.createChooser(intent, "Choose sticker location"), 0);
51            return true;
52        });
53
54        final var downloadDefaultStickers = findPreference("download_default_stickers");
55        downloadDefaultStickers.setOnPreferenceClickListener((pref) -> {
56            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
57                if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
58                    requestStorageLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
59                } else {
60                    downloadStickers();
61                }
62            } else {
63                downloadStickers();
64            }
65            return true;
66        });
67
68        final var clearBlockedMedia = findPreference("clear_blocked_media");
69        clearBlockedMedia.setOnPreferenceClickListener((pref) -> {
70            requireService().clearBlockedMedia();
71            runOnUiThread(() -> Toast.makeText(requireActivity(), "Blocked media will be displayed again", Toast.LENGTH_LONG).show());
72            return true;
73        });
74    }
75
76    protected void downloadStickers() {
77        final var intent = new Intent(requireActivity(), DownloadDefaultStickers.class);
78        intent.putExtra("tor", requireService().useTorToConnect());
79        ContextCompat.startForegroundService(requireActivity(), intent);
80        runOnUiThread(() -> Toast.makeText(requireActivity(), "Sticker download started", Toast.LENGTH_LONG).show());
81    }
82
83    @Override
84    public void onStart() {
85        super.onStart();
86        requireActivity().setTitle(R.string.pref_attachments);
87    }
88
89    @Override
90    public void onActivityResult(int requestCode, int resultCode, Intent data) {
91        if (data == null || data.getData() == null) return;
92
93        final var p = PreferenceManager.getDefaultSharedPreferences(requireActivity());
94        p.edit().putString("sticker_directory", data.getData().toString()).commit();
95        final var stickerDir = findPreference("sticker_directory");
96        stickerDir.setSummary(data.getData().toString());
97    }
98}