Skip to content

Commit

Permalink
Merge pull request #1772 from novasamatech/hotfix/dapp-browser-fix
Browse files Browse the repository at this point in the history
Hotfix/dapp browser fix
  • Loading branch information
antonijzelinskij authored Jan 22, 2025
2 parents e4d1e28 + 7e4cf5f commit cdb6e8f
Show file tree
Hide file tree
Showing 15 changed files with 73 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import io.novafoundation.nova.app.root.navigation.navigators.governance.TinderGo
import io.novafoundation.nova.common.di.scope.ApplicationScope
import io.novafoundation.nova.common.resources.ContextManager
import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectTracksCommunicator
import io.novafoundation.nova.feature_dapp_impl.presentation.DAppRouter
import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter
import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vote.setup.tindergov.TinderGovVoteCommunicator

Expand All @@ -21,8 +22,9 @@ class GovernanceNavigationModule {
fun provideRouter(
navigationHoldersRegistry: NavigationHoldersRegistry,
commonNavigator: Navigator,
contextManager: ContextManager
): GovernanceRouter = GovernanceNavigator(navigationHoldersRegistry, commonNavigator, contextManager)
contextManager: ContextManager,
dAppRouter: DAppRouter
): GovernanceRouter = GovernanceNavigator(navigationHoldersRegistry, commonNavigator, contextManager, dAppRouter)

@Provides
@ApplicationScope
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.novafoundation.nova.app.root.navigation.navigators.NavigationHoldersRe
import io.novafoundation.nova.app.root.navigation.navigators.Navigator
import io.novafoundation.nova.app.root.navigation.navigators.staking.relaychain.RelayStakingNavigator
import io.novafoundation.nova.common.di.scope.ApplicationScope
import io.novafoundation.nova.feature_dapp_impl.presentation.DAppRouter
import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter
import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter

