From d73c79f083b48eea0946126afa96b3887b54657c Mon Sep 17 00:00:00 2001 From: garrettmills Date: Wed, 12 May 2021 12:07:07 -0500 Subject: [PATCH] Make QR scanner separate activity and get code using activity result --- .idea/vcs.xml | 6 + app/build.gradle | 1 - app/src/main/AndroidManifest.xml | 2 + .../starship/hyperlink/Hyperlink.java | 11 +- .../hyperlink/LoginTokenScannerActivity.java | 114 ++++++++++++++++++ .../starship/hyperlink/MainActivity.java | 112 ++--------------- .../layout/activity_login_token_scanner.xml | 24 ++++ app/src/main/res/layout/activity_main.xml | 14 +-- 8 files changed, 170 insertions(+), 114 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java create mode 100644 app/src/main/res/layout/activity_login_token_scanner.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f65b8ad..6b661a4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,5 @@ plugins { id 'com.android.application' -// id 'kotlin-android-extensions' } android { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c4796b..d7d04b2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="dev.garrettmills.starship.hyperlink"> + + diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java index 9ef1fc6..0e53d5c 100644 --- a/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java @@ -3,9 +3,14 @@ package dev.garrettmills.starship.hyperlink; import android.content.SharedPreferences; public class Hyperlink { - public static final String SHARED_PREFERENCES_NAME = "hyperlink.main"; - public static final String SERVER_ADDR = "hyperlink.server"; - public static final String SERVER_TOKEN = "hyperlink.token.server"; + public static final int PERMISSION_REQUEST_CAMERA = 0; + public static final String SHARED_PREFERENCES_NAME = "dev.garrettmills.starship.hyperlink.main"; + public static final String SERVER_ADDR = "dev.garrettmills.starship.hyperlink.server"; + public static final String SERVER_TOKEN = "dev.garrettmills.starship.hyperlink.token.server"; + + public static final String EXTRA_LOGIN_TOKEN = "dev.garrettmills.starship.hyperlink.extra.login_token"; + + public static final int REQUEST_LOGIN_TOKEN = 180; public static SharedPreferences preferences; } diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java new file mode 100644 index 0000000..d88d8f3 --- /dev/null +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java @@ -0,0 +1,114 @@ +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.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.util.Size; +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 LoginTokenScannerActivity extends AppCompatActivity implements QRCodeListener { + private PreviewView previewView; + private ListenableFuture cameraProviderFuture; + private String qrCode; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login_token_scanner); + + previewView = findViewById(R.id.activity_login_token_scanner_previewView); + 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(this, new String[]{Manifest.permission.CAMERA}, Hyperlink.PERMISSION_REQUEST_CAMERA); + } else { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Hyperlink.PERMISSION_REQUEST_CAMERA); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == Hyperlink.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(this)); + + Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, preview); + } + + public void onQRCodeFound(String qrCode) { + if ( !isValidLoginToken(qrCode) ) return; + + Intent result = new Intent(); + result.putExtra(Hyperlink.EXTRA_LOGIN_TOKEN, qrCode); + + setResult(RESULT_OK, result); + finish(); + } + + public void onQRCodeNotFound() {} + + public boolean isValidLoginToken(String token) { + return true; + } +} diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java index 0d54016..e62a672 100644 --- a/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java @@ -1,126 +1,34 @@ 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.content.Intent; 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); - } - } + public void onScanTokenClick(View view) { + Intent intent = new Intent(this, LoginTokenScannerActivity.class); + startActivityForResult(intent, Hyperlink.REQUEST_LOGIN_TOKEN); } @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(); - } - } - } + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); - 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(); + if ( resultCode == RESULT_OK && requestCode == Hyperlink.REQUEST_LOGIN_TOKEN ) { + if ( data.hasExtra(Hyperlink.EXTRA_LOGIN_TOKEN) ) { + Toast.makeText(getApplicationContext(), data.getExtras().getString(Hyperlink.EXTRA_LOGIN_TOKEN), Toast.LENGTH_SHORT).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); + } } } diff --git a/app/src/main/res/layout/activity_login_token_scanner.xml b/app/src/main/res/layout/activity_login_token_scanner.xml new file mode 100644 index 0000000..ef43d8c --- /dev/null +++ b/app/src/main/res/layout/activity_login_token_scanner.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 859ee99..0f4368f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,18 +6,16 @@ xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> - -