That fuck shit the fascists are using
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}