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}