That fuck shit the fascists are using
at master 291 lines 8.4 kB view raw
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}