From 74142f9b4694b9e43c0181c39301543a637ecc71 Mon Sep 17 00:00:00 2001 From: Aleksandr Vakhtin Date: Thu, 16 Nov 2023 01:25:09 +0000 Subject: [PATCH] Test fixes --- .../application/TariWalletApplication.kt | 2 - .../deeplinks/DeeplinkFormatter.kt | 8 +- .../com/tari/android/wallet/event/Event.kt | 7 +- .../android/wallet/model/TariWalletAddress.kt | 2 +- .../wallet/ui/common/CommonActivity.kt | 5 - .../ContactSelectionViewModel.kt | 1 - .../TransactionHistoryFragment.kt | 1 + .../TransactionHistoryViewModel.kt | 22 +- .../ui/fragment/home/HomeActivity.kt.orig | 406 ------------------ .../HomeTransactionHistoryFragment.kt | 5 +- .../HomeTransactionHistoryViewModel.kt | 10 + .../ui/fragment/qr/QRScannerActivity.kt | 1 - .../addAmount/keyboard/KeyboardController.kt | 18 +- .../wallet/ui/fragment/tx/HomeFragment.kt | 27 +- .../ui/fragment/tx/adapter/TransactionItem.kt | 2 +- .../com/tari/android/wallet/util/BuildUtil.kt | 5 +- build.gradle | 2 +- 17 files changed, 88 insertions(+), 436 deletions(-) delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/fragment/home/HomeActivity.kt.orig diff --git a/app/src/main/java/com/tari/android/wallet/application/TariWalletApplication.kt b/app/src/main/java/com/tari/android/wallet/application/TariWalletApplication.kt index e9a640f40..780108bd6 100644 --- a/app/src/main/java/com/tari/android/wallet/application/TariWalletApplication.kt +++ b/app/src/main/java/com/tari/android/wallet/application/TariWalletApplication.kt @@ -151,7 +151,6 @@ class TariWalletApplication : Application() { override fun onStart(owner: LifecycleOwner) { super.onStart(owner) - securityPrefRepository.isAuthenticated = false logger.i("App in foreground") isInForeground = true walletServiceLauncher.startOnAppForegrounded() @@ -159,7 +158,6 @@ class TariWalletApplication : Application() { } override fun onStop(owner: LifecycleOwner) { - securityPrefRepository.isAuthenticated = false super.onStop(owner) logger.i("App in background") isInForeground = false diff --git a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt index a991e410e..4084e5666 100644 --- a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt +++ b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt @@ -34,8 +34,12 @@ class DeeplinkFormatter @Inject constructor(private val networkRepository: Netwo val parsedDeeplink = DeepLink.getByCommand(command, paramentrs) - if (parsedDeeplink is DeepLink.Send && !TariWalletAddress.validate(parsedDeeplink.walletAddressHex)) return null - if (parsedDeeplink is DeepLink.UserProfile && !TariWalletAddress.validate(parsedDeeplink.tariAddressHex)) return null + if (parsedDeeplink is DeepLink.Send) { + if (!TariWalletAddress.validate(parsedDeeplink.walletAddressHex)) return null + } + if (parsedDeeplink is DeepLink.UserProfile) { + if (!TariWalletAddress.validate(parsedDeeplink.tariAddressHex)) return null + } return parsedDeeplink } diff --git a/app/src/main/java/com/tari/android/wallet/event/Event.kt b/app/src/main/java/com/tari/android/wallet/event/Event.kt index d7f1b5ecc..663a0967c 100644 --- a/app/src/main/java/com/tari/android/wallet/event/Event.kt +++ b/app/src/main/java/com/tari/android/wallet/event/Event.kt @@ -32,7 +32,12 @@ */ package com.tari.android.wallet.event -import com.tari.android.wallet.model.* +import com.tari.android.wallet.model.CancelledTx +import com.tari.android.wallet.model.CompletedTx +import com.tari.android.wallet.model.PendingInboundTx +import com.tari.android.wallet.model.PendingOutboundTx +import com.tari.android.wallet.model.TransactionSendStatus +import com.tari.android.wallet.model.TxId import com.tari.android.wallet.ui.fragment.send.finalize.TxFailureReason /** diff --git a/app/src/main/java/com/tari/android/wallet/model/TariWalletAddress.kt b/app/src/main/java/com/tari/android/wallet/model/TariWalletAddress.kt index b86a112e1..482122eef 100644 --- a/app/src/main/java/com/tari/android/wallet/model/TariWalletAddress.kt +++ b/app/src/main/java/com/tari/android/wallet/model/TariWalletAddress.kt @@ -85,7 +85,7 @@ class TariWalletAddress() : Parcelable, Serializable { return Array(size) { TariWalletAddress() } } - fun validate(addressHex: String): Boolean = addressHex.length == 66 + fun validate(addressHex: String): Boolean = addressHex.length > 64 } override fun writeToParcel(parcel: Parcel, flags: Int) { diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/CommonActivity.kt b/app/src/main/java/com/tari/android/wallet/ui/common/CommonActivity.kt index 0c064d047..6be51da48 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/common/CommonActivity.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/common/CommonActivity.kt @@ -154,11 +154,6 @@ abstract class CommonActivity : App super.onCreate(savedInstanceState) dialogManager.context = this - onBackInvokedDispatcher.registerOnBackInvokedCallback(0) { - overridePendingTransition(R.anim.enter_from_left, R.anim.exit_to_right) - } - - overridePendingTransition(R.anim.enter_from_right, R.anim.exit_to_left) subscribeToCommon(connectionStateViewModel) } diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/contactSelection/ContactSelectionViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/contactSelection/ContactSelectionViewModel.kt index 2b884ab4e..a407588c7 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/contactSelection/ContactSelectionViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/contactSelection/ContactSelectionViewModel.kt @@ -121,7 +121,6 @@ open class ContactSelectionViewModel : CommonViewModel() { if (hex.isEmpty()) return val walletAddress = walletService.getWalletAddressFromHexString(hex) selectedUser.value = ContactDto(FFIContactDto(walletAddress), name) - goNext.postValue(Unit) } fun getUserDto(): ContactDto = selectedUser.value ?: contactListSource.value.orEmpty() diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/transactionHistory/TransactionHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/transactionHistory/TransactionHistoryFragment.kt index 39708c383..b821c67fa 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/transactionHistory/TransactionHistoryFragment.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/transactionHistory/TransactionHistoryFragment.kt @@ -55,6 +55,7 @@ class TransactionHistoryFragment : CommonFragment() var list = MediatorLiveData>() @@ -21,20 +27,28 @@ class TransactionHistoryViewModel : CommonViewModel() { init { component.inject(this) + list.addSource(contactRepository.publishSubject.toFlowable(BackpressureStrategy.LATEST).toLiveData()) { + updateList() + } + list.addSource(selectedContact) { updateList() } - list.addSource(transactionRepository.debouncedList) { updateList() } + list.addSource(transactionRepository.list) { updateList() } } private fun updateList() { - val filtered = transactionRepository.list.value?.filter { + val contact = selectedContact.value ?: return + val actualContact = contactRepository.getByUuid(contact.uuid) + if (contact != actualContact) selectedContact.postValue(actualContact) + + val filtered: MutableList = transactionRepository.list.value?.filter { if (it is TransactionItem) { it.tx.tariContact.walletAddress == selectedContact.value?.contact?.extractWalletAddress() } else { false } - } - list.postValue(filtered.orEmpty().toMutableList()) + }.orEmpty().map { (it as TransactionItem).copy(contact = actualContact) }.toMutableList() + list.postValue(filtered) } } diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/home/HomeActivity.kt.orig b/app/src/main/java/com/tari/android/wallet/ui/fragment/home/HomeActivity.kt.orig deleted file mode 100644 index 7dabb6d3f..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/home/HomeActivity.kt.orig +++ /dev/null @@ -1,406 +0,0 @@ -/** - * Copyright 2020 The Tari Project - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of - * its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.tari.android.wallet.ui.fragment.home - -import android.Manifest.permission.POST_NOTIFICATIONS -import android.content.Intent -import android.os.Build -import android.os.Bundle -import android.widget.ImageView -import androidx.activity.viewModels -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.viewpager2.adapter.FragmentStateAdapter -import com.tari.android.wallet.R -import com.tari.android.wallet.application.MigrationManager -import com.tari.android.wallet.application.deeplinks.DeeplinkHandler -import com.tari.android.wallet.application.deeplinks.DeeplinkViewModel -import com.tari.android.wallet.data.sharedPrefs.SharedPrefsRepository -import com.tari.android.wallet.data.sharedPrefs.network.NetworkRepository -import com.tari.android.wallet.data.sharedPrefs.tariSettings.TariSettingsSharedRepository -import com.tari.android.wallet.databinding.ActivityHomeBinding -import com.tari.android.wallet.di.DiContainer.appComponent -import com.tari.android.wallet.extension.applyFontStyle -import com.tari.android.wallet.extension.observe -import com.tari.android.wallet.model.TxId -import com.tari.android.wallet.service.connection.ServiceConnectionStatus -import com.tari.android.wallet.service.service.WalletServiceLauncher -import com.tari.android.wallet.ui.common.CommonActivity -import com.tari.android.wallet.ui.common.domain.ResourceManager -import com.tari.android.wallet.ui.component.tari.TariFont -import com.tari.android.wallet.ui.dialog.modular.DialogArgs -import com.tari.android.wallet.ui.dialog.modular.ModularDialog -import com.tari.android.wallet.ui.dialog.modular.ModularDialogArgs -import com.tari.android.wallet.ui.dialog.modular.modules.body.BodyModule -import com.tari.android.wallet.ui.dialog.modular.modules.button.ButtonModule -import com.tari.android.wallet.ui.dialog.modular.modules.button.ButtonStyle -import com.tari.android.wallet.ui.dialog.modular.modules.head.HeadModule -import com.tari.android.wallet.ui.extension.parcelable -import com.tari.android.wallet.ui.extension.setVisible -import com.tari.android.wallet.ui.extension.string -import com.tari.android.wallet.ui.fragment.chat_list.ChatListFragment -import com.tari.android.wallet.ui.fragment.contact_book.root.ContactBookFragment -import com.tari.android.wallet.ui.fragment.contact_book.root.action_menu.ContactBookActionMenuViewModel -import com.tari.android.wallet.ui.fragment.home.navigation.Navigation -import com.tari.android.wallet.ui.fragment.home.navigation.TariNavigator.Companion.INDEX_CHAT -import com.tari.android.wallet.ui.fragment.home.navigation.TariNavigator.Companion.INDEX_CONTACT_BOOK -import com.tari.android.wallet.ui.fragment.home.navigation.TariNavigator.Companion.INDEX_HOME -import com.tari.android.wallet.ui.fragment.home.navigation.TariNavigator.Companion.INDEX_SETTINGS -import com.tari.android.wallet.ui.fragment.home.navigation.TariNavigator.Companion.NO_SMOOTH_SCROLL -import com.tari.android.wallet.ui.fragment.onboarding.activity.OnboardingFlowActivity -import com.tari.android.wallet.ui.fragment.settings.allSettings.AllSettingsFragment -import com.tari.android.wallet.ui.fragment.splash.SplashActivity -import com.tari.android.wallet.ui.fragment.tx.HomeFragment -import com.tari.android.wallet.util.Constants -import com.tari.android.wallet.util.TariBuild -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import java.lang.ref.WeakReference -import javax.inject.Inject - -class HomeActivity : CommonActivity() { - - @Inject - lateinit var sharedPrefsRepository: SharedPrefsRepository - - @Inject - lateinit var walletServiceLauncher: WalletServiceLauncher - - @Inject - lateinit var networkRepository: NetworkRepository - - @Inject - lateinit var deeplinkHandler: DeeplinkHandler - - @Inject - lateinit var resourceManager: ResourceManager - - @Inject - lateinit var migrationManager: MigrationManager - - @Inject - lateinit var tariSettingsRepository: TariSettingsSharedRepository - - val deeplinkViewModel: DeeplinkViewModel by viewModels() - - val actionMenuViewModel = ContactBookActionMenuViewModel() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - instance = WeakReference(this) - - val viewModel: HomeViewModel by viewModels() - bindViewModel(viewModel) - subscribeToCommon(deeplinkViewModel) - - subscribeToCommon(viewModel.shareViewModel) - subscribeToCommon(viewModel.shareViewModel.tariBluetoothServer) - subscribeToCommon(viewModel.shareViewModel.tariBluetoothClient) - subscribeToCommon(viewModel.shareViewModel.deeplinkViewModel) - subscribeToCommon(actionMenuViewModel) - - viewModel.shareViewModel.tariBluetoothServer.init(this) - viewModel.shareViewModel.tariBluetoothClient.init(this) - - setContainerId(R.id.nav_container) - - overridePendingTransition(0, 0) - appComponent.inject(this) - if (!sharedPrefsRepository.isAuthenticated) { - val intent = Intent(this, SplashActivity::class.java) - .apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK } - this.intent?.data?.let(intent::setData) - startActivity(intent) - finish() - return - } - ui = ActivityHomeBinding.inflate(layoutInflater).also { setContentView(it.root) } - if (savedInstanceState == null) { - enableNavigationView(ui.homeImageView) - viewModel.doOnConnected { - ui.root.postDelayed({ - processIntentDeepLink(intent) - }, Constants.UI.mediumDurationMs) - } - } else { - val index = savedInstanceState.getInt(KEY_PAGE) - ui.viewPager.setCurrentItem(index, false) - enableNavigationView(index) - } - setupUi() - subscribeUI() - lifecycleScope.launch(Dispatchers.IO) { - delay(3000) - launch(Dispatchers.Main) { - checkNetworkCompatibility() - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - requestPermissions(arrayOf(POST_NOTIFICATIONS), 0) - } - } - - private fun subscribeUI() = with(viewModel) { - observe(shareViewModel.shareText) { shareViaText(it) } - - ui.actionMenuView.init(sharedPrefsRepository) - observe(actionMenuViewModel.showWithContact) { - ui.actionMenuView.showContact(it) - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - viewModel.shareViewModel.tariBluetoothServer.handleActivityResult(requestCode, resultCode, data) - viewModel.shareViewModel.tariBluetoothClient.handleActivityResult(requestCode, resultCode, data) - } - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - - // onNewIntent might get called before onCreate, so we anticipate that here - checkScreensDeeplink(intent) - if (viewModel.serviceConnection.currentState.status == ServiceConnectionStatus.CONNECTED) { - processIntentDeepLink(intent) - } else { - setIntent(intent) - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putInt(KEY_PAGE, ui.viewPager.currentItem) - } - - override fun onBackPressed() { - if (ui.actionMenuView.onBackPressed()) { - return - } - if (supportFragmentManager.backStackEntryCount > 0) { - super.onBackPressed() - } else { - if (ui.viewPager.currentItem == INDEX_HOME) { - super.onBackPressed() - } else { - ui.viewPager.setCurrentItem(INDEX_HOME, NO_SMOOTH_SCROLL) - enableNavigationView(ui.homeImageView) - } - } - } - - fun setBottomBarVisibility(isVisible: Boolean) { - val postDelay = if (!isVisible) 0 else Constants.UI.shortDurationMs - ui.bottomNavigationView.postDelayed({ - ui.bottomNavigationView.setVisible(isVisible) - ui.sendTariButton.setVisible(isVisible) - }, postDelay) - } - - private fun setupUi() { - ui.sendTariButton.setOnClickListener { viewModel.navigation.postValue(Navigation.TxListNavigation.ToTransfer()) } - setupBottomNavigation() - } - - private fun setupBottomNavigation() { - enableNavigationView(ui.homeImageView) - ui.viewPager.adapter = if (TariBuild.isChat) HomeChatAdapter(supportFragmentManager, this.lifecycle) - else HomeStoreAdapter(supportFragmentManager, this.lifecycle) - ui.viewPager.isUserInputEnabled = false - ui.viewPager.offscreenPageLimit = 3 - ui.homeView.setOnClickListener { - ui.viewPager.setCurrentItem(INDEX_HOME, NO_SMOOTH_SCROLL) - enableNavigationView(ui.homeImageView) - } - ui.storeImageView.setImageResource(if (TariBuild.isChat) R.drawable.vector_home_book else R.drawable.vector_ttl_store_icon) - ui.storeView.setOnClickListener { - ui.viewPager.setCurrentItem(INDEX_CONTACT_BOOK, NO_SMOOTH_SCROLL) - enableNavigationView(ui.storeImageView) - } -<<<<<<< HEAD - ui.chatImageView.setImageResource(if (TariBuild.isChat) R.drawable.vector_home_chat else R.drawable.vector_home_book) - ui.chatView.setOnClickListener { - ui.viewPager.setCurrentItem(INDEX_CHAT, NO_SMOOTH_SCROLL) - enableNavigationView(ui.chatImageView) -======= - ui.walletInfoView.setOnClickListener { - ui.viewPager.setCurrentItem(INDEX_CHAT, NO_SMOOTH_SCROLL) - enableNavigationView(ui.walletInfoImageView) ->>>>>>> cb06ea1bc7c0b86add6505cb8e8235be91f6dd50 - } - ui.settingsView.setOnClickListener { - ui.viewPager.setCurrentItem(INDEX_SETTINGS, NO_SMOOTH_SCROLL) - enableNavigationView(ui.settingsImageView) - } - } - - private fun enableNavigationView(index: Int) { - val view: ImageView = when (index) { - INDEX_HOME -> ui.homeImageView - INDEX_CHAT -> ui.storeImageView -<<<<<<< HEAD - INDEX_CONTACT_BOOK -> ui.chatImageView -======= - INDEX_CONTACT_BOOK -> ui.walletInfoImageView ->>>>>>> cb06ea1bc7c0b86add6505cb8e8235be91f6dd50 - INDEX_SETTINGS -> ui.settingsImageView - else -> error("Unexpected index: $index") - } - enableNavigationView(view) - } - - private fun enableNavigationView(view: ImageView) { - arrayOf(ui.homeImageView, ui.storeImageView, ui.chatImageView, ui.settingsImageView).forEach { it.clearColorFilter() } - view.setColorFilter(viewModel.paletteManager.getPurpleBrand(this)) - } - - private fun checkNetworkCompatibility() { - if (!networkRepository.supportedNetworks.contains(networkRepository.currentNetwork!!.network) && !networkRepository.incompatibleNetworkShown) { - networkRepository.incompatibleNetworkShown = true - displayIncompatibleNetworkDialog() - } - } - - private fun displayIncompatibleNetworkDialog() { - if (this.isFinishing) return - - val description = string(R.string.incompatible_network_description) - .applyFontStyle( - this@HomeActivity, - TariFont.AVENIR_LT_STD_MEDIUM, - listOf( - string(R.string.incompatible_network_description_bold_part_1), - string(R.string.incompatible_network_description_bold_part_2) - ), - TariFont.AVENIR_LT_STD_BLACK - ) - val dialog = ModularDialog(this) - val args = ModularDialogArgs( - DialogArgs(true, canceledOnTouchOutside = false), modules = listOf( - HeadModule(string(R.string.incompatible_network_title)), - BodyModule(null, description), - ButtonModule(string(R.string.incompatible_network_reset_now), ButtonStyle.Normal) { - deleteWallet() - dialog.dismiss() - }, - ButtonModule(string(R.string.incompatible_network_reset_later), ButtonStyle.Close) - ) - ) - dialog.applyArgs(args) - dialog.show() - } - - private fun deleteWallet() { - // delete wallet - goToSplashScreen() - lifecycleScope.launch(Dispatchers.IO) { - walletServiceLauncher.stopAndDelete() - } - } - - private fun goToSplashScreen() { - val intent = Intent(this, OnboardingFlowActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK - startActivity(intent) - finishAffinity() - } - - private fun checkScreensDeeplink(intent: Intent) { - val screen = intent.getStringExtra(HomeDeeplinkScreens.Key) - if (screen.orEmpty().isNotEmpty()) { - when (HomeDeeplinkScreens.parse(screen)) { - HomeDeeplinkScreens.TxDetails -> { - (intent.parcelable(HomeDeeplinkScreens.KeyTxDetailsArgs))?.let { viewModel.tariNavigator.toTxDetails(null, it) } - } - - else -> {} - } - } - } - - fun willNotifyAboutNewTx(): Boolean = ui.viewPager.currentItem == INDEX_HOME - - private fun processIntentDeepLink(intent: Intent) { - deeplinkViewModel.tryToHandle(intent.data?.toString().orEmpty()) - } - - override fun onDestroy() { - super.onDestroy() - instance = WeakReference(null) - viewModelStore.clear() - } - - class HomeStoreAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) { - - override fun createFragment(position: Int): Fragment = when (position) { - INDEX_HOME -> HomeFragment() -<<<<<<< HEAD - INDEX_CHAT -> ContactBookFragment() - INDEX_CONTACT_BOOK -> StoreFragment.newInstance() - INDEX_SETTINGS -> AllSettingsFragment.newInstance() - else -> error("Unexpected position: $position") - } - - override fun getItemCount(): Int = 4 - } - - class HomeChatAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) { - - override fun createFragment(position: Int): Fragment = when (position) { - INDEX_HOME -> HomeFragment() -======= ->>>>>>> cb06ea1bc7c0b86add6505cb8e8235be91f6dd50 - INDEX_CHAT -> ChatListFragment() - INDEX_CONTACT_BOOK -> ContactBookFragment() - INDEX_SETTINGS -> AllSettingsFragment.newInstance() - else -> error("Unexpected position: $position") - } - - override fun getItemCount(): Int = 4 - } - - companion object { - - private const val KEY_PAGE = "key_page" - - @Volatile - var instance: WeakReference = WeakReference(null) - private set - } -} - - diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/home/homeTransactionHistory/HomeTransactionHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/home/homeTransactionHistory/HomeTransactionHistoryFragment.kt index 19ae04bd9..8d59a222b 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/home/homeTransactionHistory/HomeTransactionHistoryFragment.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/home/homeTransactionHistory/HomeTransactionHistoryFragment.kt @@ -39,7 +39,10 @@ class HomeTransactionHistoryFragment : CommonFragment>() val searchText = MutableLiveData("") @@ -25,6 +31,10 @@ class HomeTransactionHistoryViewModel : CommonViewModel() { init { component.inject(this) + list.addSource(contactsRepository.publishSubject.toFlowable(BackpressureStrategy.LATEST).toLiveData()) { + updateList() + } + list.addSource(transactionRepository.list) { updateList() } list.addSource(searchText) { updateList() } diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/qr/QRScannerActivity.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/qr/QRScannerActivity.kt index 4cafff619..84f79fac0 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/qr/QRScannerActivity.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/qr/QRScannerActivity.kt @@ -160,7 +160,6 @@ class QRScannerActivity : CommonActivity, grantResults: IntArray) { diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/send/addAmount/keyboard/KeyboardController.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/send/addAmount/keyboard/KeyboardController.kt index a3c776cc3..7070d8e8f 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/send/addAmount/keyboard/KeyboardController.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/send/addAmount/keyboard/KeyboardController.kt @@ -14,7 +14,16 @@ import com.tari.android.wallet.R import com.tari.android.wallet.databinding.ViewInputAmountBinding import com.tari.android.wallet.databinding.ViewNumpadBinding import com.tari.android.wallet.model.MicroTari -import com.tari.android.wallet.ui.extension.* +import com.tari.android.wallet.ui.extension.dimen +import com.tari.android.wallet.ui.extension.dimenPx +import com.tari.android.wallet.ui.extension.getFirstChild +import com.tari.android.wallet.ui.extension.getLastChild +import com.tari.android.wallet.ui.extension.setLayoutSize +import com.tari.android.wallet.ui.extension.setLayoutWidth +import com.tari.android.wallet.ui.extension.setStartMargin +import com.tari.android.wallet.ui.extension.setTextSizePx +import com.tari.android.wallet.ui.extension.setTopMargin +import com.tari.android.wallet.ui.extension.setWidthAndHeightToMeasured import com.tari.android.wallet.util.Constants import com.tari.android.wallet.util.WalletUtil import java.math.BigInteger @@ -95,14 +104,14 @@ class KeyboardController { if (isFirstLaunch && startAmount != Double.MIN_VALUE) { val handler = Handler(Looper.getMainLooper()) isFirstLaunch = false - startAmount.toString().withIndex().forEach { (index, char) -> - handler.postDelayed({ + handler.post { + startAmount.toString().withIndex().forEach { (index, char) -> if (Character.isDigit(char)) { onDigitOrSeparatorClicked(char.toString()) } else { onDigitOrSeparatorClicked(decimalSeparator) } - }, (index + 1) * Constants.UI.AddAmount.numPadDigitEnterAnimDurationMs * 2) + } } handler.postDelayed( this::setActionBindings, @@ -200,7 +209,6 @@ class KeyboardController { * Digit or separator clicked. */ private fun onDigitOrSeparatorClicked(digit: String) { - if (digitAnimIsRunning) return // check if entering first digit var enteringFirstDigit = false if (elements.size == 1 && elements[0].first == "0") { diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/HomeFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/HomeFragment.kt index 9907b1a00..b127f1a9a 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/HomeFragment.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/HomeFragment.kt @@ -32,13 +32,20 @@ */ package com.tari.android.wallet.ui.fragment.tx -import android.animation.* import android.annotation.SuppressLint -import android.os.* -import android.view.* +import android.app.Activity +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import com.tari.android.wallet.R +import com.tari.android.wallet.application.deeplinks.DeeplinkViewModel import com.tari.android.wallet.databinding.FragmentHomeBinding import com.tari.android.wallet.event.EventBus import com.tari.android.wallet.extension.observe @@ -49,7 +56,7 @@ import com.tari.android.wallet.ui.common.recyclerView.AdapterFactory import com.tari.android.wallet.ui.common.recyclerView.CommonAdapter import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolderItem import com.tari.android.wallet.ui.component.networkStateIndicator.ConnectionIndicatorViewModel -import com.tari.android.wallet.ui.extension.* +import com.tari.android.wallet.ui.extension.setVisible import com.tari.android.wallet.ui.fragment.home.navigation.Navigation import com.tari.android.wallet.ui.fragment.qr.QRScannerActivity import com.tari.android.wallet.ui.fragment.qr.QrScannerSource @@ -70,6 +77,8 @@ class HomeFragment : CommonFragment( // This listener is used only to animate the visibility of the scroll depth gradient view. private lateinit var balanceViewController: BalanceViewController + private val deeplinkViewModel: DeeplinkViewModel by viewModels() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = FragmentHomeBinding.inflate(inflater, container, false).also { ui = it }.root @@ -82,6 +91,7 @@ class HomeFragment : CommonFragment( viewModel.serviceConnection.reconnectToService() subscribeVM(viewModel.stagedWalletSecurityManager) + subscribeVM(deeplinkViewModel) checkPermission() setupUI() @@ -99,6 +109,7 @@ class HomeFragment : CommonFragment( observe(txList) { ui.transactionsRecyclerView.setVisible(it.isNotEmpty()) + ui.viewAllTxsButton.setVisible(it.isNotEmpty()) ui.emptyState.setVisible(it.isEmpty()) adapter.update(it) adapter.notifyDataSetChanged() @@ -166,6 +177,14 @@ class HomeFragment : CommonFragment( } } + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (requestCode == QRScannerActivity.REQUEST_QR_SCANNER && resultCode == Activity.RESULT_OK && data != null) { + val qrData = data.getStringExtra(QRScannerActivity.EXTRA_QR_DATA) ?: return + deeplinkViewModel.tryToHandle(qrData) + } + } + private fun updateBalanceInfoUI(restart: Boolean) { val balanceInfo = viewModel.balanceInfo.value!! diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/adapter/TransactionItem.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/adapter/TransactionItem.kt index c487a8c9c..71a92364a 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/adapter/TransactionItem.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/tx/adapter/TransactionItem.kt @@ -16,7 +16,7 @@ data class TransactionItem( override val viewHolderUUID: String = "TransactionItem" + tx.id - override fun hashCode(): Int = HashcodeUtils.generate(tx.id, contact?.contact, position, requiredConfirmationCount, contact?.contact?.getAlias()) + override fun hashCode(): Int = HashcodeUtils.generate(tx.id, contact?.contact?.getAlias(), contact?.contact, position, requiredConfirmationCount, contact?.contact?.getAlias()) override fun equals(other: Any?): Boolean { return if (other is TransactionItem) { diff --git a/app/src/main/java/com/tari/android/wallet/util/BuildUtil.kt b/app/src/main/java/com/tari/android/wallet/util/BuildUtil.kt index af962f98b..fa82651b8 100644 --- a/app/src/main/java/com/tari/android/wallet/util/BuildUtil.kt +++ b/app/src/main/java/com/tari/android/wallet/util/BuildUtil.kt @@ -48,7 +48,10 @@ object TariBuild { val mocked_zero_hex = TariWalletAddress.zero66Hex val mocked_wallet_address - get() = TariWalletAddress(mocked_hex, mocked_emojiId) +// get() = TariWalletAddress(mocked_hex, mocked_emojiId) + get() = TariWalletAddress( + "C05575BE00EF016A209B1F493D9027B0E330F3E25FE89BBE6FA66D966EE5B6356", + "\uD83C\uDF34\uD83C\uDF0D\uD83C\uDFB5\uD83C\uDFBA\uD83D\uDDFD\uD83C\uDF37\uD83D\uDE91\uD83C\uDF45\uD83D\uDC60\uD83C\uDF1F\uD83D\uDC8C\uD83D\uDE97\uD83D\uDC40\uD83D\uDD29\uD83C\uDF08\uD83D\uDC1D\uD83C\uDF37\uD83C\uDF70\uD83C\uDF38\uD83C\uDF81\uD83C\uDF55\uD83D\uDEBF\uD83D\uDC34\uD83D\uDCA6\uD83D\uDE0E\uD83D\uDEAA\uD83C\uDFE0\uD83D\uDD29\uD83C\uDFE0\uD83D\uDE82\uD83C\uDFBA\uD83C\uDFC6\uD83C\uDFB3") val moched_zero_contact get() = TariWalletAddress(mocked_zero_hex, mocked_zero_emojiId) diff --git a/build.gradle b/build.gradle index 3fa8ef03d..944b0cf26 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { ext.lifecycle_version = '2.6.2' // build & version - ext.buildNumber = 271 + ext.buildNumber = 274 ext.versionNumber = "0.24.0" // JNI libs