Expand All @@ -17,8 +18,9 @@ class RelayStakingNavigationModule {
fun provideRelayStakingRouter(
navigationHoldersRegistry: NavigationHoldersRegistry,
navigator: Navigator,
dashboardRouter: StakingDashboardRouter
dashboardRouter: StakingDashboardRouter,
dAppRouter: DAppRouter
): StakingRouter {
return RelayStakingNavigator(navigationHoldersRegistry, navigator, dashboardRouter)
return RelayStakingNavigator(navigationHoldersRegistry, navigator, dashboardRouter, dAppRouter)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import io.novafoundation.nova.app.root.navigation.navigators.Navigator
import io.novafoundation.nova.common.resources.ContextManager
import io.novafoundation.nova.common.utils.showBrowser
import io.novafoundation.nova.feature_dapp_api.presentation.browser.main.DAppBrowserPayload
import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment
import io.novafoundation.nova.feature_dapp_impl.presentation.DAppRouter
import io.novafoundation.nova.feature_governance_impl.BuildConfig
import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter
import io.novafoundation.nova.feature_governance_impl.presentation.common.description.DescriptionFragment
Expand Down Expand Up @@ -47,7 +47,8 @@ import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vot
class GovernanceNavigator(
navigationHoldersRegistry: NavigationHoldersRegistry,
private val commonNavigator: Navigator,
private val contextManager: ContextManager
private val contextManager: ContextManager,
private val dAppRouter: DAppRouter
) : BaseNavigator(navigationHoldersRegistry), GovernanceRouter {

override fun openReferendum(payload: ReferendumDetailsPayload) {
Expand Down Expand Up @@ -235,9 +236,7 @@ class GovernanceNavigator(
}

override fun openDAppBrowser(url: String) {
navigationBuilder().action(R.id.action_referendumDetailsFragment_to_DAppBrowserGraph)
.setArgs(DAppBrowserFragment.getBundle(DAppBrowserPayload.Address(url)))
.navigateInFirstAttachedContext()
dAppRouter.openDAppBrowser(DAppBrowserPayload.Address(url))
}

override fun openReferendumDescription(payload: DescriptionPayload) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator
import io.novafoundation.nova.app.root.navigation.navigators.NavigationHoldersRegistry
import io.novafoundation.nova.app.root.navigation.navigators.Navigator
import io.novafoundation.nova.feature_dapp_api.presentation.browser.main.DAppBrowserPayload
import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment
import io.novafoundation.nova.feature_dapp_impl.presentation.DAppRouter
import io.novafoundation.nova.feature_staking_impl.domain.staking.redeem.RedeemConsequences
import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter
import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter
Expand Down Expand Up @@ -47,6 +47,7 @@ class RelayStakingNavigator(
navigationHoldersRegistry: NavigationHoldersRegistry,
private val commonNavigator: Navigator,
private val stakingDashboardRouter: StakingDashboardRouter,
private val dAppRouter: DAppRouter
) : BaseNavigator(navigationHoldersRegistry), StakingRouter {

override fun returnToStakingMain() {
Expand Down Expand Up @@ -286,8 +287,6 @@ class RelayStakingNavigator(
}

override fun openDAppBrowser(url: String) {
navigationBuilder().action(R.id.action_open_dappBrowser)
.setArgs(DAppBrowserFragment.getBundle(DAppBrowserPayload.Address(url)))
.navigateInFirstAttachedContext()
dAppRouter.openDAppBrowser(DAppBrowserPayload.Address(url))
}
}
8 changes: 0 additions & 8 deletions app/src/main/res/navigation/referendum_details_graph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,6 @@
app:popUpTo="@id/referendumDetailsFragment"
app:popUpToInclusive="true" />

<action
android:id="@+id/action_referendumDetailsFragment_to_DAppBrowserGraph"
app:destination="@id/dapp_browser_graph"
app:enterAnim="@anim/fragment_slide_in"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_slide_out" />

<action
android:id="@+id/action_referendumDetailsFragment_to_referendumDescription"
app:destination="@id/referendumDescription"
Expand Down
8 changes: 0 additions & 8 deletions app/src/main/res/navigation/root_nav_graph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,6 @@
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />

<action
android:id="@+id/action_open_dappBrowser"
app:destination="@id/dapp_browser_graph"
app:enterAnim="@anim/fragment_slide_in"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_slide_out" />

<action
android:id="@+id/action_import_nav_graph"
app:destination="@id/import_nav_graph"
Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
buildscript {
ext {
// App version
versionName = '9.2.0'
versionCode = 168
versionName = '9.2.1'
versionCode = 171

applicationId = "io.novafoundation.nova"
releaseApplicationSuffix = "market"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ interface HydrationFeeInjector {
object ToNative : ResetMode()

/**
* Resets the the fee to the native one only the current fee payment asset is different
* Resets the fee to the native one only the current fee payment asset is different
*/
class ToNativeLazily(val feeAssetBeforeTransaction: BigInteger) : ResetMode()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import kotlinx.coroutines.flow.Flow

interface DAppMetadataRepository {

suspend fun isDAppsSynced(): Boolean

suspend fun syncDAppMetadatas()

suspend fun syncAndGetDapp(baseUrl: String): DappMetadata?
Expand All @@ -20,3 +22,11 @@ interface DAppMetadataRepository {

fun observeDAppCatalog(): Flow<DappCatalog>
}

suspend fun DAppMetadataRepository.getDAppIfSyncedOrSync(baseUrl: String): DappMetadata? {
return if (isDAppsSynced()) {
getDAppMetadata(baseUrl)
} else {
syncAndGetDapp(baseUrl)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ class RealDAppMetadataRepository(

private val dappMetadatasFlow = MutableSharedFlow<DappCatalog>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)

override suspend fun isDAppsSynced(): Boolean {
return dappMetadatasFlow.replayCache.isNotEmpty()
}

override suspend fun syncDAppMetadatas() {
val response = retryUntilDone { dappMetadataApi.getParachainMetadata(remoteApiUrl) }
val dappMetadatas = mapDAppMetadataResponseToDAppMetadatas(response)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ class RealBrowserTabRepository(
}

override suspend fun changeCurrentUrl(tabId: String, url: String) {
browserTabsDao.updateCurrentUrl(tabId, url)
withContext(Dispatchers.Default) { browserTabsDao.updateCurrentUrl(tabId, url) }
}

override suspend fun changeKnownDAppMetadata(tabId: String, dappIconUrl: String?) {
browserTabsDao.updateKnownDAppMetadata(tabId, dappIconUrl)
withContext(Dispatchers.Default) { browserTabsDao.updateKnownDAppMetadata(tabId, dappIconUrl) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.novafoundation.nova.common.utils.Urls
import io.novafoundation.nova.common.utils.coroutines.RootScope
import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepository
import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository
import io.novafoundation.nova.feature_dapp_api.data.repository.getDAppIfSyncedOrSync
import io.novafoundation.nova.feature_dapp_impl.data.repository.tabs.BrowserTabInternalRepository
import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab
import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.CurrentTabState
Expand All @@ -23,7 +24,6 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class RealBrowserTabService(
private val dAppMetadataRepository: DAppMetadataRepository,
Expand All @@ -47,9 +47,8 @@ class RealBrowserTabService(

override val tabStateFlow = combine(
selectedTabIdFlow,
accountRepository.selectedMetaAccountFlow(),
allTabsFlow
) { selectedTabId, metaAccount, allTabs ->
) { selectedTabId, allTabs ->
TabsState(
tabs = allTabs.values.toList(),
selectedTab = currentTabState(selectedTabId, allTabs)
Expand All @@ -76,18 +75,22 @@ class RealBrowserTabService(
selectTab(null)
}

// Create a new browser tab and save it to persistent storage
// Then we sync dapp metadata for this tab asynchronously to not block tab creation
override suspend fun createNewTab(url: String): BrowserTab {
val tab = BrowserTab(
id = UUID.randomUUID().toString(),
metaId = accountRepository.getSelectedMetaAccount().id,
pageSnapshot = PageSnapshot.fromName(Urls.domainOf(url)),
currentUrl = url,
knownDAppMetadata = getKnownDappMetadata(url),
knownDAppMetadata = null,
creationTime = Date()
)

browserTabInternalRepository.saveTab(tab)

deferredSyncKnownDAppMetadata(tab.id, url)

return tab
}

Expand Down Expand Up @@ -144,14 +147,11 @@ class RealBrowserTabService(
if (url == null) return

launch {
withContext(Dispatchers.Default) {
activeSessions[tabId].currentUrl = url
browserTabInternalRepository.changeCurrentUrl(tabId, url)

val metadata = getKnownDappMetadata(url)
browserTabInternalRepository.changeKnownDAppMetadata(tabId, metadata?.iconLink)
}
activeSessions[tabId].currentUrl = url
browserTabInternalRepository.changeCurrentUrl(tabId, url)
}

deferredSyncKnownDAppMetadata(tabId, url)
}

private fun makeTabSnapshot(tabId: String) {
Expand All @@ -166,8 +166,16 @@ class RealBrowserTabService(
}
}

private fun deferredSyncKnownDAppMetadata(tabId: String, url: String) {
launch {
getKnownDappMetadata(url)?.let {
browserTabInternalRepository.changeKnownDAppMetadata(tabId, it.iconLink)
}
}
}

private suspend fun getKnownDappMetadata(url: String): BrowserTab.KnownDAppMetadata? {
return dAppMetadataRepository.getDAppMetadata(Urls.normalizeUrl(url))?.let {
return dAppMetadataRepository.getDAppIfSyncedOrSync(Urls.normalizeUrl(url))?.let {
BrowserTab.KnownDAppMetadata(it.iconLink)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ abstract class BaseState<R : Web3Transport.Request<*>, S>(
Web3Session.Authorization.State.ALLOWED -> true
// first time dapp request authorization during this session
Web3Session.Authorization.State.NONE -> authorizePageWithConfirmation()
// user rejected this dapp previosuly - ask for authorization one more time
// user rejected this dapp previously - ask for authorization one more time
Web3Session.Authorization.State.REJECTED -> authorizePageWithConfirmation()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class WalletConnectPairDeeplinkHandler(

override suspend fun matches(data: Uri): Boolean {
val newLinkMatch = data.scheme == "novawallet" && data.host == "wc"
// Older version of wc send both pair and sign requests through `wc:` deeplink so we additionaly check for `symKey` which is only present in pairing url
// Older version of wc send both pair and sign requests through `wc:` deeplink so we additionally check for `symKey` which is only present in pairing url
val oldLinkMatch = data.scheme == "wc" && "symKey" in data.toString()

return newLinkMatch || oldLinkMatch
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,27 @@ class LedgerBleManager(
contextManager: ContextManager
) : BleManager(contextManager.getApplicationContext()), DataReceivedCallback {

// You can find this and new devices here: https://github.com/LedgerHQ/device-sdk-ts/blob/develop/packages/device-management-kit/src/api/device-model/data/StaticDeviceModelDataSource.ts
companion object {
val supportedLedgerDevices by lazy {
listOf(
// Nano X
SupportedBleDevice(
serviceUuid = "13D63400-2C97-0004-0000-4C6564676572".toUuid(),
writeUuid = "13D63400-2C97-0004-0002-4C6564676572".toUuid(),
notifyUuid = "13D63400-2C97-0004-0001-4C6564676572".toUuid()
serviceUuid = "13d63400-2c97-0004-0000-4c6564676572".toUuid(),
notifyUuid = "13d63400-2c97-0004-0001-4c6564676572".toUuid(),
writeUuid = "13d63400-2c97-0004-0002-4c6564676572".toUuid()
),
// Stax
SupportedBleDevice(
serviceUuid = "13d63400-2c97-6004-0000-4c6564676572".toUuid(),
notifyUuid = "13d63400-2c97-6004-0001-4c6564676572".toUuid(),
writeUuid = "13d63400-2c97-6004-0002-4c6564676572".toUuid()
),
// Flex
SupportedBleDevice(
serviceUuid = "13d63400-2c97-3004-0000-4c6564676572".toUuid(),
notifyUuid = "13d63400-2c97-3004-0001-4c6564676572".toUuid(),
writeUuid = "13d63400-2c97-3004-0002-4c6564676572".toUuid()
)
)
}
Expand Down

0 comments on commit cdb6e8f

Please sign in to comment.