diff options
20 files changed, 179 insertions, 64 deletions
diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 65dee6e..603ebc0 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,6 +13,7 @@ <option value="$PROJECT_DIR$/akono" /> <option value="$PROJECT_DIR$/cashier" /> <option value="$PROJECT_DIR$/merchant-terminal" /> + <option value="$PROJECT_DIR$/taler-kotlin-common" /> <option value="$PROJECT_DIR$/wallet" /> </set> </option> diff --git a/build.gradle b/build.gradle index f286dfe..4c2476d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ buildscript { ext.kotlin_version = '1.3.70' ext.nav_version = "2.2.1" + ext.build_tools_version = "29.0.2" repositories { google() jcenter() diff --git a/cashier/build.gradle b/cashier/build.gradle index b77dc30..5fe7e16 100644 --- a/cashier/build.gradle +++ b/cashier/build.gradle @@ -21,11 +21,12 @@ apply plugin: 'androidx.navigation.safeargs.kotlin' android { compileSdkVersion 29 - buildToolsVersion "29.0.3" + //noinspection GradleDependency + buildToolsVersion "$build_tools_version" defaultConfig { applicationId "net.taler.cashier" - minSdkVersion 23 + minSdkVersion 24 targetSdkVersion 29 versionCode 1 versionName "0.1" @@ -46,9 +47,7 @@ android { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.core:core-ktx:1.2.0' + implementation project(":taler-kotlin-common") implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.security:security-crypto:1.0.0-beta01' implementation 'com.google.android.material:material:1.1.0' @@ -56,13 +55,6 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" - // ViewModel and LiveData - def lifecycle_version = "2.2.0" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" - - // QR codes - implementation 'com.google.zxing:core:3.4.0' - implementation "com.squareup.okhttp3:okhttp:3.12.6" testImplementation 'junit:junit:4.13' diff --git a/cashier/src/main/AndroidManifest.xml b/cashier/src/main/AndroidManifest.xml index 345c9a1..bdc5ec0 100644 --- a/cashier/src/main/AndroidManifest.xml +++ b/cashier/src/main/AndroidManifest.xml @@ -3,10 +3,6 @@ xmlns:tools="http://schemas.android.com/tools" package="net.taler.cashier"> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.NFC" /> - <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" diff --git a/cashier/src/main/java/net/taler/cashier/BalanceFragment.kt b/cashier/src/main/java/net/taler/cashier/BalanceFragment.kt index b3a0221..2178a78 100644 --- a/cashier/src/main/java/net/taler/cashier/BalanceFragment.kt +++ b/cashier/src/main/java/net/taler/cashier/BalanceFragment.kt @@ -34,6 +34,9 @@ import kotlinx.android.synthetic.main.fragment_balance.* import net.taler.cashier.BalanceFragmentDirections.Companion.actionBalanceFragmentToTransactionFragment import net.taler.cashier.withdraw.LastTransaction import net.taler.cashier.withdraw.WithdrawStatus +import net.taler.common.Amount +import net.taler.common.fadeIn +import net.taler.common.fadeOut sealed class BalanceResult { object Error : BalanceResult() diff --git a/cashier/src/main/java/net/taler/cashier/MainViewModel.kt b/cashier/src/main/java/net/taler/cashier/MainViewModel.kt index 3874038..6cd12ff 100644 --- a/cashier/src/main/java/net/taler/cashier/MainViewModel.kt +++ b/cashier/src/main/java/net/taler/cashier/MainViewModel.kt @@ -32,9 +32,10 @@ import androidx.security.crypto.MasterKeys import androidx.security.crypto.MasterKeys.AES256_GCM_SPEC import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import net.taler.cashier.Amount.Companion.fromStringSigned import net.taler.cashier.HttpHelper.makeJsonGetRequest import net.taler.cashier.withdraw.WithdrawManager +import net.taler.common.Amount.Companion.fromStringSigned +import net.taler.common.isOnline private val TAG = MainViewModel::class.java.simpleName diff --git a/cashier/src/main/java/net/taler/cashier/withdraw/TransactionFragment.kt b/cashier/src/main/java/net/taler/cashier/withdraw/TransactionFragment.kt index 8b782b0..8857bfa 100644 --- a/cashier/src/main/java/net/taler/cashier/withdraw/TransactionFragment.kt +++ b/cashier/src/main/java/net/taler/cashier/withdraw/TransactionFragment.kt @@ -30,13 +30,14 @@ import androidx.navigation.fragment.findNavController import kotlinx.android.synthetic.main.fragment_transaction.* import net.taler.cashier.MainViewModel import net.taler.cashier.R -import net.taler.cashier.fadeIn -import net.taler.cashier.fadeOut import net.taler.cashier.withdraw.TransactionFragmentDirections.Companion.actionTransactionFragmentToBalanceFragment import net.taler.cashier.withdraw.TransactionFragmentDirections.Companion.actionTransactionFragmentToErrorFragment import net.taler.cashier.withdraw.WithdrawResult.Error import net.taler.cashier.withdraw.WithdrawResult.InsufficientBalance import net.taler.cashier.withdraw.WithdrawResult.Success +import net.taler.common.NfcManager +import net.taler.common.fadeIn +import net.taler.common.fadeOut class TransactionFragment : Fragment() { diff --git a/cashier/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt b/cashier/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt index 4c618ac..bfc82ce 100644 --- a/cashier/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt +++ b/cashier/src/main/java/net/taler/cashier/withdraw/WithdrawManager.kt @@ -34,6 +34,7 @@ import net.taler.cashier.HttpJsonResult.Error import net.taler.cashier.HttpJsonResult.Success import net.taler.cashier.MainViewModel import net.taler.cashier.R +import net.taler.common.QrCodeManager.makeQrCode import org.json.JSONObject import java.util.concurrent.TimeUnit.MINUTES import java.util.concurrent.TimeUnit.SECONDS @@ -95,7 +96,7 @@ class WithdrawManager( val withdrawResult = WithdrawResult.Success( id = result.json.getString("withdrawal_id"), talerUri = talerUri, - qrCode = QrCodeManager.makeQrCode(talerUri) + qrCode = makeQrCode(talerUri) ) mWithdrawResult.postValue(withdrawResult) timer.start() diff --git a/gradle.properties b/gradle.properties index 00f6d64..337c38f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m +org.gradle.configureondemand=true # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/settings.gradle b/settings.gradle index a1882de..f254aa2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,3 +15,4 @@ */ include ':akono', ':cashier', ':merchant-terminal', ':wallet' +include ':taler-kotlin-common' diff --git a/taler-kotlin-common/.gitignore b/taler-kotlin-common/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/taler-kotlin-common/.gitignore @@ -0,0 +1 @@ +/build diff --git a/taler-kotlin-common/build.gradle b/taler-kotlin-common/build.gradle new file mode 100644 index 0000000..d7c9362 --- /dev/null +++ b/taler-kotlin-common/build.gradle @@ -0,0 +1,56 @@ +/* + * This file is part of GNU Taler + * (C) 2020 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 29 + //noinspection GradleDependency + buildToolsVersion "$build_tools_version" + + defaultConfig { + minSdkVersion 24 + targetSdkVersion 29 + versionCode 1 + versionName "0.1" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.core:core-ktx:1.2.0' + + // ViewModel and LiveData + def lifecycle_version = "2.2.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" + + // QR codes + implementation 'com.google.zxing:core:3.4.0' // needs minSdkVersion 24+ +} diff --git a/taler-kotlin-common/consumer-rules.pro b/taler-kotlin-common/consumer-rules.pro new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/taler-kotlin-common/consumer-rules.pro diff --git a/taler-kotlin-common/proguard-rules.pro b/taler-kotlin-common/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/taler-kotlin-common/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/taler-kotlin-common/src/main/AndroidManifest.xml b/taler-kotlin-common/src/main/AndroidManifest.xml new file mode 100644 index 0000000..902ddc1 --- /dev/null +++ b/taler-kotlin-common/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ +<!-- + ~ This file is part of GNU Taler + ~ (C) 2020 Taler Systems S.A. + ~ + ~ GNU Taler is free software; you can redistribute it and/or modify it under the + ~ terms of the GNU General Public License as published by the Free Software + ~ Foundation; either version 3, or (at your option) any later version. + ~ + ~ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + ~ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + ~ A PARTICULAR PURPOSE. See the GNU General Public License for more details. + ~ + ~ You should have received a copy of the GNU General Public License along with + ~ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="net.taler.common"> + + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.NFC" /> + +</manifest> diff --git a/cashier/src/main/java/net/taler/cashier/Amount.kt b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt index 2c237c8..428ddef 100644 --- a/cashier/src/main/java/net/taler/cashier/Amount.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt @@ -14,7 +14,7 @@ * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -package net.taler.cashier +package net.taler.common data class Amount(val currency: String, val amount: String) { diff --git a/taler-kotlin-common/src/main/java/net/taler/common/AndroidUtils.kt b/taler-kotlin-common/src/main/java/net/taler/common/AndroidUtils.kt new file mode 100644 index 0000000..2fafdf2 --- /dev/null +++ b/taler-kotlin-common/src/main/java/net/taler/common/AndroidUtils.kt @@ -0,0 +1,53 @@ +/* + * This file is part of GNU Taler + * (C) 2020 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +package net.taler.common + +import android.content.Context +import android.content.Context.CONNECTIVITY_SERVICE +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import android.view.View + +fun View.fadeIn(endAction: () -> Unit = {}) { + if (visibility == View.VISIBLE) return + alpha = 0f + visibility = View.VISIBLE + animate().alpha(1f).withEndAction { + endAction.invoke() + }.start() +} + +fun View.fadeOut(endAction: () -> Unit = {}) { + if (visibility == View.INVISIBLE) return + animate().alpha(0f).withEndAction { + visibility = View.INVISIBLE + alpha = 1f + endAction.invoke() + }.start() +} + +fun Context.isOnline(): Boolean { + val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager + return if (Build.VERSION.SDK_INT < 29) { + @Suppress("DEPRECATION") + cm.activeNetworkInfo?.isConnected == true + } else { + val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) ?: return false + capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } +} diff --git a/cashier/src/main/java/net/taler/cashier/Utils.kt b/taler-kotlin-common/src/main/java/net/taler/common/ByteArrayUtils.kt index 62f7a77..fba0d07 100644 --- a/cashier/src/main/java/net/taler/cashier/Utils.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/ByteArrayUtils.kt @@ -14,18 +14,9 @@ * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -package net.taler.cashier +package net.taler.common -import android.content.Context -import android.content.Context.CONNECTIVITY_SERVICE -import android.net.ConnectivityManager -import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET -import android.os.Build.VERSION.SDK_INT -import android.view.View -import android.view.View.INVISIBLE -import android.view.View.VISIBLE - -object Utils { +object ByteArrayUtils { private const val HEX_CHARS = "0123456789ABCDEF" @@ -60,32 +51,3 @@ object Utils { } } - -fun View.fadeIn(endAction: () -> Unit = {}) { - if (visibility == VISIBLE) return - alpha = 0f - visibility = VISIBLE - animate().alpha(1f).withEndAction { - endAction.invoke() - }.start() -} - -fun View.fadeOut(endAction: () -> Unit = {}) { - if (visibility == INVISIBLE) return - animate().alpha(0f).withEndAction { - visibility = INVISIBLE - alpha = 1f - endAction.invoke() - }.start() -} - -fun Context.isOnline(): Boolean { - val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager - return if (SDK_INT < 29) { - @Suppress("DEPRECATION") - cm.activeNetworkInfo?.isConnected == true - } else { - val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) ?: return false - capabilities.hasCapability(NET_CAPABILITY_INTERNET) - } -} diff --git a/cashier/src/main/java/net/taler/cashier/withdraw/NfcManager.kt b/taler-kotlin-common/src/main/java/net/taler/common/NfcManager.kt index a487b5f..11e1e1e 100644 --- a/cashier/src/main/java/net/taler/cashier/withdraw/NfcManager.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/NfcManager.kt @@ -14,7 +14,7 @@ * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -package net.taler.cashier.withdraw +package net.taler.common import android.app.Activity import android.content.Context @@ -25,7 +25,7 @@ import android.nfc.NfcAdapter.getDefaultAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.util.Log -import net.taler.cashier.Utils.hexStringToByteArray +import net.taler.common.ByteArrayUtils.hexStringToByteArray import org.json.JSONObject import java.io.ByteArrayOutputStream import java.net.URL diff --git a/cashier/src/main/java/net/taler/cashier/withdraw/QrCodeManager.kt b/taler-kotlin-common/src/main/java/net/taler/common/QrCodeManager.kt index e3ffa92..e2a9a55 100644 --- a/cashier/src/main/java/net/taler/cashier/withdraw/QrCodeManager.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/QrCodeManager.kt @@ -14,7 +14,7 @@ * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -package net.taler.cashier.withdraw +package net.taler.common import android.graphics.Bitmap import android.graphics.Bitmap.Config.RGB_565 |