diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Context.kt b/app/src/main/java/com/tangem/tap/common/extensions/Context.kt index cba31fe77c..1a6ff8b260 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Context.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Context.kt @@ -1,7 +1,11 @@ package com.tangem.tap.common.extensions +import android.content.ContentResolver import android.content.Context import android.content.pm.PackageManager +import android.content.res.Resources +import android.net.Uri +import androidx.annotation.AnyRes import androidx.core.content.ContextCompat fun Context.readFile(fileName: String): String = @@ -19,4 +23,20 @@ fun Context.readAssetAsString(fileName: String): String { fun Context.isPermissionGranted(permission: String): Boolean { return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED +} + +/** + * Get uri to any resource type via given Resource Instance + * @param resId - resource id + * @throws Resources.NotFoundException if the given ID does not exist. + * @return - Uri to resource by the given ID + */ +@Throws(Resources.NotFoundException::class) +fun Context.resourceUri(@AnyRes resId: Int): Uri { + return Uri.parse( + ContentResolver.SCHEME_ANDROID_RESOURCE + + "://" + resources.getResourcePackageName(resId) + + '/' + resources.getResourceTypeName(resId) + + '/' + resources.getResourceEntryName(resId), + ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt index f3ff070f97..eabcd70384 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.onboarding.products.wallet.redux import android.graphics.Bitmap +import android.net.Uri import org.rekotlin.Action sealed class OnboardingWalletAction : Action { @@ -13,8 +14,8 @@ sealed class OnboardingWalletAction : Action { object ResumeBackup : OnboardingWalletAction() - object LoadArtwork : OnboardingWalletAction() - class SetArtworkUrl(val artworkUrl: String?) : OnboardingWalletAction() + data class LoadArtwork(val cardArtworkUriForUnfinishedBackup: Uri? = null) : OnboardingWalletAction() + class SetArtworkUrl(val artworkUri: Uri?) : OnboardingWalletAction() object OnBackPressed : OnboardingWalletAction() } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index 537b815ec3..d1e4c0f576 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.onboarding.products.wallet.redux +import android.net.Uri import com.tangem.blockchain.common.Blockchain import com.tangem.common.CompletionResult import com.tangem.common.extensions.ifNotNull @@ -100,11 +101,11 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: } is OnboardingWalletAction.LoadArtwork -> { scope.launch { - val artwork = onboardingManager?.loadArtworkUrl() - val cardArtwork = if (artwork == Artwork.DEFAULT_IMG_URL) { - null - } else { - artwork + val cardArtwork = when (onboardingManager) { + null -> action.cardArtworkUriForUnfinishedBackup + else -> onboardingManager.loadArtworkUrl() + .takeIf { it != Artwork.DEFAULT_IMG_URL } + ?.let { Uri.parse(it) } } store.dispatchOnMain(OnboardingWalletAction.SetArtworkUrl(cardArtwork)) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index 43b61349ab..2e50716048 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -29,7 +29,7 @@ private fun internalReduce(action: Action, appState: AppState): OnboardingWallet ) is OnboardingWalletAction.ResumeBackup -> state.copy(step = OnboardingWalletStep.Backup) is OnboardingWalletAction.SetArtworkUrl -> { - state.copy(cardArtworkUrl = action.artworkUrl) + state.copy(cardArtworkUri = action.artworkUri) } is OnboardingWalletAction.Done -> state.copy(step = OnboardingWalletStep.Done) else -> state diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index aa04272085..23da378819 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -1,6 +1,7 @@ package com.tangem.tap.features.onboarding.products.wallet.redux import android.graphics.Bitmap +import android.net.Uri import com.tangem.common.CardFilter import com.tangem.common.extensions.VoidCallback import com.tangem.domain.common.SaltPayWorkaround @@ -17,7 +18,7 @@ data class OnboardingWalletState( val backupState: BackupState = BackupState(), val onboardingSaltPayState: OnboardingSaltPayState? = null, val isSaltPay: Boolean = false, - val cardArtworkUrl: String? = null, + val cardArtworkUri: Uri? = null, val showConfetti: Boolean = false, ) : StateType { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt index 429a84cbab..c1df20ee2c 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.onboarding.products.wallet.saltPay.ui +import android.net.Uri import android.view.View import android.view.ViewGroup import android.view.animation.OvershootInterpolator @@ -97,7 +98,8 @@ internal class OnboardingSaltPayView( crossfade(enable = true) } } else { - walletFragment.loadImageIntoImageView(state.onboardingSaltPayState.saltPayCardArtworkUrl, imvFrontCard) + val uri = Uri.parse(state.onboardingSaltPayState.saltPayCardArtworkUrl) + walletFragment.loadImageIntoImageView(uri, imvFrontCard) } imvFirstBackupCard.load(R.drawable.card_placeholder_wallet) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt index f91b444e9c..f6dd395cf4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/ui/OnboardingWalletFragment.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.onboarding.products.wallet.ui +import android.net.Uri import android.os.Bundle import android.util.TypedValue import android.view.View @@ -23,6 +24,7 @@ import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.hide import com.tangem.tap.common.extensions.inflate +import com.tangem.tap.common.extensions.resourceUri import com.tangem.tap.common.extensions.show import com.tangem.tap.features.BaseFragment import com.tangem.tap.features.FragmentOnBackPressedHandler @@ -85,7 +87,11 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle store.dispatch(OnboardingWalletAction.Init) store.dispatch(OnboardingSaltPayAction.Init) - store.dispatch(OnboardingWalletAction.LoadArtwork) + store.dispatch( + OnboardingWalletAction.LoadArtwork( + cardArtworkUriForUnfinishedBackup = requireContext().resourceUri(R.drawable.card_placeholder_wallet), + ), + ) } override fun loadToolbarMenu(): MenuProvider? = OnboardingMenuProvider() @@ -148,15 +154,15 @@ class OnboardingWalletFragment : BaseFragment(R.layout.fragment_onboarding_walle if (state.isSaltPay) { onboardingSaltPayView.newState(state) } else { - loadImageIntoImageView(state.cardArtworkUrl, binding.imvFrontCard) - loadImageIntoImageView(state.cardArtworkUrl, binding.imvFirstBackupCard) - loadImageIntoImageView(state.cardArtworkUrl, binding.imvSecondBackupCard) + loadImageIntoImageView(state.cardArtworkUri, binding.imvFrontCard) + loadImageIntoImageView(state.cardArtworkUri, binding.imvFirstBackupCard) + loadImageIntoImageView(state.cardArtworkUri, binding.imvSecondBackupCard) handleOnboardingStep(state) } } - internal fun loadImageIntoImageView(url: String?, view: ImageView) { - view.load(url) { + internal fun loadImageIntoImageView(uri: Uri?, view: ImageView) { + view.load(uri) { placeholder(R.drawable.card_placeholder_black) error(R.drawable.card_placeholder_black) fallback(R.drawable.card_placeholder_black)