From c8f291eade1508d891fd856125b688bc7513d189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Danil=C4=8Denko?= Date: Wed, 14 May 2025 08:12:25 +0200 Subject: [PATCH 1/5] Create the Tx History screen --- .../com/tari/android/wallet/data/tx/TxDto.kt | 11 +- .../tari/android/wallet/data/tx/TxListData.kt | 3 +- .../android/wallet/data/tx/TxRepository.kt | 10 +- .../android/wallet/di/ApplicationComponent.kt | 2 + .../wallet/navigation/TariNavigator.kt | 4 +- .../ui/compose/components/TariSearchField.kt | 114 ++++++++++ .../home/overview/HomeOverviewViewModel.kt | 2 - .../ui/screen/tx/history/TxHistoryFragment.kt | 35 ++++ .../ui/screen/tx/history/TxHistoryScreen.kt | 197 ++++++++++++++++++ .../screen/tx/history/TxHistoryViewModel.kt | 73 +++++++ .../tx/history/all/AllTxHistoryViewModel.kt | 8 +- 11 files changed, 438 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/tari/android/wallet/ui/compose/components/TariSearchField.kt create mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt create mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt create mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt diff --git a/app/src/main/java/com/tari/android/wallet/data/tx/TxDto.kt b/app/src/main/java/com/tari/android/wallet/data/tx/TxDto.kt index 26fc007c3..4c5fcc096 100644 --- a/app/src/main/java/com/tari/android/wallet/data/tx/TxDto.kt +++ b/app/src/main/java/com/tari/android/wallet/data/tx/TxDto.kt @@ -6,4 +6,13 @@ import com.tari.android.wallet.model.tx.Tx data class TxDto( val tx: Tx, val contact: ContactDto?, -) \ No newline at end of file +) { + fun contains(searchQuery: String): Boolean = this.tx.tariContact.walletAddress.fullEmojiId.contains(searchQuery, ignoreCase = true) + || this.tx.tariContact.walletAddress.fullBase58.contains(searchQuery, ignoreCase = true) + || this.tx.tariContact.alias.contains(searchQuery, ignoreCase = true) + || this.tx.message.contains(searchQuery, ignoreCase = true) + || this.tx.paymentId.contains(searchQuery, ignoreCase = true) + || this.tx.amount.formattedTariValue.contains(searchQuery, ignoreCase = true) + || this.tx.amount.formattedValue.contains(searchQuery, ignoreCase = true) + || this.contact?.contactInfo?.getAlias()?.contains(searchQuery, ignoreCase = true) == true +} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/data/tx/TxListData.kt b/app/src/main/java/com/tari/android/wallet/data/tx/TxListData.kt index 55886c908..160471b34 100644 --- a/app/src/main/java/com/tari/android/wallet/data/tx/TxListData.kt +++ b/app/src/main/java/com/tari/android/wallet/data/tx/TxListData.kt @@ -1,18 +1,17 @@ package com.tari.android.wallet.data.tx +import com.tari.android.wallet.model.TxStatus import com.tari.android.wallet.model.tx.CancelledTx import com.tari.android.wallet.model.tx.CompletedTx import com.tari.android.wallet.model.tx.PendingInboundTx import com.tari.android.wallet.model.tx.PendingOutboundTx import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.model.TxStatus data class TxListData( val cancelledTxs: List = emptyList(), val completedTxs: List = emptyList(), val pendingInboundTxs: List = emptyList(), val pendingOutboundTxs: List = emptyList(), - val confirmationCount: Long, // TODO maybe not to pass to every instance, but to have a global value ? ) { val minedUnconfirmedTxs: List get() = completedTxs.filter { it.status == TxStatus.MINED_UNCONFIRMED } diff --git a/app/src/main/java/com/tari/android/wallet/data/tx/TxRepository.kt b/app/src/main/java/com/tari/android/wallet/data/tx/TxRepository.kt index ebb0708f1..ab9bb4869 100644 --- a/app/src/main/java/com/tari/android/wallet/data/tx/TxRepository.kt +++ b/app/src/main/java/com/tari/android/wallet/data/tx/TxRepository.kt @@ -28,7 +28,7 @@ class TxRepository @Inject constructor( private val logger get() = Logger.t(TxRepository::class.java.simpleName) - private val _txs = MutableStateFlow(TxListData(confirmationCount = DEFAULT_CONFIRMATION_COUNT)) + private val _txs = MutableStateFlow(TxListData()) val txs = _txs.asStateFlow() val pendingTxs: Flow> = txs.map { txs -> (txs.pendingInboundTxs + txs.pendingOutboundTxs + txs.minedUnconfirmedTxs) @@ -89,14 +89,12 @@ class TxRepository @Inject constructor( completedTxs = wallet.getCompletedTxs(), pendingInboundTxs = wallet.getPendingInboundTxs(), pendingOutboundTxs = wallet.getPendingOutboundTxs(), - confirmationCount = wallet.getRequiredConfirmationCount(), ) logger.i( "Refreshed tx list: ${_txs.value.completedTxs.size} completed, " + "${_txs.value.pendingInboundTxs.size} pending inbound, " + "${_txs.value.pendingOutboundTxs.size} pending outbound, " + - "${_txs.value.cancelledTxs.size} cancelled (required confirmation count: " + - "${_txs.value.confirmationCount})" + "${_txs.value.cancelledTxs.size} cancelled" ) } } @@ -106,8 +104,4 @@ class TxRepository @Inject constructor( tx = this, contact = contactsRepository.getContactForTx(this), ) - - companion object { - private const val DEFAULT_CONFIRMATION_COUNT = 3L - } } diff --git a/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt b/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt index 348cfffe1..f4e7d7dac 100644 --- a/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt +++ b/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt @@ -98,6 +98,7 @@ import com.tari.android.wallet.ui.screen.settings.torBridges.TorBridgesSelection import com.tari.android.wallet.ui.screen.settings.torBridges.customBridges.CustomTorBridgesViewModel import com.tari.android.wallet.ui.screen.settings.userAutorization.BiometricAuthenticationViewModel import com.tari.android.wallet.ui.screen.tx.details.TxDetailsViewModel +import com.tari.android.wallet.ui.screen.tx.history.TxHistoryViewModel import com.tari.android.wallet.ui.screen.tx.history.all.AllTxHistoryViewModel import com.tari.android.wallet.ui.screen.tx.history.contact.ContactTxHistoryViewModel import com.tari.android.wallet.ui.screen.utxos.list.UtxosListViewModel @@ -165,6 +166,7 @@ interface ApplicationComponent { fun inject(viewModel: HomeViewModel) fun inject(viewModel: HomeOverviewViewModel) fun inject(viewModel: AllTxHistoryViewModel) + fun inject(viewModel: TxHistoryViewModel) fun inject(viewModel: EnterCurrentPasswordViewModel) fun inject(viewModel: ChangeSecurePasswordViewModel) fun inject(viewModel: AddNoteViewModel) diff --git a/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt b/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt index b8ffe7321..89d210ef6 100644 --- a/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt +++ b/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt @@ -77,7 +77,7 @@ import com.tari.android.wallet.ui.screen.settings.themeSelector.ThemeSelectorFra import com.tari.android.wallet.ui.screen.settings.torBridges.TorBridgesSelectionFragment import com.tari.android.wallet.ui.screen.settings.torBridges.customBridges.CustomTorBridgesFragment import com.tari.android.wallet.ui.screen.tx.details.TxDetailsFragment -import com.tari.android.wallet.ui.screen.tx.history.all.AllTxHistoryFragment +import com.tari.android.wallet.ui.screen.tx.history.TxHistoryFragment import com.tari.android.wallet.ui.screen.tx.history.contact.ContactTxHistoryFragment import com.tari.android.wallet.ui.screen.utxos.list.UtxosListFragment import com.tari.android.wallet.util.extension.parcelable @@ -150,7 +150,7 @@ class TariNavigator @Inject constructor( is TxList.ToAllSettings -> addFragment(AllSettingsFragment.newInstance()) is TxList.ToTransfer -> addFragment(TransferFragment()) is TxList.ToReceive -> addFragment(ReceiveFragment()) - is TxList.HomeTransactionHistory -> addFragment(AllTxHistoryFragment()) + is TxList.HomeTransactionHistory -> addFragment(TxHistoryFragment()) is TorBridge.ToCustomBridges -> addFragment(CustomTorBridgesFragment()) diff --git a/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariSearchField.kt b/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariSearchField.kt new file mode 100644 index 000000000..b79d8c046 --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariSearchField.kt @@ -0,0 +1,114 @@ +package com.tari.android.wallet.ui.compose.components + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Clear +import androidx.compose.material.icons.rounded.Search +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.TextFieldDefaults.indicatorLine +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.tari.android.wallet.ui.compose.PreviewSecondarySurface +import com.tari.android.wallet.ui.compose.TariDesignSystem +import com.tari.android.wallet.ui.screen.settings.themeSelector.TariTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TariSearchField( + searchQuery: String, + onQueryChanged: (String) -> Unit, + hint: String, + modifier: Modifier = Modifier, +) { + TextField( + value = searchQuery, + onValueChange = onQueryChanged, + modifier = modifier + .clip(TariDesignSystem.shapes.button) + .indicatorLine( + enabled = false, + isError = false, + interactionSource = remember { + MutableInteractionSource() + }, + colors = TextFieldDefaults.colors( + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + ), + focusedIndicatorLineThickness = 0.dp, + unfocusedIndicatorLineThickness = 0.dp + ), + placeholder = { + Text( + text = hint, + style = TariDesignSystem.typography.body1, + ) + }, + leadingIcon = { + Icon( + imageVector = Icons.Rounded.Search, + tint = TariDesignSystem.colors.componentsNavbarIcons, + contentDescription = null, + ) + }, + trailingIcon = { + if (searchQuery.isNotEmpty()) { + IconButton(onClick = { onQueryChanged("") }) { + Icon( + imageVector = Icons.Rounded.Clear, + tint = TariDesignSystem.colors.componentsNavbarIcons, + contentDescription = null, + ) + } + } + }, + colors = TextFieldDefaults.colors( + focusedContainerColor = TariDesignSystem.colors.backgroundPrimary, + focusedTextColor = TariDesignSystem.colors.textPrimary, + unfocusedContainerColor = TariDesignSystem.colors.backgroundPrimary, + unfocusedTextColor = TariDesignSystem.colors.textPrimary, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + cursorColor = TariDesignSystem.colors.primaryMain, + ), + textStyle = TariDesignSystem.typography.body1.copy(color = TariDesignSystem.colors.textPrimary), + ) +} + +@Preview +@Composable +private fun TariSearchFieldPreview() { + PreviewSecondarySurface(TariTheme.Light) { + TariSearchField( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + searchQuery = "Query", + onQueryChanged = {}, + hint = "Hint", + ) + + TariSearchField( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + searchQuery = "", + onQueryChanged = {}, + hint = "Hint", + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt index 968edc314..1aeeb141c 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt @@ -84,8 +84,6 @@ class HomeOverviewViewModel : CommonViewModel() { val uiState = _uiState.asStateFlow() init { - component.inject(this) - collectFlow(balanceStateHandler.balanceState) { balanceInfo -> _uiState.update { it.copy(balance = balanceInfo) } stagedSecurityDelegate.handleStagedSecurity(balanceInfo) diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt new file mode 100644 index 000000000..e292f1937 --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt @@ -0,0 +1,35 @@ +package com.tari.android.wallet.ui.screen.tx.history + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.fragment.app.viewModels +import com.tari.android.wallet.ui.common.CommonFragment +import com.tari.android.wallet.ui.compose.TariDesignSystem +import com.tari.android.wallet.util.extension.composeContent + +class TxHistoryFragment : CommonFragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = composeContent { + val uiState by viewModel.uiState.collectAsState() + + TariDesignSystem(viewModel.currentTheme) { + TxHistoryScreen( + uiState = uiState, + onBackClick = { viewModel.onBackPressed() }, + onTxClick = { viewModel.navigateToTxDetail(it.tx) }, + onSearchQueryChange = { viewModel.onQueryChange(it) }, + ) + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val viewModel: TxHistoryViewModel by viewModels() + bindViewModel(viewModel) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt new file mode 100644 index 000000000..a79a06eaf --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt @@ -0,0 +1,197 @@ +package com.tari.android.wallet.ui.screen.tx.history + +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.tari.android.wallet.R +import com.tari.android.wallet.data.tx.TxDto +import com.tari.android.wallet.ui.compose.TariDesignSystem +import com.tari.android.wallet.ui.compose.components.TariSearchField +import com.tari.android.wallet.ui.compose.components.TariTopBar +import com.tari.android.wallet.ui.screen.home.overview.widget.TxItem +import com.tari.android.wallet.ui.screen.settings.themeSelector.TariTheme +import com.tari.android.wallet.util.MockDataStub + +@Composable +fun TxHistoryScreen( + uiState: TxHistoryViewModel.UiState, + onSearchQueryChange: (String) -> Unit, + onBackClick: () -> Unit, + onTxClick: (tx: TxDto) -> Unit, +) { + var searchQuery by rememberSaveable { mutableStateOf(uiState.searchQuery) } + + Scaffold( + modifier = Modifier + .fillMaxSize() + .statusBarsPadding(), + containerColor = TariDesignSystem.colors.backgroundSecondary, + topBar = { + TariTopBar( + title = stringResource(R.string.contact_details_transaction_history), + onBack = onBackClick, + ) + } + ) { paddingValues -> + LazyColumn(modifier = Modifier.padding(paddingValues)) { + item { + TariSearchField( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + searchQuery = searchQuery, + hint = stringResource(R.string.home_search_hint), + onQueryChanged = { + onSearchQueryChange(it) + searchQuery = it + }, + ) + } + + when { + uiState.showEmptyState -> { + item { + EmptyState( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 40.dp, vertical = 20.dp), + ) + } + } + + uiState.showSortedList -> { + txListItems( + txList = uiState.sortedTxList, + ticker = uiState.ticker, + onTxClick = onTxClick, + ) + } + + else -> { + txListItems( + txList = uiState.pendingTxs, + ticker = uiState.ticker, + titleRes = R.string.home_pending_transactions_title, + onTxClick = onTxClick, + ) + if (uiState.pendingTxs.isNotEmpty()) item { Spacer(Modifier.size(10.dp)) } + txListItems( + txList = uiState.nonPendingTxs, + ticker = uiState.ticker, + titleRes = R.string.home_completed_transactions_title, + onTxClick = onTxClick, + ) + } + } + } + } +} + +@Composable +private fun EmptyState(modifier: Modifier = Modifier) { + Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = stringResource(R.string.contact_details_transaction_history_empty_state_title), + style = TariDesignSystem.typography.body1, + textAlign = TextAlign.Center, + color = TariDesignSystem.colors.textPrimary, + ) + Spacer(Modifier.size(8.dp)) + Text( + textAlign = TextAlign.Center, + text = stringResource(R.string.home_transaction_list_empty_description), + style = TariDesignSystem.typography.body2, + color = TariDesignSystem.colors.textSecondary, + ) + } +} + +private fun LazyListScope.txListItems( + txList: List, + ticker: String, + @StringRes titleRes: Int? = null, + onTxClick: (tx: TxDto) -> Unit, +) { + if (txList.isEmpty()) return + + if (titleRes != null) { + item { + Text( + modifier = Modifier.padding(horizontal = 20.dp, vertical = 10.dp), + text = stringResource(titleRes), + style = TariDesignSystem.typography.headingMedium, + ) + } + } + + items(txList.size) { index -> + val keyboardController = LocalSoftwareKeyboardController.current + val txItem = txList[index] + TxItem( + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 5.dp) + .animateItem(), + txDto = txItem, + ticker = ticker, + onTxClick = { + keyboardController?.hide() + onTxClick(txItem) + }, + ) + } +} + +@Composable +@Preview +private fun TxHistoryScreenPreview() { + TariDesignSystem(TariTheme.Light) { + TxHistoryScreen( + uiState = TxHistoryViewModel.UiState( + pendingTxs = MockDataStub.createTxList(), + nonPendingTxs = MockDataStub.createTxList(), + ticker = "XTM", + ), + onSearchQueryChange = {}, + onBackClick = {}, + onTxClick = {}, + ) + } +} + +@Composable +@Preview +private fun TxHistoryScreenEmptyPreview() { + TariDesignSystem(TariTheme.Dark) { + TxHistoryScreen( + uiState = TxHistoryViewModel.UiState( + pendingTxs = emptyList(), + nonPendingTxs = emptyList(), + ticker = "XTM", + ), + onSearchQueryChange = {}, + onBackClick = {}, + onTxClick = {}, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt new file mode 100644 index 000000000..ade163b74 --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt @@ -0,0 +1,73 @@ +package com.tari.android.wallet.ui.screen.tx.history + +import com.tari.android.wallet.data.tx.TxDto +import com.tari.android.wallet.data.tx.TxRepository +import com.tari.android.wallet.model.tx.Tx +import com.tari.android.wallet.navigation.Navigation +import com.tari.android.wallet.ui.common.CommonViewModel +import com.tari.android.wallet.util.extension.collectFlow +import com.tari.android.wallet.util.extension.zipToPair +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +class TxHistoryViewModel : CommonViewModel() { + + @Inject + lateinit var txRepository: TxRepository + + init { + component.inject(this) + } + + private val _uiState = MutableStateFlow( + UiState( + pendingTxs = emptyList(), + nonPendingTxs = emptyList(), + ticker = networkRepository.currentNetwork.ticker, + ) + ) + val uiState = _uiState.asStateFlow() + + init { + collectFlow(txRepository.pendingTxs.zipToPair(txRepository.nonPendingTxs)) { (pendingTxs, nonPendingTxs) -> + _uiState.update { + it.copy( + pendingTxs = pendingTxs, + nonPendingTxs = nonPendingTxs, + ) + } + } + } + + fun navigateToTxDetail(tx: Tx) { + tariNavigator.navigate(Navigation.TxList.ToTxDetails(tx)) + } + + fun onQueryChange(query: String) { + _uiState.update { + it.copy( + searchQuery = query, + ) + } + } + + data class UiState( + val pendingTxs: List, + val nonPendingTxs: List, + val ticker: String, + val searchQuery: String = "", + ) { + val allTxList: List + get() = pendingTxs + nonPendingTxs + + val sortedTxList: List + get() = searchQuery.trim().takeIf { it.isNotBlank() }?.let { query -> allTxList.filter { it.contains(query) } } ?: allTxList + + val showEmptyState: Boolean + get() = allTxList.isEmpty() + val showSortedList: Boolean + get() = allTxList.isNotEmpty() && searchQuery.isNotBlank() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt index 5d464dd4a..d2f7c1500 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt @@ -2,16 +2,15 @@ package com.tari.android.wallet.ui.screen.tx.history.all import com.tari.android.wallet.R import com.tari.android.wallet.data.tx.TxRepository -import com.tari.android.wallet.util.extension.collectFlow -import com.tari.android.wallet.util.extension.zipToPair import com.tari.android.wallet.model.tx.Tx import com.tari.android.wallet.navigation.Navigation import com.tari.android.wallet.ui.common.CommonViewModel import com.tari.android.wallet.ui.common.giphy.presentation.GifViewModel import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService import com.tari.android.wallet.ui.common.recyclerView.items.TitleViewHolderItem -import com.tari.android.wallet.data.contacts.ContactsRepository import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem +import com.tari.android.wallet.util.extension.collectFlow +import com.tari.android.wallet.util.extension.zipToPair import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update @@ -22,9 +21,6 @@ class AllTxHistoryViewModel : CommonViewModel() { @Inject lateinit var txRepository: TxRepository - @Inject - lateinit var contactsRepository: ContactsRepository - @Inject lateinit var giphyRestService: GiphyRestService From a3ff31517bb3eb80a7ef1844952cab3109ffc8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Danil=C4=8Denko?= Date: Wed, 14 May 2025 17:40:06 +0200 Subject: [PATCH 2/5] Add contact as parameter to Tx History screen --- .../wallet/navigation/TariNavigator.kt | 5 +- .../ui/compose/components/TariTopBar.kt | 15 ++++ .../ui/screen/tx/history/TxHistoryFragment.kt | 9 ++ .../ui/screen/tx/history/TxHistoryScreen.kt | 85 +++++++++++++++---- .../screen/tx/history/TxHistoryViewModel.kt | 29 +++++-- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 117 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt b/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt index 89d210ef6..562f81b67 100644 --- a/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt +++ b/app/src/main/java/com/tari/android/wallet/navigation/TariNavigator.kt @@ -78,7 +78,6 @@ import com.tari.android.wallet.ui.screen.settings.torBridges.TorBridgesSelection import com.tari.android.wallet.ui.screen.settings.torBridges.customBridges.CustomTorBridgesFragment import com.tari.android.wallet.ui.screen.tx.details.TxDetailsFragment import com.tari.android.wallet.ui.screen.tx.history.TxHistoryFragment -import com.tari.android.wallet.ui.screen.tx.history.contact.ContactTxHistoryFragment import com.tari.android.wallet.ui.screen.utxos.list.UtxosListFragment import com.tari.android.wallet.util.extension.parcelable import java.math.BigInteger @@ -119,7 +118,7 @@ class TariNavigator @Inject constructor( is ContactBook.ToLinkContact -> addFragment(ContactLinkFragment.createFragment(navigation.contact)) is ContactBook.BackToContactBook -> popUpTo(ContactBookFragment::class.java.simpleName) is ContactBook.ToExternalWallet -> toExternalWallet(navigation.connectedWallet) - is ContactBook.ToContactTransactionHistory -> addFragment(ContactTxHistoryFragment.createFragment(navigation.contact)) + is ContactBook.ToContactTransactionHistory -> addFragment(TxHistoryFragment.newInstance(navigation.contact)) is ContactBook.ToAddPhoneContact -> toAddPhoneContact() is ContactBook.ToSelectTariUser -> addFragment(SelectUserContactFragment.newInstance()) @@ -150,7 +149,7 @@ class TariNavigator @Inject constructor( is TxList.ToAllSettings -> addFragment(AllSettingsFragment.newInstance()) is TxList.ToTransfer -> addFragment(TransferFragment()) is TxList.ToReceive -> addFragment(ReceiveFragment()) - is TxList.HomeTransactionHistory -> addFragment(TxHistoryFragment()) + is TxList.HomeTransactionHistory -> addFragment(TxHistoryFragment.newInstance()) is TorBridge.ToCustomBridges -> addFragment(CustomTorBridgesFragment()) diff --git a/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariTopBar.kt b/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariTopBar.kt index 26c76485b..979e3e4d3 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariTopBar.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/compose/components/TariTopBar.kt @@ -58,6 +58,7 @@ fun TariTopBar( modifier = Modifier .fillMaxWidth() .align(Alignment.Center) + .padding(horizontal = if (onBack != null) 64.dp else 16.dp) .padding(8.dp), style = TariDesignSystem.typography.headingLarge, textAlign = TextAlign.Center, @@ -92,4 +93,18 @@ fun TariTopBarPreview() { ) } } +} + +@Composable +@Preview +fun TariTopBarLongTitlePreview() { + PreviewSecondarySurface(TariTheme.Light, Modifier.fillMaxSize()) { + Column { + TariTopBar( + title = "Toolbar very long title that should be truncated at some point and not overflow the screen", + showShadow = false, + onBack = {}, + ) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt index e292f1937..a09c6a205 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.fragment.app.viewModels +import com.tari.android.wallet.data.contacts.model.ContactDto import com.tari.android.wallet.ui.common.CommonFragment import com.tari.android.wallet.ui.compose.TariDesignSystem import com.tari.android.wallet.util.extension.composeContent @@ -32,4 +33,12 @@ class TxHistoryFragment : CommonFragment() { val viewModel: TxHistoryViewModel by viewModels() bindViewModel(viewModel) } + + companion object { + const val PARAMETER_CONTACT = "PARAMETER_CONTACT" + + fun newInstance(contactDto: ContactDto? = null): TxHistoryFragment = TxHistoryFragment().apply { + arguments = Bundle().apply { putParcelable(PARAMETER_CONTACT, contactDto) } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt index a79a06eaf..c27302cc7 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.tari.android.wallet.R +import com.tari.android.wallet.data.contacts.model.ContactDto import com.tari.android.wallet.data.tx.TxDto import com.tari.android.wallet.ui.compose.TariDesignSystem import com.tari.android.wallet.ui.compose.components.TariSearchField @@ -49,26 +50,35 @@ fun TxHistoryScreen( containerColor = TariDesignSystem.colors.backgroundSecondary, topBar = { TariTopBar( - title = stringResource(R.string.contact_details_transaction_history), + title = if (uiState.selectedContact != null) { + stringResource(R.string.contact_details_transaction_history_description, uiState.selectedContact.contactInfo.getAlias()) + } else { + stringResource(R.string.contact_details_transaction_history) + }, onBack = onBackClick, ) } ) { paddingValues -> LazyColumn(modifier = Modifier.padding(paddingValues)) { - item { - TariSearchField( - modifier = Modifier - .fillMaxWidth() - .padding(20.dp), - searchQuery = searchQuery, - hint = stringResource(R.string.home_search_hint), - onQueryChanged = { - onSearchQueryChange(it) - searchQuery = it - }, - ) + if (uiState.selectedContact == null) { + item { + Spacer(Modifier.size(20.dp)) + TariSearchField( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + searchQuery = searchQuery, + hint = stringResource(R.string.home_search_hint), + onQueryChanged = { + onSearchQueryChange(it) + searchQuery = it + }, + ) + } } + item { Spacer(Modifier.size(20.dp)) } + when { uiState.showEmptyState -> { item { @@ -76,6 +86,7 @@ fun TxHistoryScreen( modifier = Modifier .fillMaxWidth() .padding(horizontal = 40.dp, vertical = 20.dp), + selectedContact = uiState.selectedContact, ) } } @@ -109,7 +120,7 @@ fun TxHistoryScreen( } @Composable -private fun EmptyState(modifier: Modifier = Modifier) { +private fun EmptyState(selectedContact: ContactDto?, modifier: Modifier = Modifier) { Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { Text( text = stringResource(R.string.contact_details_transaction_history_empty_state_title), @@ -120,7 +131,11 @@ private fun EmptyState(modifier: Modifier = Modifier) { Spacer(Modifier.size(8.dp)) Text( textAlign = TextAlign.Center, - text = stringResource(R.string.home_transaction_list_empty_description), + text = if (selectedContact != null) { + stringResource(R.string.contact_details_transaction_history_empty_state_description, selectedContact.contactInfo.getAlias()) + } else { + stringResource(R.string.home_transaction_list_empty_description) + }, style = TariDesignSystem.typography.body2, color = TariDesignSystem.colors.textSecondary, ) @@ -150,7 +165,7 @@ private fun LazyListScope.txListItems( val txItem = txList[index] TxItem( modifier = Modifier - .padding(horizontal = 16.dp, vertical = 5.dp) + .padding(horizontal = 20.dp, vertical = 5.dp) .animateItem(), txDto = txItem, ticker = ticker, @@ -171,6 +186,7 @@ private fun TxHistoryScreenPreview() { pendingTxs = MockDataStub.createTxList(), nonPendingTxs = MockDataStub.createTxList(), ticker = "XTM", + selectedContact = null, ), onSearchQueryChange = {}, onBackClick = {}, @@ -188,6 +204,43 @@ private fun TxHistoryScreenEmptyPreview() { pendingTxs = emptyList(), nonPendingTxs = emptyList(), ticker = "XTM", + selectedContact = null, + ), + onSearchQueryChange = {}, + onBackClick = {}, + onTxClick = {}, + ) + } +} + +@Composable +@Preview +private fun TxHistoryContactScreenPreview() { + TariDesignSystem(TariTheme.Light) { + TxHistoryScreen( + uiState = TxHistoryViewModel.UiState( + pendingTxs = MockDataStub.createTxList(), + nonPendingTxs = MockDataStub.createTxList(), + ticker = "XTM", + selectedContact = MockDataStub.createContact(), + ), + onSearchQueryChange = {}, + onBackClick = {}, + onTxClick = {}, + ) + } +} + +@Composable +@Preview +private fun TxHistoryContactScreenEmptyPreview() { + TariDesignSystem(TariTheme.Dark) { + TxHistoryScreen( + uiState = TxHistoryViewModel.UiState( + pendingTxs = emptyList(), + nonPendingTxs = emptyList(), + ticker = "XTM", + selectedContact = MockDataStub.createContact(), ), onSearchQueryChange = {}, onBackClick = {}, diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt index ade163b74..8840d87a3 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryViewModel.kt @@ -1,9 +1,13 @@ package com.tari.android.wallet.ui.screen.tx.history +import androidx.lifecycle.SavedStateHandle +import com.tari.android.wallet.data.contacts.ContactsRepository +import com.tari.android.wallet.data.contacts.model.ContactDto import com.tari.android.wallet.data.tx.TxDto import com.tari.android.wallet.data.tx.TxRepository import com.tari.android.wallet.model.tx.Tx import com.tari.android.wallet.navigation.Navigation +import com.tari.android.wallet.navigation.TariNavigator import com.tari.android.wallet.ui.common.CommonViewModel import com.tari.android.wallet.util.extension.collectFlow import com.tari.android.wallet.util.extension.zipToPair @@ -12,17 +16,21 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import javax.inject.Inject -class TxHistoryViewModel : CommonViewModel() { +class TxHistoryViewModel(savedState: SavedStateHandle) : CommonViewModel() { @Inject lateinit var txRepository: TxRepository + @Inject + lateinit var contactsRepository: ContactsRepository + init { component.inject(this) } private val _uiState = MutableStateFlow( UiState( + selectedContact = savedState.get(TariNavigator.PARAMETER_CONTACT)?.uuid?.let { contactsRepository.getByUuid(it) }, pendingTxs = emptyList(), nonPendingTxs = emptyList(), ticker = networkRepository.currentNetwork.ticker, @@ -46,14 +54,11 @@ class TxHistoryViewModel : CommonViewModel() { } fun onQueryChange(query: String) { - _uiState.update { - it.copy( - searchQuery = query, - ) - } + _uiState.update { it.copy(searchQuery = query) } } data class UiState( + val selectedContact: ContactDto? = null, // null if not contact tx history val pendingTxs: List, val nonPendingTxs: List, val ticker: String, @@ -63,11 +68,19 @@ class TxHistoryViewModel : CommonViewModel() { get() = pendingTxs + nonPendingTxs val sortedTxList: List - get() = searchQuery.trim().takeIf { it.isNotBlank() }?.let { query -> allTxList.filter { it.contains(query) } } ?: allTxList + get() = allTxList.filterByContact().filterByQuery() val showEmptyState: Boolean get() = allTxList.isEmpty() val showSortedList: Boolean - get() = allTxList.isNotEmpty() && searchQuery.isNotBlank() + get() = selectedContact != null || allTxList.isNotEmpty() && searchQuery.isNotBlank() + + private fun List.filterByContact(): List = selectedContact?.let { contact -> + filter { it.tx.tariContact.walletAddress == contact.walletAddress } + } ?: this + + private fun List.filterByQuery(): List = searchQuery.trim().takeIf { it.isNotBlank() }?.let { query -> + filter { it.contains(query) } + } ?: this } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9a8fa9fd1..6244c8f38 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -940,7 +940,7 @@ Transaction History Your transaction history with %s No transactions found - %s yet. Click the button below to send some Tari]]> + You don\’t have any transactions with %s yet. Messages From 004a94b14773c77815f91b8ee72158f0267eeffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Danil=C4=8Denko?= Date: Thu, 15 May 2025 15:46:13 +0200 Subject: [PATCH 3/5] Remove old Tx History fragments and GIF-related files --- app/build.gradle.kts | 11 +- app/proguard-rules.pro | 8 - .../application/TariWalletApplication.kt | 6 - .../walletManager/WalletManager.kt | 16 -- .../android/wallet/di/ApplicationComponent.kt | 8 - .../android/wallet/di/ApplicationModule.kt | 6 - .../android/wallet/di/GiphyGlideModule.java | 51 ------ .../tari/android/wallet/di/RetrofitModule.kt | 36 ---- .../android/wallet/ffi/LogFileObserver.kt | 89 --------- .../com/tari/android/wallet/model/TxNote.kt | 80 -------- .../wallet/ui/common/giphy/GiphyAdapter.kt | 41 ----- .../common/giphy/GiphyKeywordsRepository.kt | 20 -- .../ui/common/giphy/api/GIFSearchException.kt | 3 - .../ui/common/giphy/api/GiphyRESTGateway.kt | 18 -- .../wallet/ui/common/giphy/api/dto/Data.kt | 42 ----- .../ui/common/giphy/api/dto/ImageVariant.kt | 38 ---- .../wallet/ui/common/giphy/api/dto/Images.kt | 49 ----- .../wallet/ui/common/giphy/api/dto/Meta.kt | 41 ----- .../ui/common/giphy/api/dto/Original.kt | 38 ---- .../common/giphy/api/dto/SearchGIFResponse.kt | 41 ----- .../giphy/api/dto/SearchGIFsResponse.kt | 41 ----- .../giphy/placeholder/GifColorPlaceholder.kt | 20 -- .../giphy/placeholder/GifPlaceholder.kt | 15 -- .../ui/common/giphy/presentation/GifState.kt | 27 --- .../giphy/presentation/GifStateConsumer.kt | 11 -- .../common/giphy/presentation/GifViewModel.kt | 59 ------ .../giphy/presentation/GlideGifListener.kt | 31 ---- .../ui/common/giphy/repository/GifItem.kt | 46 ----- .../giphy/repository/GiphyRepository.kt | 42 ----- .../giphy/repository/GiphyRestService.kt | 40 ---- .../ui/component/tari/toolbar/TariToolbar.kt | 10 +- .../ui/screen/home/overview/widget/TxItem.kt | 3 +- .../ui/screen/pinCode/EnterPinCodeFragment.kt | 1 + .../ui/screen/send/addNote/AddNoteFragment.kt | 102 +---------- .../addNote/gif/ChooseGIFDialogFragment.kt | 129 ------------- .../send/addNote/gif/GIFsPanelAnimation.kt | 38 ---- .../addNote/gif/GIFsPanelAnimationState.kt | 5 - .../screen/send/addNote/gif/GifContainer.kt | 69 ------- .../send/addNote/gif/GifThumbnailAdapter.kt | 89 --------- .../gif/HorizontalInnerMarginDecoration.kt | 12 -- .../send/addNote/gif/ThumbnailGifViewModel.kt | 64 ------- .../send/addNote/gif/TranslationDirection.kt | 3 - .../tx/adapter/CommonTxListViewHolder.kt | 171 ------------------ .../ui/screen/tx/adapter/TxListAdapter.kt | 13 -- .../ui/screen/tx/adapter/TxListViewHolder.kt | 139 -------------- .../ui/screen/tx/adapter/TxViewHolderItem.kt | 22 --- .../ui/screen/tx/details/TxDetailsScreen.kt | 4 +- .../ui/screen/tx/history/TxHistoryScreen.kt | 4 +- .../tx/history/all/AllTxHistoryFragment.kt | 68 ------- .../tx/history/all/AllTxHistoryModel.kt | 24 --- .../tx/history/all/AllTxHistoryViewModel.kt | 75 -------- .../contact/ContactTxHistoryFragment.kt | 94 ---------- .../history/contact/ContactTxHistoryModel.kt | 12 -- .../contact/ContactTxHistoryViewModel.kt | 66 ------- .../wallet/util/extension/ViewExtensions.kt | 7 +- app/src/main/res/layout/fragment_add_note.xml | 98 +--------- .../fragment_all_transaction_history.xml | 97 ---------- app/src/main/res/layout/fragment_chat.xml | 6 +- .../main/res/layout/fragment_choose_gif.xml | 63 ------- .../fragment_contact_transaction_history.xml | 103 ----------- .../main/res/layout/item_show_more_gifs.xml | 37 ---- .../main/res/layout/item_thumbnail_gif.xml | 7 - app/src/main/res/layout/item_tx_list.xml | 142 --------------- .../main/res/layout/view_gif_container.xml | 57 ------ app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/strings.xml | 6 - app/src/main/res/values/styles.xml | 11 -- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- gradle.properties | 3 +- secret-example.properties | 5 +- settings.gradle.kts | 1 - 71 files changed, 34 insertions(+), 2805 deletions(-) delete mode 100644 app/src/main/java/com/tari/android/wallet/di/GiphyGlideModule.java delete mode 100644 app/src/main/java/com/tari/android/wallet/ffi/LogFileObserver.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/model/TxNote.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyAdapter.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyKeywordsRepository.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GIFSearchException.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GiphyRESTGateway.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Data.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/ImageVariant.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Images.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Meta.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Original.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFResponse.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFsResponse.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifColorPlaceholder.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifPlaceholder.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifState.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifStateConsumer.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifViewModel.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GlideGifListener.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GifItem.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRepository.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRestService.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/ChooseGIFDialogFragment.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimation.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimationState.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifContainer.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifThumbnailAdapter.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/HorizontalInnerMarginDecoration.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/ThumbnailGifViewModel.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/TranslationDirection.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/CommonTxListViewHolder.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListAdapter.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListViewHolder.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxViewHolderItem.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryFragment.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryModel.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryFragment.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryModel.kt delete mode 100644 app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryViewModel.kt delete mode 100644 app/src/main/res/layout/fragment_all_transaction_history.xml delete mode 100644 app/src/main/res/layout/fragment_choose_gif.xml delete mode 100644 app/src/main/res/layout/fragment_contact_transaction_history.xml delete mode 100644 app/src/main/res/layout/item_show_more_gifs.xml delete mode 100644 app/src/main/res/layout/item_thumbnail_gif.xml delete mode 100644 app/src/main/res/layout/item_tx_list.xml delete mode 100644 app/src/main/res/layout/view_gif_container.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dd7fbab95..c4b19cd94 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -68,11 +68,9 @@ android { getByName("debug") { isJniDebuggable = true - buildConfigField("String", "GIPHY_KEY", "\"${secretProperties["giphy.key"]}\"") } getByName("release") { - buildConfigField("String", "GIPHY_KEY", "\"${secretProperties["giphy.key"]}\"") isMinifyEnabled = true isShrinkResources = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") @@ -90,12 +88,12 @@ android { productFlavors { create("regular") { dimension = "privacy-mode" - buildConfigField("String", "NOTIFICATIONS_API_KEY", "\"${loadSecretProps()["service.notifications.api_key"]}\"") // todo use new API KEY + buildConfigField("String", "NOTIFICATIONS_API_KEY", "\"${loadSecretProps()["service.notifications.api_key"]}\"") proguardFile("regular-proguard-rules.pro") } create("privacy") { dimension = "privacy-mode" - buildConfigField("String", "NOTIFICATIONS_API_KEY", "\"${loadSecretProps()["service.notifications.api_key"]}\"")// todo use new API KEY + buildConfigField("String", "NOTIFICATIONS_API_KEY", "\"${loadSecretProps()["service.notifications.api_key"]}\"") } } @@ -235,6 +233,7 @@ dependencies { implementation(Dependencies.AndroidX.legacySupport) implementation(Dependencies.AndroidX.recyclerview) implementation(Dependencies.AndroidX.viewpager2) + implementation(Dependencies.AndroidX.material) implementation(Dependencies.AndroidX.activityKtx) implementation(Dependencies.AndroidX.fragmentKtx) implementation(Dependencies.AndroidX.Lifecycle.extensions) @@ -320,10 +319,6 @@ dependencies { implementation(Dependencies.blessedAndroid) - implementation(Dependencies.giphySdkUi) { - exclude(group = "com.android.support") - } - implementation(Dependencies.itext7Core) implementation(Dependencies.keyboardVisibilityEvent) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 204b037d1..b0f640351 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -36,14 +36,6 @@ -keep enum com.tari.android.wallet.application.Network { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFResponse { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFsResponse { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.Data { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.Meta { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.Images { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.ImageVariant { *; } --keep class com.tari.android.wallet.ui.common.giphy.api.dto.Original { *; } - -keep class **Fragment** { *; } -keep class **ViewModel** { *; } 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 00159f2b3..0f839476a 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 @@ -45,7 +45,6 @@ import com.tari.android.wallet.di.ApplicationScope import com.tari.android.wallet.di.DiContainer import com.tari.android.wallet.infrastructure.logging.LoggerAdapter import com.tari.android.wallet.notification.NotificationHelper -import com.tari.android.wallet.ui.common.giphy.GiphyAdapter import com.tari.android.wallet.util.DebugConfig import io.sentry.android.core.SentryAndroid import kotlinx.coroutines.CoroutineScope @@ -78,9 +77,6 @@ class TariWalletApplication : Application() { @Inject lateinit var yatAdapter: YatAdapter - @Inject - lateinit var giphyAdapter: GiphyAdapter - @Inject @ApplicationScope lateinit var applicationScope: CoroutineScope @@ -135,8 +131,6 @@ class TariWalletApplication : Application() { yatAdapter.initYat(this) - giphyAdapter.init() - loggerAdapter.init() } diff --git a/app/src/main/java/com/tari/android/wallet/application/walletManager/WalletManager.kt b/app/src/main/java/com/tari/android/wallet/application/walletManager/WalletManager.kt index 786330101..07fbec0b4 100644 --- a/app/src/main/java/com/tari/android/wallet/application/walletManager/WalletManager.kt +++ b/app/src/main/java/com/tari/android/wallet/application/walletManager/WalletManager.kt @@ -33,7 +33,6 @@ package com.tari.android.wallet.application.walletManager import com.orhanobut.logger.Logger -import com.tari.android.wallet.BuildConfig import com.tari.android.wallet.application.AppStateHandler import com.tari.android.wallet.application.baseNodes.BaseNodesManager import com.tari.android.wallet.application.walletManager.WalletCallbacks.Companion.MAIN_WALLET_CONTEXT_ID @@ -57,7 +56,6 @@ import com.tari.android.wallet.ffi.FFITariTransportConfig import com.tari.android.wallet.ffi.FFITariWalletAddress import com.tari.android.wallet.ffi.FFIWallet import com.tari.android.wallet.ffi.HexString -import com.tari.android.wallet.ffi.LogFileObserver import com.tari.android.wallet.ffi.NetAddressString import com.tari.android.wallet.ffi.runWithDestroy import com.tari.android.wallet.model.MicroTari @@ -138,7 +136,6 @@ class WalletManager @Inject constructor( private val _txSentConfirmations = MutableStateFlow(emptyList()) val txSentConfirmations = _txSentConfirmations.asStateFlow() - private var logFileObserver: LogFileObserver? = null private val logger get() = Logger.t(WalletManager::class.simpleName) @@ -230,8 +227,6 @@ class WalletManager @Inject constructor( walletCallbacks = walletCallbacks, ) - startLogFileObserver() - if (DebugConfig.selectBaseNodeEnabled) { baseNodesManager.refreshBaseNodeList(wallet) if (baseNodesManager.currentBaseNode == null) { @@ -282,17 +277,6 @@ class WalletManager @Inject constructor( ) } - /** - * Starts the log file observer only in debug mode. - * Will skip if the app is in release config. - */ - private fun startLogFileObserver() { - if (BuildConfig.DEBUG) { - logFileObserver = LogFileObserver(walletConfig.getWalletLogFilePath()) - logFileObserver?.startWatching() - } - } - /** * Stores wallet's Base58 address and emoji id into the shared prefs * for future convenience. diff --git a/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt b/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt index f4e7d7dac..1ec6a8550 100644 --- a/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt +++ b/app/src/main/java/com/tari/android/wallet/di/ApplicationComponent.kt @@ -70,8 +70,6 @@ import com.tari.android.wallet.ui.screen.restore.inputSeedWords.InputSeedWordsVi import com.tari.android.wallet.ui.screen.restore.walletRestoring.WalletRestoringViewModel import com.tari.android.wallet.ui.screen.send.addAmount.AddAmountViewModel import com.tari.android.wallet.ui.screen.send.addNote.AddNoteViewModel -import com.tari.android.wallet.ui.screen.send.addNote.gif.ChooseGIFDialogFragment -import com.tari.android.wallet.ui.screen.send.addNote.gif.ThumbnailGifViewModel import com.tari.android.wallet.ui.screen.send.confirm.ConfirmViewModel import com.tari.android.wallet.ui.screen.send.finalize.FinalizeSendTxViewModel import com.tari.android.wallet.ui.screen.send.receive.ReceiveViewModel @@ -99,8 +97,6 @@ import com.tari.android.wallet.ui.screen.settings.torBridges.customBridges.Custo import com.tari.android.wallet.ui.screen.settings.userAutorization.BiometricAuthenticationViewModel import com.tari.android.wallet.ui.screen.tx.details.TxDetailsViewModel import com.tari.android.wallet.ui.screen.tx.history.TxHistoryViewModel -import com.tari.android.wallet.ui.screen.tx.history.all.AllTxHistoryViewModel -import com.tari.android.wallet.ui.screen.tx.history.contact.ContactTxHistoryViewModel import com.tari.android.wallet.ui.screen.utxos.list.UtxosListViewModel import dagger.Component import javax.inject.Singleton @@ -129,11 +125,9 @@ interface ApplicationComponent { fun inject(activity: AuthActivity) fun inject(activity: QrScannerActivity) - fun inject(fragment: ChooseGIFDialogFragment) fun inject(fragment: CreateWalletFragment) fun inject(commonViewModel: CommonViewModel) - fun inject(viewModel: ThumbnailGifViewModel) fun inject(viewModel: ScreenRecordingSettingsViewModel) fun inject(viewModel: ChooseRestoreOptionViewModel) fun inject(viewModel: EnterRestorationPasswordViewModel) @@ -165,7 +159,6 @@ interface ApplicationComponent { fun inject(viewModel: DeleteWalletViewModel) fun inject(viewModel: HomeViewModel) fun inject(viewModel: HomeOverviewViewModel) - fun inject(viewModel: AllTxHistoryViewModel) fun inject(viewModel: TxHistoryViewModel) fun inject(viewModel: EnterCurrentPasswordViewModel) fun inject(viewModel: ChangeSecurePasswordViewModel) @@ -179,7 +172,6 @@ interface ApplicationComponent { fun inject(viewModel: ContactSelectionViewModel) fun inject(viewModel: TxDetailsViewModel) fun inject(viewModel: ShareManager) - fun inject(viewModel: ContactTxHistoryViewModel) fun inject(viewModel: WalletAddressViewModel) fun inject(viewModel: QrScannerViewModel) fun inject(viewModel: ChatListViewModel) diff --git a/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt b/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt index 8ef5baff8..c84607051 100644 --- a/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt +++ b/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt @@ -39,12 +39,10 @@ import android.content.Context.MODE_PRIVATE import android.content.SharedPreferences import androidx.biometric.BiometricManager import androidx.core.content.ContextCompat -import com.tari.android.wallet.BuildConfig import com.tari.android.wallet.application.TariWalletApplication import com.tari.android.wallet.infrastructure.security.biometric.BiometricAuthenticationService import com.tari.android.wallet.notification.NotificationHelper import com.tari.android.wallet.ui.common.domain.ResourceManager -import com.tari.android.wallet.ui.common.giphy.GiphyAdapter import dagger.Module import dagger.Provides import java.io.File @@ -95,10 +93,6 @@ class ApplicationModule(private val app: TariWalletApplication) { context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager ) - @Provides - @Singleton - fun provideGiphyAdapter(context: Context): GiphyAdapter = GiphyAdapter(context, BuildConfig.GIPHY_KEY) - companion object { const val sharedPrefsFileName = "tari_wallet_shared_prefs" } diff --git a/app/src/main/java/com/tari/android/wallet/di/GiphyGlideModule.java b/app/src/main/java/com/tari/android/wallet/di/GiphyGlideModule.java deleted file mode 100644 index ce79002b5..000000000 --- a/app/src/main/java/com/tari/android/wallet/di/GiphyGlideModule.java +++ /dev/null @@ -1,51 +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.di; - -import android.content.Context; - -import androidx.annotation.NonNull; - -import com.bumptech.glide.GlideBuilder; -import com.bumptech.glide.annotation.GlideModule; -import com.bumptech.glide.load.engine.cache.LruResourceCache; -import com.bumptech.glide.module.AppGlideModule; - -@GlideModule -public class GiphyGlideModule extends AppGlideModule { - - @Override - public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { - builder.setMemoryCache(new LruResourceCache(30 * 1024 * 1024)); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/di/RetrofitModule.kt b/app/src/main/java/com/tari/android/wallet/di/RetrofitModule.kt index a426bfa9c..3e5681ee7 100644 --- a/app/src/main/java/com/tari/android/wallet/di/RetrofitModule.kt +++ b/app/src/main/java/com/tari/android/wallet/di/RetrofitModule.kt @@ -35,16 +35,12 @@ package com.tari.android.wallet.di import com.tari.android.wallet.BuildConfig import com.tari.android.wallet.data.airdrop.AirdropRetrofitService import com.tari.android.wallet.data.push.PushRetrofitService -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRepository -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService import dagger.Module import dagger.Provides -import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.create import javax.inject.Named import javax.inject.Singleton @@ -52,45 +48,13 @@ import javax.inject.Singleton class RetrofitModule { private companion object { - private const val GIPHY_BASE_URL = "https://api.giphy.com" private const val AIRDROP_BASE_URL = "https://airdrop.tari.com" private const val PUSH_BASE_URL = "https://push.tari.com" - private const val RETROFIT_GIPHY = "giphy_retrofit" private const val RETROFIT_AIRDROP = "airdrop_retrofit" private const val RETROFIT_PUSH = "push_retrofit" - - private const val GIPHY_QUERY_PARAM_API_KEY = "api_key" } - @Provides - @Named(RETROFIT_GIPHY) - @Singleton - fun provideGiphyHttpClient(): OkHttpClient = OkHttpClient.Builder() - .addLoggingIfDebug() - .addInterceptor { chain: Interceptor.Chain -> - chain.request().url.newBuilder() - .addQueryParameter(GIPHY_QUERY_PARAM_API_KEY, BuildConfig.GIPHY_KEY).build() - .let { chain.request().newBuilder().url(it).build() } - .let(chain::proceed) - } - .build() - - @Provides - @Named(RETROFIT_GIPHY) - @Singleton - fun provideTestnetFaucetRetrofit(@Named(RETROFIT_GIPHY) client: OkHttpClient): Retrofit = - Retrofit.Builder() - .baseUrl(GIPHY_BASE_URL) - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .build() - - @Provides - @Singleton - fun provideGifRepository(@Named(RETROFIT_GIPHY) retrofit: Retrofit): GiphyRestService = - GiphyRepository(retrofit.create()) - @Provides @Named(RETROFIT_AIRDROP) @Singleton diff --git a/app/src/main/java/com/tari/android/wallet/ffi/LogFileObserver.kt b/app/src/main/java/com/tari/android/wallet/ffi/LogFileObserver.kt deleted file mode 100644 index 0ffbcfdb2..000000000 --- a/app/src/main/java/com/tari/android/wallet/ffi/LogFileObserver.kt +++ /dev/null @@ -1,89 +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.ffi - -import android.os.FileObserver -import org.apache.commons.io.input.ReversedLinesFileReader -import timber.log.Timber -import java.io.File -import java.io.FileReader -import java.io.LineNumberReader -import java.nio.charset.StandardCharsets - -/** - * Observes the log file and on a file modify, forwards the new line (if any) in - * the log file to the Android log. - * - * @author The Tari Development Team - */ -class LogFileObserver(logFilePath: String) : FileObserver(logFilePath) { - - private val logTag = "FFI" - private val logFile = File(logFilePath) - - /** - * Remember the last number of lines to be able to log any new lines. - */ - private var lastNumberOfLines = 0 - - private fun logNewLines() { - // read number of lines - val fileReader = FileReader(logFile) - val lineNumberReader = LineNumberReader(fileReader) - lineNumberReader.skip(Long.MAX_VALUE) - // figured out how many new lines there are - val numberOfNewLines = (lineNumberReader.lineNumber) - lastNumberOfLines - // read last new lines - val reversedFileReader = ReversedLinesFileReader(logFile, StandardCharsets.UTF_8) - val lineList = mutableListOf() - for (i in 0 until numberOfNewLines) { - val line = reversedFileReader.readLine() - lineList.add(line) - } - val stringBuilder = StringBuilder() - if (lineList.isNotEmpty()) { - // log them in reverse order - lineList.reversed().forEach { logLine -> stringBuilder.appendLine(logLine) } - Timber.tag(logTag).d(stringBuilder.toString()) - lastNumberOfLines = lineNumberReader.lineNumber - } - // close resources - fileReader.close() - lineNumberReader.close() - reversedFileReader.close() - } - - override fun onEvent(event: Int, path: String?) { - runCatching { logNewLines() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/model/TxNote.kt b/app/src/main/java/com/tari/android/wallet/model/TxNote.kt deleted file mode 100644 index f46b45acb..000000000 --- a/app/src/main/java/com/tari/android/wallet/model/TxNote.kt +++ /dev/null @@ -1,80 +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.model - -import com.tari.android.wallet.model.tx.Tx - -data class TxNote(val message: String?, val gifUrl: String?) { - - init { - if (message == null && gifUrl == null) { - throw IllegalStateException("Both message and gifUrl can't ge null at the same time") - } - } - - val gifId: String? - get() = gifUrl?.split(Regex("/"))?.last() - - fun compose(): String = "${message ?: ""}${gifUrl?.run { " $this" } ?: ""}" - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - other as TxNote - if (message != other.message) return false - if (gifUrl != other.gifUrl) return false - return true - } - - override fun hashCode(): Int { - var result = message?.hashCode() ?: 0 - result = 31 * result + (gifUrl?.hashCode() ?: 0) - return result - } - - override fun toString(): String = "TransactionNote(message=$message, gifUrl=$gifUrl)" - - companion object { - fun fromTx(tx: Tx, assetsDomain: String = "giphy.com", protocol: String = "https://"): TxNote { - // The paymentId is a note value for one-sided txs, and message for interactive. But we can't properly check if a tx is OSP - val note = tx.note - val lines = note.split(Regex(" ")) - return if (Regex("$protocol$assetsDomain.*").matches(lines.last())) TxNote( - message = lines.take(lines.size - 1).filter(String::isNotEmpty) - .joinToString(separator = " ") - .let { it.ifEmpty { null } }, - gifUrl = lines.last() - ) else TxNote(note, null) - } - } -} diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyAdapter.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyAdapter.kt deleted file mode 100644 index 7ca2e19a9..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyAdapter.kt +++ /dev/null @@ -1,41 +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.common.giphy - -import android.content.Context -import com.giphy.sdk.ui.Giphy - -class GiphyAdapter(private val context: Context, private val key: String) { - - fun init() = Giphy.configure(context, key) -} diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyKeywordsRepository.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyKeywordsRepository.kt deleted file mode 100644 index 9ac0250bc..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/GiphyKeywordsRepository.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy - -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GiphyKeywordsRepository @Inject constructor() { - private val _words = listOf("money", "money machine", "rich") - private var _currentIndex = 0 - - fun getCurrent() : String = _words[_currentIndex] - - fun getNext() : String { - _currentIndex++ - if (_currentIndex >= _words.size) { - _currentIndex = 0 - } - return getCurrent() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GIFSearchException.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GIFSearchException.kt deleted file mode 100644 index 2f9c1f75d..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GIFSearchException.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.api - -class GIFSearchException(s: String?) : IllegalStateException(s) \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GiphyRESTGateway.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GiphyRESTGateway.kt deleted file mode 100644 index ffc203f77..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/GiphyRESTGateway.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.api - -import com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFResponse -import com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFsResponse -import retrofit2.Call -import retrofit2.http.GET -import retrofit2.http.Path -import retrofit2.http.Query - -interface GiphyRESTGateway { - - @GET("/v1/gifs/search") - fun searchGIFs(@Query("q") query: String, @Query("limit") limit: Int): Call - - @GET("/v1/gifs/{gif_id}") - fun getGIFByID(@Path("gif_id") id: String): Call - -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Data.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Data.kt deleted file mode 100644 index bef01932f..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Data.kt +++ /dev/null @@ -1,42 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class Data( - @Expose @SerializedName("id") val id: String, - @Expose @SerializedName("embed_url") val embedUrl: String, - @Expose @SerializedName("images") val images: Images -) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/ImageVariant.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/ImageVariant.kt deleted file mode 100644 index a2e0c0459..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/ImageVariant.kt +++ /dev/null @@ -1,38 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class ImageVariant(@Expose @SerializedName("url") val url: String) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Images.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Images.kt deleted file mode 100644 index 96e0a1c28..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Images.kt +++ /dev/null @@ -1,49 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class Images( - @Expose @SerializedName("original") val original: Original, - @Expose @SerializedName("fixed_height") val fixedHeight: ImageVariant, - @Expose @SerializedName("fixed_width") val fixedWidth: ImageVariant, - @Expose @SerializedName("fixed_height_small") val fixedHeightSmall: ImageVariant, - @Expose @SerializedName("fixed_width_small") val fixedWidthSmall: ImageVariant, - @Expose @SerializedName("fixed_height_downsampled") val fixedHeightDownsampled: ImageVariant, - @Expose @SerializedName("fixed_width_downsampled") val fixedWidthDownsampled: ImageVariant, - @Expose @SerializedName("downsized") val downsized: ImageVariant, - @Expose @SerializedName("downsized_small") val downsizedSmall: ImageVariant, - @Expose @SerializedName("preview_gif") val previewGif: ImageVariant, -) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Meta.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Meta.kt deleted file mode 100644 index 84ec10fad..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Meta.kt +++ /dev/null @@ -1,41 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class Meta( - @SerializedName("status") @Expose val status: Int, - @SerializedName("msg") @Expose val message: String -) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Original.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Original.kt deleted file mode 100644 index da5e1f63b..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/Original.kt +++ /dev/null @@ -1,38 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class Original(@Expose @SerializedName("url") val url: String) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFResponse.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFResponse.kt deleted file mode 100644 index b369b6984..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFResponse.kt +++ /dev/null @@ -1,41 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class SearchGIFResponse( - @SerializedName("data") @Expose val data: Data, - @SerializedName("meta") @Expose val meta: Meta -) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFsResponse.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFsResponse.kt deleted file mode 100644 index 8351f89b8..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/api/dto/SearchGIFsResponse.kt +++ /dev/null @@ -1,41 +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.common.giphy.api.dto - -import com.google.gson.annotations.Expose -import com.google.gson.annotations.SerializedName - -data class SearchGIFsResponse( - @SerializedName("data") @Expose val data: List, - @SerializedName("meta") @Expose val meta: Meta -) diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifColorPlaceholder.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifColorPlaceholder.kt deleted file mode 100644 index d2c337e79..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifColorPlaceholder.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.placeholder - -import android.graphics.drawable.Drawable -import androidx.annotation.ColorInt -import com.facebook.drawee.drawable.RoundedColorDrawable -import kotlin.math.abs - -class GifColorPlaceholder private constructor(@field:ColorInt @param:ColorInt private val color: Int, private val cornerRadius: Float) : - GifPlaceholder { - override fun asDrawable(): Drawable = RoundedColorDrawable(cornerRadius, color) - - companion object { - private const val DEFAULT_CORNER_RADIUS = 20f - private val BUILT_IN_COLORS = intArrayOf(-0xff481b, -0x1a25ad, -0x76d11b, -0xff1a77, -0x1aa3a4) - - @JvmOverloads - fun generate(target: Any, cornerRadius: Float = DEFAULT_CORNER_RADIUS): GifColorPlaceholder = - GifColorPlaceholder(BUILT_IN_COLORS[abs(target.hashCode()) % BUILT_IN_COLORS.size], cornerRadius) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifPlaceholder.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifPlaceholder.kt deleted file mode 100644 index 6bccd644c..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/placeholder/GifPlaceholder.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.placeholder - -import android.graphics.drawable.Drawable -import com.tari.android.wallet.ui.common.giphy.placeholder.GifColorPlaceholder.Companion.generate - -interface GifPlaceholder { - fun asDrawable(): Drawable - - companion object { - fun color(target: Any): GifPlaceholder = generate(target) - - fun color(target: Any, cornerRadius: Float): GifPlaceholder = generate(target, cornerRadius) - } -} - diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifState.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifState.kt deleted file mode 100644 index 59c6367ac..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifState.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.presentation - -import com.tari.android.wallet.ui.common.giphy.repository.GifItem - -sealed class GifState { - open fun handle(consumer: GifStateConsumer) = Unit - - data object LoadingState : GifState() { - override fun handle(consumer: GifStateConsumer) = consumer.onGifLoadingState() - } - - data object ResourceReady : GifState() { - override fun handle(consumer: GifStateConsumer) = consumer.onGifResourceReady() - } - - data object ErrorState : GifState() { - override fun handle(consumer: GifStateConsumer) = consumer.onGifErrorState() - } - - data class SuccessState(private val gifItem: GifItem) : GifState() { - override fun handle(consumer: GifStateConsumer) = consumer.onGifSuccessState(gifItem) - } - - data object NoGIFState : GifState() { - override fun handle(consumer: GifStateConsumer) = consumer.noGifState() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifStateConsumer.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifStateConsumer.kt deleted file mode 100644 index 64b7568a3..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifStateConsumer.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.presentation - -import com.tari.android.wallet.ui.common.giphy.repository.GifItem - -interface GifStateConsumer { - fun onGifLoadingState() - fun onGifResourceReady() - fun onGifErrorState() - fun onGifSuccessState(gifItem: GifItem) - fun noGifState() -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifViewModel.kt deleted file mode 100644 index 39ec5c905..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GifViewModel.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.presentation - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import com.tari.android.wallet.util.extension.addTo -import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.model.TxNote -import com.tari.android.wallet.ui.common.giphy.presentation.GifState.ErrorState -import com.tari.android.wallet.ui.common.giphy.presentation.GifState.LoadingState -import com.tari.android.wallet.ui.common.giphy.presentation.GifState.NoGIFState -import com.tari.android.wallet.ui.common.giphy.presentation.GifState.SuccessState -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService -import com.tari.android.wallet.ui.common.giphy.repository.GifItem -import io.reactivex.Observable -import io.reactivex.ObservableEmitter -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.schedulers.Schedulers -import io.reactivex.subjects.BehaviorSubject - -class GifViewModel(private val repository: GiphyRestService) { - private val compositeDisposable = CompositeDisposable() - private val subject = BehaviorSubject.create() - private val _gifState = MutableLiveData() - val gifState: LiveData get() = _gifState - - init { - _gifState.postValue(NoGIFState) - subject - .map(TxNote.Companion::fromTx) - .map { it.gifId ?: "" } - .switchMap { - if (it.isEmpty()) Observable.just(NoGIFState) - else Observable.create { e: ObservableEmitter -> retrieveGif(e, it) } - .map { state -> SuccessState(state) } - .onErrorReturn { ErrorState } - .startWith(LoadingState) - .subscribeOn(Schedulers.io()) - .doOnError { } - } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { _gifState.postValue(it) } - .addTo(compositeDisposable) - } - - private fun retrieveGif(e: ObservableEmitter, id: String) { - try { - e.onNext(repository.getById(id)) - } catch (exception: Throwable) { - e.tryOnError(exception) - } - } - - fun onNewTx(tx: Tx) = subject.onNext(tx) - - fun retry() { - subject.value?.let(subject::onNext) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GlideGifListener.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GlideGifListener.kt deleted file mode 100644 index ed22d7654..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/presentation/GlideGifListener.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.presentation - -import com.bumptech.glide.load.DataSource -import com.bumptech.glide.load.engine.GlideException -import com.bumptech.glide.load.resource.gif.GifDrawable -import com.bumptech.glide.request.RequestListener -import com.bumptech.glide.request.target.Target - -class GlideGifListener(private val consumer: GifStateConsumer) : RequestListener { - - override fun onLoadFailed( - e: GlideException?, - model: Any?, - target: Target, - isFirstResource: Boolean - ): Boolean { - consumer.onGifErrorState() - return true - } - - override fun onResourceReady( - resource: GifDrawable, - model: Any, - target: Target?, - dataSource: DataSource, - isFirstResource: Boolean - ): Boolean { - consumer.onGifResourceReady() - return false - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GifItem.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GifItem.kt deleted file mode 100644 index b3b47bbc0..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GifItem.kt +++ /dev/null @@ -1,46 +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.common.giphy.repository - -import android.net.Uri -import android.os.Parcelable -import kotlinx.parcelize.Parcelize - -@Parcelize -data class GifItem( - val id: String, - val embedUri: Uri, - val uri: Uri, -) : Parcelable { - override fun toString(): String = "GIFItem(id='$id', embedUri=$embedUri, uri=$uri)" -} diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRepository.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRepository.kt deleted file mode 100644 index 3d7722f98..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRepository.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.tari.android.wallet.ui.common.giphy.repository - -import android.net.Uri -import com.orhanobut.logger.Logger -import com.tari.android.wallet.ui.common.giphy.api.GIFSearchException -import com.tari.android.wallet.ui.common.giphy.api.GiphyRESTGateway -import com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFResponse -import com.tari.android.wallet.ui.common.giphy.api.dto.SearchGIFsResponse -import retrofit2.Response - -class GiphyRepository(private val gateway: GiphyRESTGateway) : GiphyRestService { - - private val logger - get() = Logger.t(GiphyRepository::class.simpleName) - - override fun getAll(query: String, limit: Int): List { - val response: Response = gateway.searchGIFs(query, limit).execute() - val body = response.body() - return if (response.isSuccessful && body != null && body.meta.status in 200..299) - body.data.map { GifItem(it.id, Uri.parse(it.embedUrl), Uri.parse(it.images.fixedWidth.url)) } - else { - val exception = GIFSearchException(body?.meta?.message ?: response.message() ?: response.errorBody()?.string()) - logger.i(exception.toString() + "Get all was failed") - throw exception - } - } - - override fun getById(id: String): GifItem { - val request = gateway.getGIFByID(id) - val response: Response = request.execute() - val body = response.body() - return if (response.isSuccessful && body != null && body.meta.status in 200..299) - body.data.let { GifItem(it.id, Uri.parse(it.embedUrl), Uri.parse(it.images.fixedWidth.url)) } - else { - val exception = GIFSearchException(body?.meta?.message ?: response.message() ?: response.errorBody()?.string()) - logger.i(exception.message.orEmpty()) - logger.i(exception.stackTraceToString()) - logger.i(exception. toString() + "Get by id was failed") - throw exception - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRestService.kt b/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRestService.kt deleted file mode 100644 index 9f7505371..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/common/giphy/repository/GiphyRestService.kt +++ /dev/null @@ -1,40 +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.common.giphy.repository - -interface GiphyRestService { - fun getAll(query: String, limit: Int): List - - fun getById(id: String): GifItem -} - diff --git a/app/src/main/java/com/tari/android/wallet/ui/component/tari/toolbar/TariToolbar.kt b/app/src/main/java/com/tari/android/wallet/ui/component/tari/toolbar/TariToolbar.kt index af87a0fe0..7910cf653 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/component/tari/toolbar/TariToolbar.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/component/tari/toolbar/TariToolbar.kt @@ -1,10 +1,10 @@ package com.tari.android.wallet.ui.component.tari.toolbar import android.content.Context +import android.content.res.Resources.getSystem import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout -import com.giphy.sdk.ui.utils.px import com.tari.android.wallet.R import com.tari.android.wallet.databinding.TariToolbarBinding import com.tari.android.wallet.util.extension.gone @@ -68,9 +68,9 @@ class TariToolbar(context: Context, attrs: AttributeSet) : FrameLayout(context, } // set the same margin for the both sides if toolbar actions are present - val maxMargin = 16.px + max(leftArgs.size, rightArgs.size) * 48.px - ui.toolbarTitle.setStartMargin(maxMargin - leftArgs.size * 48.px) - ui.toolbarTitle.setEndMargin(maxMargin - rightArgs.size * 48.px) + val maxMargin = 16.dp + max(leftArgs.size, rightArgs.size) * 48.dp + ui.toolbarTitle.setStartMargin(maxMargin - leftArgs.size * 48.dp) + ui.toolbarTitle.setEndMargin(maxMargin - rightArgs.size * 48.dp) } fun showRightActions() { @@ -88,4 +88,6 @@ class TariToolbar(context: Context, attrs: AttributeSet) : FrameLayout(context, fun hideLeftActions() { ui.toolbarLeftActions.gone() } + + val Int.dp: Int get() = (this / getSystem().displayMetrics.density).toInt() } \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/TxItem.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/TxItem.kt index d76fd7dde..a9d148e8b 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/TxItem.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/TxItem.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.giphy.sdk.analytics.GiphyPingbacks.context import com.tari.android.wallet.R import com.tari.android.wallet.application.walletManager.WalletConfig import com.tari.android.wallet.data.tx.TxDto @@ -142,7 +141,7 @@ fun TxDto.itemMessage(): String { } contact != null && contact.contactInfo.getAlias().isNotEmpty() || txUser.walletAddress.isUnknownUser() -> { - val alias = contact?.contactInfo?.getAlias().orEmpty().ifBlank { context.getString(R.string.unknown_source) } + val alias = contact?.contactInfo?.getAlias().orEmpty().ifBlank { stringResource(R.string.unknown_source) } when (tx.direction) { Tx.Direction.INBOUND -> stringResource(R.string.tx_list_sent_a_payment, alias) Tx.Direction.OUTBOUND -> stringResource(R.string.tx_list_you_paid_with_alias, alias) diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/pinCode/EnterPinCodeFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/pinCode/EnterPinCodeFragment.kt index 8da04809a..4578d45e8 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/pinCode/EnterPinCodeFragment.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/pinCode/EnterPinCodeFragment.kt @@ -127,6 +127,7 @@ class EnterPinCodeFragment : CommonXmlFragment(ChooseGIFDialogFragment.MEDIA_DELIVERY_KEY) ?: return - gifContainer.gifItem = media.let { - GifItem(it.id, Uri.parse(it.embedUrl), Uri.parse(it.images.original!!.gifUrl)) - } - updateSliderState() - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - gifContainer.save(outState) - } - - override fun onDestroyView() { - gifContainer.dispose() - super.onDestroyView() - } - @SuppressLint("ClickableViewAccessibility") - private fun setupUI(state: Bundle?) { - gifContainer = GifContainer(Glide.with(this), ui.gifContainerView, ui.gifImageView, ui.searchGiphyContainerView, state) - if (gifContainer.gifItem != null) changeScrollViewBottomConstraint(R.id.slide_button_container_view) - adapter = GifThumbnailAdapter(Glide.with(this), ::handleViewMoreGIFsIntent) { - if (gifContainer.isShown) { - changeScrollViewBottomConstraint(R.id.slide_button_container_view) - gifContainer.gifItem = it - updateSliderState() - } - } - + private fun setupUI() { displayAliasOrEmojiId() ui.progressBar.setWhite() ui.noteEditText.addTextChangedListener(afterTextChanged = { updateSliderState() }) @@ -183,18 +118,12 @@ class AddNoteFragment : CommonXmlFragment - private lateinit var searchSubscription: Disposable - - @Inject - lateinit var giphyKeywordsRepository: GiphyKeywordsRepository - - override fun onAttach(context: Context) { - super.onAttach(context) - DiContainer.appComponent.inject(this) - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - FragmentChooseGifBinding.inflate(inflater, container, false).also { ui = it }.root - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - val searchSubject = BehaviorSubject.create() - searchSubscription = searchSubject - .debounce(500L, TimeUnit.MILLISECONDS) - .map { it.ifEmpty { giphyKeywordsRepository.getCurrent() } } - .map { GPHContent.searchQuery(it, mediaType = MediaType.gif) } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { ui.giphyGridView.content = it } - setupUI(searchSubject) - } - - override fun onDestroyView() { - searchSubscription.dispose() - super.onDestroyView() - } - - private fun setupUI(observer: Observer) { - ui.giphyGridView.content = GPHContent.searchQuery(giphyKeywordsRepository.getCurrent(), MediaType.gif) - ui.giphyGridView.callback = object : GPHGridCallback { - override fun contentDidUpdate(resultCount: Int) = Unit - - override fun didSelectMedia(media: Media) { - val intent = Intent().apply { putExtra(MEDIA_DELIVERY_KEY, media) } - targetFragment!!.onActivityResult(targetRequestCode, Activity.RESULT_OK, intent) - behavior.state = BottomSheetBehavior.STATE_HIDDEN - } - } - ui.gifSearchEditText.addTextChangedListener(afterTextChanged = afterChanged@{ observer.onNext(it?.toString() ?: return@afterChanged) }) - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - BottomSheetDialog(requireContext(), R.style.ChooseGIFDialog) - .apply { setOnShowListener { setupDialog(this) } } - - private fun setupDialog(bottomSheetDialog: BottomSheetDialog) { - val bottomSheet: View = bottomSheetDialog.findViewById(R.id.design_bottom_sheet)!! - behavior = BottomSheetBehavior() - behavior.isHideable = true - behavior.skipCollapsed = true - behavior.state = BottomSheetBehavior.STATE_HIDDEN - val layoutParams = bottomSheet.layoutParams as CoordinatorLayout.LayoutParams - layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT - layoutParams.behavior = behavior - bottomSheetDialog.setOnKeyListener { _, keyCode, _ -> - (keyCode == KeyEvent.KEYCODE_BACK && behavior.state != BottomSheetBehavior.STATE_HIDDEN && - behavior.state != BottomSheetBehavior.STATE_COLLAPSED).also { - if (it) behavior.state = BottomSheetBehavior.STATE_HIDDEN - } - } - ui.root.doOnNextLayout { - behavior.state = BottomSheetBehavior.STATE_EXPANDED - behavior.addCallback( - onStateChange = { _, state -> - if (state == BottomSheetBehavior.STATE_HIDDEN || state == BottomSheetBehavior.STATE_COLLAPSED) dismiss() - }, - onSlided = { _, slideOffset -> - val alpha = (slideOffset.coerceIn(0F, 1F) * 255).toInt() - val color = Color.argb(alpha, 0, 0, 0) - (bottomSheet.parent as View).setBackgroundColor(color) - } - ) - } - } - - private fun BottomSheetBehavior<*>.addCallback( - onStateChange: (View, Int) -> Unit = { _, _ -> }, - onSlided: (View, Float) -> Unit = { _, _ -> }, - ) = addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { - override fun onStateChanged(bottomSheet: View, newState: Int) = onStateChange(bottomSheet, newState) - - override fun onSlide(bottomSheet: View, slideOffset: Float) = onSlided(bottomSheet, slideOffset) - }) - - companion object { - @Suppress("DEPRECATION") - fun newInstance() = ChooseGIFDialogFragment() - const val MEDIA_DELIVERY_KEY = "key_media" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimation.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimation.kt deleted file mode 100644 index 1ada3cce8..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimation.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import android.animation.ValueAnimator -import android.view.View -import com.tari.android.wallet.util.extension.removeListenersAndCancel - -class GIFsPanelAnimation(private val view: View) { - private var state = GIFsPanelAnimationState(TranslationDirection.UP, null) - val isViewShown - get() = state.direction == TranslationDirection.UP - - fun show() { - state.animator?.cancel() - state = createState(TranslationDirection.UP, to = 0F) - } - - fun hide() { - state.animator?.cancel() - state = createState(TranslationDirection.DOWN, to = view.height.toFloat()) - } - - private fun createState(direction: TranslationDirection, to: Float) = - GIFsPanelAnimationState(direction, ValueAnimator.ofFloat(view.translationY, to).apply { - duration = TRANSLATION_DURATION - addUpdateListener { - view.translationY = it.animatedValue as Float - } - start() - }) - - fun dispose() { - this.state.animator?.removeListenersAndCancel() - } - - private companion object { - private const val TRANSLATION_DURATION = 300L - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimationState.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimationState.kt deleted file mode 100644 index 9643226b0..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GIFsPanelAnimationState.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import android.animation.Animator - -data class GIFsPanelAnimationState(val direction: TranslationDirection, val animator: Animator?) \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifContainer.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifContainer.kt deleted file mode 100644 index 2be26ab8c..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifContainer.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import android.os.Bundle -import android.view.View -import android.widget.ImageView -import com.bumptech.glide.RequestManager -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestOptions -import com.tari.android.wallet.ui.common.giphy.placeholder.GifPlaceholder -import com.tari.android.wallet.ui.common.giphy.repository.GifItem -import com.tari.android.wallet.util.extension.gone -import com.tari.android.wallet.util.extension.parcelable -import com.tari.android.wallet.util.extension.visible - -class GifContainer( - private val glide: RequestManager, - private val gifContainerView: View, - private val gifView: ImageView, - thumbnailsContainer: View, - state: Bundle? -) { - - private val transformation = RequestOptions().transform(RoundedCorners(10)) - private var animation = GIFsPanelAnimation(thumbnailsContainer) - - val isShown: Boolean - get() = animation.isViewShown - - var gifItem: GifItem? = null - set(value) { - field = value - if (value == null) { - glide.clear(gifView) - showContainer() - } else { - showGif() - glide.asGif() - .placeholder(GifPlaceholder.color(value).asDrawable()) - .apply(transformation) - .load(value.uri) - .transition(DrawableTransitionOptions.withCrossFade(250)) - .into(gifView) - } - } - - init { - gifItem = state?.parcelable(ThumbnailGifViewModel.KEY_GIF) - } - - private fun showContainer() { - animation.show() - gifContainerView.gone() - } - - private fun showGif() { - animation.hide() - gifContainerView.visible() - } - - fun save(bundle: Bundle) { - gifItem?.run { bundle.putParcelable(ThumbnailGifViewModel.KEY_GIF, this) } - } - - fun dispose() { - animation.dispose() - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifThumbnailAdapter.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifThumbnailAdapter.kt deleted file mode 100644 index c9b28f2b4..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/GifThumbnailAdapter.kt +++ /dev/null @@ -1,89 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.RequestManager -import com.bumptech.glide.load.resource.bitmap.CenterCrop -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestOptions -import com.tari.android.wallet.R -import com.tari.android.wallet.util.extension.repopulate -import com.tari.android.wallet.ui.common.giphy.placeholder.GifPlaceholder -import com.tari.android.wallet.ui.common.giphy.repository.GifItem -import com.tari.android.wallet.ui.screen.send.addNote.gif.GifThumbnailAdapter.GIFThumbnailViewHolder - -class GifThumbnailAdapter( - private val glide: RequestManager, - private val onShowMoreClick: () -> Unit, - private val onGifClick: (GifItem) -> Unit -) : RecyclerView.Adapter() { - - private val gifs = mutableListOf() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GIFThumbnailViewHolder = - if (viewType == VIEW_TYPE_MORE) - parent.inflate(R.layout.item_show_more_gifs) - .run { ShowMoreViewHolder(this, onShowMoreClick) } - else parent.inflate(R.layout.item_thumbnail_gif) - .run { GIFViewHolder(this, glide, onGifClick) } - - private fun ViewGroup.inflate(id: Int) = LayoutInflater.from(context) - .inflate(id, this, false) - - override fun onBindViewHolder(holder: GIFThumbnailViewHolder, position: Int) = - holder.bind(position, gifs) - - override fun getItemCount(): Int = if (gifs.size == 0) 0 else gifs.size + 1 - - override fun getItemViewType(position: Int) = - if (position == gifs.size) VIEW_TYPE_MORE else VIEW_TYPE_GIF - - fun repopulate(gifs: Iterable) { - this.gifs.repopulate(gifs) - super.notifyDataSetChanged() - } - - private companion object { - private const val VIEW_TYPE_GIF = 0 - private const val VIEW_TYPE_MORE = 1 - } - - abstract class GIFThumbnailViewHolder(view: View) : RecyclerView.ViewHolder(view) { - abstract fun bind(position: Int, gifItems: List) - } - - class GIFViewHolder( - view: View, - private val glide: RequestManager, - private val onGifClick: (GifItem) -> Unit - ) : - GIFThumbnailViewHolder(view) { - - private val imageView = view.findViewById(R.id.image_view) - - override fun bind(position: Int, gifItems: List) { - val gif = gifItems[position] - itemView.setOnClickListener { onGifClick(gif) } - glide.asGif() - .load(gif.uri) - .placeholder(GifPlaceholder.color(position).asDrawable()) - .apply(RequestOptions().transform(CenterCrop(), RoundedCorners(24))) - .transition(DrawableTransitionOptions.withCrossFade(250)) - .into(imageView) - } - } - - class ShowMoreViewHolder(view: View, onClick: () -> Unit) : GIFThumbnailViewHolder(view) { - - init { - view.setOnClickListener { onClick() } - } - - override fun bind(position: Int, gifItems: List) { - - } - } -} diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/HorizontalInnerMarginDecoration.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/HorizontalInnerMarginDecoration.kt deleted file mode 100644 index 145104d71..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/HorizontalInnerMarginDecoration.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import android.graphics.Rect -import android.view.View -import androidx.recyclerview.widget.RecyclerView - -class HorizontalInnerMarginDecoration(private val value: Int) : RecyclerView.ItemDecoration() { - - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - if (parent.getChildLayoutPosition(view) > 0) outRect.left = value - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/ThumbnailGifViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/ThumbnailGifViewModel.kt deleted file mode 100644 index f7008b626..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/ThumbnailGifViewModel.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import com.tari.android.wallet.ui.common.CommonViewModel -import com.tari.android.wallet.ui.common.giphy.GiphyKeywordsRepository -import com.tari.android.wallet.ui.common.giphy.repository.GifItem -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import javax.inject.Inject - -class ThumbnailGifViewModel : CommonViewModel() { - - init { - component.inject(this) - } - - @Inject - lateinit var gifsRepository: GiphyRestService - - @Inject - lateinit var giphyKeywordsRepository: GiphyKeywordsRepository - - - private val _state = MutableLiveData() - val state: LiveData get() = _state - - init { - fetchGIFs() - } - - private fun fetchGIFs() { - viewModelScope.launch(Dispatchers.Main) { - _state.value = GifsState() - try { - val gifs = withContext(Dispatchers.IO) { - gifsRepository.getAll(giphyKeywordsRepository.getNext(), THUMBNAIL_REQUEST_LIMIT) - } - _state.value = GifsState(gifs) - } catch (e: Exception) { - _state.value = GifsState(e) - } - } - } - - class GifsState private constructor(val gifItems: List?, val error: Exception?) { - // Loading state - constructor() : this(null, null) - constructor(gifItems: List) : this(gifItems, null) - constructor(e: Exception) : this(null, e) - - val isError get() = error != null - val isSuccessful get() = gifItems != null - } - - companion object { - const val KEY_GIF = "key_gif" - const val REQUEST_CODE_GIF = 1535 - const val THUMBNAIL_REQUEST_LIMIT = 20 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/TranslationDirection.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/TranslationDirection.kt deleted file mode 100644 index 974df00b7..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/send/addNote/gif/TranslationDirection.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.tari.android.wallet.ui.screen.send.addNote.gif - -enum class TranslationDirection { UP, DOWN } \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/CommonTxListViewHolder.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/CommonTxListViewHolder.kt deleted file mode 100644 index 8f0d8f759..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/CommonTxListViewHolder.kt +++ /dev/null @@ -1,171 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.adapter - -import androidx.viewbinding.ViewBinding -import com.tari.android.wallet.R -import com.tari.android.wallet.application.walletManager.WalletConfig -import com.tari.android.wallet.data.contacts.model.ContactDto -import com.tari.android.wallet.databinding.ViewAddressShortSmallBinding -import com.tari.android.wallet.model.TxStatus -import com.tari.android.wallet.model.tx.CancelledTx -import com.tari.android.wallet.model.tx.CompletedTx -import com.tari.android.wallet.model.tx.PendingInboundTx -import com.tari.android.wallet.model.tx.PendingOutboundTx -import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.ui.common.domain.PaletteManager -import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolder -import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolderItem -import com.tari.android.wallet.ui.component.tari.TariTextView -import com.tari.android.wallet.ui.component.tari.background.TariRoundBackground -import com.tari.android.wallet.util.addressFirstEmojis -import com.tari.android.wallet.util.addressLastEmojis -import com.tari.android.wallet.util.addressPrefixEmojis -import com.tari.android.wallet.util.extension.gone -import com.tari.android.wallet.util.extension.makeTextBold -import com.tari.android.wallet.util.extension.safeCastTo -import com.tari.android.wallet.util.extension.string -import com.tari.android.wallet.util.extension.visible -import org.joda.time.DateTime -import org.joda.time.Hours -import org.joda.time.LocalDate -import org.joda.time.Minutes -import java.util.Locale - -abstract class CommonTxListViewHolder(val view: VB) : CommonViewHolder(view) { - - protected fun displayAliasOrEmojiId( - tx: Tx, - contact: ContactDto?, - participantTextView1: TariTextView, - participantTextView2: TariTextView, - emojiIdViewContainer: ViewAddressShortSmallBinding - ) { - val txUser = tx.tariContact - // display contact name or emoji id - when { - tx.isCoinbase -> { - participantTextView1.visible() - participantTextView2.gone() - emojiIdViewContainer.root.gone() - participantTextView1.text = string(R.string.tx_details_coinbase, tx.safeCastTo()?.minedHeight ?: "--") - } - - contact != null && contact.contactInfo.getAlias().isNotEmpty() || txUser.walletAddress.isUnknownUser() -> { - val alias = contact?.contactInfo?.getAlias().orEmpty().ifBlank { itemView.context.getString(R.string.unknown_source) } - val fullText = when (tx.direction) { - Tx.Direction.INBOUND -> string(R.string.tx_list_sent_a_payment, alias) - Tx.Direction.OUTBOUND -> string(R.string.tx_list_you_paid_with_alias, alias) - } - participantTextView1.visible() - participantTextView1.text = fullText.makeTextBold(itemView.context, string(R.string.tx_list_you), alias) - participantTextView2.gone() - emojiIdViewContainer.root.gone() - } - - tx.isOneSided -> { - val title = (string(R.string.tx_list_someone) + " " + string(R.string.tx_list_paid_you)) - .makeTextBold(itemView.context, string(R.string.tx_list_you), string(R.string.tx_list_someone)) - participantTextView1.visible() - participantTextView1.text = title - participantTextView2.gone() - emojiIdViewContainer.root.gone() - } - - else -> { // display emoji id - emojiIdViewContainer.root.visible() - emojiIdViewContainer.textViewEmojiPrefix.text = txUser.walletAddress.addressPrefixEmojis() - emojiIdViewContainer.textViewEmojiFirstPart.text = txUser.walletAddress.addressFirstEmojis() - emojiIdViewContainer.textViewEmojiLastPart.text = txUser.walletAddress.addressLastEmojis() - - when (tx.direction) { - Tx.Direction.INBOUND -> { - participantTextView1.gone() - participantTextView2.visible() - participantTextView2.text = string(R.string.tx_list_paid_you).makeTextBold(itemView.context, string(R.string.tx_list_you)) - } - - Tx.Direction.OUTBOUND -> { - participantTextView1.visible() - participantTextView1.text = string(R.string.tx_list_you_paid).makeTextBold(itemView.context, string(R.string.tx_list_you)) - participantTextView2.gone() - } - } - } - } - } - - protected fun displayAmount(tx: Tx, amountTextView: TariTextView, amountTextViewRound: TariRoundBackground) { - val amount = WalletConfig.amountFormatter.format(tx.amount.tariValue) - val context = itemView.context - val (amountText, textColor, backgroundColor) = when { - tx is CancelledTx -> Triple( - amount, - PaletteManager.getTextBody(context), - PaletteManager.getBackgroundPrimary(context) - ) - - tx is PendingInboundTx -> Triple( - "+$amount", - PaletteManager.getYellow(context), - PaletteManager.getSecondaryYellow(context) - ) - - tx is PendingOutboundTx -> Triple( - "-$amount", - PaletteManager.getYellow(context), - PaletteManager.getSecondaryYellow(context) - ) - - tx is CompletedTx && tx.status == TxStatus.MINED_UNCONFIRMED -> Triple( - when (tx.direction) { - Tx.Direction.OUTBOUND -> "-$amount" - Tx.Direction.INBOUND -> "+$amount" - }, - PaletteManager.getYellow(context), - PaletteManager.getSecondaryYellow(context) - ) - - tx.direction == Tx.Direction.INBOUND -> Triple( - "+$amount", - PaletteManager.getGreen(context), - PaletteManager.getSecondaryGreen(context) - ) - - else -> Triple( - "-$amount", - PaletteManager.getRed(context), - PaletteManager.getSecondaryRed(context) - ) - } - amountTextView.text = amountText - amountTextView.setTextColor(textColor) - amountTextViewRound.updateBack(backColor = backgroundColor) - val measure = amountTextView.paint.measureText("0".repeat(amountTextView.text.length)) - val totalPadding = amountTextView.paddingStart + amountTextView.paddingEnd - amountTextView.width = totalPadding + measure.toInt() - } - - protected fun displayDate(tx: Tx, dateTextView: TariTextView) { - val txDateTime = DateTime(tx.timestamp.toLong() * 1000L) - val txDate = txDateTime.toLocalDate() - val todayDate = LocalDate.now() - val yesterdayDate = todayDate.minusDays(1) - dateTextView.text = when { - txDate.isEqual(todayDate) -> { - val minutesSinceTx = Minutes.minutesBetween(txDateTime, DateTime.now()).minutes - when { - minutesSinceTx == 0 -> string(R.string.tx_list_now) - minutesSinceTx < 60 -> String.format(string(R.string.tx_list_minutes_ago), minutesSinceTx) - else -> String.format(string(R.string.tx_list_hours_ago), Hours.hoursBetween(txDateTime, DateTime.now()).hours) - } - } - - txDate.isEqual(yesterdayDate) -> string(R.string.home_tx_list_header_yesterday) - else -> txDate.toString(DATE_FORMAT, Locale.ENGLISH) - } - } - - companion object { - // e.g. Wed, Jun 2 - private const val DATE_FORMAT = "E, MMM d" - } -} diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListAdapter.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListAdapter.kt deleted file mode 100644 index 4f2c48907..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListAdapter.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.adapter - -import com.tari.android.wallet.ui.common.recyclerView.CommonAdapter -import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolderItem -import com.tari.android.wallet.ui.common.recyclerView.ViewHolderBuilder -import com.tari.android.wallet.ui.common.recyclerView.viewHolders.TitleViewHolder - -class TxListAdapter : CommonAdapter() { - override var viewHolderBuilders: List = listOf( - TitleViewHolder.getBuilder(), - TxListViewHolder.getBuilder(), - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListViewHolder.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListViewHolder.kt deleted file mode 100644 index 567b44f6b..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxListViewHolder.kt +++ /dev/null @@ -1,139 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.adapter - -import android.content.Context -import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestOptions -import com.bumptech.glide.request.target.Target -import com.tari.android.wallet.R -import com.tari.android.wallet.databinding.ItemTxListBinding -import com.tari.android.wallet.model.TxNote -import com.tari.android.wallet.model.TxStatus.BROADCAST -import com.tari.android.wallet.model.TxStatus.COINBASE -import com.tari.android.wallet.model.TxStatus.COINBASE_CONFIRMED -import com.tari.android.wallet.model.TxStatus.COINBASE_NOT_IN_BLOCKCHAIN -import com.tari.android.wallet.model.TxStatus.COINBASE_UNCONFIRMED -import com.tari.android.wallet.model.TxStatus.COMPLETED -import com.tari.android.wallet.model.TxStatus.IMPORTED -import com.tari.android.wallet.model.TxStatus.MINED_CONFIRMED -import com.tari.android.wallet.model.TxStatus.MINED_UNCONFIRMED -import com.tari.android.wallet.model.TxStatus.ONE_SIDED_CONFIRMED -import com.tari.android.wallet.model.TxStatus.ONE_SIDED_UNCONFIRMED -import com.tari.android.wallet.model.TxStatus.PENDING -import com.tari.android.wallet.model.TxStatus.QUEUED -import com.tari.android.wallet.model.TxStatus.REJECTED -import com.tari.android.wallet.model.TxStatus.TX_NULL_ERROR -import com.tari.android.wallet.model.TxStatus.UNKNOWN -import com.tari.android.wallet.model.tx.CancelledTx -import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.model.tx.Tx.Direction.INBOUND -import com.tari.android.wallet.model.tx.Tx.Direction.OUTBOUND -import com.tari.android.wallet.ui.common.giphy.presentation.GifStateConsumer -import com.tari.android.wallet.ui.common.giphy.presentation.GlideGifListener -import com.tari.android.wallet.ui.common.giphy.repository.GifItem -import com.tari.android.wallet.ui.common.recyclerView.ViewHolderBuilder -import com.tari.android.wallet.util.extension.dimen -import com.tari.android.wallet.util.extension.gone -import com.tari.android.wallet.util.extension.setTopMargin -import com.tari.android.wallet.util.extension.setVisible -import com.tari.android.wallet.util.extension.string -import com.tari.android.wallet.util.extension.visible - -class TxListViewHolder(view: ItemTxListBinding) : CommonTxListViewHolder(view), GifStateConsumer { - - private val glide = Glide.with(itemView.context) - private lateinit var tx: Tx - - override fun bind(item: TxViewHolderItem) { - super.bind(item) - - with(item.txDto.tx) { - this@TxListViewHolder.tx = this - displayAliasOrEmojiId(this, item.txDto.contact, ui.participantTextView1, ui.participantTextView2, ui.emojiIdViewContainer) - displayAmount(this, ui.amountTextView, ui.amountTextViewRound) - displayDate(this, ui.dateTextView) - displayStatus(this) - displayMessage(this) - } - - item.gifViewModel.onNewTx(tx) - ui.gifContainer.retryLoadingGifTextView.setOnClickListener { item.gifViewModel.retry() } - item.gifViewModel.gifState.observeForever { it.handle(this) } - } - - private fun displayStatus(tx: Tx) { - val status = tx.statusString(context = itemView.context) - ui.statusTextView.setVisible(status.isNotEmpty()) - ui.statusTextView.text = status - } - - private fun displayMessage(tx: Tx) { - val note = TxNote.fromTx(tx) - if (note.message.isNullOrBlank() || tx.isCoinbase) { // FIXME: we temporarily hide the message for coinbase txs because it's always "None" - ui.messageTextView.gone() - } else { - ui.messageTextView.visible() - ui.messageTextView.text = note.message - } - } - - private fun Tx.statusString(context: Context): String { - return if (this is CancelledTx) "" else when (this.status) { - PENDING -> when (this.direction) { - INBOUND -> context.string(R.string.tx_detail_waiting_for_sender_to_complete) - OUTBOUND -> context.string(R.string.tx_detail_waiting_for_recipient) - } - - BROADCAST, COMPLETED, MINED_UNCONFIRMED -> context.string(R.string.tx_detail_in_progress) - - TX_NULL_ERROR, IMPORTED, COINBASE, MINED_CONFIRMED, REJECTED, ONE_SIDED_UNCONFIRMED, ONE_SIDED_CONFIRMED, QUEUED, COINBASE_UNCONFIRMED, - COINBASE_CONFIRMED, COINBASE_NOT_IN_BLOCKCHAIN, UNKNOWN -> "" - } - } - - override fun onGifLoadingState() { - glide.clear(ui.gifContainer.gifView) - ui.gifContainer.gifStatusContainer.visible() - ui.gifContainer.loadingGifTextView.visible() - ui.gifContainer.retryLoadingGifTextView.gone() - ui.gifContainer.loadingGifProgressBar.visible() - ui.gifContainer.gifView.gone() - ui.gifContainer.gifView.setTopMargin(0) - } - - override fun onGifErrorState() { - ui.gifContainer.gifStatusContainer.visible() - ui.gifContainer.loadingGifProgressBar.gone() - ui.gifContainer.loadingGifTextView.gone() - ui.gifContainer.retryLoadingGifTextView.visible() - } - - override fun onGifSuccessState(gifItem: GifItem) { - glide - .asGif() - .override(ui.gifContainer.gifContainerRootView.width, Target.SIZE_ORIGINAL) - .apply(RequestOptions().transform(RoundedCorners(10))) - .load(gifItem.uri) - .listener(GlideGifListener(this)) - .transition(DrawableTransitionOptions.withCrossFade(250)) - .into(ui.gifContainer.gifView) - } - - override fun onGifResourceReady() { - ui.gifContainer.gifStatusContainer.gone() - ui.gifContainer.gifView.visible() - ui.gifContainer.gifView.setTopMargin(dimen(R.dimen.tx_list_item_gif_container_top_margin)) - } - - override fun noGifState() { - glide.clear(ui.gifContainer.gifView) - ui.gifContainer.gifView.gone() - ui.gifContainer.gifStatusContainer.gone() - } - - companion object { - fun getBuilder(): ViewHolderBuilder = - ViewHolderBuilder(ItemTxListBinding::inflate, TxViewHolderItem::class.java) { TxListViewHolder(it as ItemTxListBinding) } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxViewHolderItem.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxViewHolderItem.kt deleted file mode 100644 index 5d71870e7..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/adapter/TxViewHolderItem.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.adapter - -import com.tari.android.wallet.data.tx.TxDto -import com.tari.android.wallet.ui.common.giphy.presentation.GifViewModel -import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolderItem - -data class TxViewHolderItem( - val txDto: TxDto, - val gifViewModel: GifViewModel, // TODO try not to pass the repo as a param, but as an injection. This possible causes memory leaks!! -) : CommonViewHolderItem() { - - override val viewHolderUUID: String = "TransactionItem$txDto" - - fun contains(searchQuery: String): Boolean = txDto.tx.tariContact.walletAddress.fullEmojiId.contains(searchQuery, ignoreCase = true) - || txDto.tx.tariContact.walletAddress.fullBase58.contains(searchQuery, ignoreCase = true) - || txDto.tx.tariContact.alias.contains(searchQuery, ignoreCase = true) - || txDto.tx.message.contains(searchQuery, ignoreCase = true) - || txDto.tx.paymentId.contains(searchQuery, ignoreCase = true) - || txDto.tx.amount.formattedTariValue.contains(searchQuery, ignoreCase = true) - || txDto.tx.amount.formattedValue.contains(searchQuery, ignoreCase = true) - || txDto.contact?.contactInfo?.getAlias()?.contains(searchQuery, ignoreCase = true) ?: false -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/details/TxDetailsScreen.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/details/TxDetailsScreen.kt index 7e60a82c9..7ab24639a 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/details/TxDetailsScreen.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/details/TxDetailsScreen.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.unit.dp import com.tari.android.wallet.R import com.tari.android.wallet.application.walletManager.WalletConfig import com.tari.android.wallet.model.TxStatus +import com.tari.android.wallet.model.tx.CompletedTx import com.tari.android.wallet.ui.compose.TariDesignSystem import com.tari.android.wallet.ui.compose.components.TariPrimaryButton import com.tari.android.wallet.ui.compose.components.TariTextButton @@ -35,6 +36,7 @@ import com.tari.android.wallet.ui.screen.tx.details.widget.TxDetailInfoItem import com.tari.android.wallet.ui.screen.tx.details.widget.TxDetailInfoStatusItem import com.tari.android.wallet.util.MockDataStub import com.tari.android.wallet.util.extension.isTrue +import com.tari.android.wallet.util.extension.safeCastTo @Composable fun TxDetailsScreen( @@ -98,7 +100,7 @@ fun TxDetailsScreen( .fillMaxWidth() .padding(horizontal = 24.dp), alias = when { - coinbase -> stringResource(R.string.tx_details_coinbase) + coinbase -> stringResource(R.string.tx_details_coinbase, uiState.tx.safeCastTo()?.minedHeight ?: "--") unknownUser -> stringResource(R.string.unknown_source) else -> contact.alias }, diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt index c27302cc7..43c5428a6 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/TxHistoryScreen.kt @@ -198,7 +198,7 @@ private fun TxHistoryScreenPreview() { @Composable @Preview private fun TxHistoryScreenEmptyPreview() { - TariDesignSystem(TariTheme.Dark) { + TariDesignSystem(TariTheme.Light) { TxHistoryScreen( uiState = TxHistoryViewModel.UiState( pendingTxs = emptyList(), @@ -234,7 +234,7 @@ private fun TxHistoryContactScreenPreview() { @Composable @Preview private fun TxHistoryContactScreenEmptyPreview() { - TariDesignSystem(TariTheme.Dark) { + TariDesignSystem(TariTheme.Light) { TxHistoryScreen( uiState = TxHistoryViewModel.UiState( pendingTxs = emptyList(), diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryFragment.kt deleted file mode 100644 index 49d811b7f..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryFragment.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.all - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.widget.SearchView -import androidx.fragment.app.viewModels -import androidx.recyclerview.widget.LinearLayoutManager -import com.tari.android.wallet.databinding.FragmentAllTransactionHistoryBinding -import com.tari.android.wallet.ui.common.CommonXmlFragment -import com.tari.android.wallet.ui.common.recyclerView.CommonAdapter -import com.tari.android.wallet.ui.screen.tx.adapter.TxListAdapter -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem -import com.tari.android.wallet.util.extension.collectFlow -import com.tari.android.wallet.util.extension.setVisible - -class AllTxHistoryFragment : CommonXmlFragment() { - - private var adapter = TxListAdapter() - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - FragmentAllTransactionHistoryBinding.inflate(inflater, container, false).apply { ui = this }.root - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val viewModel: AllTxHistoryViewModel by viewModels() - bindViewModel(viewModel) - - initUI() - observeUI() - } - - private fun observeUI() { - collectFlow(viewModel.uiState) { state -> - ui.searchFullContainer.setVisible(state.searchBarVisible) - ui.emptyState.setVisible(state.txEmptyStateVisible) - ui.list.setVisible(state.txListVisible) - adapter.update(state.sortedTxList) - adapter.notifyDataSetChanged() - ui.list.smoothScrollToPosition(0) - } - } - - private fun initUI() = with(ui) { - list.adapter = adapter - list.layoutManager = LinearLayoutManager(context) - requestTariButton.setOnClickListener { viewModel.onRequestTariClick() } - - adapter.setClickListener(CommonAdapter.ItemClickListener { item -> - if (item is TxViewHolderItem) { - viewModel.onTransactionClick(item.txDto.tx) - } - }) - - ui.searchView.setIconifiedByDefault(false) - - ui.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextChange(newText: String?): Boolean { - viewModel.doSearch(newText.orEmpty()) - return true - } - - override fun onQueryTextSubmit(query: String?): Boolean = true - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryModel.kt deleted file mode 100644 index 7db4420e3..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryModel.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.all - -import com.tari.android.wallet.ui.common.recyclerView.CommonViewHolderItem -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem - -class AllTxHistoryModel { - data class UiState( - private val allTxList: List = emptyList(), - val searchQuery: String = "", - ) { - val sortedTxList - get() = searchQuery.trim().takeIf { it.isNotBlank() }?.let { query -> - allTxList.filterIsInstance() - .filter { it.contains(query) } - } ?: allTxList - - val searchBarVisible - get() = searchQuery.trim().isNotBlank() || sortedTxList.isNotEmpty() - val txEmptyStateVisible - get() = searchQuery.trim().isBlank() && sortedTxList.isEmpty() - val txListVisible - get() = sortedTxList.isNotEmpty() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt deleted file mode 100644 index d2f7c1500..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/all/AllTxHistoryViewModel.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.all - -import com.tari.android.wallet.R -import com.tari.android.wallet.data.tx.TxRepository -import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.navigation.Navigation -import com.tari.android.wallet.ui.common.CommonViewModel -import com.tari.android.wallet.ui.common.giphy.presentation.GifViewModel -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService -import com.tari.android.wallet.ui.common.recyclerView.items.TitleViewHolderItem -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem -import com.tari.android.wallet.util.extension.collectFlow -import com.tari.android.wallet.util.extension.zipToPair -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import javax.inject.Inject - -class AllTxHistoryViewModel : CommonViewModel() { - - @Inject - lateinit var txRepository: TxRepository - - @Inject - lateinit var giphyRestService: GiphyRestService - - private val _uiState = MutableStateFlow(AllTxHistoryModel.UiState()) - val uiState = _uiState.asStateFlow() - - init { - component.inject(this) - - collectFlow(txRepository.pendingTxs.zipToPair(txRepository.nonPendingTxs)) { (pendingTxs, nonPendingTxs) -> - _uiState.update { uiState -> - uiState.copy( - allTxList = listOfNotNull( - TitleViewHolderItem( - title = resourceManager.getString(R.string.home_pending_transactions_title), - isFirst = true, - ).takeIf { pendingTxs.isNotEmpty() }, - *pendingTxs.map { txDto -> - TxViewHolderItem( - txDto = txDto, - gifViewModel = GifViewModel(giphyRestService), - ) - }.toTypedArray(), - - TitleViewHolderItem( - title = resourceManager.getString(R.string.home_completed_transactions_title), - isFirst = pendingTxs.isEmpty(), - ).takeIf { nonPendingTxs.isNotEmpty() }, - *nonPendingTxs.map { txDto -> - TxViewHolderItem( - txDto = txDto, - gifViewModel = GifViewModel(giphyRestService), - ) - }.toTypedArray(), - ) - ) - } - } - } - - fun doSearch(query: String) { - _uiState.update { it.copy(searchQuery = query) } - } - - fun onTransactionClick(tx: Tx) { - tariNavigator.navigate(Navigation.TxList.ToTxDetails(tx)) - } - - fun onRequestTariClick() { - tariNavigator.navigate(Navigation.AllSettings.ToRequestTari) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryFragment.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryFragment.kt deleted file mode 100644 index 95c45a815..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryFragment.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.contact - -import android.os.Bundle -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.data.contacts.model.ContactDto -import com.tari.android.wallet.databinding.FragmentContactTransactionHistoryBinding -import com.tari.android.wallet.navigation.TariNavigator -import com.tari.android.wallet.ui.common.CommonXmlFragment -import com.tari.android.wallet.ui.common.recyclerView.CommonAdapter -import com.tari.android.wallet.ui.screen.tx.adapter.TxListAdapter -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem -import com.tari.android.wallet.util.addressFirstEmojis -import com.tari.android.wallet.util.addressLastEmojis -import com.tari.android.wallet.util.addressPrefixEmojis -import com.tari.android.wallet.util.extension.collectFlow -import com.tari.android.wallet.util.extension.gone -import com.tari.android.wallet.util.extension.setVisible -import com.tari.android.wallet.util.extension.visible -import yat.android.ui.extension.HtmlHelper - -class ContactTxHistoryFragment : CommonXmlFragment() { - - private var adapter = TxListAdapter() - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - FragmentContactTransactionHistoryBinding.inflate(inflater, container, false).apply { ui = this }.root - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val viewModel: ContactTxHistoryViewModel by viewModels() - bindViewModel(viewModel) - - initUI() - observeUI() - } - - private fun observeUI() { - collectFlow(viewModel.uiState) { uiState -> - ui.list.setVisible(uiState.txList.isNotEmpty()) - ui.descriptionViewContainer.setVisible(uiState.txList.isNotEmpty()) - ui.emptyState.setVisible(uiState.txList.isEmpty()) - - adapter.update(uiState.txList) - adapter.notifyDataSetChanged() - } - } - - private fun initUI() = with(ui) { - list.adapter = adapter - list.layoutManager = LinearLayoutManager(context) - - adapter.setClickListener(CommonAdapter.ItemClickListener { item -> - if (item is TxViewHolderItem) { - viewModel.onTransactionClick(item.txDto.tx) - } - }) - - sendTariButton.setOnClickListener { - viewModel.onSendTariClick() - } - - setContactText(viewModel.uiState.value.selectedContact) - } - - private fun setContactText(contactDto: ContactDto) { - val name = contactDto.contactInfo.getAlias() - val address = contactDto.walletAddress - - ui.descriptionView.text = getString(R.string.contact_details_transaction_history_description, name) - if (name.isBlank() && address != null) { - ui.emojiIdViewContainer.root.visible() - ui.emojiIdViewContainer.textViewEmojiPrefix.text = address.addressPrefixEmojis() - ui.emojiIdViewContainer.textViewEmojiFirstPart.text = address.addressFirstEmojis() - ui.emojiIdViewContainer.textViewEmojiLastPart.text = address.addressLastEmojis() - } else { - ui.emojiIdViewContainer.root.gone() - } - - val emptyStateText = getString(R.string.contact_details_transaction_history_empty_state_description, name) - ui.emptyStateDescription.text = HtmlHelper.getSpannedText(emptyStateText) - } - - companion object { - fun createFragment(args: ContactDto): ContactTxHistoryFragment = ContactTxHistoryFragment().apply { - arguments = Bundle().apply { putParcelable(TariNavigator.PARAMETER_CONTACT, args) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryModel.kt deleted file mode 100644 index 509af063e..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryModel.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.contact - -import com.tari.android.wallet.data.contacts.model.ContactDto -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem - -class ContactTxHistoryModel { - data class UiState( - val selectedContact: ContactDto, - - val txList: List = emptyList(), - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryViewModel.kt deleted file mode 100644 index 71f83d746..000000000 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/tx/history/contact/ContactTxHistoryViewModel.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.tari.android.wallet.ui.screen.tx.history.contact - -import androidx.lifecycle.SavedStateHandle -import com.tari.android.wallet.data.tx.TxRepository -import com.tari.android.wallet.util.extension.collectFlow -import com.tari.android.wallet.model.tx.Tx -import com.tari.android.wallet.navigation.Navigation -import com.tari.android.wallet.navigation.TariNavigator -import com.tari.android.wallet.ui.common.CommonViewModel -import com.tari.android.wallet.ui.common.giphy.presentation.GifViewModel -import com.tari.android.wallet.ui.common.giphy.repository.GiphyRestService -import com.tari.android.wallet.data.contacts.ContactsRepository -import com.tari.android.wallet.data.contacts.model.ContactDto -import com.tari.android.wallet.ui.screen.tx.adapter.TxViewHolderItem -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import javax.inject.Inject - -class ContactTxHistoryViewModel(savedState: SavedStateHandle) : CommonViewModel() { - - @Inject - lateinit var txRepository: TxRepository - - @Inject - lateinit var contactsRepository: ContactsRepository - - @Inject - lateinit var giphyRestService: GiphyRestService - - init { - component.inject(this) - } - - private val _uiState = MutableStateFlow( - ContactTxHistoryModel.UiState( - selectedContact = contactsRepository.getByUuid(savedState.get(TariNavigator.PARAMETER_CONTACT)!!.uuid), - ) - ) - val uiState = _uiState.asStateFlow() - - init { - collectFlow(txRepository.allTxs) { txs -> - _uiState.update { uiState -> - uiState.copy(txList = txs.filter { it.tx.tariContact.walletAddress == uiState.selectedContact.walletAddress } - .map { it.copy(contact = uiState.selectedContact) } - .map { txDto -> - TxViewHolderItem( - txDto = txDto, - gifViewModel = GifViewModel(giphyRestService) - ) - } - ) - } - } - } - - fun onSendTariClick() { - tariNavigator.navigate(Navigation.TxList.ToSendTariToUser(uiState.value.selectedContact)) - } - - fun onTransactionClick(tx: Tx) { - tariNavigator.navigate(Navigation.TxList.ToTxDetails(tx)) - } -} - diff --git a/app/src/main/java/com/tari/android/wallet/util/extension/ViewExtensions.kt b/app/src/main/java/com/tari/android/wallet/util/extension/ViewExtensions.kt index 6648c05d3..f70a5bcb2 100644 --- a/app/src/main/java/com/tari/android/wallet/util/extension/ViewExtensions.kt +++ b/app/src/main/java/com/tari/android/wallet/util/extension/ViewExtensions.kt @@ -57,11 +57,14 @@ import androidx.core.animation.addListener import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat import androidx.fragment.app.FragmentTransaction +import com.orhanobut.logger.Logger import com.tari.android.wallet.R import com.tari.android.wallet.util.Constants -import timber.log.Timber import java.lang.ref.WeakReference +private val logger + get() = Logger.t("ViewExtensions") + fun View.visible() { this.visibility = View.VISIBLE } @@ -310,7 +313,7 @@ fun TypedArray.runRecycle(action: TypedArray.() -> Unit) { try { action.invoke(this) } catch (e: Throwable) { - Timber.e(e) + logger.e(e, "Error while running action on TypedArray") } finally { recycle() } diff --git a/app/src/main/res/layout/fragment_add_note.xml b/app/src/main/res/layout/fragment_add_note.xml index 4f50cebf3..f3634155e 100644 --- a/app/src/main/res/layout/fragment_add_note.xml +++ b/app/src/main/res/layout/fragment_add_note.xml @@ -1,11 +1,10 @@ + android:layout_height="match_parent" + android:fitsSystemWindows="true"> @@ -114,100 +113,9 @@ android:textColorHint="?attr/palette_text_light" android:textSize="@dimen/add_note_note_text_size" app:customFont="medium" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 453b5ce31..1bfaad130 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -3,9 +3,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root_view" - android:fitsSystemWindows="true" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:fitsSystemWindows="true"> - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_contact_transaction_history.xml b/app/src/main/res/layout/fragment_contact_transaction_history.xml deleted file mode 100644 index 3df8d8619..000000000 --- a/app/src/main/res/layout/fragment_contact_transaction_history.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_show_more_gifs.xml b/app/src/main/res/layout/item_show_more_gifs.xml deleted file mode 100644 index 06ef86fad..000000000 --- a/app/src/main/res/layout/item_show_more_gifs.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_thumbnail_gif.xml b/app/src/main/res/layout/item_thumbnail_gif.xml deleted file mode 100644 index 26a4d2924..000000000 --- a/app/src/main/res/layout/item_thumbnail_gif.xml +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/app/src/main/res/layout/item_tx_list.xml b/app/src/main/res/layout/item_tx_list.xml deleted file mode 100644 index 179c19936..000000000 --- a/app/src/main/res/layout/item_tx_list.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/view_gif_container.xml b/app/src/main/res/layout/view_gif_container.xml deleted file mode 100644 index 1780b504f..000000000 --- a/app/src/main/res/layout/view_gif_container.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 75b80e164..e38d9b686 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -49,7 +49,6 @@ 14dp - 8dp 36dp 40dp @@ -95,8 +94,6 @@ 40dp 12sp 16sp - 64dp - 9dp 25dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6244c8f38..94a1a91a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -248,8 +248,6 @@ %dd ago Just now Now - Loading GIF - Retry loading GIF ➡️ 🪙 Someone @@ -303,9 +301,6 @@ Transaction Note Let the recipient know what the payment is for Slide to Send - chosen gif - SEARCH GIPHY - SEARCH GIFS Connecting to the @@ -645,7 +640,6 @@ Enter Password That’s not it! Change Password - Search GIPHY We\'re always striving to make Tari Universe Wallet better.\nTo achieve this, we use a third-party service to gather non-identifiable data like crash logs and usage statistics. This data helps us pinpoint and fix any issues, ultimately improving your experience diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 2605cc117..3ce43ebcb 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -59,17 +59,6 @@ match_parent - - - - - - - Log in to Tari Universe