From a9fd9aa024d1cafe50be76eb2ca6a818bce38862 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 3 Mar 2020 10:24:56 -0300 Subject: Clean up MainActivity and unregister receivers to not leak them This also reduces the scope of files that get an automatic copyright header. --- app/build.gradle | 3 +- app/src/main/java/net/taler/wallet/MainActivity.kt | 152 +++++++++------------ app/src/main/java/net/taler/wallet/ShowBalance.kt | 1 - .../main/java/net/taler/wallet/WalletViewModel.kt | 11 +- app/src/main/res/layout/app_bar_main.xml | 13 +- 5 files changed, 67 insertions(+), 113 deletions(-) (limited to 'app') 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().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"> - - - - \ No newline at end of file + -- cgit v1.2.3