diff --git a/app/build.gradle b/app/build.gradle index 6d32729..4275a0d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,7 +86,9 @@ dependencies { implementation 'com.google.android.gms:play-services-vision:17.0.2' implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:2.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19' - implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + //implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + implementation 'com.journeyapps:zxing-android-embedded:3.6.0@aar' + implementation 'com.google.zxing:core:3.3.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 17a8d71..0217e12 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,7 +52,8 @@ + android:screenOrientation="fullSensor" + tools:replace="screenOrientation" /> Connect mobile app on your desktop wallet and scan the QR Code to connect") - intentIntegrator.initiateScan() - } + val intent = Intent(this, QrReaderActivity::class.java) + intent.putExtra("REQUEST_CODE", + QrReaderActivity.REQUEST_CONNDATA + ) + startActivityForResult(intent, + QrReaderActivity.REQUEST_CONNDATA + ) } btnReconnect.setOnClickListener { @@ -353,39 +340,49 @@ class MainActivity : AppCompatActivity(), super.onDestroy() } - // the toasts work here so commenting out - /*override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { + QrReaderActivity.REQUEST_CONNDATA -> { + if (resultCode == Activity.RESULT_OK) { + Log.i(TAG, "Main Activity got result for QrCode: ${data?.dataString}") + + // Check to make sure that the result is an actual address + if (!(data?.dataString ?: "").startsWith("ws")) { + Toast.makeText( + applicationContext, + getString(R.string.is_not_a_valid_connection_string, data?.dataString), + Toast.LENGTH_SHORT + ).show() + return + } - var result: IntentResult? = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) + val conComponents = data?.dataString?.split(",") + if (conComponents?.size ?: 0 < 2 || conComponents?.size ?: 0 > 3) { + Toast.makeText( + applicationContext, + getString(R.string.is_not_a_valid_connection_string, data?.dataString), + Toast.LENGTH_SHORT + ).show() + return + } - if(result != null){ + val conString = conComponents!![0] + val secretHex = conComponents[1] + val allowInternetConnections = + if (conComponents.size == 3) conComponents[2] == "1" else false - if(result.contents != null){ - //Toast.makeText(applicationContext, result.contents,Toast.LENGTH_LONG).show() - Toast.makeText(this, "Scanned: " + result.contents, Toast.LENGTH_LONG).show(); - } else { - //Toast.makeText(applicationContext,"scan failed",Toast.LENGTH_SHORT).show() - Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show() - } - } else { - super.onActivityResult(requestCode, resultCode, data) - } - }*/ + DataModel.setSecretHex(secretHex) + DataModel.setConnString( + conString, + applicationContext + ) + DataModel.setAllowInternet( + allowInternetConnections + ) - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - var result: IntentResult? = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) - - if(result != null){ - if(result.contents != null){ - Log.d("MainActivity", "Scanned" + result.contents) - Toast.makeText(this, "Scanned: " + result.contents, Toast.LENGTH_LONG).show(); - processMobileConnectorText(result.contents) - } else { - Log.d("MainActivity", "Cancelled scan") - Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show() + ConnectionManager.refreshAllData() + } } - } else { - super.onActivityResult(requestCode, resultCode, data) } } @@ -400,15 +397,5 @@ class MainActivity : AppCompatActivity(), updateUI(true) } - private fun processMobileConnectorText(qrcodeInfo: String) { - if (qrcodeInfo.startsWith("ws")) { - Log.i(TAG, "It's a ws connection") - //Toast.makeText(this, "YEAH " + qrcodeInfo.toString(), Toast.LENGTH_SHORT).show(); - } else { - Log.i(TAG, "Not a ws connection") - //Toast.makeText(this, "Not a ws connection", Toast.LENGTH_SHORT).show(); - } - } - private val TAG = "MainActivity" } diff --git a/app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt b/app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt index e03cb2f..1b56f8c 100644 --- a/app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt +++ b/app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt @@ -2,29 +2,26 @@ package org.myhush.silentdragon import android.app.Activity +import android.app.AlertDialog import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import androidx.appcompat.app.AppCompatActivity +import android.text.InputType import android.util.Log import android.view.Menu import android.view.MenuItem -import android.view.SurfaceHolder -import android.view.SurfaceView -import com.google.android.gms.vision.CameraSource -import com.google.android.gms.vision.Detector -import com.google.android.gms.vision.barcode.Barcode -import com.google.android.gms.vision.barcode.BarcodeDetector -import kotlinx.android.synthetic.main.activity_qr_reader.* -import java.io.IOException -import android.app.AlertDialog -import android.text.InputType import android.widget.EditText +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.google.zxing.ResultPoint +import com.journeyapps.barcodescanner.BarcodeCallback +import com.journeyapps.barcodescanner.BarcodeResult +import com.journeyapps.barcodescanner.CaptureManager +import kotlinx.android.synthetic.main.activity_qr_reader.* class QrReaderActivity : AppCompatActivity() { + lateinit var captureManager: CaptureManager companion object { const val REQUEST_ADDRESS = 1 @@ -43,7 +40,26 @@ class QrReaderActivity : AppCompatActivity() { lblErrorMsg.text = "" - setupCamera() + btnQrCodeCancel.setOnClickListener { + setResult(Activity.RESULT_CANCELED) + finish() + } + + captureManager = CaptureManager(this, barcodeView) + captureManager.initializeFromIntent(intent, savedInstanceState) + + barcodeView.decodeSingle(object: BarcodeCallback{ + override fun barcodeResult(result: BarcodeResult?) { + result?.let { + if (result.text != null) { + processQrCodeText(result.text) + } + } + } + override fun possibleResultPoints(resultPoints: MutableList?) { + } + }) + } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { @@ -92,63 +108,19 @@ class QrReaderActivity : AppCompatActivity() { } } - private fun setupCamera() { - val cameraView = findViewById(R.id.camera_view) - - val barcodeDetector = BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build() - val cameraSource = CameraSource.Builder(this, barcodeDetector) - .setAutoFocusEnabled(true) - .setRequestedPreviewSize(640, 480) - .build() - - - cameraView.holder.addCallback(object : SurfaceHolder.Callback { - override fun surfaceCreated(holder: SurfaceHolder) { - try { - if (ContextCompat.checkSelfPermission(applicationContext, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this@QrReaderActivity, arrayOf(android.Manifest.permission.CAMERA), 50) - } else { - cameraSource.start(cameraView.holder) - - val w = cameraView.width - val h = cameraView.height - val scale = cameraSource.previewSize.width.toDouble() / cameraSource.previewSize.height.toDouble() - - val scaleWidth = (h.toDouble() / scale).toInt() - - cameraView.layout((w - scaleWidth)/2, 0, scaleWidth , h) - println("Preview size: ${cameraSource.previewSize}") - } - } catch (ie: IOException) { - Log.e("CAMERA SOURCE", ie.toString()) - } - } - - override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {} - - override fun surfaceDestroyed(holder: SurfaceHolder) { - cameraSource.stop() - } - }) - - btnQrCodeCancel.setOnClickListener { - setResult(Activity.RESULT_CANCELED) - finish() - } + override fun onPause() { + super.onPause() + captureManager.onPause() + } - barcodeDetector.setProcessor(object : Detector.Processor { - override fun release() {} + override fun onResume() { + super.onResume() + captureManager.onResume() + } - override fun receiveDetections(detections: Detector.Detections) { - val barcodes = detections.detectedItems - if (barcodes.size() != 0) { - runOnUiThread { - val barcodeInfo = barcodes.valueAt(0).displayValue - processText(barcodeInfo) - } - } - } - }) + override fun onDestroy() { + super.onDestroy() + captureManager.onDestroy() } private fun processText(barcodeInfo: String) { @@ -174,15 +146,13 @@ class QrReaderActivity : AppCompatActivity() { err = err.substring(0, 22) + "...." + err.substring(err.length - 22, err.length) } lblErrorMsg.text = getString(R.string.is_not_a_valid_hush_address, err) - return } - // The data seems valid, so return it. val data = Intent() - // Payment URIs are often formatted as "hush:", but this casuses parsing problems. + // Payment URIs are often formatted as "hush:", but this causes parsing problems. // So change it to hush://, so that it parses properly if (barcodeInfo.startsWith("hush:") && !barcodeInfo.startsWith("hush://")) { data.data = Uri.parse(barcodeInfo.replaceFirst("hush:", "hush://")) @@ -194,5 +164,22 @@ class QrReaderActivity : AppCompatActivity() { finish() } + private fun processQrCodeText(qrcodeInfo: String) { + if (qrcodeInfo.startsWith("ws")) { + Log.i(TAG, "It's a ws connection") + //Toast.makeText(this, "YEAH: " + qrcodeInfo, Toast.LENGTH_SHORT).show(); + + val data = Intent() // The data seems valid, so return it + data.data = Uri.parse(qrcodeInfo) + setResult(Activity.RESULT_OK, data) + finish() + } else { + Log.i(TAG, "Not a ws connection") + //Toast.makeText(this, "Not a ws connection", Toast.LENGTH_SHORT).show(); + setResult(Activity.RESULT_CANCELED) + finish() + } + } + private val TAG = "QrReader" } diff --git a/app/src/main/res/layout/activity_qr_reader.xml b/app/src/main/res/layout/activity_qr_reader.xml index 0286a11..13391f3 100644 --- a/app/src/main/res/layout/activity_qr_reader.xml +++ b/app/src/main/res/layout/activity_qr_reader.xml @@ -9,23 +9,15 @@ tools:context="org.myhush.silentdragon.QrReaderActivity" tools:showIn="@layout/activity_qr_reader"> - - - + app:layout_constraintTop_toTopOf="parent" + app:zxing_scanner_layout="@layout/custom_qrcode_layout" /> + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0aa1e27..91f31ec 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.6.0' // does this need 4.0 or another version? + classpath 'com.android.tools.build:gradle:3.6.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}" classpath 'io.fabric.tools:gradle:1.31.2'