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 0e53d5c..929b695 100644 --- a/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/Hyperlink.java @@ -3,7 +3,6 @@ package dev.garrettmills.starship.hyperlink; import android.content.SharedPreferences; public class Hyperlink { - 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"; @@ -11,6 +10,7 @@ public class Hyperlink { public static final String EXTRA_LOGIN_TOKEN = "dev.garrettmills.starship.hyperlink.extra.login_token"; public static final int REQUEST_LOGIN_TOKEN = 180; + public static final int REQUEST_PERMISSION_CAMERA = 181; 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 index d88d8f3..0f88346 100644 --- a/app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/LoginTokenScannerActivity.java @@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException; import dev.garrettmills.starship.hyperlink.scanner.QRCodeImageAnalyzer; import dev.garrettmills.starship.hyperlink.scanner.QRCodeListener; +import dev.garrettmills.starship.hyperlink.util.InvalidLoginTokenException; +import dev.garrettmills.starship.hyperlink.util.LoginToken; public class LoginTokenScannerActivity extends AppCompatActivity implements QRCodeListener { private PreviewView previewView; @@ -45,21 +47,22 @@ public class LoginTokenScannerActivity extends AppCompatActivity implements QRCo 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); - } + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Hyperlink.REQUEST_PERMISSION_CAMERA); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - if (requestCode == Hyperlink.PERMISSION_REQUEST_CAMERA) { + if (requestCode == Hyperlink.REQUEST_PERMISSION_CAMERA) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera(); } else { - Toast.makeText(this, "Camera Permission Denied", Toast.LENGTH_SHORT).show(); + if ( BuildConfig.DEBUG ) { + Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show(); + } + + // If we denied, go back up to the main activity, w/o any login token + finish(); } } } @@ -70,7 +73,11 @@ public class LoginTokenScannerActivity extends AppCompatActivity implements QRCo ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); bindCameraPreview(cameraProvider); } catch (ExecutionException | InterruptedException e) { - Toast.makeText(this, "Error starting camera: " + e.getMessage(), Toast.LENGTH_LONG).show(); + if ( BuildConfig.DEBUG ) { + Toast.makeText(this, "Error starting camera: " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + + finish(); } }, ContextCompat.getMainExecutor(this)); } @@ -109,6 +116,11 @@ public class LoginTokenScannerActivity extends AppCompatActivity implements QRCo public void onQRCodeNotFound() {} public boolean isValidLoginToken(String token) { - return true; + try { + new LoginToken(token); + return true; + } catch (InvalidLoginTokenException e) { + return false; + } } } 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 e62a672..f858c89 100644 --- a/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/MainActivity.java @@ -27,7 +27,9 @@ public class MainActivity extends AppCompatActivity { 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(); + if ( BuildConfig.DEBUG ) { + Toast.makeText(getApplicationContext(), data.getExtras().getString(Hyperlink.EXTRA_LOGIN_TOKEN), Toast.LENGTH_SHORT).show(); + } } } } diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/util/InvalidLoginTokenException.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/InvalidLoginTokenException.java new file mode 100644 index 0000000..a2db0c3 --- /dev/null +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/InvalidLoginTokenException.java @@ -0,0 +1,4 @@ +package dev.garrettmills.starship.hyperlink.util; + +public class InvalidLoginTokenException extends Exception { +} diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/util/LoginToken.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/LoginToken.java new file mode 100644 index 0000000..2e1ec90 --- /dev/null +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/LoginToken.java @@ -0,0 +1,24 @@ +package dev.garrettmills.starship.hyperlink.util; + +public class LoginToken { + private String _server; + private String _token; + + public LoginToken(String token) throws InvalidLoginTokenException { + String[] parts = token.split("\\|"); + if ( parts.length != 3 || !parts[0].equals("hyperlink")) { + throw new InvalidLoginTokenException(); + } + + this._server = parts[1]; + this._token = parts[2]; + } + + public String getServer() { + return _server; + } + + public String getToken() { + return _token; + } +}