That fuck shit the fascists are using
1package org.tm.archive.mediasend;
2
3import android.content.Context;
4import android.content.Intent;
5import android.graphics.Point;
6import android.net.Uri;
7import android.os.Bundle;
8import android.view.WindowManager;
9import android.widget.Toast;
10
11import androidx.annotation.NonNull;
12import androidx.annotation.Nullable;
13import androidx.appcompat.app.AppCompatActivity;
14import androidx.appcompat.app.AppCompatDelegate;
15import androidx.fragment.app.Fragment;
16import androidx.fragment.app.FragmentTransaction;
17
18import org.signal.imageeditor.core.model.EditorModel;
19import org.tm.archive.R;
20import org.tm.archive.mediasend.v2.gallery.MediaGalleryFragment;
21import org.tm.archive.mms.MediaConstraints;
22import org.tm.archive.profiles.AvatarHelper;
23import org.tm.archive.providers.BlobProvider;
24import org.tm.archive.scribbles.ImageEditorFragment;
25import org.tm.archive.util.MediaUtil;
26
27import java.io.FileDescriptor;
28import java.util.Collections;
29import java.util.Optional;
30
31import io.reactivex.rxjava3.core.Flowable;
32
33public class AvatarSelectionActivity extends AppCompatActivity implements CameraFragment.Controller, ImageEditorFragment.Controller, MediaGalleryFragment.Callbacks {
34
35 private static final Point AVATAR_DIMENSIONS = new Point(AvatarHelper.AVATAR_DIMENSIONS, AvatarHelper.AVATAR_DIMENSIONS);
36
37 private static final String IMAGE_CAPTURE = "IMAGE_CAPTURE";
38 private static final String IMAGE_EDITOR = "IMAGE_EDITOR";
39 private static final String ARG_GALLERY = "ARG_GALLERY";
40
41 public static final String EXTRA_MEDIA = "avatar.media";
42
43 private Media currentMedia;
44
45 public static Intent getIntentForCameraCapture(@NonNull Context context) {
46 return new Intent(context, AvatarSelectionActivity.class);
47 }
48
49 public static Intent getIntentForGallery(@NonNull Context context) {
50 Intent intent = getIntentForCameraCapture(context);
51
52 intent.putExtra(ARG_GALLERY, true);
53
54 return intent;
55 }
56
57 @Override
58 protected void attachBaseContext(@NonNull Context newBase) {
59 getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
60 super.attachBaseContext(newBase);
61 }
62
63 @Override
64 protected void onCreate(@Nullable Bundle savedInstanceState) {
65 super.onCreate(savedInstanceState);
66
67 getWindow().addFlags(
68 WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
69 );
70
71 setContentView(R.layout.avatar_selection_activity);
72
73 if (isGalleryFirst()) {
74 onGalleryClicked();
75 } else {
76 onNavigateToCamera();
77 }
78 }
79
80 @Override
81 public void onCameraError() {
82 Toast.makeText(this, R.string.default_error_msg, Toast.LENGTH_SHORT).show();
83 finish();
84 }
85
86 @Override
87 public void onImageCaptured(@NonNull byte[] data, int width, int height) {
88 Uri blobUri = BlobProvider.getInstance()
89 .forData(data)
90 .withMimeType(MediaUtil.IMAGE_JPEG)
91 .createForSingleSessionInMemory();
92
93 onMediaSelected(new Media(blobUri,
94 MediaUtil.IMAGE_JPEG,
95 System.currentTimeMillis(),
96 width,
97 height,
98 data.length,
99 0,
100 false,
101 false,
102 Optional.of(Media.ALL_MEDIA_BUCKET_ID),
103 Optional.empty(),
104 Optional.empty()));
105 }
106
107 @Override
108 public void onVideoCaptured(@NonNull FileDescriptor fd) {
109 throw new UnsupportedOperationException("Cannot set profile as video");
110 }
111
112 @Override
113 public void onVideoCaptureError() {
114 throw new AssertionError("This should never happen");
115 }
116
117 @Override
118 public void onGalleryClicked() {
119 if (isGalleryFirst() && popToRoot()) {
120 return;
121 }
122
123 MediaGalleryFragment fragment = new MediaGalleryFragment();
124 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction()
125 .replace(R.id.fragment_container, fragment);
126
127 if (isCameraFirst()) {
128 transaction.addToBackStack(null);
129 }
130
131 transaction.commit();
132 }
133
134 @Override
135 public void onCameraCountButtonClicked() {
136 throw new UnsupportedOperationException("Cannot select more than one photo");
137 }
138
139 @Override
140 public @NonNull Flowable<Optional<Media>> getMostRecentMediaItem() {
141 return Flowable.just(Optional.empty());
142 }
143
144 @Override
145 public @NonNull MediaConstraints getMediaConstraints() {
146 return MediaConstraints.getPushMediaConstraints();
147 }
148
149 @Override
150 public int getMaxVideoDuration() {
151 return -1;
152 }
153
154 @Override
155 public void onTouchEventsNeeded(boolean needed) {
156 }
157
158 @Override
159 public void onRequestFullScreen(boolean fullScreen, boolean hideKeyboard) {
160 }
161
162 @Override
163 public void onMediaSelected(@NonNull Media media) {
164 currentMedia = media;
165
166 getSupportFragmentManager().beginTransaction()
167 .replace(R.id.fragment_container, ImageEditorFragment.newInstanceForAvatarCapture(media.getUri()), IMAGE_EDITOR)
168 .addToBackStack(IMAGE_EDITOR)
169 .commit();
170 }
171
172 @Override
173 public void onDoneEditing() {
174 handleSave();
175 }
176
177 @Override
178 public void onCancelEditing() {
179 finish();
180 }
181
182 @Override
183 public void onMainImageLoaded() {
184 }
185
186 @Override
187 public void onMainImageFailedToLoad() {
188 }
189
190 @Override
191 public void restoreState() {
192 }
193
194 @Override
195 public void onQrCodeFound(@NonNull String data) {
196 }
197
198 public boolean popToRoot() {
199 final int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
200 if (backStackCount == 0) {
201 return false;
202 }
203
204 for (int i = 0; i < backStackCount; i++) {
205 getSupportFragmentManager().popBackStack();
206 }
207
208 return true;
209 }
210
211 private boolean isGalleryFirst() {
212 return getIntent().getBooleanExtra(ARG_GALLERY, false);
213 }
214
215 private boolean isCameraFirst() {
216 return !isGalleryFirst();
217 }
218
219 private void handleSave() {
220 ImageEditorFragment fragment = (ImageEditorFragment) getSupportFragmentManager().findFragmentByTag(IMAGE_EDITOR);
221 if (fragment == null) {
222 throw new AssertionError();
223 }
224
225 ImageEditorFragment.Data data = (ImageEditorFragment.Data) fragment.saveState();
226
227 EditorModel model = data.readModel();
228 if (model == null) {
229 throw new AssertionError();
230 }
231
232 MediaRepository.transformMedia(this,
233 Collections.singletonList(currentMedia),
234 Collections.singletonMap(currentMedia, new ImageEditorModelRenderMediaTransform(model, AVATAR_DIMENSIONS)),
235 output -> {
236 Media transformed = output.get(currentMedia);
237
238 Intent result = new Intent();
239 result.putExtra(EXTRA_MEDIA, transformed);
240 setResult(RESULT_OK, result);
241 finish();
242 });
243 }
244
245 @Override
246 public boolean isMultiselectEnabled() {
247 return false;
248 }
249
250 @Override
251 public void onMediaUnselected(@NonNull Media media) {
252 throw new UnsupportedOperationException();
253 }
254
255 @Override
256 public void onSelectedMediaClicked(@NonNull Media media) {
257 throw new UnsupportedOperationException();
258 }
259
260 @Override
261 public void onNavigateToCamera() {
262 if (isCameraFirst() && popToRoot()) {
263 return;
264 }
265
266 Fragment fragment = CameraFragment.newInstanceForAvatarCapture();
267 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction()
268 .replace(R.id.fragment_container, fragment, IMAGE_CAPTURE);
269
270 if (isGalleryFirst()) {
271 transaction.addToBackStack(null);
272 }
273
274 transaction.commit();
275 }
276
277 @Override
278 public void onSubmit() {
279 throw new UnsupportedOperationException();
280 }
281
282 @Override
283 public void onToolbarNavigationClicked() {
284 finish();
285 }
286
287 @Override
288 public boolean isCameraEnabled() {
289 return true;
290 }
291}