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}