Browse Source

Merge pull request #106 from jahway603/master

Implemented functional QR Code Scanner
master
Duke Leto 4 years ago
committed by GitHub
parent
commit
b57345e270
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      README.md
  2. 60
      app/build.gradle
  3. 11
      app/src/main/AndroidManifest.xml
  4. 38
      app/src/main/java/org/myhush/silentdragon/MainActivity.kt
  5. 131
      app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt
  6. 4
      app/src/main/java/org/myhush/silentdragon/ui/AboutActivity.kt
  7. 23
      app/src/main/java/org/myhush/silentdragon/ui/SettingsActivity.kt
  8. 6
      app/src/main/java/org/myhush/silentdragon/ui/SplashActivity.kt
  9. 2
      app/src/main/res/layout/activity_about.xml
  10. 103
      app/src/main/res/layout/activity_qr_reader.xml
  11. 2
      app/src/main/res/layout/activity_settings.xml
  12. 24
      app/src/main/res/layout/custom_qrcode_layout.xml
  13. 2053
      app/src/main/res/values/word_list_bip39.xml
  14. 9
      build.gradle
  15. 7
      buildSrc/build.gradle.kts
  16. 55
      buildSrc/src/main/java/org/myhush/silentdragon/Dependencies.kt

6
README.md

@ -63,6 +63,10 @@ Make sure you have Gradle 5.4.x or higher, 5.4.1 is known to work:
./gradlew wrapper --gradle-version=5.4.1
Or you can use Android Studio on Linux, OS X, or Windows:
Make sure to install ndkVersion 21.1.6352462
## Release Build Process
The first time you create a release build you'll need to create a keystore file and prepare a properties file. The
@ -114,7 +118,7 @@ This build can be directly uploaded to Google Play.
### Building a release APK for F-Droid
We should do this & will plan to using [this](https://gitlab.com/fdroid/fdroiddata/blob/master/CONTRIBUTING.md)
This will be pursued once lite wallet functionality exists in the SilentDragonAndroid wallet.
...

60
app/build.gradle

@ -1,18 +1,22 @@
// Copyright 2019-2020 The Hush developers
// Released under the GPLv3
import org.myhush.silentdragon.Deps
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
ndkVersion "21.1.6352462"
compileSdkVersion Deps.compileSdkVersion
buildToolsVersion Deps.buildToolsVersion
defaultConfig {
applicationId "org.myhush.silentdragon"
minSdkVersion 17
targetSdkVersion 29
minSdkVersion Deps.minSdkVersion
targetSdkVersion Deps.targetSdkVersion
multiDexEnabled true
versionCode 4
versionName "0.5.16"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -31,6 +35,15 @@ android {
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
def secretsPropertiesFile = rootProject.file("secrets.properties")
@ -51,19 +64,48 @@ if (secretsPropertiesFile.exists()) {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation Deps.Kotlin.STDLIB
implementation Deps.Kotlin.Coroutines.ANDROID
implementation Deps.Kotlin.Coroutines.CORE
implementation Deps.AndroidX.APPCOMPAT
implementation Deps.AndroidX.CONSTRAINT_LAYOUT
implementation Deps.AndroidX.CORE_KTX
implementation Deps.AndroidX.FRAGMENT_KTX
implementation Deps.AndroidX.LEGACY
implementation Deps.AndroidX.MULTIDEX
implementation Deps.AndroidX.PAGING
implementation Deps.AndroidX.VECTOR_DRAWABLE
implementation Deps.AndroidX.Navigation.FRAGMENT_KTX
implementation Deps.AndroidX.Navigation.UI_KTX
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidmads.library.qrgenearator:QRGenearator:1.0.3'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.beust:klaxon:5.0.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.gms:play-services-vision:17.0.2'
implementation 'androidx.vectordrawable:vectordrawable:1.0.0'
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@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'
// from Demo App SDK
implementation Deps.Hush.ANDROID_WALLET_PLUGINS
implementation Deps.Hush.Sdk.MAINNET
implementation Deps.Hush.KOTLIN_BIP39
implementation Deps.Grpc.ANDROID
implementation Deps.Grpc.OKHTTP
implementation Deps.Grpc.PROTOBUG
implementation Deps.Grpc.STUB
implementation 'javax.annotation:javax.annotation-api:1.3.2'
implementation Deps.AndroidX.Room.ROOM_KTX
implementation Deps.AndroidX.PAGING
implementation 'com.google.guava:guava:27.0.1-android'
kapt Deps.AndroidX.Room.ROOM_COMPILER
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5'
}

11
app/src/main/AndroidManifest.xml

@ -5,6 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
package="org.myhush.silentdragon">
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
@ -21,7 +22,7 @@
tools:replace="android:allowBackup">
<activity
android:name="org.myhush.silentdragon.SplashActivity"
android:name="org.myhush.silentdragon.ui.SplashActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -30,7 +31,7 @@
</activity>
<activity
android:name="org.myhush.silentdragon.SettingsActivity"
android:name="org.myhush.silentdragon.ui.SettingsActivity"
android:label="@string/title_activity_settings"
android:parentActivityName="org.myhush.silentdragon.SendActivity"
android:screenOrientation="portrait">
@ -40,7 +41,7 @@
</activity>
<activity
android:name="org.myhush.silentdragon.AboutActivity"
android:name="org.myhush.silentdragon.ui.AboutActivity"
android:label="@string/title_activity_about"
android:parentActivityName="org.myhush.silentdragon.SendActivity"
android:screenOrientation="portrait">
@ -51,7 +52,8 @@
<activity
android:name="org.myhush.silentdragon.QrReaderActivity"
android:screenOrientation="portrait"/>
android:screenOrientation="fullSensor"
tools:replace="screenOrientation" />
<activity
android:name="org.myhush.silentdragon.TxDetailsActivity"
android:label="@string/title_activity_tx_details"
@ -70,7 +72,6 @@
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

38
app/src/main/java/org/myhush/silentdragon/MainActivity.kt

@ -10,11 +10,6 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.StrictMode
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.android.material.snackbar.Snackbar
import androidx.core.text.HtmlCompat
import androidx.appcompat.app.AppCompatActivity
import android.text.Html
import android.util.Log
import android.view.Menu
@ -23,14 +18,19 @@ import android.widget.Button
import android.widget.ScrollView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.text.HtmlCompat
import com.beust.klaxon.Klaxon
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.content_main.*
import org.myhush.silentdragon.DataModel.ConnectionStatus
import org.myhush.silentdragon.DataModel.connStatus
import org.myhush.silentdragon.ui.AboutActivity
import org.myhush.silentdragon.ui.SettingsActivity
import java.text.DecimalFormat
class MainActivity : AppCompatActivity(),
TransactionItemFragment.OnFragmentInteractionListener,
UnconfirmedTxItemFragment.OnFragmentInteractionListener {
@ -51,7 +51,6 @@ class MainActivity : AppCompatActivity(),
// When creating, clear all the data first
setMainStatus("")
DataModel.init()
btnConnect.setOnClickListener {
@ -87,7 +86,6 @@ class MainActivity : AppCompatActivity(),
txtMainBalanceUSD.setOnClickListener {
if(DataModel.selectedCurrency == "BTC")
Toast.makeText(applicationContext, "1 HUSH = ${DataModel.currencySymbols[DataModel.selectedCurrency]}${DecimalFormat(" #,##0.00000000")
.format(DataModel.currencyValues[DataModel.selectedCurrency])}", Toast.LENGTH_LONG).show()
@ -130,7 +128,6 @@ class MainActivity : AppCompatActivity(),
lblBalance.text = ""
txtMainBalanceUSD.text = ""
txtMainBalance.text = status
}
@SuppressLint("SetTextI18n")
@ -297,14 +294,12 @@ class MainActivity : AppCompatActivity(),
R.id.action_refresh -> {
swiperefresh.isRefreshing = true
ConnectionManager.refreshAllData()
return true
}
else -> super.onOptionsItemSelected(item)
}
}
var mReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// We've received a signal
@ -346,28 +341,35 @@ class MainActivity : AppCompatActivity(),
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when(requestCode) {
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()
Toast.makeText(
applicationContext,
getString(R.string.is_not_a_valid_connection_string, data?.dataString),
Toast.LENGTH_SHORT
).show()
return
}
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()
Toast.makeText(
applicationContext,
getString(R.string.is_not_a_valid_connection_string, data?.dataString),
Toast.LENGTH_SHORT
).show()
return
}
val conString = conComponents!![0]
val secretHex = conComponents[1]
val allowInternetConnections = if (conComponents.size == 3) conComponents[2] == "1" else false
val allowInternetConnections =
if (conComponents.size == 3) conComponents[2] == "1" else false
DataModel.setSecretHex(secretHex)
DataModel.setConnString(
@ -395,7 +397,5 @@ class MainActivity : AppCompatActivity(),
updateUI(true)
}
private val TAG = "MainActivity"
}

131
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<ResultPoint>?) {
}
})
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
@ -92,63 +108,19 @@ class QrReaderActivity : AppCompatActivity() {
}
}
private fun setupCamera() {
val cameraView = findViewById<SurfaceView>(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<Barcode> {
override fun release() {}
override fun onResume() {
super.onResume()
captureManager.onResume()
}
override fun receiveDetections(detections: Detector.Detections<Barcode>) {
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:<addr>", but this casuses parsing problems.
// Payment URIs are often formatted as "hush:<addr>", but this causes parsing problems.
// So change it to hush://<addr>, 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"
}

4
app/src/main/java/org/myhush/silentdragon/AboutActivity.kt → app/src/main/java/org/myhush/silentdragon/ui/AboutActivity.kt

@ -1,9 +1,11 @@
// Copyright 2019-2020 The Hush developers
package org.myhush.silentdragon
package org.myhush.silentdragon.ui
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_about.lblVersionName
import org.myhush.silentdragon.BuildConfig
import org.myhush.silentdragon.R
class AboutActivity : AppCompatActivity() {

23
app/src/main/java/org/myhush/silentdragon/SettingsActivity.kt → app/src/main/java/org/myhush/silentdragon/ui/SettingsActivity.kt

@ -1,5 +1,5 @@
// Copyright 2019-2020 The Hush developers
package org.myhush.silentdragon
package org.myhush.silentdragon.ui
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
@ -9,6 +9,10 @@ import android.widget.Adapter
import android.widget.AdapterView
import android.widget.ArrayAdapter
import kotlinx.android.synthetic.main.activity_settings.*
import org.myhush.silentdragon.ConnectionManager
import org.myhush.silentdragon.DataModel
import org.myhush.silentdragon.R
import org.myhush.silentdragon.SilentDragonApp
class SettingsActivity : AppCompatActivity() {
@ -19,7 +23,10 @@ class SettingsActivity : AppCompatActivity() {
updateUI()
btnDisconnect.setOnClickListener {
DataModel.setConnString(null, applicationContext)
DataModel.setConnString(
null,
applicationContext
)
DataModel.clear()
ConnectionManager.closeConnection()
@ -47,7 +54,9 @@ class SettingsActivity : AppCompatActivity() {
var pref: SharedPreferences = getSharedPreferences("MainFile",0)
var editor: SharedPreferences.Editor = pref.edit()
editor.putString("currency", DataModel.selectedCurrency)
editor.putString("currency",
DataModel.selectedCurrency
)
editor.commit()
}
@ -79,11 +88,15 @@ class SettingsActivity : AppCompatActivity() {
fun updateUI() {
fillSpinner()
txtSettingsConnString.text = DataModel.getConnString(SilentDragonApp.appContext!!)
txtSettingsConnString.text = DataModel.getConnString(
SilentDragonApp.appContext!!
)
?: getString(R.string.not_connected)
chkDisallowInternet.isChecked = !DataModel.getGlobalAllowInternet()
lblServerVersion.text = DataModel.mainResponseData?.serverversion ?: getString(R.string.not_connected)
lblServerVersion.text = DataModel.mainResponseData?.serverversion ?: getString(
R.string.not_connected
)
}
}

6
app/src/main/java/org/myhush/silentdragon/SplashActivity.kt → app/src/main/java/org/myhush/silentdragon/ui/SplashActivity.kt

@ -1,11 +1,13 @@
// Copyright 2019-2020 The Hush developers
// Released under the GPLv3
package org.myhush.silentdragon
package org.myhush.silentdragon.ui
import androidx.appcompat.app.AppCompatActivity
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import org.myhush.silentdragon.MainActivity
import org.myhush.silentdragon.R
class SplashActivity : AppCompatActivity() {
@ -18,7 +20,7 @@ class SplashActivity : AppCompatActivity() {
Handler().postDelayed({
// This method will be executed once the timer is over
startActivity(Intent(this,MainActivity::class.java))
startActivity(Intent(this, MainActivity::class.java))
// close this activity
finish()

2
app/src/main/res/layout/activity_about.xml

@ -5,7 +5,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.myhush.silentdragon.AboutActivity">
tools:context="org.myhush.silentdragon.ui.AboutActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/scrollView2"

103
app/src/main/res/layout/activity_qr_reader.xml

@ -1,53 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/camPreview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="org.myhush.silentdragon.QrReaderActivity"
tools:showIn="@layout/activity_qr_reader">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/barcodeView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_qr_code_reader"
tools:context=".QrCodeReaderActivity" android:id="@+id/camPreview">
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/txtQrCodeHelp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:zxing_scanner_layout="@layout/custom_qrcode_layout" />
<SurfaceView
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/camera_view"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView
android:src="#ee000000"
android:layout_width="0dp"
android:layout_height="200dp" android:id="@+id/imageView4"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<TextView
android:text="@string/how_to_connect_sd2sda"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/txtQrCodeHelp"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp" android:textAlignment="center"
android:layout_marginBottom="16dp" app:layout_constraintBottom_toTopOf="@+id/btnQrCodeCancel"
android:textColor="@android:color/white"/>
android:id="@+id/txtQrCodeHelp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
android:text="@string/how_to_connect_sd2sda"
android:textAlignment="center"
android:textColor="@android:color/white"
app:layout_constraintBottom_toTopOf="@+id/btnQrCodeCancel"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:text="@string/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnQrCodeCancel"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp" android:background="@color/colorPrimary"
android:textColor="@android:color/white" android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@+id/lblErrorMsg"/>
android:id="@+id/btnQrCodeCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
android:background="@color/colorPrimary"
android:text="@string/cancel"
android:textColor="@android:color/white"
app:layout_constraintBottom_toTopOf="@+id/lblErrorMsg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/lblErrorMsg"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp" android:textAlignment="center" android:textColor="@color/colorAccent"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/lblErrorMsg"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="32dp"
android:textAlignment="center"
android:textColor="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

2
app/src/main/res/layout/activity_settings.xml

@ -5,7 +5,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.myhush.silentdragon.SettingsActivity">
tools:context="org.myhush.silentdragon.ui.SettingsActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/scrollView2"

24
app/src/main/res/layout/custom_qrcode_layout.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.journeyapps.barcodescanner.BarcodeView
android:id="@+id/zxing_barcode_surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_framing_rect_height="300dp"
app:zxing_framing_rect_width="300dp" />
<com.journeyapps.barcodescanner.ViewfinderView
android:id="@+id/zxing_viewfinder_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:zxing_possible_result_points="@color/zxing_custom_possible_result_points"
app:zxing_result_view="@color/zxing_custom_result_view"
app:zxing_viewfinder_laser="@color/zxing_custom_viewfinder_laser"
app:zxing_viewfinder_mask="@color/zxing_custom_viewfinder_mask" />
</androidx.constraintlayout.widget.ConstraintLayout>

2053
app/src/main/res/values/word_list_bip39.xml

File diff suppressed because it is too large

9
build.gradle

@ -1,15 +1,19 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
import org.myhush.silentdragon.Deps
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
mavenCentral()
maven {
url 'https://maven.fabric.io/public'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}"
classpath 'io.fabric.tools:gradle:1.31.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@ -21,6 +25,7 @@ allprojects {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}

7
buildSrc/build.gradle.kts

@ -0,0 +1,7 @@
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}

55
buildSrc/src/main/java/org/myhush/silentdragon/Dependencies.kt

@ -0,0 +1,55 @@
package org.myhush.silentdragon
object Deps {
const val kotlinVersion = "1.3.72"
const val compileSdkVersion = 29
const val buildToolsVersion = "29.0.3"
const val minSdkVersion = 17
const val targetSdkVersion = 29
object Kotlin : Version(kotlinVersion) {
val STDLIB = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$version"
object Coroutines : Version("1.3.2") {
val ANDROID = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version"
val CORE = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
}
}
object AndroidX {
//const val ANNOTATION = "androidx.annotation:annotation:1.0.0"
const val APPCOMPAT = "androidx.appcompat:appcompat:1.0.0"
const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:1.1.3"
const val CORE_KTX = "androidx.core:core-ktx:1.3.0"
const val FRAGMENT_KTX = "androidx.fragment:fragment-ktx:1.1.0-beta01"
const val LEGACY = "androidx.legacy:legacy-support-v4:1.0.0"
const val MULTIDEX = "androidx.multidex:multidex:2.0.1"
const val PAGING = "androidx.paging:paging-runtime-ktx:2.1.2"
const val VECTOR_DRAWABLE = "androidx.vectordrawable:vectordrawable:1.0.0"
object Navigation : Version("2.1.0") {
val FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx:$version"
val UI_KTX = "androidx.navigation:navigation-ui-ktx:$version"
}
object Room : Version("2.2.5") {
val ROOM_COMPILER = "androidx.room:room-compiler:$version"
val ROOM_KTX = "androidx.room:room-ktx:$version"
}
}
// from Demo App SDK
object Hush {
val ANDROID_WALLET_PLUGINS = "cash.z.ecc.android:zcash-android-wallet-plugins:1.0.0"
val KOTLIN_BIP39 = "cash.z.ecc.android:kotlin-bip39:1.0.0-beta09"
object Sdk : Version("1.1.0-beta02") {
val MAINNET = "cash.z.ecc.android:sdk-mainnet:$version"
//val TESTNET = "cash.z.ecc.android:sdk-testnet:$version"
}
}
object Grpc : Version("1.25.0") {
val ANDROID = "io.grpc:grpc-android:$version"
val OKHTTP = "io.grpc:grpc-okhttp:$version"
val PROTOBUG ="io.grpc:grpc-protobuf-lite:$version"
val STUB = "io.grpc:grpc-stub:$version"
}
}
open class Version(@JvmField val version: String)
Loading…
Cancel
Save