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">
-
-
+ app:layout_constraintHorizontal_bias="0.498"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
\ No newline at end of file