package dev.garrettmills.starship.hyperlink; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.camera.core.Camera; import androidx.camera.core.CameraSelector; import androidx.camera.core.ImageAnalysis; import androidx.camera.core.Preview; import androidx.camera.lifecycle.ProcessCameraProvider; import androidx.camera.view.PreviewView; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.lifecycle.LifecycleOwner; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.util.Size; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.ExecutionException; import dev.garrettmills.starship.hyperlink.scanner.QRCodeImageAnalyzer; import dev.garrettmills.starship.hyperlink.scanner.QRCodeListener; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CAMERA = 0; private PreviewView previewView; private ListenableFuture cameraProviderFuture; private Button qrCodeFoundButton; private String qrCode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Hyperlink.preferences = getSharedPreferences(Hyperlink.SHARED_PREFERENCES_NAME, MODE_PRIVATE); setContentView(R.layout.activity_main); previewView = findViewById(R.id.activity_main_previewView); qrCodeFoundButton = findViewById(R.id.activity_main_qrCodeFoundButton); qrCodeFoundButton.setVisibility(View.INVISIBLE); qrCodeFoundButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), qrCode, Toast.LENGTH_LONG).show(); Log.i(MainActivity.class.getSimpleName(), "QR Code Found: " + qrCode); } }); cameraProviderFuture = ProcessCameraProvider.getInstance(this); requestCamera(); } protected void requestCamera() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { startCamera(); } else { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_REQUEST_CAMERA) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera(); } else { Toast.makeText(this, "Camera Permission Denied", Toast.LENGTH_SHORT).show(); } } } private void startCamera() { cameraProviderFuture.addListener(() -> { try { ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); bindCameraPreview(cameraProvider); } catch (ExecutionException | InterruptedException e) { Toast.makeText(this, "Error starting camera: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }, ContextCompat.getMainExecutor(this)); } private void bindCameraPreview(@NonNull ProcessCameraProvider cameraProvider) { previewView.setPreferredImplementationMode(PreviewView.ImplementationMode.SURFACE_VIEW); Preview preview = new Preview.Builder().build(); CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build(); preview.setSurfaceProvider(previewView.createSurfaceProvider()); ImageAnalysis imageAnalysis = new ImageAnalysis.Builder() .setTargetResolution(new Size(1280, 720)) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build(); imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new QRCodeImageAnalyzer(new QRCodeListener() { @Override public void onQRCodeFound(String _qrCode) { qrCode = _qrCode; qrCodeFoundButton.setVisibility(View.VISIBLE); } @Override public void onQRCodeNotFound() { qrCodeFoundButton.setVisibility(View.INVISIBLE); } })); Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview); } }