package org.thoughtcrime.securesms; import android.animation.Animator; import android.annotation.TargetApi; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; import androidx.annotation.NonNull; import org.signal.qr.QrScannerView; import org.signal.qr.kitkat.ScanListener; import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.ViewUtil; public class DeviceAddFragment extends LoggingFragment { private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable(); private LinearLayout overlay; private ImageView devicesImage; private ScanListener scanListener; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { ViewGroup container = ViewUtil.inflate(inflater, viewGroup, R.layout.device_add_fragment); this.overlay = container.findViewById(R.id.overlay); QrScannerView scannerView = container.findViewById(R.id.scanner); this.devicesImage = container.findViewById(R.id.devices); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { this.overlay.setOrientation(LinearLayout.HORIZONTAL); } else { this.overlay.setOrientation(LinearLayout.VERTICAL); } if (Build.VERSION.SDK_INT >= 21) { container.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @TargetApi(21) @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { v.removeOnLayoutChangeListener(this); Animator reveal = ViewAnimationUtils.createCircularReveal(v, right, bottom, 0, (int) Math.hypot(right, bottom)); reveal.setInterpolator(new DecelerateInterpolator(2f)); reveal.setDuration(800); reveal.start(); } }); } scannerView.start(getViewLifecycleOwner()); lifecycleDisposable.bindTo(getViewLifecycleOwner()); lifecycleDisposable.add(scannerView.getQrData().subscribe(qrData -> { if (scanListener != null) { scanListener.onQrDataFound(qrData); } })); return container; } @Override public void onConfigurationChanged(@NonNull Configuration newConfiguration) { super.onConfigurationChanged(newConfiguration); if (newConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE) { overlay.setOrientation(LinearLayout.HORIZONTAL); } else { overlay.setOrientation(LinearLayout.VERTICAL); } } public ImageView getDevicesImage() { return devicesImage; } public void setScanListener(ScanListener scanListener) { this.scanListener = scanListener; } }