diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/MainActivity.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/MainActivity.kt | 141 |
1 files changed, 70 insertions, 71 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt index ca53de3..00fd2d3 100644 --- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt +++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt @@ -22,9 +22,9 @@ import android.content.Context import android.content.Intent import android.content.Intent.ACTION_VIEW import android.content.IntentFilter -import android.net.Uri import android.os.Bundle import android.util.Log +import android.view.Menu import android.view.MenuItem import android.view.View.GONE import android.view.View.INVISIBLE @@ -32,8 +32,8 @@ import android.view.View.VISIBLE import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.os.bundleOf import androidx.core.view.GravityCompat.START -import androidx.lifecycle.Observer import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration @@ -42,12 +42,12 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback import com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener -import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG -import com.google.android.material.snackbar.Snackbar -import com.google.zxing.integration.android.IntentIntegrator -import com.google.zxing.integration.android.IntentIntegrator.parseActivityResult -import net.taler.common.isOnline -import net.taler.common.showError +import com.google.zxing.client.android.Intents.Scan.MIXED_SCAN +import com.google.zxing.client.android.Intents.Scan.SCAN_TYPE +import com.journeyapps.barcodescanner.ScanContract +import com.journeyapps.barcodescanner.ScanOptions +import com.journeyapps.barcodescanner.ScanOptions.QR_CODE +import net.taler.common.EventObserver import net.taler.wallet.BuildConfig.VERSION_CODE import net.taler.wallet.BuildConfig.VERSION_NAME import net.taler.wallet.HostCardEmulatorService.Companion.HTTP_TUNNEL_RESPONSE @@ -55,8 +55,7 @@ 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 net.taler.wallet.databinding.ActivityMainBinding -import net.taler.wallet.refund.RefundStatus -import java.util.Locale.ROOT +import net.taler.wallet.events.ObservabilityDialog class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, OnPreferenceStartFragmentCallback { @@ -66,6 +65,11 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, private lateinit var ui: ActivityMainBinding private lateinit var nav: NavController + private val barcodeLauncher = registerForActivityResult(ScanContract()) { result -> + if (result == null || result.contents == null) return@registerForActivityResult + handleTalerUri(result.contents, "QR code") + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ui = ActivityMainBinding.inflate(layoutInflater) @@ -82,24 +86,23 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, setSupportActionBar(ui.content.toolbar) val appBarConfiguration = AppBarConfiguration( - setOf(R.id.nav_main, R.id.nav_settings, R.id.nav_pending_operations), + setOf(R.id.nav_main, R.id.nav_settings), ui.drawerLayout ) ui.content.toolbar.setupWithNavController(nav, appBarConfiguration) - model.showProgressBar.observe(this, { show -> + model.showProgressBar.observe(this) { show -> ui.content.progressBar.visibility = if (show) VISIBLE else INVISIBLE - }) + } val versionView: TextView = ui.navView.getHeaderView(0).findViewById(R.id.versionView) - model.devMode.observe(this, { enabled -> - ui.navView.menu.findItem(R.id.nav_dev).isVisible = enabled - if (enabled) { - @SuppressLint("SetTextI18n") - versionView.text = "$VERSION_NAME ($VERSION_CODE)" - versionView.visibility = VISIBLE - } else versionView.visibility = GONE - }) + @SuppressLint("SetTextI18n") + versionView.text = "$VERSION_NAME ($VERSION_CODE)" + + // Uncomment if any dev options are added in the future + // model.devMode.observe(this) { enabled -> + // ui.navView.menu.findItem(R.id.nav_dev).isVisible = enabled + // } if (intent.action == ACTION_VIEW) intent.dataString?.let { uri -> handleTalerUri(uri, "intent") @@ -111,30 +114,69 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, registerReceiver(nfcConnectedReceiver, IntentFilter(MERCHANT_NFC_CONNECTED)) registerReceiver(nfcDisconnectedReceiver, IntentFilter(MERCHANT_NFC_DISCONNECTED)) registerReceiver(tunnelResponseReceiver, IntentFilter(HTTP_TUNNEL_RESPONSE)) + + model.scanCodeEvent.observe(this, EventObserver { + val scanOptions = ScanOptions().apply { + setPrompt("") + setBeepEnabled(true) + setOrientationLocked(false) + setDesiredBarcodeFormats(QR_CODE) + addExtra(SCAN_TYPE, MIXED_SCAN) + } + if (it) barcodeLauncher.launch(scanOptions) + }) + + model.networkManager.networkStatus.observe(this) { online -> + ui.content.offlineBanner.visibility = if (online) GONE else VISIBLE + } + + model.devMode.observe(this) { + invalidateMenu() + } } + @Deprecated("Deprecated in Java") override fun onBackPressed() { if (ui.drawerLayout.isDrawerOpen(START)) ui.drawerLayout.closeDrawer(START) else super.onBackPressed() } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + if (intent?.action == ACTION_VIEW) intent.dataString?.let { uri -> + handleTalerUri(uri, "intent") + } + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + if (model.devMode.value == true) { + menuInflater.inflate(R.menu.global_dev, menu) + } + + return super.onCreateOptionsMenu(menu) + } + override fun onNavigationItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.nav_home -> nav.navigate(R.id.nav_main) R.id.nav_settings -> nav.navigate(R.id.nav_settings) - R.id.nav_pending_operations -> nav.navigate(R.id.nav_pending_operations) } ui.drawerLayout.closeDrawer(START) return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == IntentIntegrator.REQUEST_CODE) { - parseActivityResult(requestCode, resultCode, data)?.contents?.let { contents -> - handleTalerUri(contents, "QR code") + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_show_logs -> { + ObservabilityDialog().show(supportFragmentManager, "OBSERVABILITY") } } + return super.onOptionsItemSelected(item) + } + + private fun handleTalerUri(uri: String, from: String) { + val args = bundleOf("uri" to uri, "from" to from) + nav.navigate(R.id.action_global_handle_uri, args) } override fun onDestroy() { @@ -145,48 +187,6 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, super.onDestroy() } - private fun handleTalerUri(url: String, from: String) { - val uri = Uri.parse(url) - if (uri.fragment != null && !isOnline()) { - connectToWifi(this, uri.fragment!!) - } - when { - url.lowercase(ROOT).startsWith("taler://pay/") -> { - Log.v(TAG, "navigating!") - nav.navigate(R.id.action_nav_main_to_promptPayment) - model.paymentManager.preparePay(url) - } - url.lowercase(ROOT).startsWith("taler://withdraw/") -> { - Log.v(TAG, "navigating!") - // there's more than one entry point, so use global action - nav.navigate(R.id.action_global_promptWithdraw) - model.withdrawManager.getWithdrawalDetails(url) - } - url.lowercase(ROOT).startsWith("taler://refund/") -> { - model.showProgressBar.value = true - model.refundManager.refund(url).observe(this, Observer(::onRefundResponse)) - } - else -> { - showError(R.string.error_unsupported_uri, "From: $from\nURI: $url") - } - } - } - - private fun onRefundResponse(status: RefundStatus) { - model.showProgressBar.value = false - when (status) { - is RefundStatus.Error -> { - showError(R.string.refund_error, status.msg) - } - is RefundStatus.Success -> { - val amount = status.response.amountRefundGranted - model.showTransactions(amount.currency) - val str = getString(R.string.refund_success, amount.amountStr) - Snackbar.make(ui.navView, str, LENGTH_LONG).show() - } - } - } - private val triggerPaymentReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (nav.currentDestination?.id == R.id.promptPayment) return @@ -222,10 +222,9 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, override fun onPreferenceStartFragment( caller: PreferenceFragmentCompat, - pref: Preference + pref: Preference, ): Boolean { when (pref.key) { - "pref_backup" -> nav.navigate(R.id.action_nav_settings_to_nav_settings_backup) "pref_exchanges" -> nav.navigate(R.id.action_nav_settings_to_nav_settings_exchanges) } return true |