That fuck shit the fascists are using
at master 95 lines 3.1 kB view raw
1package org.tm.archive; 2 3import android.animation.Animator; 4import android.os.Bundle; 5import android.view.LayoutInflater; 6import android.view.MenuItem; 7import android.view.View; 8import android.view.ViewAnimationUtils; 9import android.view.ViewGroup; 10import android.view.animation.DecelerateInterpolator; 11import android.widget.ImageView; 12 13import androidx.annotation.NonNull; 14import androidx.annotation.Nullable; 15import androidx.core.view.ViewCompat; 16 17import org.signal.qr.QrScannerView; 18import org.signal.qr.kitkat.ScanListener; 19import org.tm.archive.mediasend.camerax.CameraXModelBlocklist; 20import org.signal.core.util.concurrent.LifecycleDisposable; 21import org.tm.archive.util.ViewUtil; 22 23import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; 24import io.reactivex.rxjava3.disposables.Disposable; 25 26public class DeviceAddFragment extends LoggingFragment { 27 28 private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable(); 29 30 private ImageView devicesImage; 31 private ScanListener scanListener; 32 private QrScannerView scannerView; 33 34 @Override 35 public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { 36 ViewGroup container = ViewUtil.inflate(inflater, viewGroup, R.layout.device_add_fragment); 37 38 this.scannerView = container.findViewById(R.id.scanner); 39 this.devicesImage = container.findViewById(R.id.devices); 40 ViewCompat.setTransitionName(devicesImage, "devices"); 41 42 container.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 43 @Override 44 public void onLayoutChange(View v, int left, int top, int right, int bottom, 45 int oldLeft, int oldTop, int oldRight, int oldBottom) 46 { 47 v.removeOnLayoutChangeListener(this); 48 49 Animator reveal = ViewAnimationUtils.createCircularReveal(v, right, bottom, 0, (int) Math.hypot(right, bottom)); 50 reveal.setInterpolator(new DecelerateInterpolator(2f)); 51 reveal.setDuration(800); 52 reveal.start(); 53 } 54 }); 55 56 scannerView.start(getViewLifecycleOwner(), CameraXModelBlocklist.isBlocklisted()); 57 58 lifecycleDisposable.bindTo(getViewLifecycleOwner()); 59 60 Disposable qrDisposable = scannerView 61 .getQrData() 62 .distinctUntilChanged() 63 .observeOn(AndroidSchedulers.mainThread()) 64 .subscribe(qrData -> { 65 if (scanListener != null) { 66 scanListener.onQrDataFound(qrData); 67 } 68 }); 69 70 lifecycleDisposable.add(qrDisposable); 71 72 return container; 73 } 74 75 @Override 76 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 77 MenuItem switchCamera = ((DeviceActivity) requireActivity()).getCameraSwitchItem(); 78 79 if (switchCamera != null) { 80 switchCamera.setVisible(true); 81 switchCamera.setOnMenuItemClickListener(v -> { 82 scannerView.toggleCamera(); 83 return true; 84 }); 85 } 86 } 87 88 public ImageView getDevicesImage() { 89 return devicesImage; 90 } 91 92 public void setScanListener(ScanListener scanListener) { 93 this.scanListener = scanListener; 94 } 95}