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}