summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-03-03 10:24:56 -0300
committerTorsten Grote <t@grobox.de>2020-03-03 10:24:56 -0300
commita9fd9aa024d1cafe50be76eb2ca6a818bce38862 (patch)
tree8657d8c9605683931ca166d6ae7d2ea2d526298b
parent5f57c48b526f7f297e307851135fc52a5ea23ab3 (diff)
downloadwallet-android-a9fd9aa024d1cafe50be76eb2ca6a818bce38862.tar.gz
wallet-android-a9fd9aa024d1cafe50be76eb2ca6a818bce38862.tar.bz2
wallet-android-a9fd9aa024d1cafe50be76eb2ca6a818bce38862.zip
Clean up MainActivity and unregister receivers to not leak them
This also reduces the scope of files that get an automatic copyright header.
-rw-r--r--.idea/codeStyles/Project.xml3
-rw-r--r--.idea/copyright/profiles_settings.xml2
-rw-r--r--.idea/gradle.xml4
-rw-r--r--.idea/scopes/Copyright_Files.xml3
-rw-r--r--app/build.gradle3
-rw-r--r--app/src/main/java/net/taler/wallet/MainActivity.kt152
-rw-r--r--app/src/main/java/net/taler/wallet/ShowBalance.kt1
-rw-r--r--app/src/main/java/net/taler/wallet/WalletViewModel.kt11
-rw-r--r--app/src/main/res/layout/app_bar_main.xml13
-rw-r--r--build.gradle7
-rw-r--r--gradle/wrapper/gradle-wrapper.properties20
11 files changed, 77 insertions, 142 deletions
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index a705caf..fad1c60 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,8 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
- <AndroidXmlCodeStyleSettings>
- <option name="ARRANGEMENT_SETTINGS_MIGRATED_TO_191" value="true" />
- </AndroidXmlCodeStyleSettings>
<JetCodeStyleSettings>
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
index 0040fda..31766eb 100644
--- a/.idea/copyright/profiles_settings.xml
+++ b/.idea/copyright/profiles_settings.xml
@@ -1,7 +1,7 @@
<component name="CopyrightManager">
<settings default="Taler">
<module2copyright>
- <element module="Project Files" copyright="Taler" />
+ <element module="Copyright Files" copyright="Taler" />
</module2copyright>
</settings>
</component> \ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 031c262..69c1925 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
+ <component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
+ <option name="delegatedBuild" value="false" />
+ <option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
@@ -13,7 +16,6 @@
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
- <option name="testRunner" value="PLATFORM" />
</GradleProjectSettings>
</option>
</component>
diff --git a/.idea/scopes/Copyright_Files.xml b/.idea/scopes/Copyright_Files.xml
new file mode 100644
index 0000000..e74c29b
--- /dev/null
+++ b/.idea/scopes/Copyright_Files.xml
@@ -0,0 +1,3 @@
+<component name="DependencyValidationManager">
+ <scope name="Copyright Files" pattern="file[app]:src/*/java//*||file[app]:src/main/res/layout/*||file[app]:src/main/res/layout-w550dp/*||file[app]:src/main/res/navigation//*||file[app]:src/main/res/values//*||file[app]:src/main/res/xml//*" />
+</component> \ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 921bbb1..2c7807e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,12 +16,11 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
- buildToolsVersion "29.0.2"
+ buildToolsVersion "29.0.3"
defaultConfig {
applicationId "net.taler.wallet"
minSdkVersion 21
diff --git a/app/src/main/java/net/taler/wallet/MainActivity.kt b/app/src/main/java/net/taler/wallet/MainActivity.kt
index 29a56da..79c3373 100644
--- a/app/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/app/src/main/java/net/taler/wallet/MainActivity.kt
@@ -19,6 +19,7 @@ package net.taler.wallet
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
+import android.content.Intent.ACTION_VIEW
import android.content.IntentFilter
import android.os.Bundle
import android.util.Log
@@ -27,8 +28,7 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.GravityCompat
-import androidx.drawerlayout.widget.DrawerLayout
+import androidx.core.view.GravityCompat.START
import androidx.lifecycle.Observer
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
@@ -38,9 +38,13 @@ import com.google.android.material.navigation.NavigationView.OnNavigationItemSel
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT
import com.google.zxing.integration.android.IntentIntegrator
-import com.google.zxing.integration.android.IntentResult
+import com.google.zxing.integration.android.IntentIntegrator.parseActivityResult
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
+import net.taler.wallet.HostCardEmulatorService.Companion.HTTP_TUNNEL_RESPONSE
+import net.taler.wallet.HostCardEmulatorService.Companion.MERCHANT_NFC_CONNECTED
+import net.taler.wallet.HostCardEmulatorService.Companion.MERCHANT_NFC_DISCONNECTED
+import net.taler.wallet.HostCardEmulatorService.Companion.TRIGGER_PAYMENT_ACTION
import java.util.Locale.ROOT
class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
@@ -54,13 +58,6 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- fab.setOnClickListener {
- val integrator = IntentIntegrator(this)
- integrator.setPrompt("Place merchant's QR Code inside the viewfinder rectangle to initiate payment.")
- integrator.initiateScan(listOf("QR_CODE"))
- }
- fab.hide()
-
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
nav = navHostFragment.navController
@@ -76,106 +73,52 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
)
toolbar.setupWithNavController(nav, appBarConfiguration)
- model.init()
- model.getBalances()
-
model.showProgressBar.observe(this, Observer { show ->
progress_bar.visibility = if (show) VISIBLE else INVISIBLE
})
- val triggerPaymentFilter = IntentFilter(HostCardEmulatorService.TRIGGER_PAYMENT_ACTION)
- registerReceiver(object : BroadcastReceiver() {
- override fun onReceive(p0: Context?, p1: Intent?) {
-
- if (nav.currentDestination?.id == R.id.promptPayment) {
- return
- }
-
- val url = p1!!.extras!!.get("contractUrl") as String
-
- nav.navigate(R.id.action_global_promptPayment)
- model.paymentManager.preparePay(url)
-
- }
- }, triggerPaymentFilter)
-
- val nfcConnectedFilter = IntentFilter(HostCardEmulatorService.MERCHANT_NFC_CONNECTED)
- registerReceiver(object : BroadcastReceiver() {
- override fun onReceive(p0: Context?, p1: Intent?) {
- Log.v(TAG, "got MERCHANT_NFC_CONNECTED")
- //model.startTunnel()
- }
- }, nfcConnectedFilter)
-
- val nfcDisconnectedFilter = IntentFilter(HostCardEmulatorService.MERCHANT_NFC_DISCONNECTED)
- registerReceiver(object : BroadcastReceiver() {
- override fun onReceive(p0: Context?, p1: Intent?) {
- Log.v(TAG, "got MERCHANT_NFC_DISCONNECTED")
- //model.stopTunnel()
- }
- }, nfcDisconnectedFilter)
-
- IntentFilter(HostCardEmulatorService.HTTP_TUNNEL_RESPONSE).also { filter ->
- registerReceiver(object : BroadcastReceiver() {
- override fun onReceive(p0: Context?, p1: Intent?) {
- Log.v("taler-tunnel", "got HTTP_TUNNEL_RESPONSE")
- model.tunnelResponse(p1!!.getStringExtra("response"))
- }
- }, filter)
- }
-
- if (intent.action == Intent.ACTION_VIEW) {
- val uri = intent.dataString
- if (uri != null)
- handleTalerUri(uri, "intent")
+ if (intent.action == ACTION_VIEW) intent.dataString?.let { uri ->
+ handleTalerUri(uri, "intent")
}
//model.startTunnel()
+
+ registerReceiver(triggerPaymentReceiver, IntentFilter(TRIGGER_PAYMENT_ACTION))
+ registerReceiver(nfcConnectedReceiver, IntentFilter(MERCHANT_NFC_CONNECTED))
+ registerReceiver(nfcDisconnectedReceiver, IntentFilter(MERCHANT_NFC_DISCONNECTED))
+ registerReceiver(tunnelResponseReceiver, IntentFilter(HTTP_TUNNEL_RESPONSE))
}
override fun onBackPressed() {
- val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
- if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
- drawerLayout.closeDrawer(GravityCompat.START)
- } else {
- super.onBackPressed()
- }
+ if (drawer_layout.isDrawerOpen(START)) drawer_layout.closeDrawer(START)
+ else super.onBackPressed()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
- // Handle navigation view item clicks here.
when (item.itemId) {
- R.id.nav_home -> {
- nav.navigate(R.id.showBalance)
- }
- R.id.nav_settings -> {
- nav.navigate(R.id.settings)
- }
- R.id.nav_history -> {
- nav.navigate(R.id.walletHistory)
- }
+ R.id.nav_home -> nav.navigate(R.id.showBalance)
+ R.id.nav_settings -> nav.navigate(R.id.settings)
+ R.id.nav_history -> nav.navigate(R.id.walletHistory)
}
- val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
- drawerLayout.closeDrawer(GravityCompat.START)
+ drawer_layout.closeDrawer(START)
return true
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
- if (requestCode != IntentIntegrator.REQUEST_CODE) {
- return
- }
-
- val scanResult: IntentResult? =
- IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
-
- if (scanResult == null || scanResult.contents == null) {
- Snackbar.make(nav_view, "QR Code scan canceled.", LENGTH_SHORT).show()
- return
+ if (requestCode == IntentIntegrator.REQUEST_CODE) {
+ parseActivityResult(requestCode, resultCode, data)?.contents?.let { contents ->
+ handleTalerUri(contents, "QR code")
+ }
}
+ }
- val url = scanResult.contents!!
- handleTalerUri(url, "QR code")
+ override fun onDestroy() {
+ unregisterReceiver(triggerPaymentReceiver)
+ unregisterReceiver(nfcConnectedReceiver)
+ unregisterReceiver(nfcDisconnectedReceiver)
+ unregisterReceiver(tunnelResponseReceiver)
+ super.onDestroy()
}
private fun handleTalerUri(url: String, from: String) {
@@ -204,6 +147,39 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener,
}
}
+ private val triggerPaymentReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ if (nav.currentDestination?.id == R.id.promptPayment) return
+ intent.extras?.getString("contractUrl")?.let { url ->
+ nav.navigate(R.id.action_global_promptPayment)
+ model.paymentManager.preparePay(url)
+ }
+ }
+ }
+
+ private val nfcConnectedReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ Log.v(TAG, "got MERCHANT_NFC_CONNECTED")
+ //model.startTunnel()
+ }
+ }
+
+ private val nfcDisconnectedReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ Log.v(TAG, "got MERCHANT_NFC_DISCONNECTED")
+ //model.stopTunnel()
+ }
+ }
+
+ private val tunnelResponseReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ Log.v("taler-tunnel", "got HTTP_TUNNEL_RESPONSE")
+ intent.getStringExtra("response")?.let {
+ model.tunnelResponse(it)
+ }
+ }
+ }
+
override fun onResetConfirmed() {
model.dangerouslyReset()
Snackbar.make(nav_view, "Wallet has been reset", LENGTH_SHORT).show()
diff --git a/app/src/main/java/net/taler/wallet/ShowBalance.kt b/app/src/main/java/net/taler/wallet/ShowBalance.kt
index 1238903..26fd050 100644
--- a/app/src/main/java/net/taler/wallet/ShowBalance.kt
+++ b/app/src/main/java/net/taler/wallet/ShowBalance.kt
@@ -202,7 +202,6 @@ class ShowBalance : Fragment(), PendingOperationClickListener {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.balance, menu)
- Log.e("TEST", "MENU INFLATED!!! ${menu.size()}")
super.onCreateOptionsMenu(menu, inflater)
}
diff --git a/app/src/main/java/net/taler/wallet/WalletViewModel.kt b/app/src/main/java/net/taler/wallet/WalletViewModel.kt
index 2942805..35f59f1 100644
--- a/app/src/main/java/net/taler/wallet/WalletViewModel.kt
+++ b/app/src/main/java/net/taler/wallet/WalletViewModel.kt
@@ -78,7 +78,6 @@ open class PendingOperations(
@Suppress("EXPERIMENTAL_API_USAGE")
class WalletViewModel(val app: Application) : AndroidViewModel(app) {
- private var initialized = false
val testWithdrawalInProgress = MutableLiveData<Boolean>().apply {
value = false
@@ -123,14 +122,7 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) {
val paymentManager = PaymentManager(walletBackendApi, mapper)
- fun init() {
- if (initialized) {
- Log.e(TAG, "WalletViewModel already initialized")
- return
- }
-
- this.initialized = true
-
+ init {
getBalances()
getPending()
@@ -147,7 +139,6 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) {
}
}
-
fun getBalances() {
if (activeGetBalance > 0) {
return
diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml
index f2d8571..834d5ca 100644
--- a/app/src/main/res/layout/app_bar_main.xml
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -21,7 +21,6 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
-
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -65,14 +64,4 @@
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
- <com.google.android.material.floatingactionbutton.FloatingActionButton
- android:id="@+id/fab"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|end"
- android:layout_margin="@dimen/fab_margin"
- android:scaleType="center"
- app:fabSize="normal"
- app:srcCompat="@drawable/ic_scan_qr" />
-
-</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/build.gradle b/build.gradle
index df21dcd..a9d913c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,20 +14,15 @@
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
buildscript {
ext.kotlin_version = '1.3.61'
repositories {
google()
jcenter()
-
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.3'
+ classpath 'com.android.tools.build:gradle:3.6.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d432222..75a58ba 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,22 +1,6 @@
-#
-# 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/>
-#
-
-#Wed Aug 14 17:39:00 CEST 2019
+#Tue Mar 03 08:42:04 BRT 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip