From 8d21dee513990fa9902b7a84c35a025d513d0c32 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Fri, 15 Nov 2024 17:06:53 +0100 Subject: [PATCH 01/83] Browser Tabs Service --- .../common/utils/browser/tabs/BrowserTab.kt | 10 ++ .../browser/tabs/BrowserTabPoolService.kt | 96 +++++++++++++++++++ .../utils/browser/tabs/BrowserTabStorage.kt | 16 ++++ .../utils/browser/tabs/CurrentTabState.kt | 13 +++ .../common/utils/browser/tabs/PageSession.kt | 15 +++ .../common/utils/browser/tabs/PageSnapshot.kt | 17 ++++ .../utils/browser/tabs/PageSnapshotBuilder.kt | 50 ++++++++++ 7 files changed, 217 insertions(+) create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt new file mode 100644 index 0000000000..3595dae3e5 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt @@ -0,0 +1,10 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +import java.util.Date + +class BrowserTab( + val id: String, + val pageSnapshot: PageSnapshot, + val currentUrl: String, + val creationTime: Date +) diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt new file mode 100644 index 0000000000..ccea14470b --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt @@ -0,0 +1,96 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +import android.content.Context +import io.novafoundation.nova.common.utils.Urls +import java.util.Date +import java.util.UUID +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChangedBy +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +interface BrowserTabPoolService { + + fun currentTabFlow(): Flow + + fun selectTab(tabId: String) + + suspend fun makeCurrentTabSnapshot() + + suspend fun createNewTabAsCurrentTab(url: String) + + suspend fun removeTab(tabId: String) + + suspend fun removeAllTabs() +} + +class RealBrowserTabPoolService( + private val context: Context, + private val browserTabStorage: BrowserTabStorage, + private val pageSnapshotBuilder: PageSnapshotBuilder +) : BrowserTabPoolService { + + private val selectedTabIdFlow = MutableStateFlow(null) + + private val allTabsFlow = browserTabStorage.observeTabs() + .map { tabs -> tabs.associateBy { it.id } } + + private val activeSessions = mutableMapOf() + + private val currentTabSession = combine( + selectedTabIdFlow, + allTabsFlow + ) { selectedTabId, allTabs -> + val tabId = selectedTabId ?: return@combine CurrentTabState.NotSelected + val tab = allTabs[tabId] ?: return@combine CurrentTabState.NotSelected + CurrentTabState.Selected( + tab, + activeSessions[tabId] ?: addNewSession(tab) + ) + }.distinctUntilChangedBy { it.stateId() } + + override fun currentTabFlow(): Flow { + return currentTabSession + } + + override fun selectTab(tabId: String) { + selectedTabIdFlow.value = tabId + } + + override suspend fun createNewTabAsCurrentTab(url: String) { + val tab = BrowserTab( + id = UUID.randomUUID().toString(), + pageSnapshot = PageSnapshot.withNameOnly(Urls.domainOf(url)), + currentUrl = url, + creationTime = Date() + ) + + browserTabStorage.saveTab(tab) + selectedTabIdFlow.value = tab.id + } + + override suspend fun removeTab(tabId: String) { + browserTabStorage.removeTab(tabId) + } + + override suspend fun removeAllTabs() { + browserTabStorage.removeAllTabs() + } + + override suspend fun makeCurrentTabSnapshot() { + val currentTab = currentTabSession.first() + + if (currentTab is CurrentTabState.Selected) { + val snapshot = pageSnapshotBuilder.getPageSnapshot(currentTab.pageSession) + browserTabStorage.savePageSnapshot(snapshot) + } + } + + private fun addNewSession(tab: BrowserTab): PageSession { + val session = PageSession(tab.id, tab.currentUrl, context) + activeSessions[tab.id] = session + return session + } +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt new file mode 100644 index 0000000000..7d491949c6 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt @@ -0,0 +1,16 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +import kotlinx.coroutines.flow.Flow + +interface BrowserTabStorage { + + suspend fun saveTab(tab: BrowserTab) + + suspend fun removeTab(tabId: String) + + suspend fun removeAllTabs() + + suspend fun savePageSnapshot(snapshot: PageSnapshot) + + fun observeTabs(): Flow> +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt new file mode 100644 index 0000000000..7c9efcd325 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt @@ -0,0 +1,13 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +sealed interface CurrentTabState { + + object NotSelected : CurrentTabState + + data class Selected(val tab: BrowserTab, val pageSession: PageSession) : CurrentTabState +} + +fun CurrentTabState.stateId() = when (this) { + CurrentTabState.NotSelected -> "not_selected" + is CurrentTabState.Selected -> tab.id +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt new file mode 100644 index 0000000000..d7b33f5c9c --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt @@ -0,0 +1,15 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +import android.content.Context +import android.webkit.WebView + +class PageSession( + val tabId: String, + startUrl: String, + context: Context +) { + + val webView: WebView = WebView(context).apply { + loadUrl(startUrl) + } +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt new file mode 100644 index 0000000000..1fa392c929 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt @@ -0,0 +1,17 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +class PageSnapshot( + val pageName: String?, + val pageIconPath: String?, + val pagePicturePath: String? +) { + + companion object; +} + +fun PageSnapshot.Companion.withNameOnly(name: String) = PageSnapshot( + pageName = name, + pageIconPath = null, + pagePicturePath = null +) + diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt new file mode 100644 index 0000000000..97a4bf1712 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt @@ -0,0 +1,50 @@ +package io.novafoundation.nova.common.utils.browser.tabs + +import android.graphics.Bitmap +import androidx.core.view.drawToBitmap +import io.novafoundation.nova.common.interfaces.FileProvider +import java.io.FileOutputStream +import java.io.IOException +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class PageSnapshotBuilder( + private val fileProvider: FileProvider +) { + + suspend fun getPageSnapshot(pageSession: PageSession): PageSnapshot { + val webView = pageSession.webView + val pageName = webView.title + val icon = webView.favicon + val pageBitmap = webView.drawToBitmap() + + val pageIconPath = saveBitmap(pageSession, icon, "icon") + val pagePicturePath = saveBitmap(pageSession, pageBitmap, "page") + + return PageSnapshot( + pageName = pageName, + pageIconPath = pagePicturePath, + pagePicturePath = pageIconPath + ) + } + + private suspend fun saveBitmap(pageSession: PageSession, bitmap: Bitmap?, filePrefix: String): String? { + if (bitmap == null) return null + + // Use this pattern to don't create a new image everytime when we rewrite the page snapshot + val fileName = "tab_${pageSession.tabId}_${filePrefix}.jpeg" + val file = fileProvider.getFileInExternalCacheStorage(fileName) + + try { + withContext(Dispatchers.IO) { + val outputStream = FileOutputStream(file) + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) + outputStream.close() + } + + return file.absolutePath + } catch (e: IOException) { + return null + } + } +} From 01bd086a1fbabb84aeaeb30835237aac0a3962bb Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Fri, 15 Nov 2024 17:45:01 +0100 Subject: [PATCH 02/83] Implemented a persistent storage --- .../nova/app/di/app/AppComponent.kt | 4 +- .../app/di/app/modules/BrowserTabsModule.kt | 50 ++++++++++++++ .../data/browser/RealBrowserTabStorage.kt | 66 +++++++++++++++++++ .../browser/tabs/BrowserTabPoolService.kt | 6 ++ .../utils/browser/tabs/BrowserTabStorage.kt | 4 +- .../utils/browser/tabs/PageSnapshotBuilder.kt | 2 + .../browser/tabs/{ => models}/BrowserTab.kt | 2 +- .../tabs/{ => models}/CurrentTabState.kt | 2 +- .../browser/tabs/{ => models}/PageSession.kt | 2 +- .../browser/tabs/{ => models}/PageSnapshot.kt | 2 +- .../nova/core_db/AppDatabase.kt | 10 ++- .../nova/core_db/dao/BrowserTabsDao.kt | 27 ++++++++ .../nova/core_db/di/DbModule.kt | 7 ++ .../migrations/64_65_AddBrowserTabs.kt | 22 +++++++ .../nova/core_db/model/BrowserTabLocal.kt | 14 ++++ 15 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt rename common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/{ => models}/BrowserTab.kt (70%) rename common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/{ => models}/CurrentTabState.kt (83%) rename common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/{ => models}/PageSession.kt (78%) rename common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/{ => models}/PageSnapshot.kt (81%) create mode 100644 core-db/src/main/java/io/novafoundation/nova/core_db/dao/BrowserTabsDao.kt create mode 100644 core-db/src/main/java/io/novafoundation/nova/core_db/migrations/64_65_AddBrowserTabs.kt create mode 100644 core-db/src/main/java/io/novafoundation/nova/core_db/model/BrowserTabLocal.kt diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt index f5e2f28eaf..b7652f1dc3 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt @@ -3,6 +3,7 @@ package io.novafoundation.nova.app.di.app import dagger.BindsInstance import dagger.Component import io.novafoundation.nova.app.App +import io.novafoundation.nova.app.di.app.modules.BrowserTabsModule import io.novafoundation.nova.app.di.app.navigation.NavigationModule import io.novafoundation.nova.app.di.deps.ComponentHolderModule import io.novafoundation.nova.common.di.CommonApi @@ -20,7 +21,8 @@ import io.novafoundation.nova.common.utils.coroutines.RootScope NetworkModule::class, NavigationModule::class, ComponentHolderModule::class, - FeatureManagerModule::class + FeatureManagerModule::class, + BrowserTabsModule::class ] ) interface AppComponent : CommonApi { diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt new file mode 100644 index 0000000000..3c1ece9d1d --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt @@ -0,0 +1,50 @@ +package io.novafoundation.nova.app.di.app.modules + +import android.content.Context +import dagger.Module +import dagger.Provides +import io.novafoundation.nova.app.App +import io.novafoundation.nova.app.root.data.browser.RealBrowserTabStorage +import io.novafoundation.nova.app.root.presentation.common.RealBuildTypeProvider +import io.novafoundation.nova.app.root.presentation.common.RootActivityIntentProvider +import io.novafoundation.nova.common.di.scope.ApplicationScope +import io.novafoundation.nova.common.interfaces.ActivityIntentProvider +import io.novafoundation.nova.common.interfaces.BuildTypeProvider +import io.novafoundation.nova.common.interfaces.FileProvider +import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabPoolService +import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabStorage +import io.novafoundation.nova.common.utils.browser.tabs.PageSnapshotBuilder +import io.novafoundation.nova.common.utils.browser.tabs.RealBrowserTabPoolService +import io.novafoundation.nova.core_db.dao.BrowserTabsDao + +@Module +class BrowserTabsModule { + + @ApplicationScope + @Provides + fun provideBrowserTabStorage( + browserTabsDao: BrowserTabsDao, + ): BrowserTabStorage { + return RealBrowserTabStorage(browserTabsDao = browserTabsDao) + } + + @ApplicationScope + @Provides + fun providePageSnapshotBuilder(fileProvider: FileProvider): PageSnapshotBuilder { + return PageSnapshotBuilder(fileProvider) + } + + @ApplicationScope + @Provides + fun provideBrowserTabPoolService( + context: Context, + browserTabStorage: BrowserTabStorage, + pageSnapshotBuilder: PageSnapshotBuilder + ): BrowserTabPoolService { + return RealBrowserTabPoolService( + context = context, + browserTabStorage = browserTabStorage, + pageSnapshotBuilder = pageSnapshotBuilder + ) + } +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt b/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt new file mode 100644 index 0000000000..374466df1e --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt @@ -0,0 +1,66 @@ +package io.novafoundation.nova.app.root.data.browser + +import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabStorage +import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot +import io.novafoundation.nova.common.utils.mapList +import io.novafoundation.nova.core_db.dao.BrowserTabsDao +import io.novafoundation.nova.core_db.model.BrowserTabLocal +import java.util.Date +import kotlinx.coroutines.flow.Flow + +class RealBrowserTabStorage( + private val browserTabsDao: BrowserTabsDao +) : BrowserTabStorage { + + override suspend fun saveTab(tab: BrowserTab) { + browserTabsDao.insertTab(tab.toLocal()) + } + + override suspend fun removeTab(tabId: String) { + browserTabsDao.removeTab(tabId) + } + + override suspend fun removeAllTabs() { + browserTabsDao.removeAllTabs() + } + + override suspend fun savePageSnapshot(tabId: String, snapshot: PageSnapshot) { + browserTabsDao.updatePageSnapshot( + tabId = tabId, + pageName = snapshot.pageName, + pageIconPath = snapshot.pageIconPath, + pagePicturePath = snapshot.pagePicturePath + ) + } + + override fun observeTabs(): Flow> { + return browserTabsDao.observeAllTabs().mapList { tab -> + tab.fromLocal() + } + } +} + +private fun BrowserTabLocal.fromLocal(): BrowserTab { + return BrowserTab( + id = id, + currentUrl = currentUrl, + pageSnapshot = PageSnapshot( + pageName = pageName, + pageIconPath = pageIconPath, + pagePicturePath = pagePicturePath + ), + creationTime = Date(creationTime), + ) +} + +private fun BrowserTab.toLocal(): BrowserTabLocal { + return BrowserTabLocal( + id = id, + currentUrl = currentUrl, + creationTime = creationTime.time, + pageName = pageSnapshot.pageName, + pageIconPath = pageSnapshot.pageIconPath, + pagePicturePath = pageSnapshot.pagePicturePath + ) +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt index ccea14470b..767d97430d 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt @@ -2,6 +2,12 @@ package io.novafoundation.nova.common.utils.browser.tabs import android.content.Context import io.novafoundation.nova.common.utils.Urls +import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab +import io.novafoundation.nova.common.utils.browser.tabs.models.CurrentTabState +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSession +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot +import io.novafoundation.nova.common.utils.browser.tabs.models.stateId +import io.novafoundation.nova.common.utils.browser.tabs.models.withNameOnly import java.util.Date import java.util.UUID import kotlinx.coroutines.flow.Flow diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt index 7d491949c6..14f6e29566 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt @@ -1,5 +1,7 @@ package io.novafoundation.nova.common.utils.browser.tabs +import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot import kotlinx.coroutines.flow.Flow interface BrowserTabStorage { @@ -10,7 +12,7 @@ interface BrowserTabStorage { suspend fun removeAllTabs() - suspend fun savePageSnapshot(snapshot: PageSnapshot) + suspend fun savePageSnapshot(tabId: String, snapshot: PageSnapshot) fun observeTabs(): Flow> } diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt index 97a4bf1712..0402d8b51c 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt @@ -3,6 +3,8 @@ package io.novafoundation.nova.common.utils.browser.tabs import android.graphics.Bitmap import androidx.core.view.drawToBitmap import io.novafoundation.nova.common.interfaces.FileProvider +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSession +import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot import java.io.FileOutputStream import java.io.IOException import kotlinx.coroutines.Dispatchers diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt similarity index 70% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt rename to common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt index 3595dae3e5..6998af7630 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTab.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.common.utils.browser.tabs.models import java.util.Date diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt similarity index 83% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt rename to common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt index 7c9efcd325..339d920e8b 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/CurrentTabState.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.common.utils.browser.tabs.models sealed interface CurrentTabState { diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt similarity index 78% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt rename to common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt index d7b33f5c9c..d70a519771 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSession.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.common.utils.browser.tabs.models import android.content.Context import android.webkit.WebView diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt similarity index 81% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt rename to common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt index 1fa392c929..ea44ebad38 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshot.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.common.utils.browser.tabs.models class PageSnapshot( val pageName: String?, diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt index 5a315b581b..d47b24c1b0 100644 --- a/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt @@ -21,6 +21,7 @@ import io.novafoundation.nova.core_db.dao.AccountDao import io.novafoundation.nova.core_db.dao.AccountStakingDao import io.novafoundation.nova.core_db.dao.AssetDao import io.novafoundation.nova.core_db.dao.BrowserHostSettingsDao +import io.novafoundation.nova.core_db.dao.BrowserTabsDao import io.novafoundation.nova.core_db.dao.ChainAssetDao import io.novafoundation.nova.core_db.dao.ChainDao import io.novafoundation.nova.core_db.dao.CoinPriceDao @@ -49,6 +50,7 @@ import io.novafoundation.nova.core_db.migrations.AddAdditionalFieldToChains_12_1 import io.novafoundation.nova.core_db.migrations.AddBalanceHolds_60_61 import io.novafoundation.nova.core_db.migrations.AddBalanceModesToAssets_51_52 import io.novafoundation.nova.core_db.migrations.AddBrowserHostSettings_34_35 +import io.novafoundation.nova.core_db.migrations.AddBrowserTabs_64_65 import io.novafoundation.nova.core_db.migrations.AddBuyProviders_7_8 import io.novafoundation.nova.core_db.migrations.AddChainColor_4_5 import io.novafoundation.nova.core_db.migrations.AddChainForeignKeyForProxy_63_64 @@ -114,6 +116,7 @@ import io.novafoundation.nova.core_db.model.AssetLocal import io.novafoundation.nova.core_db.model.BalanceHoldLocal import io.novafoundation.nova.core_db.model.BalanceLockLocal import io.novafoundation.nova.core_db.model.BrowserHostSettingsLocal +import io.novafoundation.nova.core_db.model.BrowserTabLocal import io.novafoundation.nova.core_db.model.CoinPriceLocal import io.novafoundation.nova.core_db.model.ContributionLocal import io.novafoundation.nova.core_db.model.CurrencyLocal @@ -193,7 +196,8 @@ import io.novafoundation.nova.core_db.model.operation.TransferTypeLocal BalanceHoldLocal::class, NodeSelectionPreferencesLocal::class, TinderGovBasketItemLocal::class, - TinderGovVotingPowerLocal::class + TinderGovVotingPowerLocal::class, + BrowserTabLocal::class ], ) @TypeConverters( @@ -249,7 +253,7 @@ abstract class AppDatabase : RoomDatabase() { .addMigrations(AddFungibleNfts_55_56, ChainPushSupport_56_57) .addMigrations(AddLocalMigratorVersionToChainRuntimes_57_58, AddGloballyUniqueIdToMetaAccounts_58_59) .addMigrations(ChainNetworkManagement_59_60, AddBalanceHolds_60_61, ChainNetworkManagement_61_62) - .addMigrations(TinderGovBasket_62_63, AddChainForeignKeyForProxy_63_64) + .addMigrations(TinderGovBasket_62_63, AddChainForeignKeyForProxy_63_64, AddBrowserTabs_64_65) .build() } return instance!! @@ -311,4 +315,6 @@ abstract class AppDatabase : RoomDatabase() { abstract fun holdsDao(): HoldsDao abstract fun tinderGovDao(): TinderGovDao + + abstract fun browserTabsDao(): BrowserTabsDao } diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/dao/BrowserTabsDao.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/dao/BrowserTabsDao.kt new file mode 100644 index 0000000000..20beaff6fa --- /dev/null +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/dao/BrowserTabsDao.kt @@ -0,0 +1,27 @@ +package io.novafoundation.nova.core_db.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import io.novafoundation.nova.core_db.model.BrowserTabLocal +import kotlinx.coroutines.flow.Flow + +@Dao +abstract class BrowserTabsDao { + + @Query("SELECT * FROM browser_tabs") + abstract fun observeAllTabs(): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + abstract suspend fun insertTab(tab: BrowserTabLocal) + + @Query("DELETE FROM browser_tabs WHERE id = :tabId") + abstract suspend fun removeTab(tabId: String) + + @Query("DELETE FROM browser_tabs") + abstract suspend fun removeAllTabs() + + @Query("UPDATE browser_tabs SET pageName = :pageName, pageIconPath = :pageIconPath, pagePicturePath = :pagePicturePath WHERE id = :tabId") + abstract suspend fun updatePageSnapshot(tabId: String, pageName: String?, pageIconPath: String?, pagePicturePath: String?) +} diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbModule.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbModule.kt index e497cbbb8b..cbd560896b 100644 --- a/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbModule.kt +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbModule.kt @@ -9,6 +9,7 @@ import io.novafoundation.nova.core_db.dao.AccountDao import io.novafoundation.nova.core_db.dao.AccountStakingDao import io.novafoundation.nova.core_db.dao.AssetDao import io.novafoundation.nova.core_db.dao.BrowserHostSettingsDao +import io.novafoundation.nova.core_db.dao.BrowserTabsDao import io.novafoundation.nova.core_db.dao.ChainAssetDao import io.novafoundation.nova.core_db.dao.ChainDao import io.novafoundation.nova.core_db.dao.CoinPriceDao @@ -212,4 +213,10 @@ class DbModule { fun provideTinderGovDao(appDatabase: AppDatabase): TinderGovDao { return appDatabase.tinderGovDao() } + + @Provides + @ApplicationScope + fun provideBrowserTabsDao(appDatabase: AppDatabase): BrowserTabsDao { + return appDatabase.browserTabsDao() + } } diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/migrations/64_65_AddBrowserTabs.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/migrations/64_65_AddBrowserTabs.kt new file mode 100644 index 0000000000..e730d9263a --- /dev/null +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/migrations/64_65_AddBrowserTabs.kt @@ -0,0 +1,22 @@ +package io.novafoundation.nova.core_db.migrations + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +val AddBrowserTabs_64_65 = object : Migration(64, 65) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `browser_tabs` ( + `id` TEXT NOT NULL, + `currentUrl` TEXT NOT NULL, + `creationTime` INTEGER NOT NULL, + `pageName` TEXT, `pageIconPath` TEXT, + `pagePicturePath` TEXT, + PRIMARY KEY(`id`) + ) + """ + ) + } +} diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/model/BrowserTabLocal.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/model/BrowserTabLocal.kt new file mode 100644 index 0000000000..f014de6dc8 --- /dev/null +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/model/BrowserTabLocal.kt @@ -0,0 +1,14 @@ +package io.novafoundation.nova.core_db.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "browser_tabs") +data class BrowserTabLocal( + @PrimaryKey(autoGenerate = false) val id: String, + val currentUrl: String, + val creationTime: Long, + val pageName: String?, + val pageIconPath: String?, + val pagePicturePath: String? +) From 93973861d9bff050e21652a07b326d3454569a4b Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Fri, 15 Nov 2024 17:54:54 +0100 Subject: [PATCH 03/83] Fixed DI --- .../nova/app/di/app/AppComponent.kt | 4 +- .../app/di/app/modules/BrowserTabsModule.kt | 50 -------------- .../data/browser/RealBrowserTabStorage.kt | 64 +----------------- .../feature_dapp_impl/di/DappFeatureModule.kt | 3 +- .../di/modules/BrowserTabsModule.kt | 62 +++++++++++++++++ .../utils}/tabs/BrowserTabPoolService.kt | 16 ++--- .../utils}/tabs/BrowserTabStorage.kt | 6 +- .../utils}/tabs/PageSnapshotBuilder.kt | 6 +- .../utils/tabs/RealBrowserTabStorage.kt | 66 +++++++++++++++++++ .../utils}/tabs/models/BrowserTab.kt | 2 +- .../utils}/tabs/models/CurrentTabState.kt | 2 +- .../utils}/tabs/models/PageSession.kt | 2 +- .../utils}/tabs/models/PageSnapshot.kt | 2 +- 13 files changed, 151 insertions(+), 134 deletions(-) delete mode 100644 app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/BrowserTabPoolService.kt (82%) rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/BrowserTabStorage.kt (58%) rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/PageSnapshotBuilder.kt (88%) create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/models/BrowserTab.kt (69%) rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/models/CurrentTabState.kt (82%) rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/models/PageSession.kt (78%) rename {common/src/main/java/io/novafoundation/nova/common/utils/browser => feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils}/tabs/models/PageSnapshot.kt (81%) diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt index b7652f1dc3..f5e2f28eaf 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/AppComponent.kt @@ -3,7 +3,6 @@ package io.novafoundation.nova.app.di.app import dagger.BindsInstance import dagger.Component import io.novafoundation.nova.app.App -import io.novafoundation.nova.app.di.app.modules.BrowserTabsModule import io.novafoundation.nova.app.di.app.navigation.NavigationModule import io.novafoundation.nova.app.di.deps.ComponentHolderModule import io.novafoundation.nova.common.di.CommonApi @@ -21,8 +20,7 @@ import io.novafoundation.nova.common.utils.coroutines.RootScope NetworkModule::class, NavigationModule::class, ComponentHolderModule::class, - FeatureManagerModule::class, - BrowserTabsModule::class + FeatureManagerModule::class ] ) interface AppComponent : CommonApi { diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt deleted file mode 100644 index 3c1ece9d1d..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/modules/BrowserTabsModule.kt +++ /dev/null @@ -1,50 +0,0 @@ -package io.novafoundation.nova.app.di.app.modules - -import android.content.Context -import dagger.Module -import dagger.Provides -import io.novafoundation.nova.app.App -import io.novafoundation.nova.app.root.data.browser.RealBrowserTabStorage -import io.novafoundation.nova.app.root.presentation.common.RealBuildTypeProvider -import io.novafoundation.nova.app.root.presentation.common.RootActivityIntentProvider -import io.novafoundation.nova.common.di.scope.ApplicationScope -import io.novafoundation.nova.common.interfaces.ActivityIntentProvider -import io.novafoundation.nova.common.interfaces.BuildTypeProvider -import io.novafoundation.nova.common.interfaces.FileProvider -import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabPoolService -import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabStorage -import io.novafoundation.nova.common.utils.browser.tabs.PageSnapshotBuilder -import io.novafoundation.nova.common.utils.browser.tabs.RealBrowserTabPoolService -import io.novafoundation.nova.core_db.dao.BrowserTabsDao - -@Module -class BrowserTabsModule { - - @ApplicationScope - @Provides - fun provideBrowserTabStorage( - browserTabsDao: BrowserTabsDao, - ): BrowserTabStorage { - return RealBrowserTabStorage(browserTabsDao = browserTabsDao) - } - - @ApplicationScope - @Provides - fun providePageSnapshotBuilder(fileProvider: FileProvider): PageSnapshotBuilder { - return PageSnapshotBuilder(fileProvider) - } - - @ApplicationScope - @Provides - fun provideBrowserTabPoolService( - context: Context, - browserTabStorage: BrowserTabStorage, - pageSnapshotBuilder: PageSnapshotBuilder - ): BrowserTabPoolService { - return RealBrowserTabPoolService( - context = context, - browserTabStorage = browserTabStorage, - pageSnapshotBuilder = pageSnapshotBuilder - ) - } -} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt b/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt index 374466df1e..5628269501 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt @@ -1,66 +1,6 @@ package io.novafoundation.nova.app.root.data.browser -import io.novafoundation.nova.common.utils.browser.tabs.BrowserTabStorage -import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot -import io.novafoundation.nova.common.utils.mapList -import io.novafoundation.nova.core_db.dao.BrowserTabsDao +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot import io.novafoundation.nova.core_db.model.BrowserTabLocal import java.util.Date -import kotlinx.coroutines.flow.Flow - -class RealBrowserTabStorage( - private val browserTabsDao: BrowserTabsDao -) : BrowserTabStorage { - - override suspend fun saveTab(tab: BrowserTab) { - browserTabsDao.insertTab(tab.toLocal()) - } - - override suspend fun removeTab(tabId: String) { - browserTabsDao.removeTab(tabId) - } - - override suspend fun removeAllTabs() { - browserTabsDao.removeAllTabs() - } - - override suspend fun savePageSnapshot(tabId: String, snapshot: PageSnapshot) { - browserTabsDao.updatePageSnapshot( - tabId = tabId, - pageName = snapshot.pageName, - pageIconPath = snapshot.pageIconPath, - pagePicturePath = snapshot.pagePicturePath - ) - } - - override fun observeTabs(): Flow> { - return browserTabsDao.observeAllTabs().mapList { tab -> - tab.fromLocal() - } - } -} - -private fun BrowserTabLocal.fromLocal(): BrowserTab { - return BrowserTab( - id = id, - currentUrl = currentUrl, - pageSnapshot = PageSnapshot( - pageName = pageName, - pageIconPath = pageIconPath, - pagePicturePath = pagePicturePath - ), - creationTime = Date(creationTime), - ) -} - -private fun BrowserTab.toLocal(): BrowserTabLocal { - return BrowserTabLocal( - id = id, - currentUrl = currentUrl, - creationTime = creationTime.time, - pageName = pageSnapshot.pageName, - pageIconPath = pageSnapshot.pageIconPath, - pagePicturePath = pageSnapshot.pagePicturePath - ) -} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DappFeatureModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DappFeatureModule.kt index 64e7a46292..32041ae9f0 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DappFeatureModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DappFeatureModule.kt @@ -7,13 +7,14 @@ import io.novafoundation.nova.common.resources.ResourceManager import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository import io.novafoundation.nova.feature_dapp_impl.data.repository.FavouritesDAppRepository import io.novafoundation.nova.feature_dapp_impl.data.repository.PhishingSitesRepository +import io.novafoundation.nova.feature_dapp_impl.di.modules.BrowserTabsModule import io.novafoundation.nova.feature_dapp_impl.di.modules.DappMetadataModule import io.novafoundation.nova.feature_dapp_impl.di.modules.FavouritesDAppModule import io.novafoundation.nova.feature_dapp_impl.di.modules.PhishingSitesModule import io.novafoundation.nova.feature_dapp_impl.di.modules.Web3Module import io.novafoundation.nova.feature_dapp_impl.domain.DappInteractor -@Module(includes = [Web3Module::class, DappMetadataModule::class, PhishingSitesModule::class, FavouritesDAppModule::class]) +@Module(includes = [Web3Module::class, DappMetadataModule::class, PhishingSitesModule::class, FavouritesDAppModule::class, BrowserTabsModule::class]) class DappFeatureModule { @Provides diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt new file mode 100644 index 0000000000..412d62719b --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt @@ -0,0 +1,62 @@ +package io.novafoundation.nova.feature_dapp_impl.di.modules + +import android.content.Context +import dagger.Module +import dagger.Provides +import io.novafoundation.nova.common.di.scope.ApplicationScope +import io.novafoundation.nova.common.di.scope.FeatureScope +import io.novafoundation.nova.common.interfaces.FileProvider +import io.novafoundation.nova.common.resources.ResourceManager +import io.novafoundation.nova.core_db.dao.BrowserTabsDao +import io.novafoundation.nova.core_db.dao.DappAuthorizationDao +import io.novafoundation.nova.feature_dapp_impl.di.modules.web3.MetamaskModule +import io.novafoundation.nova.feature_dapp_impl.di.modules.web3.PolkadotJsModule +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabStorage +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.PageSnapshotBuilder +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabPoolService +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabStorage +import io.novafoundation.nova.feature_dapp_impl.web3.metamask.states.MetamaskStateFactory +import io.novafoundation.nova.feature_dapp_impl.web3.metamask.transport.MetamaskInjector +import io.novafoundation.nova.feature_dapp_impl.web3.metamask.transport.MetamaskTransportFactory +import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.PolkadotJsInjector +import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.PolkadotJsTransportFactory +import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.states.PolkadotJsStateFactory +import io.novafoundation.nova.feature_dapp_impl.web3.session.DbWeb3Session +import io.novafoundation.nova.feature_dapp_impl.web3.session.Web3Session +import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionStoreFactory +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClientFactory +import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewHolder +import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewScriptInjector + +@Module +class BrowserTabsModule { + + @FeatureScope + @Provides + fun provideBrowserTabStorage( + browserTabsDao: BrowserTabsDao, + ): BrowserTabStorage { + return RealBrowserTabStorage(browserTabsDao = browserTabsDao) + } + + @FeatureScope + @Provides + fun providePageSnapshotBuilder(fileProvider: FileProvider): PageSnapshotBuilder { + return PageSnapshotBuilder(fileProvider) + } + + @FeatureScope + @Provides + fun provideBrowserTabPoolService( + context: Context, + browserTabStorage: BrowserTabStorage, + pageSnapshotBuilder: PageSnapshotBuilder + ): BrowserTabPoolService { + return RealBrowserTabPoolService( + context = context, + browserTabStorage = browserTabStorage, + pageSnapshotBuilder = pageSnapshotBuilder + ) + } +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt similarity index 82% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 767d97430d..20bfb0e413 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.feature_dapp_impl.utils.tabs import android.content.Context import io.novafoundation.nova.common.utils.Urls -import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab -import io.novafoundation.nova.common.utils.browser.tabs.models.CurrentTabState -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSession -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot -import io.novafoundation.nova.common.utils.browser.tabs.models.stateId -import io.novafoundation.nova.common.utils.browser.tabs.models.withNameOnly +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.CurrentTabState +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSession +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.stateId +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.withNameOnly import java.util.Date import java.util.UUID import kotlinx.coroutines.flow.Flow @@ -90,7 +90,7 @@ class RealBrowserTabPoolService( if (currentTab is CurrentTabState.Selected) { val snapshot = pageSnapshotBuilder.getPageSnapshot(currentTab.pageSession) - browserTabStorage.savePageSnapshot(snapshot) + browserTabStorage.savePageSnapshot(currentTab.tab.id, snapshot) } } diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabStorage.kt similarity index 58% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabStorage.kt index 14f6e29566..4b03ee1b0e 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/BrowserTabStorage.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabStorage.kt @@ -1,7 +1,7 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.feature_dapp_impl.utils.tabs -import io.novafoundation.nova.common.utils.browser.tabs.models.BrowserTab -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot import kotlinx.coroutines.flow.Flow interface BrowserTabStorage { diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt similarity index 88% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt index 0402d8b51c..c7b15fc302 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/PageSnapshotBuilder.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt @@ -1,10 +1,10 @@ -package io.novafoundation.nova.common.utils.browser.tabs +package io.novafoundation.nova.feature_dapp_impl.utils.tabs import android.graphics.Bitmap import androidx.core.view.drawToBitmap import io.novafoundation.nova.common.interfaces.FileProvider -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSession -import io.novafoundation.nova.common.utils.browser.tabs.models.PageSnapshot +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSession +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot import java.io.FileOutputStream import java.io.IOException import kotlinx.coroutines.Dispatchers diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt new file mode 100644 index 0000000000..4b7f3aa64f --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt @@ -0,0 +1,66 @@ +package io.novafoundation.nova.feature_dapp_impl.utils.tabs + +import io.novafoundation.nova.common.utils.mapList +import io.novafoundation.nova.core_db.dao.BrowserTabsDao +import io.novafoundation.nova.core_db.model.BrowserTabLocal +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot +import java.util.Date +import kotlinx.coroutines.flow.Flow + +class RealBrowserTabStorage( + private val browserTabsDao: BrowserTabsDao +) : BrowserTabStorage { + + override suspend fun saveTab(tab: BrowserTab) { + browserTabsDao.insertTab(tab.toLocal()) + } + + override suspend fun removeTab(tabId: String) { + browserTabsDao.removeTab(tabId) + } + + override suspend fun removeAllTabs() { + browserTabsDao.removeAllTabs() + } + + override suspend fun savePageSnapshot(tabId: String, snapshot: PageSnapshot) { + browserTabsDao.updatePageSnapshot( + tabId = tabId, + pageName = snapshot.pageName, + pageIconPath = snapshot.pageIconPath, + pagePicturePath = snapshot.pagePicturePath + ) + } + + override fun observeTabs(): Flow> { + return browserTabsDao.observeAllTabs().mapList { tab -> + tab.fromLocal() + } + } +} + + +private fun BrowserTabLocal.fromLocal(): BrowserTab { + return BrowserTab( + id = id, + currentUrl = currentUrl, + pageSnapshot = PageSnapshot( + pageName = pageName, + pageIconPath = pageIconPath, + pagePicturePath = pagePicturePath + ), + creationTime = Date(creationTime), + ) +} + +private fun BrowserTab.toLocal(): BrowserTabLocal { + return BrowserTabLocal( + id = id, + currentUrl = currentUrl, + creationTime = creationTime.time, + pageName = pageSnapshot.pageName, + pageIconPath = pageSnapshot.pageIconPath, + pagePicturePath = pageSnapshot.pagePicturePath + ) +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/BrowserTab.kt similarity index 69% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/BrowserTab.kt index 6998af7630..6abade65bf 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/BrowserTab.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/BrowserTab.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs.models +package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models import java.util.Date diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/CurrentTabState.kt similarity index 82% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/CurrentTabState.kt index 339d920e8b..21a8bae79d 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/CurrentTabState.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/CurrentTabState.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs.models +package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models sealed interface CurrentTabState { diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt similarity index 78% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt index d70a519771..3e8898c2bd 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSession.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs.models +package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models import android.content.Context import android.webkit.WebView diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt similarity index 81% rename from common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt rename to feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt index ea44ebad38..cd33edd872 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/browser/tabs/models/PageSnapshot.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.common.utils.browser.tabs.models +package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models class PageSnapshot( val pageName: String?, From b1091bfc7d6fedb89c8dc3217ad3bd5310ecb6d9 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Fri, 15 Nov 2024 17:56:57 +0100 Subject: [PATCH 04/83] Delete RealBrowserTabStorage.kt --- .../nova/app/root/data/browser/RealBrowserTabStorage.kt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt diff --git a/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt b/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt deleted file mode 100644 index 5628269501..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/root/data/browser/RealBrowserTabStorage.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.novafoundation.nova.app.root.data.browser - -import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab -import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot -import io.novafoundation.nova.core_db.model.BrowserTabLocal -import java.util.Date From 6bea1599d99a795ee47c3dbb9ca27e6b75b70b54 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Mon, 18 Nov 2024 11:39:45 +0100 Subject: [PATCH 05/83] Add memory usage restriction for tabs --- .../di/modules/BrowserTabsModule.kt | 30 +++++++------------ .../utils/tabs/BrowserTabPoolService.kt | 17 +++++++++-- .../utils/tabs/TabMemoryRestrictionService.kt | 23 ++++++++++++++ .../utils/tabs/models/PageSession.kt | 7 ++++- 4 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/TabMemoryRestrictionService.kt diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt index 412d62719b..3f4e2aad3e 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt @@ -3,31 +3,15 @@ package io.novafoundation.nova.feature_dapp_impl.di.modules import android.content.Context import dagger.Module import dagger.Provides -import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.common.di.scope.FeatureScope import io.novafoundation.nova.common.interfaces.FileProvider -import io.novafoundation.nova.common.resources.ResourceManager import io.novafoundation.nova.core_db.dao.BrowserTabsDao -import io.novafoundation.nova.core_db.dao.DappAuthorizationDao -import io.novafoundation.nova.feature_dapp_impl.di.modules.web3.MetamaskModule -import io.novafoundation.nova.feature_dapp_impl.di.modules.web3.PolkadotJsModule import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabStorage import io.novafoundation.nova.feature_dapp_impl.utils.tabs.PageSnapshotBuilder import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabPoolService import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabStorage -import io.novafoundation.nova.feature_dapp_impl.web3.metamask.states.MetamaskStateFactory -import io.novafoundation.nova.feature_dapp_impl.web3.metamask.transport.MetamaskInjector -import io.novafoundation.nova.feature_dapp_impl.web3.metamask.transport.MetamaskTransportFactory -import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.PolkadotJsInjector -import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.PolkadotJsTransportFactory -import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.states.PolkadotJsStateFactory -import io.novafoundation.nova.feature_dapp_impl.web3.session.DbWeb3Session -import io.novafoundation.nova.feature_dapp_impl.web3.session.Web3Session -import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionStoreFactory -import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClientFactory -import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewHolder -import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewScriptInjector +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.TabMemoryRestrictionService @Module class BrowserTabsModule { @@ -46,17 +30,25 @@ class BrowserTabsModule { return PageSnapshotBuilder(fileProvider) } + @FeatureScope + @Provides + fun provideTabMemoryRestrictionService(context: Context): TabMemoryRestrictionService { + return TabMemoryRestrictionService(context) + } + @FeatureScope @Provides fun provideBrowserTabPoolService( context: Context, browserTabStorage: BrowserTabStorage, - pageSnapshotBuilder: PageSnapshotBuilder + pageSnapshotBuilder: PageSnapshotBuilder, + tabMemoryRestrictionService: TabMemoryRestrictionService ): BrowserTabPoolService { return RealBrowserTabPoolService( context = context, browserTabStorage = browserTabStorage, - pageSnapshotBuilder = pageSnapshotBuilder + pageSnapshotBuilder = pageSnapshotBuilder, + tabMemoryRestrictionService = tabMemoryRestrictionService ) } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 20bfb0e413..398cbbd8db 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -35,9 +35,12 @@ interface BrowserTabPoolService { class RealBrowserTabPoolService( private val context: Context, private val browserTabStorage: BrowserTabStorage, - private val pageSnapshotBuilder: PageSnapshotBuilder + private val pageSnapshotBuilder: PageSnapshotBuilder, + private val tabMemoryRestrictionService: TabMemoryRestrictionService ) : BrowserTabPoolService { + private val availableSessionsCount = tabMemoryRestrictionService.getMaximumActiveSessions() + private val selectedTabIdFlow = MutableStateFlow(null) private val allTabsFlow = browserTabStorage.observeTabs() @@ -95,8 +98,18 @@ class RealBrowserTabPoolService( } private fun addNewSession(tab: BrowserTab): PageSession { - val session = PageSession(tab.id, tab.currentUrl, context) + if (activeSessions.size >= availableSessionsCount) { + removeOldestSession() + } + + val session = PageSession(tabId = tab.id, sessionStartTime = Date(), startUrl = tab.currentUrl, context = context) activeSessions[tab.id] = session return session } + + private fun removeOldestSession() { + val sessionToDestroy = activeSessions.values.minBy { it.sessionStartTime.time } + sessionToDestroy.destroySession() + activeSessions.remove(sessionToDestroy.tabId) + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/TabMemoryRestrictionService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/TabMemoryRestrictionService.kt new file mode 100644 index 0000000000..62945017f6 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/TabMemoryRestrictionService.kt @@ -0,0 +1,23 @@ +package io.novafoundation.nova.feature_dapp_impl.utils.tabs + +import android.app.ActivityManager +import android.content.Context + +private const val MIN_TABS = 3 +private const val MEMORY_STEP = 100L * 1024L * 1024L // 100 Mb + +class TabMemoryRestrictionService(val context: Context) { + + // The linear function that starts from 3 and adds 1 tab each MEMORY_STEP of available memory + fun getMaximumActiveSessions(): Int { + val availableMemory = getAvailableMemory() + return MIN_TABS + (availableMemory / MEMORY_STEP).toInt() + } + + private fun getAvailableMemory(): Long { + val activityManager = context.getSystemService(ActivityManager::class.java) + val memoryInfo = ActivityManager.MemoryInfo() + activityManager.getMemoryInfo(memoryInfo) + return memoryInfo.availMem + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt index 3e8898c2bd..158c9ac524 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt @@ -2,14 +2,19 @@ package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models import android.content.Context import android.webkit.WebView +import java.util.Date class PageSession( val tabId: String, + val sessionStartTime: Date, startUrl: String, context: Context ) { - val webView: WebView = WebView(context).apply { loadUrl(startUrl) } + + fun destroySession() { + webView.destroy() + } } From 28f39de765145cc27bbdb57fe58bcfab99ee7f38 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Mon, 18 Nov 2024 11:43:09 +0100 Subject: [PATCH 06/83] Run ktlint --- .../nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt | 2 +- .../nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt | 1 - .../nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt index c7b15fc302..abc0886742 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt @@ -34,7 +34,7 @@ class PageSnapshotBuilder( if (bitmap == null) return null // Use this pattern to don't create a new image everytime when we rewrite the page snapshot - val fileName = "tab_${pageSession.tabId}_${filePrefix}.jpeg" + val fileName = "tab_${pageSession.tabId}_$filePrefix.jpeg" val file = fileProvider.getFileInExternalCacheStorage(fileName) try { diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt index 4b7f3aa64f..e0bed08350 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/RealBrowserTabStorage.kt @@ -40,7 +40,6 @@ class RealBrowserTabStorage( } } - private fun BrowserTabLocal.fromLocal(): BrowserTab { return BrowserTab( id = id, diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt index cd33edd872..e587317344 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSnapshot.kt @@ -14,4 +14,3 @@ fun PageSnapshot.Companion.withNameOnly(name: String) = PageSnapshot( pageIconPath = null, pagePicturePath = null ) - From 3f98b0294a3e0c2201681c0d33566de4dd08de3b Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Mon, 18 Nov 2024 12:15:00 +0100 Subject: [PATCH 07/83] Bump database version --- .../src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt index d47b24c1b0..17525b87de 100644 --- a/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/AppDatabase.kt @@ -154,7 +154,7 @@ import io.novafoundation.nova.core_db.model.operation.SwapTypeLocal import io.novafoundation.nova.core_db.model.operation.TransferTypeLocal @Database( - version = 64, + version = 65, entities = [ AccountLocal::class, NodeLocal::class, From e0357b8b060e67cdf890c8898dd4ffdf1faaeb20 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Tue, 19 Nov 2024 12:13:42 +0100 Subject: [PATCH 08/83] Provide new tab logic in browser --- .../novafoundation/nova/core_db/di/DbApi.kt | 29 +++---- .../di/DAppFeatureDependencies.kt | 29 ++++--- .../di/modules/BrowserTabsModule.kt | 15 +++- .../di/modules/Web3Module.kt | 6 +- .../browser/main/DAppBrowserFragment.kt | 76 +++++++++++------- .../browser/main/DAppBrowserViewModel.kt | 19 ++++- .../browser/main/di/DAppBrowserModule.kt | 7 +- .../utils/tabs/BrowserTabPoolService.kt | 41 ++++++---- .../utils/tabs/models/PageSession.kt | 78 +++++++++++++++++-- .../metamask/transport/MetamaskInjector.kt | 4 +- .../web3/polkadotJs/PolkadotJsInjector.kt | 4 +- .../web3/webview/Web3ChromeClient.kt | 27 +++++++ .../web3/webview/Web3Injector.kt | 22 ++++++ .../web3/webview/Web3WebView.kt | 19 +---- .../web3/webview/Web3WebViewClient.kt | 67 ++++------------ .../web3/webview/WebViewHolder.kt | 2 +- .../main/res/layout/fragment_dapp_browser.xml | 4 +- 17 files changed, 292 insertions(+), 157 deletions(-) create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3ChromeClient.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3Injector.kt diff --git a/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbApi.kt b/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbApi.kt index 43c6f9ed94..0d46e10a2f 100644 --- a/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbApi.kt +++ b/core-db/src/main/java/io/novafoundation/nova/core_db/di/DbApi.kt @@ -5,6 +5,7 @@ import io.novafoundation.nova.core_db.dao.AccountDao import io.novafoundation.nova.core_db.dao.AccountStakingDao import io.novafoundation.nova.core_db.dao.AssetDao import io.novafoundation.nova.core_db.dao.BrowserHostSettingsDao +import io.novafoundation.nova.core_db.dao.BrowserTabsDao import io.novafoundation.nova.core_db.dao.ChainAssetDao import io.novafoundation.nova.core_db.dao.ChainDao import io.novafoundation.nova.core_db.dao.CoinPriceDao @@ -32,6 +33,20 @@ import io.novafoundation.nova.core_db.dao.WalletConnectSessionsDao interface DbApi { + val phishingSitesDao: PhishingSitesDao + + val favouritesDAppsDao: FavouriteDAppsDao + + val currencyDao: CurrencyDao + + val walletConnectSessionsDao: WalletConnectSessionsDao + + val stakingDashboardDao: StakingDashboardDao + + val externalBalanceDao: ExternalBalanceDao + + val holdsDao: HoldsDao + fun provideDatabase(): AppDatabase fun provideLockDao(): LockDao @@ -76,17 +91,5 @@ interface DbApi { fun tinderGovDao(): TinderGovDao - val phishingSitesDao: PhishingSitesDao - - val favouritesDAppsDao: FavouriteDAppsDao - - val currencyDao: CurrencyDao - - val walletConnectSessionsDao: WalletConnectSessionsDao - - val stakingDashboardDao: StakingDashboardDao - - val externalBalanceDao: ExternalBalanceDao - - val holdsDao: HoldsDao + fun browserTabsDao(): BrowserTabsDao } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureDependencies.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureDependencies.kt index 15210b8d41..c6ee645370 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureDependencies.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureDependencies.kt @@ -1,14 +1,17 @@ package io.novafoundation.nova.feature_dapp_impl.di +import android.content.Context import coil.ImageLoader import com.google.gson.Gson import io.novafoundation.nova.common.address.AddressIconGenerator import io.novafoundation.nova.common.data.network.AppLinksProvider import io.novafoundation.nova.common.data.network.NetworkApiCreator import io.novafoundation.nova.common.data.secrets.v2.SecretStoreV2 +import io.novafoundation.nova.common.interfaces.FileProvider import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.common.resources.ResourceManager import io.novafoundation.nova.core_db.dao.BrowserHostSettingsDao +import io.novafoundation.nova.core_db.dao.BrowserTabsDao import io.novafoundation.nova.core_db.dao.DappAuthorizationDao import io.novafoundation.nova.core_db.dao.FavouriteDAppsDao import io.novafoundation.nova.core_db.dao.PhishingSitesDao @@ -26,6 +29,22 @@ import io.novafoundation.nova.runtime.multiNetwork.runtime.repository.RuntimeVer interface DAppFeatureDependencies { + val context: Context + + val browserTabsDao: BrowserTabsDao + + val phishingSitesDao: PhishingSitesDao + + val favouriteDAppsDao: FavouriteDAppsDao + + val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory + + val walletUiUseCase: WalletUiUseCase + + val walletRepository: WalletRepository + + val fileProvider: FileProvider + fun currencyRepository(): CurrencyRepository fun accountRepository(): AccountRepository @@ -62,14 +81,4 @@ interface DAppFeatureDependencies { fun dappAuthorizationDao(): DappAuthorizationDao fun browserHostSettingsDao(): BrowserHostSettingsDao - - val phishingSitesDao: PhishingSitesDao - - val favouriteDAppsDao: FavouriteDAppsDao - - val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory - - val walletUiUseCase: WalletUiUseCase - - val walletRepository: WalletRepository } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt index 3f4e2aad3e..4da45f5acf 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/BrowserTabsModule.kt @@ -12,6 +12,7 @@ import io.novafoundation.nova.feature_dapp_impl.utils.tabs.PageSnapshotBuilder import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabPoolService import io.novafoundation.nova.feature_dapp_impl.utils.tabs.RealBrowserTabStorage import io.novafoundation.nova.feature_dapp_impl.utils.tabs.TabMemoryRestrictionService +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSessionFactory @Module class BrowserTabsModule { @@ -36,19 +37,25 @@ class BrowserTabsModule { return TabMemoryRestrictionService(context) } + @FeatureScope + @Provides + fun providePageSessionFactory(): PageSessionFactory { + return PageSessionFactory() + } + @FeatureScope @Provides fun provideBrowserTabPoolService( - context: Context, browserTabStorage: BrowserTabStorage, pageSnapshotBuilder: PageSnapshotBuilder, - tabMemoryRestrictionService: TabMemoryRestrictionService + tabMemoryRestrictionService: TabMemoryRestrictionService, + pageSessionFactory: PageSessionFactory ): BrowserTabPoolService { return RealBrowserTabPoolService( - context = context, browserTabStorage = browserTabStorage, pageSnapshotBuilder = pageSnapshotBuilder, - tabMemoryRestrictionService = tabMemoryRestrictionService + tabMemoryRestrictionService = tabMemoryRestrictionService, + pageSessionFactory = pageSessionFactory ) } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/Web3Module.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/Web3Module.kt index bed72a5fdd..476757daa3 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/Web3Module.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/modules/Web3Module.kt @@ -16,7 +16,7 @@ import io.novafoundation.nova.feature_dapp_impl.web3.polkadotJs.states.PolkadotJ import io.novafoundation.nova.feature_dapp_impl.web3.session.DbWeb3Session import io.novafoundation.nova.feature_dapp_impl.web3.session.Web3Session import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionStoreFactory -import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClientFactory +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3InjectorPool import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewHolder import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewScriptInjector @@ -35,10 +35,10 @@ class Web3Module { @Provides @FeatureScope - fun provideWeb3ClientFactory( + fun provideWeb3InjectorPool( polkadotJsInjector: PolkadotJsInjector, metamaskInjector: MetamaskInjector, - ) = Web3WebViewClientFactory( + ) = Web3InjectorPool( injectors = listOf( polkadotJsInjector, metamaskInjector diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt index 46742a906b..abfbecbbc3 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt @@ -2,10 +2,12 @@ package io.novafoundation.nova.feature_dapp_impl.presentation.browser.main import android.content.Intent import android.content.pm.ActivityInfo +import android.graphics.Bitmap import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.webkit.WebView import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.core.os.bundleOf @@ -23,13 +25,13 @@ import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.sheets import io.novafoundation.nova.feature_dapp_impl.presentation.browser.options.DAppOptionsPayload import io.novafoundation.nova.feature_dapp_impl.presentation.browser.options.OptionsBottomSheetDialog import io.novafoundation.nova.feature_dapp_impl.presentation.common.favourites.setupRemoveFavouritesConfirmation +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSession import io.novafoundation.nova.feature_dapp_impl.web3.webview.PageCallback +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3ChromeClient +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3InjectorPool import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClient -import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClientFactory import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewFileChooser import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewHolder -import io.novafoundation.nova.feature_dapp_impl.web3.webview.injectWeb3 -import io.novafoundation.nova.feature_dapp_impl.web3.webview.uninjectWeb3 import io.novafoundation.nova.feature_external_sign_api.presentation.externalSign.AuthorizeDappBottomSheet import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserAddressBar import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserAddressBarGroup @@ -39,8 +41,8 @@ import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserForward import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserMore import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserProgress import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserRefresh -import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserWebView import javax.inject.Inject +import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserWebViewContainer class DAppBrowserFragment : BaseFragment(), OptionsBottomSheetDialog.Callback, PageCallback { @@ -52,7 +54,7 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } @Inject - lateinit var web3WebViewClientFactory: Web3WebViewClientFactory + lateinit var web3InjectorPool: Web3InjectorPool @Inject lateinit var webViewHolder: WebViewHolder @@ -64,6 +66,11 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS var backCallback: OnBackPressedCallback? = null + private val dappBrowserWebView: WebView? + get() { + return dappBrowserWebViewContainer.getChildAt(0) as? WebView + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -77,8 +84,6 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } override fun initViews() { - webViewHolder.set(dappBrowserWebView) - dappBrowserAddressBarGroup.applyStatusBarInsets() dappBrowserClose.setOnClickListener { viewModel.closeClicked() } @@ -98,13 +103,10 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } override fun onDestroyView() { + viewModel.detachCurrentSession() super.onDestroyView() - dappBrowserWebView.uninjectWeb3() - requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - - webViewHolder.release() } override fun onPause() { @@ -136,12 +138,9 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS override fun subscribe(viewModel: DAppBrowserViewModel) { setupRemoveFavouritesConfirmation(viewModel.removeFromFavouritesConfirmation) - webViewClient = web3WebViewClientFactory.create(dappBrowserWebView, viewModel.extensionsStore, viewModel::onPageChanged, this) - dappBrowserWebView.injectWeb3( - progressBar = dappBrowserProgress, - fileChooser = fileChooser, - web3Client = webViewClient!! - ) + viewModel.currentTabFlow.observe { currentTab -> + attachSession(currentTab.pageSession) + } viewModel.desktopModeChangedModel.observe { webViewClient?.desktopMode = it.desktopModeEnabled @@ -152,6 +151,7 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS is Action.Authorize -> { showConfirmAuthorizeSheet(it as DappPendingConfirmation) } + Action.CloseScreen -> showCloseConfirmation(it) Action.AcknowledgePhishingAlert -> { AcknowledgePhishingBottomSheet(requireContext(), it) @@ -162,12 +162,12 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS viewModel.browserCommandEvent.observeEvent { when (it) { - BrowserCommand.Reload -> dappBrowserWebView.reload() + BrowserCommand.Reload -> dappBrowserWebView?.reload() BrowserCommand.GoBack -> backClicked() - is BrowserCommand.OpenUrl -> dappBrowserWebView.loadUrl(it.url) + is BrowserCommand.OpenUrl -> dappBrowserWebView?.loadUrl(it.url) is BrowserCommand.ChangeDesktopMode -> { webViewClient?.desktopMode = it.enabled - dappBrowserWebView.reload() + dappBrowserWebView?.reload() } } } @@ -185,6 +185,22 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } } + private fun attachSession(session: PageSession) { + session.initialize(requireContext()) { webView -> + web3InjectorPool.initialInject(webView) + webView.loadUrl(session.startUrl) + } + + session.attachSession(createChromeClient(), this) + webViewHolder.set(session.webView) + webViewClient = session.webViewClient + + dappBrowserWebViewContainer.removeAllViews() + dappBrowserWebViewContainer.addView(session.webView) + } + + private fun createChromeClient() = Web3ChromeClient(fileChooser, dappBrowserProgress) + private fun showCloseConfirmation(pendingConfirmation: DappPendingConfirmation<*>) { dialog(requireContext().themed(R.style.AccentNegativeAlertDialogTheme_Reversed)) { setPositiveButton(R.string.common_close) { _, _ -> pendingConfirmation.onConfirm() } @@ -196,8 +212,8 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } private fun updateButtonsState() { - dappBrowserForward.isEnabled = dappBrowserWebView.canGoForward() - dappBrowserBack.isEnabled = dappBrowserWebView.canGoBack() + dappBrowserForward.isEnabled = dappBrowserWebView?.canGoForward() ?: false + dappBrowserBack.isEnabled = dappBrowserWebView?.canGoBack() ?: false } private fun showConfirmAuthorizeSheet(pendingConfirmation: DappPendingConfirmation) { @@ -210,19 +226,19 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } private fun backClicked() { - if (dappBrowserWebView.canGoBack()) { - dappBrowserWebView.goBack() + if (dappBrowserWebView?.canGoBack() == true) { + dappBrowserWebView?.goBack() } else { viewModel.closeClicked() } } private fun forwardClicked() { - dappBrowserWebView.goForward() + dappBrowserWebView?.goForward() } private fun refreshClicked() { - dappBrowserWebView.reload() + dappBrowserWebView?.reload() } private fun attachBackCallback() { @@ -253,6 +269,10 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS viewModel.onDesktopClick() } + override fun onPageStarted(webView: WebView, url: String, favicon: Bitmap?) { + web3InjectorPool.injectForPage(webView, viewModel.extensionsStore) + } + override fun handleBrowserIntent(intent: Intent) { try { startActivity(intent) @@ -261,4 +281,8 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS .show() } } + + override fun onPageChanged(webView: WebView, url: String, title: String?) { + viewModel.onPageChanged(url, title) + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt index 6dbf8a672d..8904092d41 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt @@ -22,6 +22,8 @@ import io.novafoundation.nova.feature_dapp_impl.presentation.browser.options.DAp import io.novafoundation.nova.feature_dapp_impl.presentation.common.favourites.RemoveFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchRequester import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.CurrentTabState import io.novafoundation.nova.feature_dapp_impl.web3.session.Web3Session.Authorization.State import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionStoreFactory import io.novafoundation.nova.feature_dapp_impl.web3.states.Web3ExtensionStateMachine.ExternalEvent @@ -43,6 +45,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.launchIn @@ -69,7 +72,8 @@ class DAppBrowserViewModel( private val initialUrl: String, private val selectedAccountUseCase: SelectedAccountUseCase, private val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, - private val chainRegistry: ChainRegistry + private val chainRegistry: ChainRegistry, + private val browserTabPoolService: BrowserTabPoolService ) : BaseViewModel(), Web3StateMachineHost { val removeFromFavouritesConfirmation = actionAwaitableMixinFactory.confirmingAction() @@ -107,6 +111,10 @@ class DAppBrowserViewModel( .distinctUntilChanged() .shareInBackground() + val currentTabFlow = browserTabPoolService.currentTabFlow + .filterIsInstance() + .shareInBackground() + init { dAppSearchRequester.responseFlow .onEach { it.newUrl?.let(::forceLoad) } @@ -114,7 +122,10 @@ class DAppBrowserViewModel( watchDangerousWebsites() - forceLoad(initialUrl) + launch { + // TODO: We should create tab before this screen open + browserTabPoolService.createNewTabAsCurrentTab(initialUrl) + } } override suspend fun authorizeDApp(payload: AuthorizeDappBottomSheet.Payload): State { @@ -147,6 +158,10 @@ class DAppBrowserViewModel( _browserCommandEvent.postValue(BrowserCommand.Reload.event()) } + fun detachCurrentSession() { + browserTabPoolService.detachCurrentSession() + } + fun onPageChanged(url: String, title: String?) { updateCurrentPage(url, title, synchronizedWithBrowser = true) } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt index 896af4f8d9..d07cf6a176 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt @@ -21,6 +21,7 @@ import io.novafoundation.nova.feature_dapp_impl.domain.DappInteractor import io.novafoundation.nova.feature_dapp_impl.domain.browser.DappBrowserInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserViewModel import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionStoreFactory import io.novafoundation.nova.feature_dapp_impl.web3.webview.WebViewFileChooser import io.novafoundation.nova.feature_external_sign_api.model.ExternalSignCommunicator @@ -71,7 +72,8 @@ class DAppBrowserModule { extensionStoreFactory: ExtensionStoreFactory, dAppInteractor: DappInteractor, actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, - chainRegistry: ChainRegistry + chainRegistry: ChainRegistry, + browserTabPoolService: BrowserTabPoolService ): ViewModel { return DAppBrowserViewModel( router = router, @@ -83,7 +85,8 @@ class DAppBrowserModule { initialUrl = initialUrl, extensionStoreFactory = extensionStoreFactory, actionAwaitableMixinFactory = actionAwaitableMixinFactory, - chainRegistry = chainRegistry + chainRegistry = chainRegistry, + browserTabPoolService = browserTabPoolService ) } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 398cbbd8db..8cc51f8d82 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -1,10 +1,10 @@ package io.novafoundation.nova.feature_dapp_impl.utils.tabs -import android.content.Context import io.novafoundation.nova.common.utils.Urls import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.BrowserTab import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.CurrentTabState import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSession +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSessionFactory import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.stateId import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.withNameOnly @@ -19,9 +19,11 @@ import kotlinx.coroutines.flow.map interface BrowserTabPoolService { - fun currentTabFlow(): Flow + val currentTabFlow: Flow - fun selectTab(tabId: String) + fun selectTab(tabId: String?) + + fun detachCurrentSession() suspend fun makeCurrentTabSnapshot() @@ -33,10 +35,10 @@ interface BrowserTabPoolService { } class RealBrowserTabPoolService( - private val context: Context, private val browserTabStorage: BrowserTabStorage, private val pageSnapshotBuilder: PageSnapshotBuilder, - private val tabMemoryRestrictionService: TabMemoryRestrictionService + private val tabMemoryRestrictionService: TabMemoryRestrictionService, + private val pageSessionFactory: PageSessionFactory ) : BrowserTabPoolService { private val availableSessionsCount = tabMemoryRestrictionService.getMaximumActiveSessions() @@ -48,7 +50,7 @@ class RealBrowserTabPoolService( private val activeSessions = mutableMapOf() - private val currentTabSession = combine( + override val currentTabFlow = combine( selectedTabIdFlow, allTabsFlow ) { selectedTabId, allTabs -> @@ -60,14 +62,17 @@ class RealBrowserTabPoolService( ) }.distinctUntilChangedBy { it.stateId() } - override fun currentTabFlow(): Flow { - return currentTabSession - } + override fun selectTab(tabId: String?) { + val oldTabId = selectedTabIdFlow.value + detachSession(oldTabId) - override fun selectTab(tabId: String) { selectedTabIdFlow.value = tabId } + override fun detachCurrentSession() { + selectTab(null) + } + override suspend fun createNewTabAsCurrentTab(url: String) { val tab = BrowserTab( id = UUID.randomUUID().toString(), @@ -77,19 +82,24 @@ class RealBrowserTabPoolService( ) browserTabStorage.saveTab(tab) - selectedTabIdFlow.value = tab.id + selectTab(tab.id) } override suspend fun removeTab(tabId: String) { + if (tabId == selectedTabIdFlow.value) { + selectTab(null) + } + browserTabStorage.removeTab(tabId) } override suspend fun removeAllTabs() { + selectTab(null) browserTabStorage.removeAllTabs() } override suspend fun makeCurrentTabSnapshot() { - val currentTab = currentTabSession.first() + val currentTab = currentTabFlow.first() if (currentTab is CurrentTabState.Selected) { val snapshot = pageSnapshotBuilder.getPageSnapshot(currentTab.pageSession) @@ -102,7 +112,7 @@ class RealBrowserTabPoolService( removeOldestSession() } - val session = PageSession(tabId = tab.id, sessionStartTime = Date(), startUrl = tab.currentUrl, context = context) + val session = pageSessionFactory.create(tabId = tab.id, sessionStartTime = Date(), startUrl = tab.currentUrl) activeSessions[tab.id] = session return session } @@ -112,4 +122,9 @@ class RealBrowserTabPoolService( sessionToDestroy.destroySession() activeSessions.remove(sessionToDestroy.tabId) } + + private fun detachSession(tabId: String?) { + val sessionToDetach = activeSessions[tabId] + sessionToDetach?.detachSession() + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt index 158c9ac524..2d71b2d924 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt @@ -1,20 +1,88 @@ package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models import android.content.Context +import android.content.Intent +import android.graphics.Bitmap import android.webkit.WebView +import io.novafoundation.nova.feature_dapp_impl.web3.webview.PageCallback +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3ChromeClient +import io.novafoundation.nova.feature_dapp_impl.web3.webview.Web3WebViewClient +import io.novafoundation.nova.feature_dapp_impl.web3.webview.injectWeb3 +import io.novafoundation.nova.feature_dapp_impl.web3.webview.uninjectWeb3 import java.util.Date +class PageSessionFactory { + + fun create(tabId: String, sessionStartTime: Date, startUrl: String): PageSession { + return PageSession( + tabId = tabId, + sessionStartTime = sessionStartTime, + startUrl = startUrl + ) + } +} + class PageSession( val tabId: String, val sessionStartTime: Date, - startUrl: String, - context: Context -) { - val webView: WebView = WebView(context).apply { - loadUrl(startUrl) + val startUrl: String +) : PageCallback { + + private var _webView: WebView? = null + val webView: WebView + get() { + return _webView ?: throw IllegalStateException("WebView is not initialized") + } + + private var _webViewClient: Web3WebViewClient? = null + val webViewClient: Web3WebViewClient + get() { + return _webViewClient ?: throw IllegalStateException("WebViewClient is not initialized") + } + + private var nestedPageCallback: PageCallback? = null + + fun initialize(context: Context, onInitialized: (WebView) -> Unit) { + if (_webView == null) { + _webView = WebView(context) + _webViewClient = Web3WebViewClient( + webView = _webView!!, + pageCallback = this + ) + + webView.injectWeb3(webViewClient) + + onInitialized(webView) + } + } + + fun attachSession( + chromeClient: Web3ChromeClient, + pageCallback: PageCallback + ) { + webView.webChromeClient = chromeClient + this.nestedPageCallback = pageCallback + } + + fun detachSession() { + webView.webChromeClient = null + nestedPageCallback = null + } + + override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { + nestedPageCallback?.onPageStarted(view, url, favicon) + } + + override fun handleBrowserIntent(intent: Intent) { + nestedPageCallback?.handleBrowserIntent(intent) + } + + override fun onPageChanged(view: WebView, url: String, title: String?) { + nestedPageCallback?.onPageChanged(view, url, title) } fun destroySession() { + webView.uninjectWeb3() webView.destroy() } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/metamask/transport/MetamaskInjector.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/metamask/transport/MetamaskInjector.kt index 975fde63c7..6f43492230 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/metamask/transport/MetamaskInjector.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/metamask/transport/MetamaskInjector.kt @@ -24,11 +24,11 @@ class MetamaskInjector( private val webViewScriptInjector: WebViewScriptInjector ) : Web3Injector { - override fun initialInject(into: WebView, extensionStore: ExtensionsStore) { + override fun initialInject(into: WebView) { webViewScriptInjector.injectJsInterface(into, jsInterface, JS_INTERFACE_NAME) } - override fun injectForPage(into: WebView, url: String, extensionStore: ExtensionsStore) { + override fun injectForPage(into: WebView, extensionStore: ExtensionsStore) { webViewScriptInjector.injectScript(R.raw.metamask_min, into, scriptId = "novawallet-metamask-bundle") injectProvider(extensionStore, into) } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/polkadotJs/PolkadotJsInjector.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/polkadotJs/PolkadotJsInjector.kt index 8d37e14a61..36d3f124d9 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/polkadotJs/PolkadotJsInjector.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/polkadotJs/PolkadotJsInjector.kt @@ -15,11 +15,11 @@ class PolkadotJsInjector( private val webViewScriptInjector: WebViewScriptInjector ) : Web3Injector { - override fun initialInject(into: WebView, extensionStore: ExtensionsStore) { + override fun initialInject(into: WebView) { webViewScriptInjector.injectJsInterface(into, jsInterface, JS_INTERFACE_NAME) } - override fun injectForPage(into: WebView, url: String, extensionStore: ExtensionsStore) { + override fun injectForPage(into: WebView, extensionStore: ExtensionsStore) { webViewScriptInjector.injectScript(R.raw.polkadotjs_min, into, scriptId = "novawallet-polkadotjs-bundle") webViewScriptInjector.injectScript(R.raw.javascript_interface_bridge, into, scriptId = "novawallet-polkadotjs-provider") } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3ChromeClient.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3ChromeClient.kt new file mode 100644 index 0000000000..380de4858b --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3ChromeClient.kt @@ -0,0 +1,27 @@ +package io.novafoundation.nova.feature_dapp_impl.web3.webview + +import android.net.Uri +import android.webkit.ValueCallback +import android.webkit.WebChromeClient +import android.webkit.WebView +import android.widget.ProgressBar +import io.novafoundation.nova.common.utils.setVisible + +private const val MAX_PROGRESS = 100 + +class Web3ChromeClient( + private val fileChooser: WebViewFileChooser, + private val progressBar: ProgressBar +) : WebChromeClient() { + + override fun onProgressChanged(view: WebView, newProgress: Int) { + progressBar.progress = newProgress + + progressBar.setVisible(newProgress < MAX_PROGRESS) + } + + override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback>?, fileChooserParams: FileChooserParams?): Boolean { + fileChooser.onShowFileChooser(filePathCallback, fileChooserParams) + return true + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3Injector.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3Injector.kt new file mode 100644 index 0000000000..b4b991a2ae --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3Injector.kt @@ -0,0 +1,22 @@ +package io.novafoundation.nova.feature_dapp_impl.web3.webview + +import android.webkit.WebView +import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionsStore + +interface Web3Injector { + + fun initialInject(into: WebView) + + fun injectForPage(into: WebView, extensionStore: ExtensionsStore) +} + +class Web3InjectorPool(val injectors: List) { + + fun initialInject(into: WebView) { + injectors.forEach { it.initialInject(into) } + } + + fun injectForPage(into: WebView, extensionStore: ExtensionsStore) { + injectors.forEach { it.injectForPage(into, extensionStore) } + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebView.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebView.kt index 314da98cc6..0aad4c3d56 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebView.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebView.kt @@ -3,15 +3,10 @@ package io.novafoundation.nova.feature_dapp_impl.web3.webview import android.annotation.SuppressLint import android.webkit.WebSettings import android.webkit.WebView -import android.widget.ProgressBar import io.novafoundation.nova.common.BuildConfig @SuppressLint("SetJavaScriptEnabled") -fun WebView.injectWeb3( - progressBar: ProgressBar, - fileChooser: WebViewFileChooser, - web3Client: Web3WebViewClient -) { +fun WebView.injectWeb3(web3Client: Web3WebViewClient) { settings.javaScriptEnabled = true settings.cacheMode = WebSettings.LOAD_DEFAULT settings.builtInZoomControls = true @@ -21,23 +16,11 @@ fun WebView.injectWeb3( settings.domStorageEnabled = true settings.javaScriptCanOpenWindowsAutomatically = true - web3Client.initialInject() this.webViewClient = web3Client - webChromeClient = Web3ChromeClient(fileChooser, progressBar) WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG) } -fun WebView.changeUserAgentByDesktopMode(desktopMode: Boolean) { - val defaultUserAgent = WebSettings.getDefaultUserAgent(context) - - settings.userAgentString = if (desktopMode) { - "Mozilla/5.0 (X11; CrOS x86_64 10066.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" - } else { - defaultUserAgent - } -} - fun WebView.uninjectWeb3() { settings.javaScriptEnabled = false diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebViewClient.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebViewClient.kt index d833cfe059..b3a3b7ef28 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebViewClient.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/Web3WebViewClient.kt @@ -2,48 +2,22 @@ package io.novafoundation.nova.feature_dapp_impl.web3.webview import android.content.Intent import android.graphics.Bitmap -import android.net.Uri -import android.webkit.ValueCallback -import android.webkit.WebChromeClient import android.webkit.WebResourceRequest +import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient -import android.widget.ProgressBar -import io.novafoundation.nova.common.utils.setVisible -import io.novafoundation.nova.feature_dapp_impl.web3.states.ExtensionsStore -interface Web3Injector { - - fun initialInject(into: WebView, extensionStore: ExtensionsStore) - - fun injectForPage(into: WebView, url: String, extensionStore: ExtensionsStore) -} - -class Web3WebViewClientFactory( - private val injectors: List, -) { - - fun create( - webView: WebView, - extensionStore: ExtensionsStore, - onPageChangedListener: OnPageChangedListener, - pageCallback: PageCallback - ): Web3WebViewClient { - return Web3WebViewClient(injectors, extensionStore, webView, onPageChangedListener, pageCallback) - } -} +interface PageCallback { -typealias OnPageChangedListener = (url: String, title: String?) -> Unit + fun onPageStarted(webView: WebView, url: String, favicon: Bitmap?) -interface PageCallback { fun handleBrowserIntent(intent: Intent) + + fun onPageChanged(webView: WebView, url: String, title: String?) } class Web3WebViewClient( - private val injectors: List, - private val extensionStore: ExtensionsStore, private val webView: WebView, - private val onPageChangedListener: OnPageChangedListener, private val pageCallback: PageCallback ) : WebViewClient() { @@ -57,10 +31,6 @@ class Web3WebViewClient( } private var desktopModeChanged = false - fun initialInject() { - injectors.forEach { it.initialInject(webView, extensionStore) } - } - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { val url = request.url @@ -74,7 +44,7 @@ class Web3WebViewClient( } override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { - tryInject(view, url) + pageCallback.onPageStarted(view, url, favicon) if (desktopMode) { setDesktopViewport(view) } @@ -85,11 +55,9 @@ class Web3WebViewClient( } override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { - onPageChangedListener(url, view.title) + pageCallback.onPageChanged(view, url, view.title) } - private fun tryInject(view: WebView, url: String) = injectors.forEach { it.injectForPage(view, url, extensionStore) } - private fun setDesktopViewport(webView: WebView) { val density = webView.context.resources.displayMetrics.density val deviceWidth = webView.measuredWidth @@ -101,21 +69,12 @@ class Web3WebViewClient( } } -private const val MAX_PROGRESS = 100 - -class Web3ChromeClient( - private val fileChooser: WebViewFileChooser, - private val progressBar: ProgressBar -) : WebChromeClient() { - - override fun onProgressChanged(view: WebView, newProgress: Int) { - progressBar.progress = newProgress - - progressBar.setVisible(newProgress < MAX_PROGRESS) - } +private fun WebView.changeUserAgentByDesktopMode(desktopMode: Boolean) { + val defaultUserAgent = WebSettings.getDefaultUserAgent(context) - override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback>?, fileChooserParams: FileChooserParams?): Boolean { - fileChooser.onShowFileChooser(filePathCallback, fileChooserParams) - return true + settings.userAgentString = if (desktopMode) { + "Mozilla/5.0 (X11; CrOS x86_64 10066.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" + } else { + defaultUserAgent } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/WebViewHolder.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/WebViewHolder.kt index 0c872691cc..043bb62d8d 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/WebViewHolder.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/web3/webview/WebViewHolder.kt @@ -7,7 +7,7 @@ class WebViewHolder { var webView: WebView? = null private set - fun set(new: WebView) { + fun set(new: WebView?) { webView = new } diff --git a/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml b/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml index 4e772baac2..2d16b3ad71 100644 --- a/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml +++ b/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml @@ -42,8 +42,8 @@ android:max="100" tools:progress="45" /> - From 1e3a68d600f01df3e151a92945f8a7b3c6dd1dfb Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Thu, 21 Nov 2024 03:37:07 +0100 Subject: [PATCH 09/83] Implemented dapp navigation with split screen support --- .../app/navigation/AccountNavigationModule.kt | 36 +-- .../di/app/navigation/BuyNavigationModule.kt | 6 +- .../navigation/CloudBackupNavigationModule.kt | 6 +- .../navigation/CurrencyNavigationModule.kt | 6 +- .../di/app/navigation/DAppNavigationModule.kt | 12 +- .../navigation/DeepLinkingNavigationModule.kt | 4 +- .../ExternalSignNavigationModule.kt | 10 +- .../navigation/GovernanceNavigationModule.kt | 16 +- .../app/navigation/LedgerNavigationModule.kt | 14 +- .../app/di/app/navigation/NavigationModule.kt | 20 +- .../di/app/navigation/NftNavigationModule.kt | 6 +- .../PushNotificationsNavigationModule.kt | 14 +- .../navigation/SettingsNavigationModule.kt | 8 +- .../di/app/navigation/SwapNavigationModule.kt | 8 +- .../navigation/VersionsNavigationModule.kt | 6 +- .../di/app/navigation/VoteNavigationModule.kt | 4 +- .../WalletConnectNavigationModule.kt | 10 +- .../NominationPoolsStakingNavigationModule.kt | 8 +- .../ParachainStakingNavigationModule.kt | 16 +- .../staking/RelayStakingNavigationModule.kt | 8 +- .../staking/StakingNavigationModule.kt | 12 +- .../nova/app/root/di/RootComponent.kt | 13 +- .../nova/app/root/di/RootFeatureHolder.kt | 24 +- .../nova/app/root/navigation/Ext.kt | 24 ++ .../NavStackInterScreenCommunicator.kt | 2 + .../app/root/navigation/buy/BuyNavigator.kt | 7 - .../cloudBackup/CloudBackupNavigator.kt | 7 - .../app/root/navigation/dApp/DAppNavigator.kt | 45 ---- .../holders/MainNavigationHolder.kt | 5 + .../{ => holders}/NavigationHolder.kt | 14 +- .../holders/RootNavigationHolder.kt | 5 + .../navigationFragment/MainNavHostFragment.kt | 8 + .../NovaNavHostFragment.kt | 10 +- .../navigationFragment/RootNavHostFragment.kt | 8 + .../{ => navigators}/BaseNavigator.kt | 3 +- .../navigation/{ => navigators}/Navigator.kt | 232 +++++++++--------- ...olkadotVaultVariantSignCommunicatorImpl.kt | 6 +- .../account/SelectAddressCommunicatorImpl.kt | 6 +- .../SelectMultipleWalletsCommunicatorImpl.kt | 6 +- .../account/SelectWalletCommunicatorImpl.kt | 5 +- .../navigation/navigators/buy/BuyNavigator.kt | 7 + .../ChangeBackupPasswordCommunicatorImpl.kt | 6 +- .../cloudBackup/CloudBackupNavigator.kt | 7 + .../RestoreBackupPasswordCommunicatorImpl.kt | 6 +- ...ncWalletsBackupPasswordCommunicatorImpl.kt | 6 +- .../navigators/dApp/DAppNavigator.kt | 59 +++++ .../dApp/DAppSearchCommunicatorImpl.kt | 6 +- .../deepLinking/DeepLinkingNavigator.kt | 4 +- .../ExternalSignCommunicatorImpl.kt | 5 +- .../externalSign/ExternalSignNavigator.kt | 8 +- .../governance/GovernanceNavigator.kt | 8 +- .../SelectTracksCommunicatorImpl.kt | 6 +- .../TinderGovVoteCommunicatorImpl.kt | 7 +- .../ledger/LedgerNavigator.kt | 8 +- .../ledger/LedgerSignCommunicatorImpl.kt | 6 +- .../SelectLedgerAddressCommunicatorImpl.kt | 6 +- .../{ => navigators}/nft/NftNavigator.kt | 8 +- ...deTwoFactorVerificationCommunicatorImpl.kt | 6 +- .../PushGovernanceSettingsCommunicatorImpl.kt | 6 +- .../push/PushNotificationsNavigator.kt | 8 +- .../PushStakingSettingsCommunicatorImpl.kt | 6 +- .../settings/SettingsNavigator.kt | 10 +- .../staking/StakingDashboardNavigator.kt | 8 +- .../staking/StartMultiStakingNavigator.kt | 10 +- .../NominationPoolsStakingNavigator.kt | 10 +- .../parachain/ParachainStakingNavigator.kt | 10 +- ...lectCollatorInterScreenCommunicatorImpl.kt | 6 +- ...atorSettingsInterScreenCommunicatorImpl.kt | 6 +- .../relaychain/RelayStakingNavigator.kt | 14 +- .../{ => navigators}/swap/SwapNavigator.kt | 9 +- .../versions/VersionsNavigator.kt | 5 +- .../{ => navigators}/vote/VoteNavigator.kt | 4 +- .../navigators/wallet/CurrencyNavigator.kt | 13 + .../ApproveSessionCommunicatorImpl.kt | 4 +- .../walletConnect/WalletConnectNavigator.kt | 8 +- .../navigation/wallet/CurrencyNavigator.kt | 13 - .../app/root/presentation/RootActivity.kt | 15 +- .../root/presentation/main/MainFragment.kt | 2 +- .../splitScreen/SplitScreenFragment.kt | 58 +++++ .../splitScreen/SplitScreenViewModel.kt | 7 + .../di/SplitScreenFragmentComponent.kt | 28 +++ .../di/SplitScreenFragmentModule.kt | 34 +++ app/src/main/res/layout/activity_root.xml | 7 +- .../main/res/layout/fragment_split_screen.xml | 16 ++ .../res/navigation/dapp_browser_graph.xml | 24 +- .../main/res/navigation/dapp_search_graph.xml | 2 +- .../main/res/navigation/dapp_tabs_graph.xml | 36 +++ .../main/res/navigation/import_nav_graph.xml | 2 +- .../main/res/navigation/main_nav_graph.xml | 4 +- .../navigation/referendum_details_graph.xml | 4 +- .../main/res/navigation/root_nav_graph.xml | 25 +- .../nova/common/utils/ImageLoaderExt.kt | 21 ++ .../transformation/TopCropTransformation.kt | 43 ++++ .../src/main/res/anim/fragment_slide_in.xml | 24 ++ .../src/main/res/anim/fragment_slide_out.xml | 23 ++ common/src/main/res/drawable/ic_tab_close.xml | 13 + common/src/main/res/values/strings.xml | 6 + .../nova/feature_dapp_api}/DAppRouter.kt | 6 +- .../feature_dapp_api/di/DAppFeatureApi.kt | 3 + .../addToFavorites}/AddToFavouritesPayload.kt | 2 +- .../di/DAppFeatureComponent.kt | 5 +- .../feature_dapp_impl/di/DAppFeatureHolder.kt | 2 +- .../AddToFavouritesFragment.kt | 1 + .../AddToFavouritesViewModel.kt | 3 +- .../di/AddToFavouritesComponent.kt | 2 +- .../di/AddToFavouritesModule.kt | 4 +- .../AuthorizedDAppsViewModel.kt | 2 +- .../di/AuthorizedDAppsModule.kt | 2 +- .../browser/main/DAppBrowserFragment.kt | 10 + .../browser/main/DAppBrowserViewModel.kt | 21 +- .../browser/main/di/DAppBrowserModule.kt | 2 +- .../presentation/main/MainDAppViewModel.kt | 2 +- .../presentation/main/di/MainDAppModule.kt | 2 +- .../search/DAppSearchViewModel.kt | 2 +- .../presentation/search/DappSearchFragment.kt | 2 +- .../search/di/DAppSearchModule.kt | 2 +- .../presentation/tab/BrowserTabRvItem.kt | 8 + .../presentation/tab/BrowserTabsAdapter.kt | 78 ++++++ .../presentation/tab/BrowserTabsFragment.kt | 90 +++++++ .../presentation/tab/BrowserTabsViewModel.kt | 56 +++++ .../tab/di/BrowserTabsComponent.kt | 26 ++ .../presentation/tab/di/BrowserTabsModule.kt | 38 +++ .../utils/tabs/BrowserTabPoolService.kt | 35 +-- .../utils/tabs/PageSnapshotBuilder.kt | 4 +- .../utils/tabs/models/TabsState.kt | 11 + .../main/res/layout/fragment_browser_tabs.xml | 56 +++++ .../main/res/layout/fragment_dapp_browser.xml | 12 +- .../src/main/res/layout/item_browser_tab.xml | 59 +++++ .../di/StakingFeatureDependencies.kt | 106 ++++---- .../presentation/StakingRouter.kt | 2 - .../more/MoreStakingOptionsViewModel.kt | 5 +- .../more/di/MoreStakingOptionsModule.kt | 5 +- 132 files changed, 1470 insertions(+), 569 deletions(-) delete mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/buy/BuyNavigator.kt delete mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/CloudBackupNavigator.kt delete mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppNavigator.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/MainNavigationHolder.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => holders}/NavigationHolder.kt (58%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/RootNavigationHolder.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/MainNavHostFragment.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigationFragment}/NovaNavHostFragment.kt (76%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/RootNavHostFragment.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/BaseNavigator.kt (91%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/Navigator.kt (69%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/account/PolkadotVaultVariantSignCommunicatorImpl.kt (89%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/account/SelectAddressCommunicatorImpl.kt (83%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/account/SelectMultipleWalletsCommunicatorImpl.kt (84%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/account/SelectWalletCommunicatorImpl.kt (78%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/buy/BuyNavigator.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt (81%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/CloudBackupNavigator.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt (81%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt (82%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/dApp/DAppSearchCommunicatorImpl.kt (78%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/deepLinking/DeepLinkingNavigator.kt (91%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/externalSign/ExternalSignCommunicatorImpl.kt (84%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/externalSign/ExternalSignNavigator.kt (68%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/governance/GovernanceNavigator.kt (97%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/governance/SelectTracksCommunicatorImpl.kt (83%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/governance/TinderGovVoteCommunicatorImpl.kt (80%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/ledger/LedgerNavigator.kt (93%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/ledger/LedgerSignCommunicatorImpl.kt (87%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/ledger/SelectLedgerAddressCommunicatorImpl.kt (83%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/nft/NftNavigator.kt (63%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt (86%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/push/PushGovernanceSettingsCommunicatorImpl.kt (83%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/push/PushNotificationsNavigator.kt (70%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/push/PushStakingSettingsCommunicatorImpl.kt (83%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/settings/SettingsNavigator.kt (92%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/StakingDashboardNavigator.kt (87%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/StartMultiStakingNavigator.kt (90%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/nominationPools/NominationPoolsStakingNavigator.kt (84%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/parachain/ParachainStakingNavigator.kt (92%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt (85%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt (85%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/staking/relaychain/RelayStakingNavigator.kt (96%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/swap/SwapNavigator.kt (87%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/versions/VersionsNavigator.kt (71%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/vote/VoteNavigator.kt (82%) create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/wallet/CurrencyNavigator.kt rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/walletConnect/ApproveSessionCommunicatorImpl.kt (86%) rename app/src/main/java/io/novafoundation/nova/app/root/navigation/{ => navigators}/walletConnect/WalletConnectNavigator.kt (78%) delete mode 100644 app/src/main/java/io/novafoundation/nova/app/root/navigation/wallet/CurrencyNavigator.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt create mode 100644 app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentModule.kt create mode 100644 app/src/main/res/layout/fragment_split_screen.xml create mode 100644 app/src/main/res/navigation/dapp_tabs_graph.xml create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/ImageLoaderExt.kt create mode 100644 common/src/main/java/io/novafoundation/nova/common/utils/coil/transformation/TopCropTransformation.kt create mode 100644 common/src/main/res/anim/fragment_slide_in.xml create mode 100644 common/src/main/res/anim/fragment_slide_out.xml create mode 100644 common/src/main/res/drawable/ic_tab_close.xml rename {feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl => feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api}/DAppRouter.kt (64%) rename {feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites => feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/presentation/addToFavorites}/AddToFavouritesPayload.kt (71%) create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsComponent.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt create mode 100644 feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/TabsState.kt create mode 100644 feature-dapp-impl/src/main/res/layout/fragment_browser_tabs.xml create mode 100644 feature-dapp-impl/src/main/res/layout/item_browser_tab.xml diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/AccountNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/AccountNavigationModule.kt index f8d76b8131..d2c75f4e74 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/AccountNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/AccountNavigationModule.kt @@ -2,16 +2,16 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.account.PolkadotVaultVariantSignCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.account.SelectAddressCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.account.SelectMultipleWalletsCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.account.SelectWalletCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.cloudBackup.ChangeBackupPasswordCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.cloudBackup.RestoreBackupPasswordCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.cloudBackup.SyncWalletsBackupPasswordCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.pincode.PinCodeTwoFactorVerificationCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.account.PolkadotVaultVariantSignCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.account.SelectAddressCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.account.SelectMultipleWalletsCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.account.SelectWalletCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.cloudBackup.ChangeBackupPasswordCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.cloudBackup.RestoreBackupPasswordCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.cloudBackup.SyncWalletsBackupPasswordCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.pincode.PinCodeTwoFactorVerificationCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.common.sequrity.verification.PinCodeTwoFactorVerificationCommunicator import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectAddress.SelectAddressCommunicator @@ -30,33 +30,33 @@ class AccountNavigationModule { @Provides @ApplicationScope fun providePinCodeTwoFactorVerificationCommunicator( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): PinCodeTwoFactorVerificationCommunicator = PinCodeTwoFactorVerificationCommunicatorImpl(navigationHolder) @Provides @ApplicationScope fun provideSelectWalletCommunicator( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): SelectWalletCommunicator = SelectWalletCommunicatorImpl(navigationHolder) @Provides @ApplicationScope fun provideParitySignerCommunicator( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): PolkadotVaultVariantSignCommunicator = PolkadotVaultVariantSignCommunicatorImpl(navigationHolder) @Provides @ApplicationScope fun provideSelectAddressCommunicator( router: AssetsRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): SelectAddressCommunicator = SelectAddressCommunicatorImpl(router, navigationHolder) @Provides @ApplicationScope fun provideSelectMultipleWalletsCommunicator( router: AssetsRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): SelectMultipleWalletsCommunicator = SelectMultipleWalletsCommunicatorImpl(router, navigationHolder) @ApplicationScope @@ -67,20 +67,20 @@ class AccountNavigationModule { @ApplicationScope fun providePushGovernanceSettingsCommunicator( router: AccountRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): SyncWalletsBackupPasswordCommunicator = SyncWalletsBackupPasswordCommunicatorImpl(router, navigationHolder) @Provides @ApplicationScope fun provideChangeBackupPasswordCommunicator( router: AccountRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): ChangeBackupPasswordCommunicator = ChangeBackupPasswordCommunicatorImpl(router, navigationHolder) @Provides @ApplicationScope fun provideRestoreBackupPasswordCommunicator( router: AccountRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): RestoreBackupPasswordCommunicator = RestoreBackupPasswordCommunicatorImpl(router, navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/BuyNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/BuyNavigationModule.kt index c6895a9540..732fb34168 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/BuyNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/BuyNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.buy.BuyNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.buy.BuyNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_buy_impl.presentation.BuyRouter @@ -12,5 +12,5 @@ class BuyNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): BuyRouter = BuyNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): BuyRouter = BuyNavigator(navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CloudBackupNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CloudBackupNavigationModule.kt index c7209237c4..f6ba95b268 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CloudBackupNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CloudBackupNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.cloudBackup.CloudBackupNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.cloudBackup.CloudBackupNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_cloud_backup_impl.presentation.CloudBackupRouter @@ -12,5 +12,5 @@ class CloudBackupNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): CloudBackupRouter = CloudBackupNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): CloudBackupRouter = CloudBackupNavigator(navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CurrencyNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CurrencyNavigationModule.kt index 10ad03bbc0..b1b86980e0 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CurrencyNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/CurrencyNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.wallet.CurrencyNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.wallet.CurrencyNavigator import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_currency_api.presentation.CurrencyRouter @@ -15,6 +15,6 @@ class CurrencyNavigationModule { @Provides fun provideRouter( rootRouter: RootRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): CurrencyRouter = CurrencyNavigator(rootRouter, navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DAppNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DAppNavigationModule.kt index a517e27bed..461fba8d3d 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DAppNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DAppNavigationModule.kt @@ -2,11 +2,11 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.dApp.DAppNavigator -import io.novafoundation.nova.app.root.navigation.dApp.DAppSearchCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.dApp.DAppNavigator +import io.novafoundation.nova.app.root.navigation.navigators.dApp.DAppSearchCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator @Module @@ -14,11 +14,11 @@ class DAppNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): DAppRouter = DAppNavigator(navigationHolder) + fun provideRouter(navigationHolder: RootNavigationHolder): DAppRouter = DAppNavigator(navigationHolder) @ApplicationScope @Provides - fun provideSearchDappCommunicator(navigationHolder: NavigationHolder): DAppSearchCommunicator { + fun provideSearchDappCommunicator(navigationHolder: RootNavigationHolder): DAppSearchCommunicator { return DAppSearchCommunicatorImpl(navigationHolder) } } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DeepLinkingNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DeepLinkingNavigationModule.kt index 1894563283..661787d7d8 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DeepLinkingNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/DeepLinkingNavigationModule.kt @@ -2,11 +2,11 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.deepLinking.DeepLinkingNavigator +import io.novafoundation.nova.app.root.navigation.navigators.deepLinking.DeepLinkingNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter import io.novafoundation.nova.feature_assets.presentation.AssetsRouter -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_deep_linking.presentation.handling.DeepLinkingRouter import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/ExternalSignNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/ExternalSignNavigationModule.kt index 96d8cb8f40..435a883028 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/ExternalSignNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/ExternalSignNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.externalSign.ExternalSignCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.externalSign.ExternalSignNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.externalSign.ExternalSignCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.externalSign.ExternalSignNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate import io.novafoundation.nova.feature_external_sign_api.model.ExternalSignCommunicator @@ -15,12 +15,12 @@ class ExternalSignNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): ExternalSignRouter = ExternalSignNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): ExternalSignRouter = ExternalSignNavigator(navigationHolder) @ApplicationScope @Provides fun provideSignExtrinsicCommunicator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, automaticInteractionGate: AutomaticInteractionGate, ): ExternalSignCommunicator { return ExternalSignCommunicatorImpl(navigationHolder, automaticInteractionGate) diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/GovernanceNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/GovernanceNavigationModule.kt index 08fb3d5143..2d50088b9d 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/GovernanceNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/GovernanceNavigationModule.kt @@ -2,11 +2,11 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.governance.GovernanceNavigator -import io.novafoundation.nova.app.root.navigation.governance.SelectTracksCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.governance.TinderGovVoteCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.governance.GovernanceNavigator +import io.novafoundation.nova.app.root.navigation.navigators.governance.SelectTracksCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.governance.TinderGovVoteCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectTracksCommunicator import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter @@ -18,7 +18,7 @@ class GovernanceNavigationModule { @ApplicationScope @Provides fun provideRouter( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, commonNavigator: Navigator, ): GovernanceRouter = GovernanceNavigator(navigationHolder, commonNavigator) @@ -26,13 +26,13 @@ class GovernanceNavigationModule { @ApplicationScope fun provideSelectTracksCommunicator( router: GovernanceRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): SelectTracksCommunicator = SelectTracksCommunicatorImpl(router, navigationHolder) @Provides @ApplicationScope fun provideTinderGovVoteCommunicator( router: GovernanceRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): TinderGovVoteCommunicator = TinderGovVoteCommunicatorImpl(router, navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/LedgerNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/LedgerNavigationModule.kt index eb1e849883..027ef116d8 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/LedgerNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/LedgerNavigationModule.kt @@ -2,10 +2,10 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.ledger.LedgerNavigator -import io.novafoundation.nova.app.root.navigation.ledger.LedgerSignCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.ledger.SelectLedgerAddressCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.ledger.LedgerNavigator +import io.novafoundation.nova.app.root.navigation.navigators.ledger.LedgerSignCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.ledger.SelectLedgerAddressCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_account_api.presenatation.sign.LedgerSignCommunicator import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter @@ -17,17 +17,17 @@ class LedgerNavigationModule { @ApplicationScope @Provides - fun provideSelectLedgerAddressCommunicator(navigationHolder: NavigationHolder): SelectLedgerAddressInterScreenCommunicator { + fun provideSelectLedgerAddressCommunicator(navigationHolder: MainNavigationHolder): SelectLedgerAddressInterScreenCommunicator { return SelectLedgerAddressCommunicatorImpl(navigationHolder) } @Provides @ApplicationScope fun provideLedgerSignerCommunicator( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): LedgerSignCommunicator = LedgerSignCommunicatorImpl(navigationHolder) @ApplicationScope @Provides - fun provideRouter(router: AccountRouter, navigationHolder: NavigationHolder): LedgerRouter = LedgerNavigator(router, navigationHolder) + fun provideRouter(router: AccountRouter, navigationHolder: MainNavigationHolder): LedgerRouter = LedgerNavigator(router, navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NavigationModule.kt index 969ae4ea19..414795097d 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NavigationModule.kt @@ -3,8 +3,9 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides import io.novafoundation.nova.app.di.app.navigation.staking.StakingNavigationModule -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.common.resources.ContextManager @@ -40,17 +41,24 @@ class NavigationModule { @ApplicationScope @Provides - fun provideNavigatorHolder( + fun provideMainNavigatorHolder( contextManager: ContextManager - ): NavigationHolder = NavigationHolder(contextManager) + ): MainNavigationHolder = MainNavigationHolder(contextManager) + + @ApplicationScope + @Provides + fun provideDappNavigatorHolder( + contextManager: ContextManager + ): RootNavigationHolder = RootNavigationHolder(contextManager) @ApplicationScope @Provides fun provideNavigator( - navigatorHolder: NavigationHolder, + rootNavigatorHolder: RootNavigationHolder, + mainNavigatorHolder: MainNavigationHolder, walletConnectRouter: WalletConnectRouter, stakingDashboardRouter: StakingDashboardRouter, - ): Navigator = Navigator(navigatorHolder, walletConnectRouter, stakingDashboardRouter) + ): Navigator = Navigator(rootNavigatorHolder, mainNavigatorHolder, walletConnectRouter, stakingDashboardRouter) @Provides @ApplicationScope diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NftNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NftNavigationModule.kt index cd06c06b5a..3e1d8167ab 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NftNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/NftNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.nft.NftNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.nft.NftNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_nft_impl.NftRouter @@ -12,5 +12,5 @@ class NftNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): NftRouter = NftNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): NftRouter = NftNavigator(navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/PushNotificationsNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/PushNotificationsNavigationModule.kt index bbdfc050da..40a19fabbe 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/PushNotificationsNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/PushNotificationsNavigationModule.kt @@ -2,10 +2,10 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.push.PushGovernanceSettingsCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.push.PushNotificationsNavigator -import io.novafoundation.nova.app.root.navigation.push.PushStakingSettingsCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.push.PushGovernanceSettingsCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.push.PushNotificationsNavigator +import io.novafoundation.nova.app.root.navigation.navigators.push.PushStakingSettingsCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_push_notifications.PushNotificationsRouter import io.novafoundation.nova.feature_push_notifications.presentation.governance.PushGovernanceSettingsCommunicator @@ -16,19 +16,19 @@ class PushNotificationsNavigationModule { @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): PushNotificationsRouter = PushNotificationsNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): PushNotificationsRouter = PushNotificationsNavigator(navigationHolder) @Provides @ApplicationScope fun providePushGovernanceSettingsCommunicator( router: PushNotificationsRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): PushGovernanceSettingsCommunicator = PushGovernanceSettingsCommunicatorImpl(router, navigationHolder) @Provides @ApplicationScope fun providePushStakingSettingsCommunicator( router: PushNotificationsRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ): PushStakingSettingsCommunicator = PushStakingSettingsCommunicatorImpl(router, navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SettingsNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SettingsNavigationModule.kt index 6abdb481f5..c49d628aff 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SettingsNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SettingsNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.settings.SettingsNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.settings.SettingsNavigator import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_settings_impl.SettingsRouter @@ -17,7 +17,7 @@ class SettingsNavigationModule { @Provides fun provideRouter( rootRouter: RootRouter, - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, walletConnectRouter: WalletConnectRouter, navigator: Navigator, ): SettingsRouter = SettingsNavigator(navigationHolder, rootRouter, walletConnectRouter, navigator) diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SwapNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SwapNavigationModule.kt index ff0c5e6488..cc9e217b47 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SwapNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/SwapNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.swap.SwapNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.swap.SwapNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_swap_impl.presentation.SwapRouter @@ -14,7 +14,7 @@ class SwapNavigationModule { @ApplicationScope @Provides fun provideRouter( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, commonDelegate: Navigator ): SwapRouter = SwapNavigator(navigationHolder, commonDelegate) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VersionsNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VersionsNavigationModule.kt index bf09faaadc..8bc4fd447d 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VersionsNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VersionsNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.versions.VersionsNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.versions.VersionsNavigator import io.novafoundation.nova.common.data.network.AppLinksProvider import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_versions_api.presentation.VersionsRouter @@ -14,7 +14,7 @@ class VersionsNavigationModule { @Provides @ApplicationScope fun provideRouter( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, appLinksProvider: AppLinksProvider ): VersionsRouter = VersionsNavigator(navigationHolder, appLinksProvider.storeUrl) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VoteNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VoteNavigationModule.kt index d1fc2490e1..dd2248e523 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VoteNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/VoteNavigationModule.kt @@ -2,8 +2,8 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.vote.VoteNavigator +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.vote.VoteNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_vote.presentation.VoteRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/WalletConnectNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/WalletConnectNavigationModule.kt index fe0c027479..12e797c960 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/WalletConnectNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/WalletConnectNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.walletConnect.ApproveSessionCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.walletConnect.WalletConnectNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.walletConnect.ApproveSessionCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.walletConnect.WalletConnectNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate import io.novafoundation.nova.feature_wallet_connect_impl.WalletConnectRouter @@ -16,11 +16,11 @@ class WalletConnectNavigationModule { @Provides @ApplicationScope fun provideApproveSessionCommunicator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, automaticInteractionGate: AutomaticInteractionGate, ): ApproveSessionCommunicator = ApproveSessionCommunicatorImpl(navigationHolder, automaticInteractionGate) @ApplicationScope @Provides - fun provideRouter(navigationHolder: NavigationHolder): WalletConnectRouter = WalletConnectNavigator(navigationHolder) + fun provideRouter(navigationHolder: MainNavigationHolder): WalletConnectRouter = WalletConnectNavigator(navigationHolder) } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/NominationPoolsStakingNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/NominationPoolsStakingNavigationModule.kt index af3cd895d1..2529f71260 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/NominationPoolsStakingNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/NominationPoolsStakingNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation.staking import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.staking.nominationPools.NominationPoolsStakingNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.nominationPools.NominationPoolsStakingNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_staking_impl.presentation.NominationPoolsRouter @@ -13,7 +13,7 @@ class NominationPoolsStakingNavigationModule { @Provides @ApplicationScope - fun provideRouter(navigationHolder: NavigationHolder, navigator: Navigator): NominationPoolsRouter { + fun provideRouter(navigationHolder: MainNavigationHolder, navigator: Navigator): NominationPoolsRouter { return NominationPoolsStakingNavigator(navigationHolder, navigator) } } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/ParachainStakingNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/ParachainStakingNavigationModule.kt index ed83dfc671..38483f71d5 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/ParachainStakingNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/ParachainStakingNavigationModule.kt @@ -2,11 +2,11 @@ package io.novafoundation.nova.app.di.app.navigation.staking import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.staking.parachain.ParachainStakingNavigator -import io.novafoundation.nova.app.root.navigation.staking.parachain.SelectCollatorInterScreenCommunicatorImpl -import io.novafoundation.nova.app.root.navigation.staking.parachain.SelectCollatorSettingsInterScreenCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.parachain.ParachainStakingNavigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.parachain.SelectCollatorInterScreenCommunicatorImpl +import io.novafoundation.nova.app.root.navigation.navigators.staking.parachain.SelectCollatorSettingsInterScreenCommunicatorImpl import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_staking_impl.presentation.ParachainStakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.common.SelectCollatorInterScreenCommunicator @@ -17,19 +17,19 @@ class ParachainStakingNavigationModule { @Provides @ApplicationScope - fun provideParachainStakingRouter(navigationHolder: NavigationHolder, navigator: Navigator): ParachainStakingRouter { + fun provideParachainStakingRouter(navigationHolder: MainNavigationHolder, navigator: Navigator): ParachainStakingRouter { return ParachainStakingNavigator(navigationHolder, navigator) } @Provides @ApplicationScope - fun provideSelectCollatorCommunicator(navigationHolder: NavigationHolder): SelectCollatorInterScreenCommunicator { + fun provideSelectCollatorCommunicator(navigationHolder: MainNavigationHolder): SelectCollatorInterScreenCommunicator { return SelectCollatorInterScreenCommunicatorImpl(navigationHolder) } @Provides @ApplicationScope - fun provideSelectCollatorSettingsCommunicator(navigationHolder: NavigationHolder): SelectCollatorSettingsInterScreenCommunicator { + fun provideSelectCollatorSettingsCommunicator(navigationHolder: MainNavigationHolder): SelectCollatorSettingsInterScreenCommunicator { return SelectCollatorSettingsInterScreenCommunicatorImpl(navigationHolder) } } diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/RelayStakingNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/RelayStakingNavigationModule.kt index 7575743fcf..e422494c87 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/RelayStakingNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/RelayStakingNavigationModule.kt @@ -2,9 +2,9 @@ package io.novafoundation.nova.app.di.app.navigation.staking import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.staking.relaychain.RelayStakingNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +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_staking_impl.presentation.StakingDashboardRouter import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter @@ -15,7 +15,7 @@ class RelayStakingNavigationModule { @Provides @ApplicationScope fun provideRelayStakingRouter( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, navigator: Navigator, dashboardRouter: StakingDashboardRouter ): StakingRouter { diff --git a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/StakingNavigationModule.kt b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/StakingNavigationModule.kt index d830cdacd1..d95b60dcf7 100644 --- a/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/StakingNavigationModule.kt +++ b/app/src/main/java/io/novafoundation/nova/app/di/app/navigation/staking/StakingNavigationModule.kt @@ -2,10 +2,10 @@ package io.novafoundation.nova.app.di.app.navigation.staking import dagger.Module import dagger.Provides -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.staking.StakingDashboardNavigator -import io.novafoundation.nova.app.root.navigation.staking.StartMultiStakingNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.StakingDashboardNavigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.StartMultiStakingNavigator import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter import io.novafoundation.nova.feature_staking_impl.presentation.StartMultiStakingRouter @@ -21,7 +21,7 @@ class StakingNavigationModule { @Provides @ApplicationScope - fun provideStakingDashboardNavigator(navigationHolder: NavigationHolder): StakingDashboardNavigator { + fun provideStakingDashboardNavigator(navigationHolder: MainNavigationHolder): StakingDashboardNavigator { return StakingDashboardNavigator(navigationHolder) } @@ -32,7 +32,7 @@ class StakingNavigationModule { @Provides @ApplicationScope fun provideStartMultiStakingRouter( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, dashboardRouter: StakingDashboardRouter, commonNavigator: Navigator ): StartMultiStakingRouter { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/di/RootComponent.kt b/app/src/main/java/io/novafoundation/nova/app/root/di/RootComponent.kt index 431598b2bf..86b31665dd 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/di/RootComponent.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/di/RootComponent.kt @@ -2,11 +2,13 @@ package io.novafoundation.nova.app.root.di import dagger.BindsInstance import dagger.Component -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.staking.StakingDashboardNavigator +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.staking.StakingDashboardNavigator import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.app.root.presentation.di.RootActivityComponent import io.novafoundation.nova.app.root.presentation.main.di.MainFragmentComponent +import io.novafoundation.nova.app.root.presentation.splitScreen.di.SplitScreenFragmentComponent import io.novafoundation.nova.common.di.CommonApi import io.novafoundation.nova.common.di.scope.FeatureScope import io.novafoundation.nova.core_db.di.DbApi @@ -17,7 +19,7 @@ import io.novafoundation.nova.feature_assets.presentation.AssetsRouter import io.novafoundation.nova.feature_crowdloan_api.di.CrowdloanFeatureApi import io.novafoundation.nova.feature_currency_api.di.CurrencyFeatureApi import io.novafoundation.nova.feature_dapp_api.di.DAppFeatureApi -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_deep_linking.di.DeepLinkingFeatureApi import io.novafoundation.nova.feature_governance_api.di.GovernanceFeatureApi import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter @@ -42,13 +44,16 @@ interface RootComponent { fun mainActivityComponentFactory(): RootActivityComponent.Factory + fun splitScreenFragmentComponentFactory(): SplitScreenFragmentComponent.Factory + fun mainFragmentComponentFactory(): MainFragmentComponent.Factory @Component.Factory interface Factory { fun create( - @BindsInstance navigationHolder: NavigationHolder, + @BindsInstance mainNavigationHolder: MainNavigationHolder, + @BindsInstance rootNavigationHolder: RootNavigationHolder, @BindsInstance rootRouter: RootRouter, @BindsInstance governanceRouter: GovernanceRouter, @BindsInstance dAppRouter: DAppRouter, diff --git a/app/src/main/java/io/novafoundation/nova/app/root/di/RootFeatureHolder.kt b/app/src/main/java/io/novafoundation/nova/app/root/di/RootFeatureHolder.kt index 406eef32ff..c1fe2d79fe 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/di/RootFeatureHolder.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/di/RootFeatureHolder.kt @@ -1,8 +1,9 @@ package io.novafoundation.nova.app.root.di -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator -import io.novafoundation.nova.app.root.navigation.staking.StakingDashboardNavigator +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.StakingDashboardNavigator import io.novafoundation.nova.common.di.FeatureApiHolder import io.novafoundation.nova.common.di.FeatureContainer import io.novafoundation.nova.common.di.scope.ApplicationScope @@ -14,7 +15,7 @@ import io.novafoundation.nova.feature_assets.presentation.AssetsRouter import io.novafoundation.nova.feature_crowdloan_api.di.CrowdloanFeatureApi import io.novafoundation.nova.feature_currency_api.di.CurrencyFeatureApi import io.novafoundation.nova.feature_dapp_api.di.DAppFeatureApi -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_deep_linking.di.DeepLinkingFeatureApi import io.novafoundation.nova.feature_governance_api.di.GovernanceFeatureApi import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter @@ -29,7 +30,8 @@ import javax.inject.Inject @ApplicationScope class RootFeatureHolder @Inject constructor( - private val navigationHolder: NavigationHolder, + private val mainNavigationHolder: MainNavigationHolder, + private val rootNavigationHolder: RootNavigationHolder, private val navigator: Navigator, private val governanceRouter: GovernanceRouter, private val dAppRouter: DAppRouter, @@ -60,6 +62,16 @@ class RootFeatureHolder @Inject constructor( .build() return DaggerRootComponent.factory() - .create(navigationHolder, navigator, governanceRouter, dAppRouter, assetsRouter, accountRouter, stakingDashboardNavigator, rootFeatureDependencies) + .create( + mainNavigationHolder, + rootNavigationHolder, + navigator, + governanceRouter, + dAppRouter, + assetsRouter, + accountRouter, + stakingDashboardNavigator, + rootFeatureDependencies + ) } } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt index b0384d2f05..5d75e64565 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt @@ -1,7 +1,9 @@ package io.novafoundation.nova.app.root.navigation import android.annotation.SuppressLint +import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes +import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController import androidx.navigation.NavGraph @@ -22,3 +24,25 @@ fun NavController.getBackStackEntryBefore(@IdRes id: Int): NavBackStackEntry { return backStack[previousIndex] } + +fun AppCompatActivity.setupBackNavigation(mainNavController: NavController, dAppNavController: NavController) { + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + // Firstly handle dapp back navigation + if (dAppNavController.popBackStack()) { + // If back navigation is handled - return + return + } + + // Secondly handle main back navigation + if (mainNavController.popBackStack()) { + // If back navigation is handled - return + return + } + + isEnabled = false + onBackPressedDispatcher.onBackPressed() + isEnabled = true + } + }) +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt index 8ada92c3f4..a64337d470 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt @@ -5,6 +5,8 @@ import androidx.annotation.CallSuper import androidx.lifecycle.asFlow import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.navigation.InterScreenCommunicator import kotlinx.coroutines.flow.Flow import java.util.UUID diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/buy/BuyNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/buy/BuyNavigator.kt deleted file mode 100644 index 84103b8122..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/buy/BuyNavigator.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.novafoundation.nova.app.root.navigation.buy - -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.feature_buy_impl.presentation.BuyRouter - -class BuyNavigator(navigationHolder: NavigationHolder) : BuyRouter, BaseNavigator(navigationHolder) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/CloudBackupNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/CloudBackupNavigator.kt deleted file mode 100644 index 1094220025..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/CloudBackupNavigator.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.novafoundation.nova.app.root.navigation.cloudBackup - -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.feature_cloud_backup_impl.presentation.CloudBackupRouter - -class CloudBackupNavigator(navigationHolder: NavigationHolder) : CloudBackupRouter, BaseNavigator(navigationHolder) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppNavigator.kt deleted file mode 100644 index f39f944c4f..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppNavigator.kt +++ /dev/null @@ -1,45 +0,0 @@ -package io.novafoundation.nova.app.root.navigation.dApp - -import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.feature_dapp_impl.DAppRouter -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesFragment -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesPayload -import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment -import io.novafoundation.nova.feature_dapp_impl.presentation.search.DappSearchFragment -import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload - -class DAppNavigator( - private val navigationHolder: NavigationHolder, -) : BaseNavigator(navigationHolder), DAppRouter { - - override fun openChangeAccount() = performNavigation(R.id.action_open_switch_wallet) - - override fun openDAppBrowser(initialUrl: String) { - // Close deapp browser if it is already opened - // TODO it's better to provide new url to existing browser - val currentDestination = navigationHolder.navController?.currentDestination - - val destinationId = when (currentDestination?.id) { - R.id.DAppBrowserFragment -> R.id.action_DAppBrowserFragment_to_DAppBrowserFragment - R.id.dappSearchFragment -> R.id.action_dappSearchFragment_to_dapp_browser_graph - else -> R.id.action_dappBrowserGraph - } - performNavigation(destinationId, DAppBrowserFragment.getBundle(initialUrl)) - } - - override fun openDappSearch() = performNavigation( - actionId = R.id.action_mainFragment_to_dappSearchGraph, - args = DappSearchFragment.getBundle(SearchPayload(initialUrl = null)) - ) - - override fun openAddToFavourites(payload: AddToFavouritesPayload) = performNavigation( - actionId = R.id.action_DAppBrowserFragment_to_addToFavouritesFragment, - args = AddToFavouritesFragment.getBundle(payload) - ) - - override fun openAuthorizedDApps() = performNavigation( - actionId = R.id.action_mainFragment_to_authorizedDAppsFragment - ) -} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/MainNavigationHolder.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/MainNavigationHolder.kt new file mode 100644 index 0000000000..9de9c9573c --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/MainNavigationHolder.kt @@ -0,0 +1,5 @@ +package io.novafoundation.nova.app.root.navigation.holders + +import io.novafoundation.nova.common.resources.ContextManager + +class MainNavigationHolder(contextManager: ContextManager) : NavigationHolder(contextManager) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavigationHolder.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/NavigationHolder.kt similarity index 58% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/NavigationHolder.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/NavigationHolder.kt index e87b441677..180f5e1efa 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavigationHolder.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/NavigationHolder.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation +package io.novafoundation.nova.app.root.navigation.holders import androidx.navigation.NavController import io.novafoundation.nova.common.resources.ContextManager -class NavigationHolder(val contextManager: ContextManager) { +abstract class NavigationHolder(val contextManager: ContextManager) { var navController: NavController? = null private set @@ -19,12 +19,12 @@ class NavigationHolder(val contextManager: ContextManager) { fun finishApp() { contextManager.getActivity()?.finish() } -} -fun NavigationHolder.executeBack() { - val popped = navController!!.popBackStack() + fun executeBack() { + val popped = navController!!.popBackStack() - if (!popped) { - contextManager.getActivity()!!.finish() + if (!popped) { + contextManager.getActivity()!!.finish() + } } } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/RootNavigationHolder.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/RootNavigationHolder.kt new file mode 100644 index 0000000000..b2d61304d3 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/holders/RootNavigationHolder.kt @@ -0,0 +1,5 @@ +package io.novafoundation.nova.app.root.navigation.holders + +import io.novafoundation.nova.common.resources.ContextManager + +class RootNavigationHolder(contextManager: ContextManager) : NavigationHolder(contextManager) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/MainNavHostFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/MainNavHostFragment.kt new file mode 100644 index 0000000000..fa65b140fb --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/MainNavHostFragment.kt @@ -0,0 +1,8 @@ +package io.novafoundation.nova.app.root.navigation.navigationFragment + +import io.novafoundation.nova.app.R + +class MainNavHostFragment : NovaNavHostFragment() { + + override val containerId: Int = R.id.mainNavHost +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NovaNavHostFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/NovaNavHostFragment.kt similarity index 76% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/NovaNavHostFragment.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/NovaNavHostFragment.kt index 8eab521632..8712bce2e4 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NovaNavHostFragment.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/NovaNavHostFragment.kt @@ -1,19 +1,19 @@ -package io.novafoundation.nova.app.root.navigation +package io.novafoundation.nova.app.root.navigation.navigationFragment import android.annotation.SuppressLint import androidx.navigation.NavController import androidx.navigation.fragment.DialogFragmentNavigator import androidx.navigation.fragment.NavHostFragment -import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.navigators.AddFragmentNavigator -class NovaNavHostFragment : NavHostFragment() { +abstract class NovaNavHostFragment : NavHostFragment() { + + abstract val containerId: Int @SuppressLint("MissingSuperCall") override fun onCreateNavController(navController: NavController) { navController.navigatorProvider.addNavigator(DialogFragmentNavigator(requireContext(), childFragmentManager)) - - val addFragmentNavigator = AddFragmentNavigator(requireContext(), childFragmentManager, R.id.navHost) + val addFragmentNavigator = AddFragmentNavigator(requireContext(), childFragmentManager, containerId) navController.navigatorProvider.addNavigator(addFragmentNavigator) } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/RootNavHostFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/RootNavHostFragment.kt new file mode 100644 index 0000000000..de609c5e99 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigationFragment/RootNavHostFragment.kt @@ -0,0 +1,8 @@ +package io.novafoundation.nova.app.root.navigation.navigationFragment + +import io.novafoundation.nova.app.R + +class RootNavHostFragment : NovaNavHostFragment() { + + override val containerId: Int = R.id.rootNavHost +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/BaseNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/BaseNavigator.kt similarity index 91% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/BaseNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/BaseNavigator.kt index 66ce87bdbe..8556e60a88 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/BaseNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/BaseNavigator.kt @@ -1,8 +1,9 @@ -package io.novafoundation.nova.app.root.navigation +package io.novafoundation.nova.app.root.navigation.navigators import android.os.Bundle import androidx.annotation.IdRes import androidx.navigation.NavController +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.navigation.ReturnableRouter abstract class BaseNavigator( diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Navigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt similarity index 69% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/Navigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt index b31933209d..e846c7c845 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Navigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.app.root.navigation +package io.novafoundation.nova.app.root.navigation.navigators import android.os.Bundle import androidx.lifecycle.asFlow @@ -7,6 +7,8 @@ import androidx.navigation.NavOptions import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.delayedNavigation.BackDelayedNavigation import io.novafoundation.nova.app.root.navigation.delayedNavigation.NavComponentDelayedNavigation +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.common.navigation.DelayedNavigation import io.novafoundation.nova.common.utils.getParcelableCompat @@ -97,10 +99,11 @@ import io.novafoundation.nova.splash.SplashRouter import kotlinx.coroutines.flow.Flow class Navigator( - private val navigationHolder: NavigationHolder, + private val rootNavigationHolder: RootNavigationHolder, + private val mainNavigationHolder: MainNavigationHolder, private val walletConnectDelegate: WalletConnectRouter, private val stakingDashboardDelegate: StakingDashboardRouter -) : BaseNavigator(navigationHolder), +) : BaseNavigator(mainNavigationHolder), SplashRouter, OnboardingRouter, AccountRouter, @@ -108,31 +111,34 @@ class Navigator( RootRouter, CrowdloanRouter { - private val navController: NavController? - get() = navigationHolder.navController + private val rootNavController: NavController? + get() = rootNavigationHolder.navController + + private val mainNavController: NavController? + get() = mainNavigationHolder.navController override fun openWelcomeScreen() { - when (navController?.currentDestination?.id) { - R.id.accountsFragment -> navController?.navigate(R.id.action_walletManagment_to_welcome, WelcomeFragment.bundle(false)) - R.id.splashFragment -> navController?.navigate(R.id.action_splash_to_onboarding, WelcomeFragment.bundle(false)) + when (rootNavController?.currentDestination?.id) { + R.id.accountsFragment -> rootNavController?.navigate(R.id.action_walletManagment_to_welcome, WelcomeFragment.bundle(false)) + R.id.splashFragment -> rootNavController?.navigate(R.id.action_splash_to_onboarding, WelcomeFragment.bundle(false)) } } override fun openInitialCheckPincode() { val action = PinCodeAction.Check(NavComponentDelayedNavigation(R.id.action_open_main), ToolbarConfiguration()) val bundle = PincodeFragment.getPinCodeBundle(action) - navController?.navigate(R.id.action_splash_to_pin, bundle) + rootNavController?.navigate(R.id.action_splash_to_pin, bundle) } override fun openCreateFirstWallet() { - navController?.navigate( + rootNavController?.navigate( R.id.action_welcomeFragment_to_startCreateWallet, StartCreateWalletFragment.bundle(StartCreateWalletPayload(FlowType.FIRST_WALLET)) ) } override fun openMain() { - navController?.navigate(R.id.action_open_main) + rootNavController?.navigate(R.id.action_open_main) } override fun openAfterPinCode(delayedNavigation: DelayedNavigation) { @@ -146,11 +152,14 @@ class Navigator( .setPopExitAnim(R.anim.fragment_close_exit) .build() - navController?.navigate(delayedNavigation.globalActionId, delayedNavigation.extras, navOptions) + // TODO: need to pass a controller + rootNavController?.navigate(delayedNavigation.globalActionId, delayedNavigation.extras, navOptions) } is BackDelayedNavigation -> { - navController?.popBackStack() + + // TODO: need to pass a controller + rootNavController?.popBackStack() } } } @@ -158,44 +167,44 @@ class Navigator( override fun openCreatePincode() { val bundle = buildCreatePinBundle() - when (navController?.currentDestination?.id) { - R.id.splashFragment -> navController?.navigate(R.id.action_splash_to_pin, bundle) - R.id.importAccountFragment -> navController?.navigate(R.id.action_importAccountFragment_to_pincodeFragment, bundle) - R.id.confirmMnemonicFragment -> navController?.navigate(R.id.action_confirmMnemonicFragment_to_pincodeFragment, bundle) - R.id.createWatchWalletFragment -> navController?.navigate(R.id.action_watchWalletFragment_to_pincodeFragment, bundle) - R.id.finishImportParitySignerFragment -> navController?.navigate(R.id.action_finishImportParitySignerFragment_to_pincodeFragment, bundle) - R.id.finishImportLedgerFragment -> navController?.navigate(R.id.action_finishImportLedgerFragment_to_pincodeFragment, bundle) - R.id.createCloudBackupPasswordFragment -> navController?.navigate(R.id.action_createCloudBackupPasswordFragment_to_pincodeFragment, bundle) - R.id.restoreCloudBackupFragment -> navController?.navigate(R.id.action_restoreCloudBackupFragment_to_pincodeFragment, bundle) - R.id.finishImportGenericLedgerFragment -> navController?.navigate(R.id.action_finishImportGenericLedgerFragment_to_pincodeFragment, bundle) + when (rootNavController?.currentDestination?.id) { + R.id.splashFragment -> rootNavController?.navigate(R.id.action_splash_to_pin, bundle) + R.id.importAccountFragment -> rootNavController?.navigate(R.id.action_importAccountFragment_to_pincodeFragment, bundle) + R.id.confirmMnemonicFragment -> rootNavController?.navigate(R.id.action_confirmMnemonicFragment_to_pincodeFragment, bundle) + R.id.createWatchWalletFragment -> rootNavController?.navigate(R.id.action_watchWalletFragment_to_pincodeFragment, bundle) + R.id.finishImportParitySignerFragment -> rootNavController?.navigate(R.id.action_finishImportParitySignerFragment_to_pincodeFragment, bundle) + R.id.finishImportLedgerFragment -> rootNavController?.navigate(R.id.action_finishImportLedgerFragment_to_pincodeFragment, bundle) + R.id.createCloudBackupPasswordFragment -> rootNavController?.navigate(R.id.action_createCloudBackupPasswordFragment_to_pincodeFragment, bundle) + R.id.restoreCloudBackupFragment -> rootNavController?.navigate(R.id.action_restoreCloudBackupFragment_to_pincodeFragment, bundle) + R.id.finishImportGenericLedgerFragment -> rootNavController?.navigate(R.id.action_finishImportGenericLedgerFragment_to_pincodeFragment, bundle) } } override fun openAdvancedSettings(payload: AdvancedEncryptionModePayload) { - navController?.navigate(R.id.action_open_advancedEncryptionFragment, AdvancedEncryptionFragment.getBundle(payload)) + mainNavController?.navigate(R.id.action_open_advancedEncryptionFragment, AdvancedEncryptionFragment.getBundle(payload)) } override fun openConfirmMnemonicOnCreate(confirmMnemonicPayload: ConfirmMnemonicPayload) { val bundle = ConfirmMnemonicFragment.getBundle(confirmMnemonicPayload) - navController?.navigate( + mainNavController?.navigate( R.id.action_backupMnemonicFragment_to_confirmMnemonicFragment, bundle ) } override fun openImportAccountScreen(payload: ImportAccountPayload) { - val currentDestination = navController?.currentDestination ?: return + val currentDestination = mainNavController?.currentDestination ?: return val actionId = when (currentDestination.id) { // Wee need the splash fragment case to close app if we use back navigation in import mnemonic screen R.id.splashFragment -> R.id.action_splashFragment_to_import_nav_graph else -> R.id.action_import_nav_graph } - navController?.navigate(actionId, ImportAccountFragment.getBundle(payload)) + mainNavController?.navigate(actionId, ImportAccountFragment.getBundle(payload)) } override fun openMnemonicScreen(accountName: String?, addAccountPayload: AddAccountPayload) { - val destination = when (val currentDestinationId = navController?.currentDestination?.id) { + val destination = when (val currentDestinationId = mainNavController?.currentDestination?.id) { R.id.welcomeFragment -> R.id.action_welcomeFragment_to_mnemonic_nav_graph R.id.startCreateWalletFragment -> R.id.action_startCreateWalletFragment_to_mnemonic_nav_graph R.id.walletDetailsFragment -> R.id.action_accountDetailsFragment_to_mnemonic_nav_graph @@ -203,53 +212,56 @@ class Navigator( } val payload = BackupMnemonicPayload.Create(accountName, addAccountPayload) - navController?.navigate(destination, BackupMnemonicFragment.getBundle(payload)) + mainNavController?.navigate(destination, BackupMnemonicFragment.getBundle(payload)) } override fun openContribute(payload: ContributePayload) { val bundle = CrowdloanContributeFragment.getBundle(payload) - when (navController?.currentDestination?.id) { - R.id.mainFragment -> navController?.navigate(R.id.action_mainFragment_to_crowdloanContributeFragment, bundle) - R.id.moonbeamCrowdloanTermsFragment -> navController?.navigate(R.id.action_moonbeamCrowdloanTermsFragment_to_crowdloanContributeFragment, bundle) + when (mainNavController?.currentDestination?.id) { + R.id.mainFragment -> mainNavController?.navigate(R.id.action_mainFragment_to_crowdloanContributeFragment, bundle) + R.id.moonbeamCrowdloanTermsFragment -> mainNavController?.navigate( + R.id.action_moonbeamCrowdloanTermsFragment_to_crowdloanContributeFragment, + bundle + ) } } override val customBonusFlow: Flow - get() = navController!!.currentBackStackEntry!!.savedStateHandle + get() = mainNavController!!.currentBackStackEntry!!.savedStateHandle .getLiveData(CrowdloanContributeFragment.KEY_BONUS_LIVE_DATA) .asFlow() override val latestCustomBonus: BonusPayload? - get() = navController!!.currentBackStackEntry!!.savedStateHandle + get() = mainNavController!!.currentBackStackEntry!!.savedStateHandle .get(CrowdloanContributeFragment.KEY_BONUS_LIVE_DATA) override fun openCustomContribute(payload: CustomContributePayload) { - navController?.navigate(R.id.action_crowdloanContributeFragment_to_customContributeFragment, CustomContributeFragment.getBundle(payload)) + mainNavController?.navigate(R.id.action_crowdloanContributeFragment_to_customContributeFragment, CustomContributeFragment.getBundle(payload)) } override fun setCustomBonus(payload: BonusPayload) { - navController!!.previousBackStackEntry!!.savedStateHandle.set(CrowdloanContributeFragment.KEY_BONUS_LIVE_DATA, payload) + mainNavController!!.previousBackStackEntry!!.savedStateHandle.set(CrowdloanContributeFragment.KEY_BONUS_LIVE_DATA, payload) } override fun openConfirmContribute(payload: ConfirmContributePayload) { - navController?.navigate(R.id.action_crowdloanContributeFragment_to_confirmContributeFragment, ConfirmContributeFragment.getBundle(payload)) + mainNavController?.navigate(R.id.action_crowdloanContributeFragment_to_confirmContributeFragment, ConfirmContributeFragment.getBundle(payload)) } override fun back() { - navigationHolder.executeBack() + mainNavigationHolder.executeBack() } override fun returnToMain() { - navController?.navigate(R.id.back_to_main) + mainNavController?.navigate(R.id.back_to_main) } override fun openMoonbeamFlow(payload: ContributePayload) { - navController?.navigate(R.id.action_mainFragment_to_moonbeamCrowdloanTermsFragment, MoonbeamCrowdloanTermsFragment.getBundle(payload)) + mainNavController?.navigate(R.id.action_mainFragment_to_moonbeamCrowdloanTermsFragment, MoonbeamCrowdloanTermsFragment.getBundle(payload)) } override fun openAddAccount(payload: AddAccountPayload) { - navController?.navigate(R.id.action_open_onboarding, WelcomeFragment.bundle(payload)) + mainNavController?.navigate(R.id.action_open_onboarding, WelcomeFragment.bundle(payload)) } override fun openFilter(payload: TransactionHistoryFilterPayload) = performNavigation( @@ -260,113 +272,113 @@ class Navigator( override fun openSend(payload: SendPayload, initialRecipientAddress: String?) { val extras = SelectSendFragment.getBundle(payload, initialRecipientAddress) - navController?.navigate(R.id.action_open_send, extras) + mainNavController?.navigate(R.id.action_open_send, extras) } override fun openConfirmTransfer(transferDraft: TransferDraft) { val bundle = ConfirmSendFragment.getBundle(transferDraft) - navController?.navigate(R.id.action_chooseAmountFragment_to_confirmTransferFragment, bundle) + mainNavController?.navigate(R.id.action_chooseAmountFragment_to_confirmTransferFragment, bundle) } override fun openTransferDetail(transaction: OperationParcelizeModel.Transfer) { val bundle = TransferDetailFragment.getBundle(transaction) - navController?.navigate(R.id.open_transfer_detail, bundle) + mainNavController?.navigate(R.id.open_transfer_detail, bundle) } override fun openRewardDetail(reward: OperationParcelizeModel.Reward) { val bundle = RewardDetailFragment.getBundle(reward) - navController?.navigate(R.id.open_reward_detail, bundle) + mainNavController?.navigate(R.id.open_reward_detail, bundle) } override fun openPoolRewardDetail(reward: OperationParcelizeModel.PoolReward) { val bundle = PoolRewardDetailFragment.getBundle(reward) - navController?.navigate(R.id.open_pool_reward_detail, bundle) + mainNavController?.navigate(R.id.open_pool_reward_detail, bundle) } override fun openSwapDetail(swap: OperationParcelizeModel.Swap) { val bundle = SwapDetailFragment.getBundle(swap) - navController?.navigate(R.id.open_swap_detail, bundle) + mainNavController?.navigate(R.id.open_swap_detail, bundle) } override fun openExtrinsicDetail(extrinsic: OperationParcelizeModel.Extrinsic) { val bundle = ExtrinsicDetailFragment.getBundle(extrinsic) - navController?.navigate(R.id.open_extrinsic_detail, bundle) + mainNavController?.navigate(R.id.open_extrinsic_detail, bundle) } override fun openWallets() { - navController?.navigate(R.id.action_open_accounts) + mainNavController?.navigate(R.id.action_open_accounts) } override fun openSwitchWallet() { - navController?.navigate(R.id.action_open_switch_wallet) + mainNavController?.navigate(R.id.action_open_switch_wallet) } override fun openDelegatedAccountsUpdates() { - navController?.navigate(R.id.action_switchWalletFragment_to_delegatedAccountUpdates) + mainNavController?.navigate(R.id.action_switchWalletFragment_to_delegatedAccountUpdates) } override fun openSelectAddress(arguments: Bundle) { - navController?.navigate(R.id.action_open_select_address, arguments) + mainNavController?.navigate(R.id.action_open_select_address, arguments) } override fun openSelectMultipleWallets(arguments: Bundle) { - navController?.navigate(R.id.action_open_select_multiple_wallets, arguments) + mainNavController?.navigate(R.id.action_open_select_multiple_wallets, arguments) } override fun openNodes() { - navController?.navigate(R.id.action_mainFragment_to_nodesFragment) + mainNavController?.navigate(R.id.action_mainFragment_to_nodesFragment) } override fun openReceive(assetPayload: AssetPayload) { - navController?.navigate(R.id.action_open_receive, ReceiveFragment.getBundle(assetPayload)) + mainNavController?.navigate(R.id.action_open_receive, ReceiveFragment.getBundle(assetPayload)) } override fun openAssetSearch() { - navController?.navigate(R.id.action_mainFragment_to_assetSearchFragment) + mainNavController?.navigate(R.id.action_mainFragment_to_assetSearchFragment) } override fun openManageTokens() { - navController?.navigate(R.id.action_mainFragment_to_manageTokensGraph) + mainNavController?.navigate(R.id.action_mainFragment_to_manageTokensGraph) } override fun openManageChainTokens(payload: ManageChainTokensPayload) { val args = ManageChainTokensFragment.getBundle(payload) - navController?.navigate(R.id.action_manageTokensFragment_to_manageChainTokensFragment, args) + mainNavController?.navigate(R.id.action_manageTokensFragment_to_manageChainTokensFragment, args) } override fun openAddTokenSelectChain() { - navController?.navigate(R.id.action_manageTokensFragment_to_addTokenSelectChainFragment) + mainNavController?.navigate(R.id.action_manageTokensFragment_to_addTokenSelectChainFragment) } override fun openSendFlow() { - navController?.navigate(R.id.action_mainFragment_to_sendFlow) + mainNavController?.navigate(R.id.action_mainFragment_to_sendFlow) } override fun openReceiveFlow() { - navController?.navigate(R.id.action_mainFragment_to_receiveFlow) + mainNavController?.navigate(R.id.action_mainFragment_to_receiveFlow) } override fun openBuyFlow() { - navController?.navigate(R.id.action_mainFragment_to_buyFlow) + mainNavController?.navigate(R.id.action_mainFragment_to_buyFlow) } override fun openBuyFlowFromSendFlow() { - navController?.navigate(R.id.action_sendFlow_to_buyFlow) + mainNavController?.navigate(R.id.action_sendFlow_to_buyFlow) } override fun openAddTokenEnterInfo(payload: AddTokenEnterInfoPayload) { val args = AddTokenEnterInfoFragment.getBundle(payload) - navController?.navigate(R.id.action_addTokenSelectChainFragment_to_addTokenEnterInfoFragment, args) + mainNavController?.navigate(R.id.action_addTokenSelectChainFragment_to_addTokenEnterInfoFragment, args) } override fun finishAddTokenFlow() { - navController?.navigate(R.id.finish_add_token_flow) + mainNavController?.navigate(R.id.finish_add_token_flow) } override fun openWalletConnectSessions(metaId: Long) { @@ -378,50 +390,50 @@ class Navigator( } override fun openStaking() { - if (navController?.currentDestination?.id != R.id.mainFragment) navController?.navigate(R.id.action_open_main) + if (mainNavController?.currentDestination?.id != R.id.mainFragment) mainNavController?.navigate(R.id.action_open_main) stakingDashboardDelegate.openStakingDashboard() } override fun closeSendFlow() { - navController?.navigate(R.id.action_close_send_flow) + mainNavController?.navigate(R.id.action_close_send_flow) } override fun openSendNetworks(payload: NetworkFlowPayload) { - navController?.navigate(R.id.action_sendFlow_to_sendFlowNetwork, NetworkFlowFragment.createPayload(payload)) + mainNavController?.navigate(R.id.action_sendFlow_to_sendFlowNetwork, NetworkFlowFragment.createPayload(payload)) } override fun openReceiveNetworks(payload: NetworkFlowPayload) { - navController?.navigate(R.id.action_receiveFlow_to_receiveFlowNetwork, NetworkFlowFragment.createPayload(payload)) + mainNavController?.navigate(R.id.action_receiveFlow_to_receiveFlowNetwork, NetworkFlowFragment.createPayload(payload)) } override fun openSwapNetworks(payload: NetworkSwapFlowPayload) { - navController?.navigate(R.id.action_selectAssetSwapFlowFragment_to_swapFlowNetworkFragment, NetworkSwapFlowFragment.createPayload(payload)) + mainNavController?.navigate(R.id.action_selectAssetSwapFlowFragment_to_swapFlowNetworkFragment, NetworkSwapFlowFragment.createPayload(payload)) } override fun openBuyNetworks(payload: NetworkFlowPayload) { - navController?.navigate(R.id.action_buyFlow_to_buyFlowNetwork, NetworkFlowFragment.createPayload(payload)) + mainNavController?.navigate(R.id.action_buyFlow_to_buyFlowNetwork, NetworkFlowFragment.createPayload(payload)) } override fun returnToMainSwapScreen() { - navController?.navigate(R.id.action_return_to_swap_settings) + mainNavController?.navigate(R.id.action_return_to_swap_settings) } override fun openSwapFlow() { val payload = SwapFlowPayload.InitialSelecting - navController?.navigate(R.id.action_mainFragment_to_swapFlow, AssetSwapFlowFragment.getBundle(payload)) + mainNavController?.navigate(R.id.action_mainFragment_to_swapFlow, AssetSwapFlowFragment.getBundle(payload)) } override fun openSwapSetupAmount(swapSettingsPayload: SwapSettingsPayload) { - navController?.navigate(R.id.action_open_swapSetupAmount, SwapMainSettingsFragment.getBundle(swapSettingsPayload)) + mainNavController?.navigate(R.id.action_open_swapSetupAmount, SwapMainSettingsFragment.getBundle(swapSettingsPayload)) } override fun openNfts() { - navController?.navigate(R.id.action_mainFragment_to_nfts_nav_graph) + mainNavController?.navigate(R.id.action_mainFragment_to_nfts_nav_graph) } override fun nonCancellableVerify() { - val currentDestination = navController?.currentDestination + val currentDestination = mainNavController?.currentDestination if (currentDestination?.id == R.id.splashFragment) { return @@ -431,18 +443,18 @@ class Navigator( val bundle = PincodeFragment.getPinCodeBundle(action) if (currentDestination?.id == R.id.pincodeFragment) { - val currentBackStackEntry = navController!!.currentBackStackEntry + val currentBackStackEntry = mainNavController!!.currentBackStackEntry val arguments = currentBackStackEntry!!.arguments!!.getParcelableCompat(PincodeFragment.KEY_PINCODE_ACTION) if (arguments is PinCodeAction.Change) { - navController?.navigate(R.id.action_pin_code_access_recovery, bundle) + mainNavController?.navigate(R.id.action_pin_code_access_recovery, bundle) } } else { - navController?.navigate(R.id.action_pin_code_access_recovery, bundle) + mainNavController?.navigate(R.id.action_pin_code_access_recovery, bundle) } } override fun openUpdateNotifications() { - navController?.navigate(R.id.action_open_update_notifications) + mainNavController?.navigate(R.id.action_open_update_notifications) } override fun openPushWelcome() { @@ -456,49 +468,49 @@ class Navigator( override fun returnToWallet() { // to achieve smooth animation postToUiThread { - navController?.navigate(R.id.action_return_to_wallet) + mainNavController?.navigate(R.id.action_return_to_wallet) } } override fun openWalletDetails(metaId: Long) { val extras = WalletDetailsFragment.getBundle(metaId) - navController?.navigate(R.id.action_open_account_details, extras) + mainNavController?.navigate(R.id.action_open_account_details, extras) } override fun openNodeDetails(nodeId: Int) { - navController?.navigate(R.id.action_nodesFragment_to_nodeDetailsFragment, NodeDetailsFragment.getBundle(nodeId)) + mainNavController?.navigate(R.id.action_nodesFragment_to_nodeDetailsFragment, NodeDetailsFragment.getBundle(nodeId)) } override fun openAssetDetails(assetPayload: AssetPayload) { val bundle = BalanceDetailFragment.getBundle(assetPayload) - val action = when (navController?.currentDestination?.id) { + val action = when (mainNavController?.currentDestination?.id) { R.id.mainFragment -> R.id.action_mainFragment_to_balanceDetailFragment R.id.assetSearchFragment -> R.id.action_assetSearchFragment_to_balanceDetailFragment R.id.confirmTransferFragment -> R.id.action_confirmTransferFragment_to_balanceDetailFragment else -> R.id.action_root_to_balanceDetailFragment } - navController?.navigate(action, bundle) + mainNavController?.navigate(action, bundle) } override fun openAddNode() { - navController?.navigate(R.id.action_nodesFragment_to_addNodeFragment) + mainNavController?.navigate(R.id.action_nodesFragment_to_addNodeFragment) } override fun openChangeWatchAccount(payload: AddAccountPayload.ChainAccount) { val bundle = ChangeWatchAccountFragment.getBundle(payload) - navController?.navigate(R.id.action_accountDetailsFragment_to_changeWatchAccountFragment, bundle) + mainNavController?.navigate(R.id.action_accountDetailsFragment_to_changeWatchAccountFragment, bundle) } override fun openCreateWallet(payload: StartCreateWalletPayload) { - navController?.navigate(R.id.action_open_create_new_wallet, StartCreateWalletFragment.bundle(payload)) + mainNavController?.navigate(R.id.action_open_create_new_wallet, StartCreateWalletFragment.bundle(payload)) } override fun openUserContributions() { - navController?.navigate(R.id.action_mainFragment_to_userContributionsFragment) + mainNavController?.navigate(R.id.action_mainFragment_to_userContributionsFragment) } override fun getExportMnemonicDelayedNavigation(exportPayload: ExportPayload.ChainAccount): DelayedNavigation { @@ -523,60 +535,60 @@ class Navigator( override fun exportJsonAction(exportPayload: ExportPayload) { val extras = ExportJsonFragment.getBundle(exportPayload) - navController?.navigate(R.id.action_export_json, extras) + mainNavController?.navigate(R.id.action_export_json, extras) } override fun finishExportFlow() { - navController?.navigate(R.id.finish_export_flow) + mainNavController?.navigate(R.id.finish_export_flow) } override fun openScanImportParitySigner(payload: ParitySignerStartPayload) { val args = ScanImportParitySignerFragment.getBundle(payload) - navController?.navigate(R.id.action_startImportParitySignerFragment_to_scanImportParitySignerFragment, args) + mainNavController?.navigate(R.id.action_startImportParitySignerFragment_to_scanImportParitySignerFragment, args) } override fun openPreviewImportParitySigner(payload: ParitySignerAccountPayload) { val bundle = PreviewImportParitySignerFragment.getBundle(payload) - navController?.navigate(R.id.action_scanImportParitySignerFragment_to_previewImportParitySignerFragment, bundle) + mainNavController?.navigate(R.id.action_scanImportParitySignerFragment_to_previewImportParitySignerFragment, bundle) } override fun openFinishImportParitySigner(payload: ParitySignerAccountPayload) { val bundle = FinishImportParitySignerFragment.getBundle(payload) - navController?.navigate(R.id.action_previewImportParitySignerFragment_to_finishImportParitySignerFragment, bundle) + mainNavController?.navigate(R.id.action_previewImportParitySignerFragment_to_finishImportParitySignerFragment, bundle) } override fun openScanParitySignerSignature(payload: ScanSignParitySignerPayload) { val bundle = ScanSignParitySignerFragment.getBundle(payload) - navController?.navigate(R.id.action_showSignParitySignerFragment_to_scanSignParitySignerFragment, bundle) + mainNavController?.navigate(R.id.action_showSignParitySignerFragment_to_scanSignParitySignerFragment, bundle) } override fun finishParitySignerFlow() { - navController?.navigate(R.id.action_finish_parity_signer_flow) + mainNavController?.navigate(R.id.action_finish_parity_signer_flow) } override fun openAddLedgerChainAccountFlow(payload: AddAccountPayload.ChainAccount) { val bundle = AddChainAccountSelectLedgerFragment.getBundle(payload) - navController?.navigate(R.id.action_accountDetailsFragment_to_addLedgerAccountGraph, bundle) + mainNavController?.navigate(R.id.action_accountDetailsFragment_to_addLedgerAccountGraph, bundle) } override fun finishApp() { - navigationHolder.finishApp() + mainNavigationHolder.finishApp() } override fun openCreateCloudBackupPassword(walletName: String) { val bundle = CreateWalletBackupPasswordFragment.getBundle(CreateBackupPasswordPayload(walletName)) - navController?.navigate(R.id.action_startCreateWalletFragment_to_createCloudBackupPasswordFragment, bundle) + mainNavController?.navigate(R.id.action_startCreateWalletFragment_to_createCloudBackupPasswordFragment, bundle) } override fun restoreCloudBackup() { - when (navController?.currentDestination?.id) { - R.id.importWalletOptionsFragment -> navController?.navigate(R.id.action_importWalletOptionsFragment_to_restoreCloudBackup) - R.id.startCreateWalletFragment -> navController?.navigate(R.id.action_startCreateWalletFragment_to_resotreCloudBackupFragment) + when (mainNavController?.currentDestination?.id) { + R.id.importWalletOptionsFragment -> mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_restoreCloudBackup) + R.id.startCreateWalletFragment -> mainNavController?.navigate(R.id.action_startCreateWalletFragment_to_resotreCloudBackupFragment) } } @@ -630,7 +642,7 @@ class Navigator( } override fun openCreateWatchWallet() { - navController?.navigate(R.id.action_importWalletOptionsFragment_to_createWatchWalletFragment) + mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_createWatchWalletFragment) } override fun openStartImportParitySigner() { @@ -642,18 +654,18 @@ class Navigator( } override fun openImportOptionsScreen() { - when (navController?.currentDestination?.id) { - R.id.welcomeFragment -> navController?.navigate(R.id.action_welcomeFragment_to_importWalletOptionsFragment) - else -> navController?.navigate(R.id.action_importWalletOptionsFragment) + when (mainNavController?.currentDestination?.id) { + R.id.welcomeFragment -> mainNavController?.navigate(R.id.action_welcomeFragment_to_importWalletOptionsFragment) + else -> mainNavController?.navigate(R.id.action_importWalletOptionsFragment) } } override fun openStartImportLegacyLedger() { - navController?.navigate(R.id.action_importWalletOptionsFragment_to_import_legacy_ledger_graph) + mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_import_legacy_ledger_graph) } override fun openStartImportGenericLedger() { - navController?.navigate(R.id.action_importWalletOptionsFragment_to_import_generic_ledger_graph) + mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_import_generic_ledger_graph) } override fun withPinCodeCheckRequired( @@ -669,12 +681,12 @@ class Navigator( val extras = PincodeFragment.getPinCodeBundle(action) - navController?.navigate(R.id.open_pincode_check, extras) + rootNavController?.navigate(R.id.open_pincode_check, extras) } private fun openStartImportPolkadotVault(variant: PolkadotVaultVariant) { val args = StartImportParitySignerFragment.getBundle(ParitySignerStartPayload(variant)) - navController?.navigate(R.id.action_importWalletOptionsFragment_to_import_parity_signer_graph, args) + mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_import_parity_signer_graph, args) } private fun buildCreatePinBundle(): Bundle { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/PolkadotVaultVariantSignCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/PolkadotVaultVariantSignCommunicatorImpl.kt similarity index 89% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/account/PolkadotVaultVariantSignCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/PolkadotVaultVariantSignCommunicatorImpl.kt index f51791b16e..a2a57601fa 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/PolkadotVaultVariantSignCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/PolkadotVaultVariantSignCommunicatorImpl.kt @@ -1,8 +1,8 @@ -package io.novafoundation.nova.app.root.navigation.account +package io.novafoundation.nova.app.root.navigation.navigators.account import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.getBackStackEntryBefore import io.novafoundation.nova.feature_account_api.domain.model.PolkadotVaultVariant import io.novafoundation.nova.feature_account_api.presenatation.sign.SignInterScreenCommunicator.Request @@ -12,7 +12,7 @@ import io.novafoundation.nova.feature_account_impl.presentation.paritySigner.sig import io.novafoundation.nova.feature_account_impl.presentation.paritySigner.sign.show.ShowSignParitySignerPayload class PolkadotVaultVariantSignCommunicatorImpl( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, ) : NavStackInterScreenCommunicator(navigationHolder), PolkadotVaultVariantSignCommunicator { private var usedPolkadotVaultVariant: PolkadotVaultVariant? = null diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectAddressCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectAddressCommunicatorImpl.kt similarity index 83% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectAddressCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectAddressCommunicatorImpl.kt index c74f095764..9f752096f0 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectAddressCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectAddressCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.account +package io.novafoundation.nova.app.root.navigation.navigators.account import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectAddress.SelectAddressCommunicator import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectAddress.SelectAddressRequester import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectAddress.SelectAddressResponder import io.novafoundation.nova.feature_account_impl.presentation.account.list.selectAddress.SelectAddressFragment import io.novafoundation.nova.feature_assets.presentation.AssetsRouter -class SelectAddressCommunicatorImpl(private val router: AssetsRouter, navigationHolder: NavigationHolder) : +class SelectAddressCommunicatorImpl(private val router: AssetsRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), SelectAddressCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectMultipleWalletsCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectMultipleWalletsCommunicatorImpl.kt similarity index 84% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectMultipleWalletsCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectMultipleWalletsCommunicatorImpl.kt index 93405b4bd2..81747a94c6 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectMultipleWalletsCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectMultipleWalletsCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.account +package io.novafoundation.nova.app.root.navigation.navigators.account import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectMultipleWalletsCommunicator import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectMultipleWalletsRequester import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectMultipleWalletsResponder import io.novafoundation.nova.feature_account_impl.presentation.account.list.multipleSelecting.SelectMultipleWalletsFragment import io.novafoundation.nova.feature_assets.presentation.AssetsRouter -class SelectMultipleWalletsCommunicatorImpl(private val router: AssetsRouter, navigationHolder: NavigationHolder) : +class SelectMultipleWalletsCommunicatorImpl(private val router: AssetsRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), SelectMultipleWalletsCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectWalletCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt similarity index 78% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectWalletCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt index a1fe779f27..ff77fa7bdd 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/account/SelectWalletCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt @@ -1,8 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.account +package io.novafoundation.nova.app.root.navigation.navigators.account import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectWallet.SelectWalletCommunicator import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectWallet.SelectWalletCommunicator.Payload import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectWallet.SelectWalletCommunicator.Response diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/buy/BuyNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/buy/BuyNavigator.kt new file mode 100644 index 0000000000..ca264ed9ef --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/buy/BuyNavigator.kt @@ -0,0 +1,7 @@ +package io.novafoundation.nova.app.root.navigation.navigators.buy + +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.feature_buy_impl.presentation.BuyRouter + +class BuyNavigator(navigationHolder: MainNavigationHolder) : BuyRouter, BaseNavigator(navigationHolder) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt similarity index 81% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt index 00ec7775ef..e912e45e7b 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/ChangeBackupPasswordCommunicatorImpl.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.cloudBackup +package io.novafoundation.nova.app.root.navigation.navigators.cloudBackup import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.ChangeBackupPasswordCommunicator import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.ChangeBackupPasswordRequester import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.ChangeBackupPasswordResponder import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter -class ChangeBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: NavigationHolder) : +class ChangeBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), ChangeBackupPasswordCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/CloudBackupNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/CloudBackupNavigator.kt new file mode 100644 index 0000000000..3fff820190 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/CloudBackupNavigator.kt @@ -0,0 +1,7 @@ +package io.novafoundation.nova.app.root.navigation.navigators.cloudBackup + +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.feature_cloud_backup_impl.presentation.CloudBackupRouter + +class CloudBackupNavigator(navigationHolder: MainNavigationHolder) : CloudBackupRouter, BaseNavigator(navigationHolder) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt similarity index 81% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt index 11f79a2570..cbaa73dd97 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/RestoreBackupPasswordCommunicatorImpl.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.cloudBackup +package io.novafoundation.nova.app.root.navigation.navigators.cloudBackup import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.RestoreBackupPasswordCommunicator import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.RestoreBackupPasswordRequester import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.changePassword.RestoreBackupPasswordResponder import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter -class RestoreBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: NavigationHolder) : +class RestoreBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), RestoreBackupPasswordCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt similarity index 82% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt index 8f838b4ba8..8d458e2527 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/cloudBackup/SyncWalletsBackupPasswordCommunicatorImpl.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.cloudBackup +package io.novafoundation.nova.app.root.navigation.navigators.cloudBackup import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.createPassword.SyncWalletsBackupPasswordCommunicator import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.createPassword.SyncWalletsBackupPasswordRequester import io.novafoundation.nova.feature_account_api.presenatation.cloudBackup.createPassword.SyncWalletsBackupPasswordResponder -class SyncWalletsBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: NavigationHolder) : +class SyncWalletsBackupPasswordCommunicatorImpl(private val router: AccountRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), SyncWalletsBackupPasswordCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt new file mode 100644 index 0000000000..18eefc277f --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt @@ -0,0 +1,59 @@ +package io.novafoundation.nova.app.root.navigation.navigators.dApp + +import io.novafoundation.nova.app.R +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesFragment +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload +import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment +import io.novafoundation.nova.feature_dapp_impl.presentation.search.DappSearchFragment +import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload + +class DAppNavigator( + private val rootNavigationHolder: RootNavigationHolder, +) : BaseNavigator(rootNavigationHolder), DAppRouter { + + override fun openChangeAccount() = performNavigation(R.id.action_open_switch_wallet) + + override fun openDAppBrowser(initialUrl: String) { + // Close deapp browser if it is already opened + // TODO it's better to provide new url to existing browser + val currentDestination = rootNavigationHolder.navController?.currentDestination + + val destinationId = when (currentDestination?.id) { + R.id.dappBrowserFragment -> R.id.action_DAppBrowserFragment_to_DAppBrowserFragment + R.id.dappSearchFragment -> R.id.action_dappSearchFragment_to_dapp_browser_graph + R.id.dappTabsFragment -> R.id.action_dappTabsFragment_to_dapp_browser_graph + else -> R.id.action_open_dappBrowser + } + performNavigation(destinationId, DAppBrowserFragment.getBundle(initialUrl)) + } + + override fun openDappSearch() { + val currentDestination = rootNavigationHolder.navController?.currentDestination + + val destinationId = when (currentDestination?.id) { + R.id.dappTabsFragment -> R.id.action_dappTabsFragment_to_dapp_search_graph + else -> R.id.action_mainFragment_to_dappSearchGraph + } + + performNavigation( + actionId = destinationId, + args = DappSearchFragment.getBundle(SearchPayload(initialUrl = null)) + ) + } + + override fun openAddToFavourites(payload: AddToFavouritesPayload) = performNavigation( + actionId = R.id.action_DAppBrowserFragment_to_addToFavouritesFragment, + args = AddToFavouritesFragment.getBundle(payload) + ) + + override fun openAuthorizedDApps() = performNavigation( + actionId = R.id.action_mainFragment_to_authorizedDAppsFragment + ) + + override fun openTabs() = performNavigation( + actionId = R.id.action_DAppBrowserFragment_to_browserTabsFragment + ) +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppSearchCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt similarity index 78% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppSearchCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt index c07a21f66f..661c83d21a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/dApp/DAppSearchCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.dApp +package io.novafoundation.nova.app.root.navigation.navigators.dApp import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator.Response import io.novafoundation.nova.feature_dapp_impl.presentation.search.DappSearchFragment import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload -class DAppSearchCommunicatorImpl(navigationHolder: NavigationHolder) : +class DAppSearchCommunicatorImpl(navigationHolder: RootNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), DAppSearchCommunicator { override fun openRequest(request: SearchPayload) { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/deepLinking/DeepLinkingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/deepLinking/DeepLinkingNavigator.kt similarity index 91% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/deepLinking/DeepLinkingNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/deepLinking/DeepLinkingNavigator.kt index d8a0a664f4..ba6b61782a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/deepLinking/DeepLinkingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/deepLinking/DeepLinkingNavigator.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.deepLinking +package io.novafoundation.nova.app.root.navigation.navigators.deepLinking import io.novafoundation.nova.feature_account_api.presenatation.account.add.ImportAccountPayload import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter import io.novafoundation.nova.feature_assets.presentation.AssetsRouter -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_deep_linking.presentation.handling.DeepLinkingRouter import io.novafoundation.nova.feature_governance_api.presentation.referenda.details.ReferendumDetailsPayload import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt similarity index 84% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt index f4037399c1..f29cbf88f9 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt @@ -1,8 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.externalSign +package io.novafoundation.nova.app.root.navigation.navigators.externalSign import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.FlowInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate import io.novafoundation.nova.common.utils.sequrity.awaitInteractionAllowed import io.novafoundation.nova.feature_external_sign_api.model.ExternalSignCommunicator diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignNavigator.kt similarity index 68% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignNavigator.kt index 8d94537066..43430bf6f6 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/externalSign/ExternalSignNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignNavigator.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.externalSign +package io.novafoundation.nova.app.root.navigation.navigators.externalSign import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_external_sign_impl.ExternalSignRouter import io.novafoundation.nova.feature_external_sign_impl.presentation.extrinsicDetails.ExternalExtrinsicDetailsFragment class ExternalSignNavigator( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ) : BaseNavigator(navigationHolder), ExternalSignRouter { override fun openExtrinsicDetails(extrinsicContent: String) = performNavigation( diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/GovernanceNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/GovernanceNavigator.kt similarity index 97% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/GovernanceNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/GovernanceNavigator.kt index 57e7d29530..253a581ce4 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/GovernanceNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/GovernanceNavigator.kt @@ -1,10 +1,10 @@ -package io.novafoundation.nova.app.root.navigation.governance +package io.novafoundation.nova.app.root.navigation.navigators.governance import android.os.Bundle import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.common.utils.showBrowser import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment import io.novafoundation.nova.feature_governance_impl.BuildConfig diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/SelectTracksCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/SelectTracksCommunicatorImpl.kt similarity index 83% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/SelectTracksCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/SelectTracksCommunicatorImpl.kt index 1f25c9ab0d..d7d8c1d35a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/SelectTracksCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/SelectTracksCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.governance +package io.novafoundation.nova.app.root.navigation.navigators.governance import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectTracksCommunicator import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectTracksRequester import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.list.SelectTracksResponder import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter import io.novafoundation.nova.feature_governance_impl.presentation.tracks.select.governanceTracks.SelectGovernanceTracksFragment -class SelectTracksCommunicatorImpl(private val router: GovernanceRouter, navigationHolder: NavigationHolder) : +class SelectTracksCommunicatorImpl(private val router: GovernanceRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), SelectTracksCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/TinderGovVoteCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/TinderGovVoteCommunicatorImpl.kt similarity index 80% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/TinderGovVoteCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/TinderGovVoteCommunicatorImpl.kt index a6a1c5ba9f..f27185acc0 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/governance/TinderGovVoteCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/governance/TinderGovVoteCommunicatorImpl.kt @@ -1,8 +1,7 @@ -package io.novafoundation.nova.app.root.navigation.governance +package io.novafoundation.nova.app.root.navigation.navigators.governance import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.common.sequrity.verification.PinCodeTwoFactorVerificationResponder.Response +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_governance_impl.presentation.GovernanceRouter import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vote.setup.common.SetupVotePayload import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vote.setup.tindergov.TinderGovVoteCommunicator @@ -10,7 +9,7 @@ import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vot import io.novafoundation.nova.feature_governance_impl.presentation.referenda.vote.setup.tindergov.TinderGovVoteResponder import kotlinx.coroutines.flow.Flow -class TinderGovVoteCommunicatorImpl(private val router: GovernanceRouter, navigationHolder: NavigationHolder) : +class TinderGovVoteCommunicatorImpl(private val router: GovernanceRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), TinderGovVoteCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerNavigator.kt similarity index 93% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerNavigator.kt index 14acfb5a6c..87507efd5f 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerNavigator.kt @@ -1,8 +1,8 @@ -package io.novafoundation.nova.app.root.navigation.ledger +package io.novafoundation.nova.app.root.navigation.navigators.ledger import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_account_impl.presentation.AccountRouter import io.novafoundation.nova.feature_ledger_impl.presentation.LedgerRouter import io.novafoundation.nova.feature_ledger_impl.presentation.account.addChain.selectAddress.AddLedgerChainAccountSelectAddressFragment @@ -18,7 +18,7 @@ import io.novafoundation.nova.feature_ledger_impl.presentation.account.connect.l class LedgerNavigator( private val accountRouter: AccountRouter, - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ) : BaseNavigator(navigationHolder), LedgerRouter { override fun openImportFillWallet() = performNavigation(R.id.action_startImportLedgerFragment_to_fillWalletImportLedgerFragment) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerSignCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerSignCommunicatorImpl.kt similarity index 87% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerSignCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerSignCommunicatorImpl.kt index aa0dde720a..2074010618 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/LedgerSignCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/LedgerSignCommunicatorImpl.kt @@ -1,8 +1,8 @@ -package io.novafoundation.nova.app.root.navigation.ledger +package io.novafoundation.nova.app.root.navigation.navigators.ledger import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.getBackStackEntryBefore import io.novafoundation.nova.feature_account_api.domain.model.LedgerVariant import io.novafoundation.nova.feature_account_api.presenatation.sign.LedgerSignCommunicator @@ -11,7 +11,7 @@ import io.novafoundation.nova.feature_account_api.presenatation.sign.SignInterSc import io.novafoundation.nova.feature_ledger_impl.presentation.account.sign.SignLedgerFragment import io.novafoundation.nova.feature_ledger_impl.presentation.account.sign.SignLedgerPayload -class LedgerSignCommunicatorImpl(navigationHolder: NavigationHolder) : +class LedgerSignCommunicatorImpl(navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), LedgerSignCommunicator { private var usedVariant: LedgerVariant? = null diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/SelectLedgerAddressCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/SelectLedgerAddressCommunicatorImpl.kt similarity index 83% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/SelectLedgerAddressCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/SelectLedgerAddressCommunicatorImpl.kt index 14346deecf..94cb69aab8 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/ledger/SelectLedgerAddressCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/ledger/SelectLedgerAddressCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.ledger +package io.novafoundation.nova.app.root.navigation.navigators.ledger import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_ledger_impl.presentation.account.common.selectLedger.SelectLedgerFragment import io.novafoundation.nova.feature_ledger_impl.presentation.account.common.selectLedger.SelectLedgerPayload import io.novafoundation.nova.feature_ledger_impl.presentation.account.connect.legacy.LedgerChainAccount import io.novafoundation.nova.feature_ledger_impl.presentation.account.connect.legacy.SelectLedgerAddressInterScreenCommunicator -class SelectLedgerAddressCommunicatorImpl(navigationHolder: NavigationHolder) : +class SelectLedgerAddressCommunicatorImpl(navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), SelectLedgerAddressInterScreenCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/nft/NftNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/nft/NftNavigator.kt similarity index 63% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/nft/NftNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/nft/NftNavigator.kt index b00a111c45..d8da3cc4a5 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/nft/NftNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/nft/NftNavigator.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.nft +package io.novafoundation.nova.app.root.navigation.navigators.nft import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_nft_impl.NftRouter import io.novafoundation.nova.feature_nft_impl.presentation.nft.details.NftDetailsFragment class NftNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, ) : BaseNavigator(navigationHolder), NftRouter { override fun openNftDetails(nftId: String) = performNavigation( diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt similarity index 86% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt index fef901f45a..6112362221 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/pincode/PinCodeTwoFactorVerificationCommunicatorImpl.kt @@ -1,8 +1,8 @@ -package io.novafoundation.nova.app.root.navigation.pincode +package io.novafoundation.nova.app.root.navigation.navigators.pincode import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.common.sequrity.verification.PinCodeTwoFactorVerificationCommunicator import io.novafoundation.nova.common.sequrity.verification.PinCodeTwoFactorVerificationRequester.Request import io.novafoundation.nova.common.sequrity.verification.PinCodeTwoFactorVerificationResponder.Response @@ -11,7 +11,7 @@ import io.novafoundation.nova.feature_account_impl.presentation.pincode.PincodeF import kotlinx.coroutines.flow.Flow class PinCodeTwoFactorVerificationCommunicatorImpl( - navigationHolder: NavigationHolder + navigationHolder: MainNavigationHolder ) : NavStackInterScreenCommunicator(navigationHolder), PinCodeTwoFactorVerificationCommunicator { override val responseFlow: Flow diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushGovernanceSettingsCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushGovernanceSettingsCommunicatorImpl.kt similarity index 83% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushGovernanceSettingsCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushGovernanceSettingsCommunicatorImpl.kt index fbac79f48c..9103a67e98 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushGovernanceSettingsCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushGovernanceSettingsCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.push +package io.novafoundation.nova.app.root.navigation.navigators.push import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_push_notifications.PushNotificationsRouter import io.novafoundation.nova.feature_push_notifications.presentation.governance.PushGovernanceSettingsCommunicator import io.novafoundation.nova.feature_push_notifications.presentation.governance.PushGovernanceSettingsFragment import io.novafoundation.nova.feature_push_notifications.presentation.governance.PushGovernanceSettingsRequester import io.novafoundation.nova.feature_push_notifications.presentation.governance.PushGovernanceSettingsResponder -class PushGovernanceSettingsCommunicatorImpl(private val router: PushNotificationsRouter, navigationHolder: NavigationHolder) : +class PushGovernanceSettingsCommunicatorImpl(private val router: PushNotificationsRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), PushGovernanceSettingsCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushNotificationsNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushNotificationsNavigator.kt similarity index 70% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushNotificationsNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushNotificationsNavigator.kt index c66430d5ca..7fb6fced14 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushNotificationsNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushNotificationsNavigator.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.push +package io.novafoundation.nova.app.root.navigation.navigators.push import android.os.Bundle import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_push_notifications.PushNotificationsRouter class PushNotificationsNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, ) : BaseNavigator(navigationHolder), PushNotificationsRouter { override fun openPushSettings() { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushStakingSettingsCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushStakingSettingsCommunicatorImpl.kt similarity index 83% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushStakingSettingsCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushStakingSettingsCommunicatorImpl.kt index 42dcb623d4..0f20263b8a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/push/PushStakingSettingsCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/push/PushStakingSettingsCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.push +package io.novafoundation.nova.app.root.navigation.navigators.push import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_push_notifications.PushNotificationsRouter import io.novafoundation.nova.feature_push_notifications.presentation.staking.PushStakingSettingsCommunicator import io.novafoundation.nova.feature_push_notifications.presentation.staking.PushStakingSettingsFragment import io.novafoundation.nova.feature_push_notifications.presentation.staking.PushStakingSettingsRequester import io.novafoundation.nova.feature_push_notifications.presentation.staking.PushStakingSettingsResponder -class PushStakingSettingsCommunicatorImpl(private val router: PushNotificationsRouter, navigationHolder: NavigationHolder) : +class PushStakingSettingsCommunicatorImpl(private val router: PushNotificationsRouter, navigationHolder: MainNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), PushStakingSettingsCommunicator { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/settings/SettingsNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/settings/SettingsNavigator.kt similarity index 92% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/settings/SettingsNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/settings/SettingsNavigator.kt index 92a5ac4d00..769f0802f7 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/settings/SettingsNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/settings/SettingsNavigator.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.settings +package io.novafoundation.nova.app.root.navigation.navigators.settings import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.app.root.presentation.RootRouter import io.novafoundation.nova.feature_account_impl.presentation.pincode.PinCodeAction import io.novafoundation.nova.feature_account_impl.presentation.pincode.PincodeFragment @@ -19,7 +19,7 @@ import io.novafoundation.nova.feature_wallet_connect_impl.WalletConnectRouter import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.list.WalletConnectSessionsPayload class SettingsNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, private val rootRouter: RootRouter, private val walletConnectDelegate: WalletConnectRouter, private val delegate: Navigator diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StakingDashboardNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StakingDashboardNavigator.kt similarity index 87% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StakingDashboardNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StakingDashboardNavigator.kt index 6ffeac12a3..f6fa8ba150 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StakingDashboardNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StakingDashboardNavigator.kt @@ -1,16 +1,16 @@ -package io.novafoundation.nova.app.root.navigation.staking +package io.novafoundation.nova.app.root.navigation.navigators.staking import androidx.lifecycle.MutableLiveData import androidx.navigation.NavController import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.common.utils.Event import io.novafoundation.nova.common.utils.event import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter class StakingDashboardNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, ) : BaseNavigator(navigationHolder), StakingDashboardRouter { private var stakingTabNavController: NavController? = null diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StartMultiStakingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StartMultiStakingNavigator.kt similarity index 90% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StartMultiStakingNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StartMultiStakingNavigator.kt index 8ebc2c4a98..8b048e153e 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/StartMultiStakingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/StartMultiStakingNavigator.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.staking +package io.novafoundation.nova.app.root.navigation.navigators.staking import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter import io.novafoundation.nova.feature_staking_impl.presentation.StartMultiStakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.start.common.StartParachainStakingMode @@ -19,7 +19,7 @@ import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.se import io.novafoundation.nova.feature_staking_impl.presentation.staking.start.setupStakingType.SetupStakingTypePayload class StartMultiStakingNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, private val stakingDashboardRouter: StakingDashboardRouter, private val commonNavigationHolder: Navigator, ) : BaseNavigator(navigationHolder), StartMultiStakingRouter { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/nominationPools/NominationPoolsStakingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/nominationPools/NominationPoolsStakingNavigator.kt similarity index 84% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/nominationPools/NominationPoolsStakingNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/nominationPools/NominationPoolsStakingNavigator.kt index 43cd6f6fb3..bb3d5a4de4 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/nominationPools/NominationPoolsStakingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/nominationPools/NominationPoolsStakingNavigator.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.staking.nominationPools +package io.novafoundation.nova.app.root.navigation.navigators.staking.nominationPools import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_staking_impl.presentation.NominationPoolsRouter import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.bondMore.confirm.NominationPoolsConfirmBondMoreFragment import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.bondMore.confirm.NominationPoolsConfirmBondMorePayload @@ -11,7 +11,7 @@ import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools. import io.novafoundation.nova.feature_staking_impl.presentation.nominationPools.unbond.confirm.NominationPoolsConfirmUnbondPayload class NominationPoolsStakingNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, private val commonNavigator: Navigator, ) : BaseNavigator(navigationHolder), NominationPoolsRouter { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/ParachainStakingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/ParachainStakingNavigator.kt similarity index 92% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/ParachainStakingNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/ParachainStakingNavigator.kt index 38be483e81..ebc7fbfcd0 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/ParachainStakingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/ParachainStakingNavigator.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.staking.parachain +package io.novafoundation.nova.app.root.navigation.navigators.staking.parachain import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_staking_impl.presentation.ParachainStakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.rebond.ParachainStakingRebondFragment import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.rebond.model.ParachainStakingRebondPayload @@ -19,7 +19,7 @@ import io.novafoundation.nova.feature_staking_impl.presentation.validators.detai import io.novafoundation.nova.feature_staking_impl.presentation.validators.details.ValidatorDetailsFragment class ParachainStakingNavigator( - navigationHolder: NavigationHolder, + navigationHolder: MainNavigationHolder, private val commonNavigator: Navigator, ) : BaseNavigator(navigationHolder), ParachainStakingRouter { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt similarity index 85% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt index 4f971de1fa..4a22c8f0e2 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorInterScreenCommunicatorImpl.kt @@ -1,13 +1,13 @@ -package io.novafoundation.nova.app.root.navigation.staking.parachain +package io.novafoundation.nova.app.root.navigation.navigators.staking.parachain import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.common.SelectCollatorInterScreenCommunicator import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.common.SelectCollatorInterScreenCommunicator.Request import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.common.SelectCollatorInterScreenCommunicator.Response -class SelectCollatorInterScreenCommunicatorImpl(navigationHolder: NavigationHolder) : +class SelectCollatorInterScreenCommunicatorImpl(navigationHolder: MainNavigationHolder) : SelectCollatorInterScreenCommunicator, NavStackInterScreenCommunicator(navigationHolder) { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt similarity index 85% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt index ef0d6e80f4..6aae85da99 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/parachain/SelectCollatorSettingsInterScreenCommunicatorImpl.kt @@ -1,14 +1,14 @@ -package io.novafoundation.nova.app.root.navigation.staking.parachain +package io.novafoundation.nova.app.root.navigation.navigators.staking.parachain import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.settings.SelectCollatorSettingsFragment import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.settings.SelectCollatorSettingsInterScreenCommunicator import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.settings.SelectCollatorSettingsInterScreenCommunicator.Request import io.novafoundation.nova.feature_staking_impl.presentation.parachainStaking.collator.settings.SelectCollatorSettingsInterScreenCommunicator.Response -class SelectCollatorSettingsInterScreenCommunicatorImpl(navigationHolder: NavigationHolder) : +class SelectCollatorSettingsInterScreenCommunicatorImpl(navigationHolder: MainNavigationHolder) : SelectCollatorSettingsInterScreenCommunicator, NavStackInterScreenCommunicator(navigationHolder) { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/relaychain/RelayStakingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt similarity index 96% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/relaychain/RelayStakingNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt index 1cf4a04603..74b4bdcd4d 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/staking/relaychain/RelayStakingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt @@ -1,9 +1,10 @@ -package io.novafoundation.nova.app.root.navigation.staking.relaychain +package io.novafoundation.nova.app.root.navigation.navigators.staking.relaychain import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment import io.novafoundation.nova.feature_staking_impl.domain.staking.redeem.RedeemConsequences import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter @@ -183,11 +184,6 @@ class RelayStakingNavigator( override fun openRebag() = performNavigation(R.id.action_stakingFragment_to_rebag) - override fun openDAppBrowser(url: String) = performNavigation( - actionId = R.id.action_dappBrowserGraph, - args = DAppBrowserFragment.getBundle(url) - ) - override fun openStakingPeriods() { performNavigation(R.id.action_stakingFragment_to_staking_periods) } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/swap/SwapNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt similarity index 87% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/swap/SwapNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt index ba72cd2dae..55018efa81 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/swap/SwapNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt @@ -1,9 +1,10 @@ -package io.novafoundation.nova.app.root.navigation.swap +package io.novafoundation.nova.app.root.navigation.navigators.swap import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_assets.presentation.send.amount.SendPayload import io.novafoundation.nova.feature_assets.presentation.balance.detail.BalanceDetailFragment import io.novafoundation.nova.feature_assets.presentation.swap.asset.AssetSwapFlowFragment diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/versions/VersionsNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt similarity index 71% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/versions/VersionsNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt index 3238faa013..c3dd1d6a1a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/versions/VersionsNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt @@ -1,7 +1,8 @@ -package io.novafoundation.nova.app.root.navigation.versions +package io.novafoundation.nova.app.root.navigation.navigators.versions import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.utils.showBrowser import io.novafoundation.nova.feature_versions_api.presentation.VersionsRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/vote/VoteNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/vote/VoteNavigator.kt similarity index 82% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/vote/VoteNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/vote/VoteNavigator.kt index b32f397f54..8f6f157998 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/vote/VoteNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/vote/VoteNavigator.kt @@ -1,7 +1,7 @@ -package io.novafoundation.nova.app.root.navigation.vote +package io.novafoundation.nova.app.root.navigation.navigators.vote import androidx.fragment.app.Fragment -import io.novafoundation.nova.app.root.navigation.Navigator +import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_crowdloan_impl.presentation.main.CrowdloanFragment import io.novafoundation.nova.feature_governance_impl.presentation.referenda.list.ReferendaListFragment import io.novafoundation.nova.feature_vote.presentation.VoteRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/wallet/CurrencyNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/wallet/CurrencyNavigator.kt new file mode 100644 index 0000000000..256c8aacf6 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/wallet/CurrencyNavigator.kt @@ -0,0 +1,13 @@ +package io.novafoundation.nova.app.root.navigation.navigators.wallet + +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.app.root.presentation.RootRouter +import io.novafoundation.nova.feature_currency_api.presentation.CurrencyRouter + +class CurrencyNavigator(val rootRouter: RootRouter, navigationHolder: MainNavigationHolder) : BaseNavigator(navigationHolder), CurrencyRouter { + + override fun returnToWallet() { + rootRouter.returnToWallet() + } +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/ApproveSessionCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/ApproveSessionCommunicatorImpl.kt similarity index 86% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/ApproveSessionCommunicatorImpl.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/ApproveSessionCommunicatorImpl.kt index eec80e7f8e..6868c96e78 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/ApproveSessionCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/ApproveSessionCommunicatorImpl.kt @@ -1,9 +1,9 @@ -package io.novafoundation.nova.app.root.navigation.walletConnect +package io.novafoundation.nova.app.root.navigation.navigators.walletConnect import com.walletconnect.web3.wallet.client.Wallet import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.FlowInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate import io.novafoundation.nova.common.utils.sequrity.awaitInteractionAllowed import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.approve.ApproveSessionCommunicator diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/WalletConnectNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/WalletConnectNavigator.kt similarity index 78% rename from app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/WalletConnectNavigator.kt rename to app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/WalletConnectNavigator.kt index e4f9cd4b1f..fed5f720d6 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/walletConnect/WalletConnectNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/walletConnect/WalletConnectNavigator.kt @@ -1,15 +1,15 @@ -package io.novafoundation.nova.app.root.navigation.walletConnect +package io.novafoundation.nova.app.root.navigation.navigators.walletConnect import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.feature_wallet_connect_impl.WalletConnectRouter import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.details.WalletConnectSessionDetailsFragment import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.details.WalletConnectSessionDetailsPayload import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.list.WalletConnectSessionsFragment import io.novafoundation.nova.feature_wallet_connect_impl.presentation.sessions.list.WalletConnectSessionsPayload -class WalletConnectNavigator(navigationHolder: NavigationHolder) : BaseNavigator(navigationHolder), WalletConnectRouter { +class WalletConnectNavigator(navigationHolder: MainNavigationHolder) : BaseNavigator(navigationHolder), WalletConnectRouter { override fun openSessionDetails(payload: WalletConnectSessionDetailsPayload) = performNavigation( actionId = R.id.action_walletConnectSessionsFragment_to_walletConnectSessionDetailsFragment, args = WalletConnectSessionDetailsFragment.getBundle(payload) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/wallet/CurrencyNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/wallet/CurrencyNavigator.kt deleted file mode 100644 index d02f1551d4..0000000000 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/wallet/CurrencyNavigator.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.novafoundation.nova.app.root.navigation.wallet - -import io.novafoundation.nova.app.root.navigation.BaseNavigator -import io.novafoundation.nova.app.root.navigation.NavigationHolder -import io.novafoundation.nova.app.root.presentation.RootRouter -import io.novafoundation.nova.feature_currency_api.presentation.CurrencyRouter - -class CurrencyNavigator(val rootRouter: RootRouter, navigationHolder: NavigationHolder) : BaseNavigator(navigationHolder), CurrencyRouter { - - override fun returnToWallet() { - rootRouter.returnToWallet() - } -} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt index dc4abfbdb1..907ea6e5f5 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt @@ -7,7 +7,7 @@ import androidx.navigation.fragment.NavHostFragment import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.di.RootApi import io.novafoundation.nova.app.root.di.RootComponent -import io.novafoundation.nova.app.root.navigation.NavigationHolder +import io.novafoundation.nova.app.root.navigation.holders.RootNavigationHolder import io.novafoundation.nova.common.base.BaseActivity import io.novafoundation.nova.common.di.FeatureUtils import io.novafoundation.nova.common.resources.ContextManager @@ -24,7 +24,7 @@ import javax.inject.Inject class RootActivity : BaseActivity(), SplashBackgroundHolder { @Inject - lateinit var navigationHolder: NavigationHolder + lateinit var rootNavigationHolder: RootNavigationHolder @Inject lateinit var systemCallExecutor: SystemCallExecutor @@ -55,7 +55,9 @@ class RootActivity : BaseActivity(), SplashBackgroundHolder { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - navigationHolder.attach(navController) + rootNavigationHolder.attach(rootNavController) + //setupBackNavigation(mainNavController, dappNavController) + contextManager.attachActivity(this) rootNetworkBar.setOnApplyWindowInsetsListener { view, insets -> @@ -74,7 +76,7 @@ class RootActivity : BaseActivity(), SplashBackgroundHolder { super.onDestroy() contextManager.detachActivity() - navigationHolder.detach() + rootNavigationHolder.detach() } override fun layoutResource(): Int { @@ -143,9 +145,8 @@ class RootActivity : BaseActivity(), SplashBackgroundHolder { // } // } - private val navController: NavController by lazy { - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.navHost) as NavHostFragment + private val rootNavController: NavController by lazy { + val navHostFragment = supportFragmentManager.findFragmentById(R.id.rootNavHost) as NavHostFragment navHostFragment.navController } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/main/MainFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/main/MainFragment.kt index 1f45f1fc9f..9eecc413db 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/main/MainFragment.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/main/MainFragment.kt @@ -13,7 +13,7 @@ import androidx.navigation.ui.setupWithNavController import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.di.RootApi import io.novafoundation.nova.app.root.di.RootComponent -import io.novafoundation.nova.app.root.navigation.staking.StakingDashboardNavigator +import io.novafoundation.nova.app.root.navigation.navigators.staking.StakingDashboardNavigator import io.novafoundation.nova.common.base.BaseFragment import io.novafoundation.nova.common.di.FeatureUtils import io.novafoundation.nova.common.utils.blur.SweetBlur diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt new file mode 100644 index 0000000000..c1add1c6b9 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt @@ -0,0 +1,58 @@ +package io.novafoundation.nova.app.root.presentation.splitScreen + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import io.novafoundation.nova.app.R +import io.novafoundation.nova.app.root.di.RootApi +import io.novafoundation.nova.app.root.di.RootComponent +import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder +import io.novafoundation.nova.common.base.BaseFragment +import io.novafoundation.nova.common.di.FeatureUtils +import javax.inject.Inject + +class SplitScreenFragment : BaseFragment() { + + @Inject + lateinit var mainNavigationHolder: MainNavigationHolder + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_split_screen, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mainNavigationHolder.attach(mainNavController) + } + + override fun onDestroyView() { + super.onDestroyView() + + mainNavigationHolder.detach() + } + + override fun inject() { + FeatureUtils.getFeature(this, RootApi::class.java) + .splitScreenFragmentComponentFactory() + .create(this) + .inject(this) + } + + override fun initViews() { + + } + + override fun subscribe(viewModel: SplitScreenViewModel) { + + } + + private val mainNavController: NavController by lazy { + val navHostFragment = childFragmentManager.findFragmentById(R.id.mainNavHost) as NavHostFragment + + navHostFragment.navController + } +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt new file mode 100644 index 0000000000..c2bcb6f09e --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt @@ -0,0 +1,7 @@ +package io.novafoundation.nova.app.root.presentation.splitScreen + +import io.novafoundation.nova.common.base.BaseViewModel + +class SplitScreenViewModel() : BaseViewModel() { + +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt new file mode 100644 index 0000000000..ff0557627e --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt @@ -0,0 +1,28 @@ +package io.novafoundation.nova.app.root.presentation.splitScreen.di + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import dagger.BindsInstance +import dagger.Subcomponent +import io.novafoundation.nova.app.root.presentation.main.MainFragment +import io.novafoundation.nova.app.root.presentation.splitScreen.SplitScreenFragment +import io.novafoundation.nova.common.di.scope.ScreenScope + +@Subcomponent( + modules = [ + SplitScreenFragmentModule::class + ] +) +@ScreenScope +interface SplitScreenFragmentComponent { + + @Subcomponent.Factory + interface Factory { + + fun create( + @BindsInstance fragment: Fragment + ): SplitScreenFragmentComponent + } + + fun inject(fragment: SplitScreenFragment) +} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentModule.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentModule.kt new file mode 100644 index 0000000000..380343e921 --- /dev/null +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentModule.kt @@ -0,0 +1,34 @@ +package io.novafoundation.nova.app.root.presentation.splitScreen.di + +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoMap +import io.novafoundation.nova.app.root.presentation.splitScreen.SplitScreenViewModel +import io.novafoundation.nova.common.di.viewmodel.ViewModelKey +import io.novafoundation.nova.common.di.viewmodel.ViewModelModule + +@Module( + includes = [ + ViewModelModule::class + ] +) +class SplitScreenFragmentModule { + + @Provides + @IntoMap + @ViewModelKey(SplitScreenViewModel::class) + fun provideViewModel(): ViewModel { + return SplitScreenViewModel() + } + + @Provides + fun provideViewModelCreator( + fragment: Fragment, + viewModelFactory: ViewModelProvider.Factory + ): SplitScreenViewModel { + return ViewModelProvider(fragment, viewModelFactory).get(SplitScreenViewModel::class.java) + } +} diff --git a/app/src/main/res/layout/activity_root.xml b/app/src/main/res/layout/activity_root.xml index c85b778455..7ac67c6475 100644 --- a/app/src/main/res/layout/activity_root.xml +++ b/app/src/main/res/layout/activity_root.xml @@ -1,14 +1,13 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_split_screen.xml b/app/src/main/res/layout/fragment_split_screen.xml new file mode 100644 index 0000000000..9652493590 --- /dev/null +++ b/app/src/main/res/layout/fragment_split_screen.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/dapp_browser_graph.xml b/app/src/main/res/navigation/dapp_browser_graph.xml index 5388845118..f870fd3a33 100644 --- a/app/src/main/res/navigation/dapp_browser_graph.xml +++ b/app/src/main/res/navigation/dapp_browser_graph.xml @@ -3,22 +3,22 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/dapp_browser_graph" - app:startDestination="@id/DAppBrowserFragment"> + app:startDestination="@id/dappBrowserFragment"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/dapp_search_graph.xml b/app/src/main/res/navigation/dapp_search_graph.xml index 40463b83eb..821e15f1af 100644 --- a/app/src/main/res/navigation/dapp_search_graph.xml +++ b/app/src/main/res/navigation/dapp_search_graph.xml @@ -17,7 +17,7 @@ app:enterAnim="@anim/fragment_open_enter" app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" - app:popExitAnim="@anim/fragment_close_exit" + app:popExitAnim="@anim/fragment_slide_out" app:popUpTo="@id/dapp_search_graph" app:popUpToInclusive="true" /> diff --git a/app/src/main/res/navigation/dapp_tabs_graph.xml b/app/src/main/res/navigation/dapp_tabs_graph.xml new file mode 100644 index 0000000000..b721af6707 --- /dev/null +++ b/app/src/main/res/navigation/dapp_tabs_graph.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/import_nav_graph.xml b/app/src/main/res/navigation/import_nav_graph.xml index e6072a6d2f..e29a1451d8 100644 --- a/app/src/main/res/navigation/import_nav_graph.xml +++ b/app/src/main/res/navigation/import_nav_graph.xml @@ -18,7 +18,7 @@ app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" app:popExitAnim="@anim/fragment_close_exit" - app:popUpTo="@id/root_nav_graph" + app:popUpTo="@id/main_root_nav_graph" app:popUpToInclusive="true"> diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index d085d337b2..cc278c767e 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -368,10 +368,10 @@ + app:popExitAnim="@anim/fragment_slide_out" /> + app:popExitAnim="@anim/fragment_slide_out" /> @@ -15,12 +15,12 @@ - + app:popExitAnim="@anim/fragment_slide_out" /> + + \ No newline at end of file diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/ImageLoaderExt.kt b/common/src/main/java/io/novafoundation/nova/common/utils/ImageLoaderExt.kt new file mode 100644 index 0000000000..3c9989dd26 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/ImageLoaderExt.kt @@ -0,0 +1,21 @@ +package io.novafoundation.nova.common.utils + +import android.widget.ImageView +import coil.ImageLoader +import coil.imageLoader +import coil.loadAny +import coil.request.ImageRequest + +fun ImageView.loadOrHide( + any: Any?, + imageLoader: ImageLoader = context.imageLoader, + builder: ImageRequest.Builder.() -> Unit = {} +) { + loadAny(any, imageLoader) { + listener( + onSuccess = { _, _ -> makeVisible() }, + onError = { _, _ -> makeGone() } + ) + builder() + } +} diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/coil/transformation/TopCropTransformation.kt b/common/src/main/java/io/novafoundation/nova/common/utils/coil/transformation/TopCropTransformation.kt new file mode 100644 index 0000000000..95f8046e8b --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/utils/coil/transformation/TopCropTransformation.kt @@ -0,0 +1,43 @@ +package io.novafoundation.nova.common.utils.coil.transformation + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Matrix +import android.graphics.Paint +import coil.bitmap.BitmapPool +import coil.size.Size +import coil.size.PixelSize +import coil.transform.Transformation + +class TopCropTransformation : Transformation { + + override fun key(): String { + return "TopCropTransformation" + } + + override suspend fun transform(pool: BitmapPool, input: Bitmap, size: Size): Bitmap { + val (width, height) = if (size is PixelSize) { + size.width to size.height + } else { + input.width to input.height + } + + val scale = width / input.width.toFloat() + + val targetWidth = (input.width * scale).toInt() + val targetHeight = height + + val output = Bitmap.createBitmap(targetWidth, targetHeight, input.config) + + val canvas = Canvas(output) + val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG) + + val matrix = Matrix() + matrix.setScale(scale, scale) + matrix.postTranslate(0f, 0f) + + canvas.drawBitmap(input, matrix, paint) + + return output + } +} diff --git a/common/src/main/res/anim/fragment_slide_in.xml b/common/src/main/res/anim/fragment_slide_in.xml new file mode 100644 index 0000000000..fb1717eb6d --- /dev/null +++ b/common/src/main/res/anim/fragment_slide_in.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/anim/fragment_slide_out.xml b/common/src/main/res/anim/fragment_slide_out.xml new file mode 100644 index 0000000000..a84cb659fd --- /dev/null +++ b/common/src/main/res/anim/fragment_slide_out.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/ic_tab_close.xml b/common/src/main/res/drawable/ic_tab_close.xml new file mode 100644 index 0000000000..885526b913 --- /dev/null +++ b/common/src/main/res/drawable/ic_tab_close.xml @@ -0,0 +1,13 @@ + + + + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index b157bffc3d..63690f45af 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1,6 +1,12 @@ + + Close All DApps? + All opened tabs in DApp browser will be closed. + + Close All + Select network Search by token diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/DAppRouter.kt b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/DAppRouter.kt similarity index 64% rename from feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/DAppRouter.kt rename to feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/DAppRouter.kt index 016c08bfd9..920fa7a8ea 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/DAppRouter.kt +++ b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/DAppRouter.kt @@ -1,7 +1,7 @@ -package io.novafoundation.nova.feature_dapp_impl +package io.novafoundation.nova.feature_dapp_api import io.novafoundation.nova.common.navigation.ReturnableRouter -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesPayload +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload interface DAppRouter : ReturnableRouter { @@ -14,4 +14,6 @@ interface DAppRouter : ReturnableRouter { fun openAddToFavourites(payload: AddToFavouritesPayload) fun openAuthorizedDApps() + + fun openTabs() } diff --git a/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/di/DAppFeatureApi.kt b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/di/DAppFeatureApi.kt index ff933f0858..044bcfed53 100644 --- a/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/di/DAppFeatureApi.kt +++ b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/di/DAppFeatureApi.kt @@ -1,8 +1,11 @@ package io.novafoundation.nova.feature_dapp_api.di +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository interface DAppFeatureApi { val dappMetadataRepository: DAppMetadataRepository + + val dappRouter: DAppRouter } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesPayload.kt b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/presentation/addToFavorites/AddToFavouritesPayload.kt similarity index 71% rename from feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesPayload.kt rename to feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/presentation/addToFavorites/AddToFavouritesPayload.kt index d4daf15ee6..357f24e3fc 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesPayload.kt +++ b/feature-dapp-api/src/main/java/io/novafoundation/nova/feature_dapp_api/presentation/addToFavorites/AddToFavouritesPayload.kt @@ -1,4 +1,4 @@ -package io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites +package io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites import android.os.Parcelable import kotlinx.android.parcel.Parcelize diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureComponent.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureComponent.kt index 3b4285e4a7..3a015c0984 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureComponent.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureComponent.kt @@ -8,13 +8,14 @@ import io.novafoundation.nova.core_db.di.DbApi import io.novafoundation.nova.feature_account_api.di.AccountFeatureApi import io.novafoundation.nova.feature_currency_api.di.CurrencyFeatureApi import io.novafoundation.nova.feature_dapp_api.di.DAppFeatureApi -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.di.AddToFavouritesComponent import io.novafoundation.nova.feature_dapp_impl.presentation.authorizedDApps.di.AuthorizedDAppsComponent import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.di.DAppBrowserComponent import io.novafoundation.nova.feature_dapp_impl.presentation.main.di.MainDAppComponent import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator import io.novafoundation.nova.feature_dapp_impl.presentation.search.di.DAppSearchComponent +import io.novafoundation.nova.feature_dapp_impl.presentation.tab.di.BrowserTabsComponent import io.novafoundation.nova.feature_external_sign_api.model.ExternalSignCommunicator import io.novafoundation.nova.feature_wallet_api.di.WalletFeatureApi import io.novafoundation.nova.runtime.di.RuntimeApi @@ -36,6 +37,8 @@ interface DAppFeatureComponent : DAppFeatureApi { fun browserComponentFactory(): DAppBrowserComponent.Factory + fun browserTabsComponentFactory(): BrowserTabsComponent.Factory + fun dAppSearchComponentFactory(): DAppSearchComponent.Factory fun addToFavouritesComponentFactory(): AddToFavouritesComponent.Factory diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureHolder.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureHolder.kt index ed21680394..b7eec47b6a 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureHolder.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/di/DAppFeatureHolder.kt @@ -6,7 +6,7 @@ import io.novafoundation.nova.common.di.scope.ApplicationScope import io.novafoundation.nova.core_db.di.DbApi import io.novafoundation.nova.feature_account_api.di.AccountFeatureApi import io.novafoundation.nova.feature_currency_api.di.CurrencyFeatureApi -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator import io.novafoundation.nova.feature_external_sign_api.model.ExternalSignCommunicator import io.novafoundation.nova.feature_wallet_api.di.WalletFeatureApi diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesFragment.kt index a40de0c386..26da3e23f0 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesFragment.kt @@ -16,6 +16,7 @@ import io.novafoundation.nova.common.utils.keyboard.showSoftKeyboard import io.novafoundation.nova.common.utils.moveCursorToTheEnd import io.novafoundation.nova.common.utils.postToSelf import io.novafoundation.nova.feature_dapp_api.di.DAppFeatureApi +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.R import io.novafoundation.nova.feature_dapp_impl.di.DAppFeatureComponent import io.novafoundation.nova.feature_external_sign_api.presentation.dapp.showDAppIcon diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesViewModel.kt index a19d8ebdbf..5bfcffbeee 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/AddToFavouritesViewModel.kt @@ -6,7 +6,8 @@ import io.novafoundation.nova.common.base.BaseViewModel import io.novafoundation.nova.common.utils.Event import io.novafoundation.nova.common.utils.sendEvent import io.novafoundation.nova.common.utils.singleReplaySharedFlow -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.data.model.FavouriteDApp import io.novafoundation.nova.feature_dapp_impl.domain.browser.addToFavourites.AddToFavouritesInteractor import kotlinx.coroutines.flow.MutableStateFlow diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesComponent.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesComponent.kt index dad834c9d9..2c567a6e0d 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesComponent.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesComponent.kt @@ -5,7 +5,7 @@ import dagger.BindsInstance import dagger.Subcomponent import io.novafoundation.nova.common.di.scope.ScreenScope import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesFragment -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesPayload +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload @Subcomponent( modules = [ diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesModule.kt index 1d501980d7..4d28098c10 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/addToFavourites/di/AddToFavouritesModule.kt @@ -10,10 +10,10 @@ import io.novafoundation.nova.common.di.scope.ScreenScope import io.novafoundation.nova.common.di.viewmodel.ViewModelKey import io.novafoundation.nova.common.di.viewmodel.ViewModelModule import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.data.repository.FavouritesDAppRepository import io.novafoundation.nova.feature_dapp_impl.domain.browser.addToFavourites.AddToFavouritesInteractor -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesPayload +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesViewModel @Module(includes = [ViewModelModule::class]) diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/AuthorizedDAppsViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/AuthorizedDAppsViewModel.kt index 05d3997748..06ef06249b 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/AuthorizedDAppsViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/AuthorizedDAppsViewModel.kt @@ -5,7 +5,7 @@ import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.common.mixin.actionAwaitable.confirmingAction import io.novafoundation.nova.common.utils.mapList import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.WalletUiUseCase -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.domain.authorizedDApps.AuthorizedDApp import io.novafoundation.nova.feature_dapp_impl.domain.authorizedDApps.AuthorizedDAppsInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.authorizedDApps.model.AuthorizedDAppModel diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/di/AuthorizedDAppsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/di/AuthorizedDAppsModule.kt index cf17369a8a..4708414f2a 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/di/AuthorizedDAppsModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/authorizedDApps/di/AuthorizedDAppsModule.kt @@ -13,7 +13,7 @@ import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepository import io.novafoundation.nova.feature_account_api.presenatation.account.wallet.WalletUiUseCase import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.domain.authorizedDApps.AuthorizedDAppsInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.authorizedDApps.AuthorizedDAppsViewModel import io.novafoundation.nova.feature_dapp_impl.web3.session.Web3Session diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt index abfbecbbc3..698c4389c5 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt @@ -42,6 +42,7 @@ import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserMore import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserProgress import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserRefresh import javax.inject.Inject +import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserTabs import kotlinx.android.synthetic.main.fragment_dapp_browser.dappBrowserWebViewContainer class DAppBrowserFragment : BaseFragment(), OptionsBottomSheetDialog.Callback, PageCallback { @@ -71,6 +72,11 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS return dappBrowserWebViewContainer.getChildAt(0) as? WebView } + override fun onCreate(savedInstanceState: Bundle?) { + WebView.enableSlowWholeDocumentDraw() + super.onCreate(savedInstanceState) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -95,6 +101,7 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } dappBrowserForward.setOnClickListener { forwardClicked() } + dappBrowserTabs.setOnClickListener { viewModel.openTabs() } dappBrowserRefresh.setOnClickListener { refreshClicked() } dappBrowserMore.setOnClickListener { moreClicked() } @@ -103,6 +110,7 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS } override fun onDestroyView() { + dappBrowserWebViewContainer.removeAllViews() viewModel.detachCurrentSession() super.onDestroyView() @@ -111,6 +119,8 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS override fun onPause() { super.onPause() + viewModel.makePageSnapshot() + detachBackCallback() } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt index 8904092d41..076c82a38a 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserViewModel.kt @@ -12,12 +12,12 @@ import io.novafoundation.nova.common.utils.removeHexPrefix import io.novafoundation.nova.common.utils.singleReplaySharedFlow import io.novafoundation.nova.feature_account_api.domain.interfaces.SelectedAccountUseCase import io.novafoundation.nova.feature_dapp_api.data.model.BrowserHostSettings -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.domain.DappInteractor import io.novafoundation.nova.feature_dapp_impl.domain.browser.BrowserPage import io.novafoundation.nova.feature_dapp_impl.domain.browser.BrowserPageAnalyzed import io.novafoundation.nova.feature_dapp_impl.domain.browser.DappBrowserInteractor -import io.novafoundation.nova.feature_dapp_impl.presentation.addToFavourites.AddToFavouritesPayload +import io.novafoundation.nova.feature_dapp_api.presentation.addToFavorites.AddToFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.presentation.browser.options.DAppOptionsPayload import io.novafoundation.nova.feature_dapp_impl.presentation.common.favourites.RemoveFavouritesPayload import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchRequester @@ -111,7 +111,8 @@ class DAppBrowserViewModel( .distinctUntilChanged() .shareInBackground() - val currentTabFlow = browserTabPoolService.currentTabFlow + val currentTabFlow = browserTabPoolService.tabStateFlow + .map { it.selectedTab } .filterIsInstance() .shareInBackground() @@ -167,11 +168,7 @@ class DAppBrowserViewModel( } fun closeClicked() = launch { - val confirmationState = awaitConfirmation(DappPendingConfirmation.Action.CloseScreen) - - if (confirmationState == ConfirmationState.ALLOWED) { - exitBrowser() - } + exitBrowser() } fun openSearch() = launch { @@ -216,6 +213,14 @@ class DAppBrowserViewModel( } } + fun openTabs() { + router.openTabs() + } + + fun makePageSnapshot() = launch { + browserTabPoolService.makeCurrentTabSnapshot() + } + private fun watchDangerousWebsites() { currentPageAnalyzed .filter { it.synchronizedWithBrowser && it.security == BrowserPageAnalyzed.Security.DANGEROUS } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt index d07cf6a176..ff23efa634 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/di/DAppBrowserModule.kt @@ -13,7 +13,7 @@ import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.core_db.dao.BrowserHostSettingsDao import io.novafoundation.nova.feature_account_api.domain.interfaces.SelectedAccountUseCase import io.novafoundation.nova.feature_dapp_api.data.repository.BrowserHostSettingsRepository -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.data.repository.FavouritesDAppRepository import io.novafoundation.nova.feature_dapp_impl.data.repository.PhishingSitesRepository import io.novafoundation.nova.feature_dapp_impl.data.repository.RealBrowserHostSettingsRepository diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/MainDAppViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/MainDAppViewModel.kt index b77eeba4f1..d434a19add 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/MainDAppViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/MainDAppViewModel.kt @@ -12,7 +12,7 @@ import io.novafoundation.nova.common.utils.indexOfFirstOrNull import io.novafoundation.nova.common.utils.withLoading import io.novafoundation.nova.feature_account_api.domain.interfaces.SelectedAccountUseCase import io.novafoundation.nova.feature_dapp_api.data.model.DappCategory -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.data.mappers.mapDappModelToDApp import io.novafoundation.nova.feature_dapp_impl.data.mappers.mapDappToDappModel import io.novafoundation.nova.feature_dapp_impl.domain.DappInteractor diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/di/MainDAppModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/di/MainDAppModule.kt index b6f4497b9d..6f92c3617d 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/di/MainDAppModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/main/di/MainDAppModule.kt @@ -11,7 +11,7 @@ import io.novafoundation.nova.common.di.viewmodel.ViewModelKey import io.novafoundation.nova.common.di.viewmodel.ViewModelModule import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.feature_account_api.domain.interfaces.SelectedAccountUseCase -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.domain.DappInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.main.MainDAppViewModel diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt index ebcea18d1b..7c57ac3807 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt @@ -12,7 +12,7 @@ import io.novafoundation.nova.common.resources.ResourceManager import io.novafoundation.nova.common.utils.Event import io.novafoundation.nova.common.utils.inBackground import io.novafoundation.nova.common.utils.sendEvent -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.R import io.novafoundation.nova.feature_dapp_impl.domain.search.DappSearchGroup import io.novafoundation.nova.feature_dapp_impl.domain.search.DappSearchResult diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DappSearchFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DappSearchFragment.kt index ae097430dc..3aeff2f206 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DappSearchFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DappSearchFragment.kt @@ -75,7 +75,7 @@ class DappSearchFragment : BaseBottomSheetFragment(), Searc searchDappSearch.searchInput.content.bindTo(viewModel.query, lifecycleScope) viewModel.searchResults.observe(::submitListPreservingViewPoint) - viewModel.dAppNotInCatalogWarning + viewModel.selectQueryTextEvent.observeEvent { searchDappSearch.searchInput.content.selectAll() } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt index 2cf3022203..c740f91f26 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt @@ -13,7 +13,7 @@ import io.novafoundation.nova.common.di.viewmodel.ViewModelModule import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.common.resources.ResourceManager import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository -import io.novafoundation.nova.feature_dapp_impl.DAppRouter +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_impl.data.repository.FavouritesDAppRepository import io.novafoundation.nova.feature_dapp_impl.domain.search.SearchDappInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt new file mode 100644 index 0000000000..a74a6da003 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt @@ -0,0 +1,8 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab + +class BrowserTabRvItem( + val tabId: String, + val tabName: String?, + val tabFaviconPath: String?, + val tabScreenshotPath: String?, +) diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt new file mode 100644 index 0000000000..1232463c2e --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt @@ -0,0 +1,78 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab + +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import coil.ImageLoader +import coil.clear +import coil.load +import io.novafoundation.nova.common.list.BaseViewHolder +import io.novafoundation.nova.common.utils.coil.transformation.TopCropTransformation +import io.novafoundation.nova.common.utils.inflateChild +import io.novafoundation.nova.common.utils.loadOrHide +import io.novafoundation.nova.feature_dapp_impl.R +import java.io.File +import kotlinx.android.synthetic.main.item_browser_tab.view.browserTabCard +import kotlinx.android.synthetic.main.item_browser_tab.view.browserTabClose +import kotlinx.android.synthetic.main.item_browser_tab.view.browserTabFavicon +import kotlinx.android.synthetic.main.item_browser_tab.view.browserTabScreenshot +import kotlinx.android.synthetic.main.item_browser_tab.view.browserTabSiteName + +class BrowserTabsAdapter( + private val imageLoader: ImageLoader, + private val handler: Handler +) : ListAdapter(DiffCallback) { + + interface Handler { + + fun tabClicked(item: BrowserTabRvItem) + + fun tabCloseClicked(item: BrowserTabRvItem) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BrowserTabViewHolder { + return BrowserTabViewHolder(parent.inflateChild(R.layout.item_browser_tab), imageLoader, handler) + } + + override fun onBindViewHolder(holder: BrowserTabViewHolder, position: Int) { + holder.bind(getItem(position)) + } +} + +private object DiffCallback : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: BrowserTabRvItem, newItem: BrowserTabRvItem): Boolean { + return oldItem.tabId == newItem.tabId + } + + override fun areContentsTheSame(oldItem: BrowserTabRvItem, newItem: BrowserTabRvItem): Boolean { + return true + } +} + +class BrowserTabViewHolder( + private val view: View, + private val imageLoader: ImageLoader, + private val itemHandler: BrowserTabsAdapter.Handler, +) : BaseViewHolder(view) { + + fun bind(item: BrowserTabRvItem) = with(itemView) { + browserTabCard.setOnClickListener { itemHandler.tabClicked(item) } + browserTabClose.setOnClickListener { itemHandler.tabCloseClicked(item) } + browserTabScreenshot.load(item.tabScreenshotPath?.asFile(), imageLoader) { + transformations(TopCropTransformation()) + } + browserTabFavicon.loadOrHide(item.tabFaviconPath?.asFile(), imageLoader) + browserTabSiteName.text = item.tabName + } + + override fun unbind() { + with(itemView) { + browserTabScreenshot.clear() + browserTabFavicon.clear() + } + } + + private fun String.asFile() = File(this) +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt new file mode 100644 index 0000000000..2d37dec4d7 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt @@ -0,0 +1,90 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager +import coil.ImageLoader +import io.novafoundation.nova.common.base.BaseFragment +import io.novafoundation.nova.common.di.FeatureUtils +import io.novafoundation.nova.common.utils.applyStatusBarInsets +import io.novafoundation.nova.common.view.dialog.warningDialog +import io.novafoundation.nova.feature_dapp_api.di.DAppFeatureApi +import io.novafoundation.nova.feature_dapp_impl.R +import io.novafoundation.nova.feature_dapp_impl.di.DAppFeatureComponent +import javax.inject.Inject +import kotlinx.android.synthetic.main.fragment_browser_tabs.browserTabsAddTab +import kotlinx.android.synthetic.main.fragment_browser_tabs.browserTabsCloseTabs +import kotlinx.android.synthetic.main.fragment_browser_tabs.browserTabsDone +import kotlinx.android.synthetic.main.fragment_browser_tabs.browserTabsList + +class BrowserTabsFragment : BaseFragment(), BrowserTabsAdapter.Handler { + + @Inject + lateinit var imageLoader: ImageLoader + + private val adapter by lazy(LazyThreadSafetyMode.NONE) { + BrowserTabsAdapter(imageLoader, this) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return layoutInflater.inflate(R.layout.fragment_browser_tabs, container, false) + } + + override fun initViews() { + requireView().applyStatusBarInsets() + + browserTabsList.layoutManager = GridLayoutManager(requireContext(), 2) + browserTabsList.adapter = adapter + + browserTabsCloseTabs.setOnClickListener { viewModel.closeAllTabs() } + browserTabsAddTab.setOnClickListener { viewModel.addTab() } + browserTabsDone.setOnClickListener { viewModel.done() } + } + + override fun inject() { + FeatureUtils.getFeature(this, DAppFeatureApi::class.java) + .browserTabsComponentFactory() + .create(this) + .inject(this) + } + + override fun subscribe(viewModel: BrowserTabsViewModel) { + setupCloseAllTabsDialogue() + + viewModel.tabsFlow.observe { + adapter.submitList(it) + } + } + + override fun tabClicked(item: BrowserTabRvItem) { + viewModel.openTab(item.tabId) + } + + override fun tabCloseClicked(item: BrowserTabRvItem) { + viewModel.closeTab(item.tabId) + } + + + private fun setupCloseAllTabsDialogue() { + viewModel.closeAllTabsConfirmation.awaitableActionLiveData.observeEvent { event -> + warningDialog( + context = providedContext, + onPositiveClick = { event.onSuccess(Unit) }, + positiveTextRes = R.string.browser_tabs_close_all, + negativeTextRes = R.string.common_cancel, + onNegativeClick = { event.onCancel() }, + styleRes = R.style.AccentNegativeAlertDialogTheme_Reversed + ) { + setTitle(R.string.close_dapp_tabs_title) + + setMessage(R.string.close_dapp_tabs_message) + } + } + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt new file mode 100644 index 0000000000..d820003444 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt @@ -0,0 +1,56 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab + +import io.novafoundation.nova.common.base.BaseViewModel +import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin +import io.novafoundation.nova.common.mixin.actionAwaitable.awaitAction +import io.novafoundation.nova.common.mixin.actionAwaitable.confirmingAction +import io.novafoundation.nova.common.utils.mapList +import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch + +class BrowserTabsViewModel( + private val router: DAppRouter, + private val browserTabPoolService: BrowserTabPoolService, + private val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, +) : BaseViewModel() { + + val closeAllTabsConfirmation = actionAwaitableMixinFactory.confirmingAction() + + val tabsFlow = browserTabPoolService.tabStateFlow + .map { it.tabs } + .mapList { + BrowserTabRvItem( + tabId = it.id, + tabName = it.pageSnapshot.pageName, + tabFaviconPath = it.pageSnapshot.pageIconPath, + tabScreenshotPath = it.pageSnapshot.pagePicturePath + ) + } + + fun openTab(tabId: String) = launch { + val tab = browserTabPoolService.tabStateFlow.first().tabs.first { it.id == tabId } + browserTabPoolService.selectTab(tabId) + router.openDAppBrowser(tab.currentUrl) + } + + fun closeTab(tabId: String) = launch { + browserTabPoolService.removeTab(tabId) + } + + fun closeAllTabs() = launch { + closeAllTabsConfirmation.awaitAction() + + browserTabPoolService.removeAllTabs() + } + + fun addTab() { + router.openDappSearch() + } + + fun done() { + router.back() + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsComponent.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsComponent.kt new file mode 100644 index 0000000000..890998d525 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsComponent.kt @@ -0,0 +1,26 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab.di + +import androidx.fragment.app.Fragment +import dagger.BindsInstance +import dagger.Subcomponent +import io.novafoundation.nova.common.di.scope.ScreenScope +import io.novafoundation.nova.feature_dapp_impl.presentation.tab.BrowserTabsFragment + +@Subcomponent( + modules = [ + BrowserTabsModule::class + ] +) +@ScreenScope +interface BrowserTabsComponent { + + @Subcomponent.Factory + interface Factory { + + fun create( + @BindsInstance fragment: Fragment + ): BrowserTabsComponent + } + + fun inject(fragment: BrowserTabsFragment) +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt new file mode 100644 index 0000000000..d8e88d5063 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt @@ -0,0 +1,38 @@ +package io.novafoundation.nova.feature_dapp_impl.presentation.tab.di + +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoMap +import io.novafoundation.nova.common.di.viewmodel.ViewModelKey +import io.novafoundation.nova.common.di.viewmodel.ViewModelModule +import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin +import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_impl.presentation.tab.BrowserTabsViewModel +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService + +@Module(includes = [ViewModelModule::class]) +class BrowserTabsModule { + + @Provides + internal fun provideViewModel(fragment: Fragment, factory: ViewModelProvider.Factory): BrowserTabsViewModel { + return ViewModelProvider(fragment, factory).get(BrowserTabsViewModel::class.java) + } + + @Provides + @IntoMap + @ViewModelKey(BrowserTabsViewModel::class) + fun provideViewModel( + router: DAppRouter, + browserTabPoolService: BrowserTabPoolService, + actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, + ): ViewModel { + return BrowserTabsViewModel( + router = router, + browserTabPoolService = browserTabPoolService, + actionAwaitableMixinFactory = actionAwaitableMixinFactory + ) + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 8cc51f8d82..54fcc7116e 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -6,10 +6,9 @@ import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.CurrentTabStat import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSession import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSessionFactory import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.PageSnapshot -import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.stateId +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.TabsState import io.novafoundation.nova.feature_dapp_impl.utils.tabs.models.withNameOnly -import java.util.Date -import java.util.UUID +import java.util.* import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine @@ -19,7 +18,7 @@ import kotlinx.coroutines.flow.map interface BrowserTabPoolService { - val currentTabFlow: Flow + val tabStateFlow: Flow fun selectTab(tabId: String?) @@ -50,15 +49,13 @@ class RealBrowserTabPoolService( private val activeSessions = mutableMapOf() - override val currentTabFlow = combine( + override val tabStateFlow = combine( selectedTabIdFlow, allTabsFlow ) { selectedTabId, allTabs -> - val tabId = selectedTabId ?: return@combine CurrentTabState.NotSelected - val tab = allTabs[tabId] ?: return@combine CurrentTabState.NotSelected - CurrentTabState.Selected( - tab, - activeSessions[tabId] ?: addNewSession(tab) + TabsState( + tabs = allTabs.values.toList(), + selectedTab = currentTabState(selectedTabId, allTabs) ) }.distinctUntilChangedBy { it.stateId() } @@ -99,11 +96,12 @@ class RealBrowserTabPoolService( } override suspend fun makeCurrentTabSnapshot() { - val currentTab = currentTabFlow.first() + val currentTab = selectedTabIdFlow.first() + val pageSession = activeSessions[currentTab] - if (currentTab is CurrentTabState.Selected) { - val snapshot = pageSnapshotBuilder.getPageSnapshot(currentTab.pageSession) - browserTabStorage.savePageSnapshot(currentTab.tab.id, snapshot) + if (pageSession != null) { + val snapshot = pageSnapshotBuilder.getPageSnapshot(pageSession) + browserTabStorage.savePageSnapshot(pageSession.tabId, snapshot) } } @@ -127,4 +125,13 @@ class RealBrowserTabPoolService( val sessionToDetach = activeSessions[tabId] sessionToDetach?.detachSession() } + + private fun currentTabState(selectedTabId: String?, allTabs: Map): CurrentTabState { + val tabId = selectedTabId ?: return CurrentTabState.NotSelected + val tab = allTabs[tabId] ?: return CurrentTabState.NotSelected + return CurrentTabState.Selected( + tab, + activeSessions[tabId] ?: addNewSession(tab) + ) + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt index abc0886742..ea9d3b8e92 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/PageSnapshotBuilder.kt @@ -25,8 +25,8 @@ class PageSnapshotBuilder( return PageSnapshot( pageName = pageName, - pageIconPath = pagePicturePath, - pagePicturePath = pageIconPath + pageIconPath = pageIconPath, + pagePicturePath = pagePicturePath ) } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/TabsState.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/TabsState.kt new file mode 100644 index 0000000000..ec7e8a7ae7 --- /dev/null +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/TabsState.kt @@ -0,0 +1,11 @@ +package io.novafoundation.nova.feature_dapp_impl.utils.tabs.models + +class TabsState( + val tabs: List, + val selectedTab: CurrentTabState +) { + + fun stateId(): String { + return tabs.joinToString { it.id } + "_" + selectedTab.stateId() + } +} diff --git a/feature-dapp-impl/src/main/res/layout/fragment_browser_tabs.xml b/feature-dapp-impl/src/main/res/layout/fragment_browser_tabs.xml new file mode 100644 index 0000000000..56193db095 --- /dev/null +++ b/feature-dapp-impl/src/main/res/layout/fragment_browser_tabs.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml b/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml index 2d16b3ad71..5319c15dd8 100644 --- a/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml +++ b/feature-dapp-impl/src/main/res/layout/fragment_dapp_browser.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:background="@color/secondary_screen_background"> + android:background="@color/secondary_screen_background"> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt index e2c51faccc..56399837b5 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt @@ -38,6 +38,7 @@ import io.novafoundation.nova.feature_account_api.presenatation.actions.External import io.novafoundation.nova.feature_account_api.presenatation.mixin.addressInput.AddressInputMixinFactory import io.novafoundation.nova.feature_account_api.presenatation.mixin.identity.IdentityMixin import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectAddress.SelectAddressMixin +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_dapp_api.data.repository.DAppMetadataRepository import io.novafoundation.nova.feature_proxy_api.data.common.ProxyDepositCalculator import io.novafoundation.nova.feature_proxy_api.data.repository.GetProxyRepository @@ -67,6 +68,60 @@ import javax.inject.Named interface StakingFeatureDependencies { + val amountChooserMixinFactory: AmountChooserMixin.Factory + + val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory + + val walletUiUseCase: WalletUiUseCase + + val resourcesHintsMixinFactory: ResourcesHintsMixinFactory + + val selectedAccountUseCase: SelectedAccountUseCase + + val chainStateRepository: ChainStateRepository + + val sampledBlockTimeStorage: SampledBlockTimeStorage + + val timestampRepository: TimestampRepository + + val totalIssuanceRepository: TotalIssuanceRepository + + val onChainIdentityRepository: OnChainIdentityRepository + + val identityMixinFactory: IdentityMixin.Factory + + val storageStorageSharedRequestsBuilderFactory: StorageSharedRequestsBuilderFactory + + val stakingDashboardDao: StakingDashboardDao + + val dAppMetadataRepository: DAppMetadataRepository + + val runtimeCallsApi: MultiChainRuntimeCallsApi + + val arbitraryAssetUseCase: ArbitraryAssetUseCase + + val locksRepository: BalanceLocksRepository + + val externalBalanceDao: ExternalBalanceDao + + val partialRetriableMixinFactory: PartialRetriableMixin.Factory + + val proxyDepositCalculator: ProxyDepositCalculator + + val getProxyRepository: GetProxyRepository + + val descriptionBottomSheetLauncher: DescriptionBottomSheetLauncher + + val metaAccountGroupingInteractor: MetaAccountGroupingInteractor + + val selectAddressMixinFactory: SelectAddressMixin.Factory + + val proxyConstantsRepository: ProxyConstantsRepository + + val proxySyncService: ProxySyncService + + val dappRouter: DAppRouter + fun contextManager(): ContextManager fun computationalCache(): ComputationalCache @@ -138,58 +193,7 @@ interface StakingFeatureDependencies { fun addressInputMixinFactory(): AddressInputMixinFactory - val amountChooserMixinFactory: AmountChooserMixin.Factory - - val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory - @Caching fun cachingIconGenerator(): AddressIconGenerator - val walletUiUseCase: WalletUiUseCase - - val resourcesHintsMixinFactory: ResourcesHintsMixinFactory - - val selectedAccountUseCase: SelectedAccountUseCase - - val chainStateRepository: ChainStateRepository - - val sampledBlockTimeStorage: SampledBlockTimeStorage - - val timestampRepository: TimestampRepository - - val totalIssuanceRepository: TotalIssuanceRepository - - val onChainIdentityRepository: OnChainIdentityRepository - - val identityMixinFactory: IdentityMixin.Factory - - val storageStorageSharedRequestsBuilderFactory: StorageSharedRequestsBuilderFactory - - val stakingDashboardDao: StakingDashboardDao - - val dAppMetadataRepository: DAppMetadataRepository - - val runtimeCallsApi: MultiChainRuntimeCallsApi - - val arbitraryAssetUseCase: ArbitraryAssetUseCase - - val locksRepository: BalanceLocksRepository - - val externalBalanceDao: ExternalBalanceDao - - val partialRetriableMixinFactory: PartialRetriableMixin.Factory - - val proxyDepositCalculator: ProxyDepositCalculator - - val getProxyRepository: GetProxyRepository - - val descriptionBottomSheetLauncher: DescriptionBottomSheetLauncher - - val metaAccountGroupingInteractor: MetaAccountGroupingInteractor - - val selectAddressMixinFactory: SelectAddressMixin.Factory - - val proxyConstantsRepository: ProxyConstantsRepository - - val proxySyncService: ProxySyncService } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/StakingRouter.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/StakingRouter.kt index 04bea06c6d..00c06d0f89 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/StakingRouter.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/StakingRouter.kt @@ -80,8 +80,6 @@ interface StakingRouter { fun openRebag() - fun openDAppBrowser(url: String) - fun openStakingPeriods() fun openSetupStakingType() diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt index 4000d4c953..a7adec534b 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt @@ -2,6 +2,7 @@ package io.novafoundation.nova.feature_staking_impl.presentation.dashboard.more import io.novafoundation.nova.common.base.BaseViewModel import io.novafoundation.nova.common.domain.map +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_staking_api.domain.dashboard.StakingDashboardInteractor import io.novafoundation.nova.feature_staking_api.domain.dashboard.model.AggregatedStakingDashboardOption import io.novafoundation.nova.feature_staking_api.domain.dashboard.model.MoreStakingOptions @@ -25,9 +26,9 @@ class MoreStakingOptionsViewModel( private val interactor: StakingDashboardInteractor, private val startStakingRouter: StartMultiStakingRouter, private val dashboardRouter: StakingDashboardRouter, - private val router: StakingRouter, private val stakingSharedState: StakingSharedState, private val presentationMapper: StakingDashboardPresentationMapper, + private val dappRouter: DAppRouter ) : BaseViewModel() { init { @@ -53,7 +54,7 @@ class MoreStakingOptionsViewModel( } fun onBrowserStakingItemClicked(item: StakingDAppModel) = launch { - router.openDAppBrowser(item.url) + dappRouter.openDAppBrowser(item.url) } private fun syncDApps() = launch { diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt index c55b8cc876..414ee068bf 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt @@ -8,6 +8,7 @@ import dagger.Provides import dagger.multibindings.IntoMap import io.novafoundation.nova.common.di.viewmodel.ViewModelKey import io.novafoundation.nova.common.di.viewmodel.ViewModelModule +import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_staking_api.domain.dashboard.StakingDashboardInteractor import io.novafoundation.nova.feature_staking_impl.data.StakingSharedState import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter @@ -26,7 +27,7 @@ class MoreStakingOptionsModule { fun provideViewModel( interactor: StakingDashboardInteractor, dashboardRouter: StakingDashboardRouter, - router: StakingRouter, + dappRouter: DAppRouter, stakingSharedState: StakingSharedState, presentationMapper: StakingDashboardPresentationMapper, startMultiStakingRouter: StartMultiStakingRouter, @@ -35,7 +36,7 @@ class MoreStakingOptionsModule { interactor = interactor, startStakingRouter = startMultiStakingRouter, dashboardRouter = dashboardRouter, - router = router, + dappRouter = dappRouter, stakingSharedState = stakingSharedState, presentationMapper = presentationMapper ) From 0d2f74256b1853b369e3bd45cf557360a08ab9e4 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Thu, 21 Nov 2024 10:31:30 +0100 Subject: [PATCH 10/83] Fixed navigation issues --- .../navigators/dApp/DAppNavigator.kt | 19 ++++----- .../dApp/DAppSearchCommunicatorImpl.kt | 4 +- .../res/navigation/dapp_browser_graph.xml | 40 ++++++++++++++----- .../main/res/navigation/dapp_search_graph.xml | 1 + .../main/res/navigation/dapp_tabs_graph.xml | 8 ++-- .../main/res/navigation/import_nav_graph.xml | 2 +- .../main/res/navigation/main_nav_graph.xml | 10 ----- .../main/res/navigation/root_nav_graph.xml | 14 ++++++- .../nova/feature_dapp_api/DAppRouter.kt | 4 ++ .../browser/main/DAppBrowserViewModel.kt | 9 ++++- .../search/DAppSearchCommunicator.kt | 13 +++++- .../search/DAppSearchViewModel.kt | 31 ++++++++++---- .../presentation/search/SearchPayload.kt | 12 +++++- .../search/di/DAppSearchModule.kt | 7 +++- .../presentation/tab/BrowserTabRvItem.kt | 2 +- .../presentation/tab/BrowserTabsAdapter.kt | 2 +- .../presentation/tab/BrowserTabsFragment.kt | 3 +- .../presentation/tab/BrowserTabsViewModel.kt | 11 ++--- .../presentation/tab/di/BrowserTabsModule.kt | 5 ++- .../utils/tabs/BrowserTabPoolService.kt | 2 +- .../utils/tabs/models/PageSession.kt | 4 +- 21 files changed, 139 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt index 18eefc277f..3412ca6081 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppNavigator.kt @@ -31,19 +31,16 @@ class DAppNavigator( } override fun openDappSearch() { - val currentDestination = rootNavigationHolder.navController?.currentDestination - - val destinationId = when (currentDestination?.id) { - R.id.dappTabsFragment -> R.id.action_dappTabsFragment_to_dapp_search_graph - else -> R.id.action_mainFragment_to_dappSearchGraph - } - performNavigation( - actionId = destinationId, - args = DappSearchFragment.getBundle(SearchPayload(initialUrl = null)) + actionId = R.id.action_open_dappSearch, + args = DappSearchFragment.getBundle(SearchPayload(initialUrl = null, SearchPayload.Request.OPEN_NEW_URL)) ) } + override fun finishDappSearch() { + performNavigation(R.id.action_finish_dapp_search) + } + override fun openAddToFavourites(payload: AddToFavouritesPayload) = performNavigation( actionId = R.id.action_DAppBrowserFragment_to_addToFavouritesFragment, args = AddToFavouritesFragment.getBundle(payload) @@ -56,4 +53,8 @@ class DAppNavigator( override fun openTabs() = performNavigation( actionId = R.id.action_DAppBrowserFragment_to_browserTabsFragment ) + + override fun finishTabs() = performNavigation( + actionId = R.id.action_finish_tabs_fragment + ) } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt index 661c83d21a..03ff93314e 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/dApp/DAppSearchCommunicatorImpl.kt @@ -11,8 +11,10 @@ import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayloa class DAppSearchCommunicatorImpl(navigationHolder: RootNavigationHolder) : NavStackInterScreenCommunicator(navigationHolder), DAppSearchCommunicator { + override fun openRequest(request: SearchPayload) { super.openRequest(request) - navController.navigate(R.id.action_DAppBrowserFragment_to_dappSearchFragment, DappSearchFragment.getBundle(request)) + + navController.navigate(R.id.action_open_dappSearch_from_browser, DappSearchFragment.getBundle(request)) } } diff --git a/app/src/main/res/navigation/dapp_browser_graph.xml b/app/src/main/res/navigation/dapp_browser_graph.xml index f870fd3a33..640d80c4ad 100644 --- a/app/src/main/res/navigation/dapp_browser_graph.xml +++ b/app/src/main/res/navigation/dapp_browser_graph.xml @@ -22,7 +22,7 @@ app:popUpToInclusive="true" /> - - + tools:layout="@layout/fragment_browser_tabs"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/dapp_search_graph.xml b/app/src/main/res/navigation/dapp_search_graph.xml index 821e15f1af..611d680c6f 100644 --- a/app/src/main/res/navigation/dapp_search_graph.xml +++ b/app/src/main/res/navigation/dapp_search_graph.xml @@ -20,6 +20,7 @@ app:popExitAnim="@anim/fragment_slide_out" app:popUpTo="@id/dapp_search_graph" app:popUpToInclusive="true" /> + diff --git a/app/src/main/res/navigation/dapp_tabs_graph.xml b/app/src/main/res/navigation/dapp_tabs_graph.xml index b721af6707..b46bcb4a2d 100644 --- a/app/src/main/res/navigation/dapp_tabs_graph.xml +++ b/app/src/main/res/navigation/dapp_tabs_graph.xml @@ -22,15 +22,15 @@ app:popUpToInclusive="true" /> + app:popExitAnim="@anim/fragment_close_exit" + app:popUpTo="@id/dapp_tabs_graph" + app:popUpToInclusive="true" /> - \ No newline at end of file diff --git a/app/src/main/res/navigation/import_nav_graph.xml b/app/src/main/res/navigation/import_nav_graph.xml index e29a1451d8..e6072a6d2f 100644 --- a/app/src/main/res/navigation/import_nav_graph.xml +++ b/app/src/main/res/navigation/import_nav_graph.xml @@ -18,7 +18,7 @@ app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" app:popExitAnim="@anim/fragment_close_exit" - app:popUpTo="@id/main_root_nav_graph" + app:popUpTo="@id/root_nav_graph" app:popUpToInclusive="true"> diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index cc278c767e..94e9a496bc 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -365,14 +365,6 @@ app:popEnterAnim="@anim/fragment_close_enter" app:popExitAnim="@anim/fragment_close_exit" /> - - - - diff --git a/app/src/main/res/navigation/root_nav_graph.xml b/app/src/main/res/navigation/root_nav_graph.xml index 15510a42cb..c8b8daca90 100644 --- a/app/src/main/res/navigation/root_nav_graph.xml +++ b/app/src/main/res/navigation/root_nav_graph.xml @@ -2,7 +2,7 @@ @@ -13,6 +13,8 @@ + + + + () .shareInBackground() init { dAppSearchRequester.responseFlow - .onEach { it.newUrl?.let(::forceLoad) } + .filterIsInstance() + .onEach { forceLoad(it.url) } .launchIn(this) watchDangerousWebsites() @@ -174,7 +179,7 @@ class DAppBrowserViewModel( fun openSearch() = launch { val currentPage = currentPage.first() - dAppSearchRequester.openRequest(SearchPayload(initialUrl = currentPage.url)) + dAppSearchRequester.openRequest(SearchPayload(initialUrl = currentPage.url, SearchPayload.Request.GO_TO_URL)) } fun onMoreClicked() { diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchCommunicator.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchCommunicator.kt index 30d5db3c11..0662d91058 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchCommunicator.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchCommunicator.kt @@ -12,6 +12,15 @@ interface DAppSearchResponder : InterScreenResponder interface DAppSearchCommunicator : DAppSearchRequester, DAppSearchResponder { - @Parcelize - class Response(val newUrl: String?) : Parcelable + sealed interface Response : Parcelable { + + @Parcelize + object TabChanged : Response + + @Parcelize + class NewUrl(val url: String) : Response + + @Parcelize + object Cancel : Response + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt index 7c57ac3807..5e4f056653 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/DAppSearchViewModel.kt @@ -18,6 +18,7 @@ import io.novafoundation.nova.feature_dapp_impl.domain.search.DappSearchGroup import io.novafoundation.nova.feature_dapp_impl.domain.search.DappSearchResult import io.novafoundation.nova.feature_dapp_impl.domain.search.SearchDappInteractor import io.novafoundation.nova.feature_dapp_impl.presentation.search.model.DappSearchModel +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.mapLatest @@ -31,7 +32,8 @@ class DAppSearchViewModel( private val payload: SearchPayload, private val dAppSearchResponder: DAppSearchResponder, private val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, - private val appLinksProvider: AppLinksProvider + private val appLinksProvider: AppLinksProvider, + private val browserTabPoolService: BrowserTabPoolService ) : BaseViewModel() { val dAppNotInCatalogWarning = actionAwaitableMixinFactory.confirmingAction() @@ -59,7 +61,7 @@ class DAppSearchViewModel( fun cancelClicked() { if (shouldReportResult()) { - dAppSearchResponder.respond(DAppSearchCommunicator.Response(newUrl = null)) + dAppSearchResponder.respond(DAppSearchCommunicator.Response.Cancel) } router.back() @@ -110,14 +112,27 @@ class DAppSearchViewModel( dAppNotInCatalogWarning.awaitAction(DappUnknownWarningModel(appLinksProvider.email)) } - if (shouldReportResult()) { - dAppSearchResponder.respond(DAppSearchCommunicator.Response(newUrl)) - router.back() - } else { - router.openDAppBrowser(newUrl) + when (payload.request) { + SearchPayload.Request.CREATE_NEW_TAB -> { + browserTabPoolService.createNewTabAsCurrentTab(newUrl) + dAppSearchResponder.respond(DAppSearchCommunicator.Response.TabChanged) + router.finishDappSearch() + } + + SearchPayload.Request.GO_TO_URL -> { + dAppSearchResponder.respond(DAppSearchCommunicator.Response.NewUrl(newUrl)) + router.finishDappSearch() + } + + SearchPayload.Request.OPEN_NEW_URL -> router.openDAppBrowser(newUrl) } } } - private fun shouldReportResult() = payload.initialUrl != null + private fun shouldReportResult() = when (payload.request) { + SearchPayload.Request.CREATE_NEW_TAB, + SearchPayload.Request.GO_TO_URL -> true + + SearchPayload.Request.OPEN_NEW_URL -> false + } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/SearchPayload.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/SearchPayload.kt index 0b65ecc2fe..78a2eec657 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/SearchPayload.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/SearchPayload.kt @@ -4,4 +4,14 @@ import android.os.Parcelable import kotlinx.android.parcel.Parcelize @Parcelize -class SearchPayload(val initialUrl: String?) : Parcelable +class SearchPayload( + val initialUrl: String?, + val request: Request +) : Parcelable { + + enum class Request { + CREATE_NEW_TAB, + GO_TO_URL, + OPEN_NEW_URL, + } +} diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt index c740f91f26..776e3ccbc4 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/search/di/DAppSearchModule.kt @@ -19,6 +19,7 @@ import io.novafoundation.nova.feature_dapp_impl.domain.search.SearchDappInteract import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchViewModel import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload +import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService @Module(includes = [ViewModelModule::class]) class DAppSearchModule { @@ -45,7 +46,8 @@ class DAppSearchModule { searchResponder: DAppSearchCommunicator, payload: SearchPayload, actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, - appLinksProvider: AppLinksProvider + appLinksProvider: AppLinksProvider, + browserTabPoolService: BrowserTabPoolService ): ViewModel { return DAppSearchViewModel( router = router, @@ -54,7 +56,8 @@ class DAppSearchModule { dAppSearchResponder = searchResponder, payload = payload, actionAwaitableMixinFactory = actionAwaitableMixinFactory, - appLinksProvider = appLinksProvider + appLinksProvider = appLinksProvider, + browserTabPoolService = browserTabPoolService ) } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt index a74a6da003..576b7674f8 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabRvItem.kt @@ -1,6 +1,6 @@ package io.novafoundation.nova.feature_dapp_impl.presentation.tab -class BrowserTabRvItem( +data class BrowserTabRvItem( val tabId: String, val tabName: String?, val tabFaviconPath: String?, diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt index 1232463c2e..1518911fd6 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt @@ -47,7 +47,7 @@ private object DiffCallback : DiffUtil.ItemCallback() { } override fun areContentsTheSame(oldItem: BrowserTabRvItem, newItem: BrowserTabRvItem): Boolean { - return true + return oldItem == newItem } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt index 2d37dec4d7..5bfbe3569d 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt @@ -39,6 +39,8 @@ class BrowserTabsFragment : BaseFragment(), BrowserTabsAda override fun initViews() { requireView().applyStatusBarInsets() + onBackPressed { viewModel.done() } + browserTabsList.layoutManager = GridLayoutManager(requireContext(), 2) browserTabsList.adapter = adapter @@ -70,7 +72,6 @@ class BrowserTabsFragment : BaseFragment(), BrowserTabsAda viewModel.closeTab(item.tabId) } - private fun setupCloseAllTabsDialogue() { viewModel.closeAllTabsConfirmation.awaitableActionLiveData.observeEvent { event -> warningDialog( diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt index d820003444..3686655d4c 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt @@ -6,8 +6,9 @@ import io.novafoundation.nova.common.mixin.actionAwaitable.awaitAction import io.novafoundation.nova.common.mixin.actionAwaitable.confirmingAction import io.novafoundation.nova.common.utils.mapList import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchRequester +import io.novafoundation.nova.feature_dapp_impl.presentation.search.SearchPayload import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -15,6 +16,7 @@ class BrowserTabsViewModel( private val router: DAppRouter, private val browserTabPoolService: BrowserTabPoolService, private val actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, + private val dAppSearchRequester: DAppSearchRequester, ) : BaseViewModel() { val closeAllTabsConfirmation = actionAwaitableMixinFactory.confirmingAction() @@ -31,9 +33,7 @@ class BrowserTabsViewModel( } fun openTab(tabId: String) = launch { - val tab = browserTabPoolService.tabStateFlow.first().tabs.first { it.id == tabId } browserTabPoolService.selectTab(tabId) - router.openDAppBrowser(tab.currentUrl) } fun closeTab(tabId: String) = launch { @@ -44,13 +44,14 @@ class BrowserTabsViewModel( closeAllTabsConfirmation.awaitAction() browserTabPoolService.removeAllTabs() + router.finishTabs() } fun addTab() { - router.openDappSearch() + dAppSearchRequester.openRequest(SearchPayload(initialUrl = null, SearchPayload.Request.CREATE_NEW_TAB)) } fun done() { - router.back() + router.finishTabs() } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt index d8e88d5063..8e016ccae9 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/di/BrowserTabsModule.kt @@ -10,6 +10,7 @@ import io.novafoundation.nova.common.di.viewmodel.ViewModelKey import io.novafoundation.nova.common.di.viewmodel.ViewModelModule import io.novafoundation.nova.common.mixin.actionAwaitable.ActionAwaitableMixin import io.novafoundation.nova.feature_dapp_api.DAppRouter +import io.novafoundation.nova.feature_dapp_impl.presentation.search.DAppSearchCommunicator import io.novafoundation.nova.feature_dapp_impl.presentation.tab.BrowserTabsViewModel import io.novafoundation.nova.feature_dapp_impl.utils.tabs.BrowserTabPoolService @@ -28,11 +29,13 @@ class BrowserTabsModule { router: DAppRouter, browserTabPoolService: BrowserTabPoolService, actionAwaitableMixinFactory: ActionAwaitableMixin.Factory, + searchRequester: DAppSearchCommunicator, ): ViewModel { return BrowserTabsViewModel( router = router, browserTabPoolService = browserTabPoolService, - actionAwaitableMixinFactory = actionAwaitableMixinFactory + actionAwaitableMixinFactory = actionAwaitableMixinFactory, + dAppSearchRequester = searchRequester ) } } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 54fcc7116e..2d582d5d90 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -57,7 +57,7 @@ class RealBrowserTabPoolService( tabs = allTabs.values.toList(), selectedTab = currentTabState(selectedTabId, allTabs) ) - }.distinctUntilChangedBy { it.stateId() } + } override fun selectTab(tabId: String?) { val oldTabId = selectedTabIdFlow.value diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt index 2d71b2d924..f6851b06d8 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/models/PageSession.kt @@ -60,12 +60,12 @@ class PageSession( chromeClient: Web3ChromeClient, pageCallback: PageCallback ) { - webView.webChromeClient = chromeClient + _webView?.webChromeClient = chromeClient this.nestedPageCallback = pageCallback } fun detachSession() { - webView.webChromeClient = null + _webView?.webChromeClient = null nestedPageCallback = null } From 3b64cb7d7fbbacc3d4c7454ea41e0e0118511089 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Thu, 21 Nov 2024 11:40:59 +0100 Subject: [PATCH 11/83] Run ktlint --- .../nova/app/root/navigation/Ext.kt | 37 ++++++++++--------- .../NavStackInterScreenCommunicator.kt | 1 - .../root/navigation/navigators/Navigator.kt | 1 - .../account/SelectWalletCommunicatorImpl.kt | 1 - .../ExternalSignCommunicatorImpl.kt | 1 - .../relaychain/RelayStakingNavigator.kt | 2 - .../navigators/swap/SwapNavigator.kt | 1 - .../navigators/versions/VersionsNavigator.kt | 1 - .../app/root/presentation/RootActivity.kt | 2 +- .../splitScreen/SplitScreenFragment.kt | 2 - .../splitScreen/SplitScreenViewModel.kt | 4 +- .../di/SplitScreenFragmentComponent.kt | 2 - .../res/navigation/dapp_browser_graph.xml | 3 +- .../presentation/tab/BrowserTabsAdapter.kt | 4 +- .../presentation/tab/BrowserTabsFragment.kt | 2 +- .../presentation/tab/BrowserTabsViewModel.kt | 1 + .../utils/tabs/BrowserTabPoolService.kt | 1 - .../di/StakingFeatureDependencies.kt | 1 - .../more/MoreStakingOptionsViewModel.kt | 1 - .../more/di/MoreStakingOptionsModule.kt | 1 - 20 files changed, 28 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt index 5d75e64565..c85a26b8d4 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt @@ -26,23 +26,26 @@ fun NavController.getBackStackEntryBefore(@IdRes id: Int): NavBackStackEntry { } fun AppCompatActivity.setupBackNavigation(mainNavController: NavController, dAppNavController: NavController) { - onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - // Firstly handle dapp back navigation - if (dAppNavController.popBackStack()) { - // If back navigation is handled - return - return + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + // Firstly handle dapp back navigation + if (dAppNavController.popBackStack()) { + // If back navigation is handled - return + return + } + + // Secondly handle main back navigation + if (mainNavController.popBackStack()) { + // If back navigation is handled - return + return + } + + isEnabled = false + onBackPressedDispatcher.onBackPressed() + isEnabled = true } - - // Secondly handle main back navigation - if (mainNavController.popBackStack()) { - // If back navigation is handled - return - return - } - - isEnabled = false - onBackPressedDispatcher.onBackPressed() - isEnabled = true } - }) + ) } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt index a64337d470..ba5c1dac1a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/NavStackInterScreenCommunicator.kt @@ -5,7 +5,6 @@ import androidx.annotation.CallSuper import androidx.lifecycle.asFlow import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.navigation.InterScreenCommunicator import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt index e846c7c845..151fa909eb 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt @@ -157,7 +157,6 @@ class Navigator( } is BackDelayedNavigation -> { - // TODO: need to pass a controller rootNavController?.popBackStack() } diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt index ff77fa7bdd..8196afdd26 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/account/SelectWalletCommunicatorImpl.kt @@ -2,7 +2,6 @@ package io.novafoundation.nova.app.root.navigation.navigators.account import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.NavStackInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectWallet.SelectWalletCommunicator import io.novafoundation.nova.feature_account_api.presenatation.mixin.selectWallet.SelectWalletCommunicator.Payload diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt index f29cbf88f9..860499fbec 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/externalSign/ExternalSignCommunicatorImpl.kt @@ -2,7 +2,6 @@ package io.novafoundation.nova.app.root.navigation.navigators.externalSign import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.FlowInterScreenCommunicator -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate import io.novafoundation.nova.common.utils.sequrity.awaitInteractionAllowed diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt index 74b4bdcd4d..4b0a826a8e 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/staking/relaychain/RelayStakingNavigator.kt @@ -1,11 +1,9 @@ package io.novafoundation.nova.app.root.navigation.navigators.staking.relaychain import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator import io.novafoundation.nova.app.root.navigation.navigators.Navigator -import io.novafoundation.nova.feature_dapp_impl.presentation.browser.main.DAppBrowserFragment 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 diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt index 55018efa81..d4dfaac4e7 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/swap/SwapNavigator.kt @@ -2,7 +2,6 @@ package io.novafoundation.nova.app.root.navigation.navigators.swap import io.novafoundation.nova.app.R import io.novafoundation.nova.app.root.navigation.navigators.BaseNavigator -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.app.root.navigation.navigators.Navigator import io.novafoundation.nova.feature_assets.presentation.send.amount.SendPayload diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt index c3dd1d6a1a..f0c26be136 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/versions/VersionsNavigator.kt @@ -1,7 +1,6 @@ package io.novafoundation.nova.app.root.navigation.navigators.versions import io.novafoundation.nova.app.R -import io.novafoundation.nova.app.root.navigation.holders.MainNavigationHolder import io.novafoundation.nova.app.root.navigation.holders.NavigationHolder import io.novafoundation.nova.common.utils.showBrowser import io.novafoundation.nova.feature_versions_api.presentation.VersionsRouter diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt index 907ea6e5f5..23576af62a 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt @@ -56,7 +56,7 @@ class RootActivity : BaseActivity(), SplashBackgroundHolder { super.onCreate(savedInstanceState) rootNavigationHolder.attach(rootNavController) - //setupBackNavigation(mainNavController, dappNavController) + // setupBackNavigation(mainNavController, dappNavController) contextManager.attachActivity(this) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt index c1add1c6b9..6a8f79b8ed 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenFragment.kt @@ -43,11 +43,9 @@ class SplitScreenFragment : BaseFragment() { } override fun initViews() { - } override fun subscribe(viewModel: SplitScreenViewModel) { - } private val mainNavController: NavController by lazy { diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt index c2bcb6f09e..dff814183f 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/SplitScreenViewModel.kt @@ -2,6 +2,4 @@ package io.novafoundation.nova.app.root.presentation.splitScreen import io.novafoundation.nova.common.base.BaseViewModel -class SplitScreenViewModel() : BaseViewModel() { - -} +class SplitScreenViewModel() : BaseViewModel() diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt index ff0557627e..32257b4230 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/splitScreen/di/SplitScreenFragmentComponent.kt @@ -1,10 +1,8 @@ package io.novafoundation.nova.app.root.presentation.splitScreen.di import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentActivity import dagger.BindsInstance import dagger.Subcomponent -import io.novafoundation.nova.app.root.presentation.main.MainFragment import io.novafoundation.nova.app.root.presentation.splitScreen.SplitScreenFragment import io.novafoundation.nova.common.di.scope.ScreenScope diff --git a/app/src/main/res/navigation/dapp_browser_graph.xml b/app/src/main/res/navigation/dapp_browser_graph.xml index 640d80c4ad..768dcc0f6d 100644 --- a/app/src/main/res/navigation/dapp_browser_graph.xml +++ b/app/src/main/res/navigation/dapp_browser_graph.xml @@ -43,7 +43,7 @@ app:enterAnim="@anim/fragment_open_enter" app:exitAnim="@anim/fragment_open_exit" app:popEnterAnim="@anim/fragment_close_enter" - app:popExitAnim="@anim/fragment_slide_out" /> + app:popExitAnim="@anim/fragment_close_exit" /> diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt index 1518911fd6..fb3e39a8d0 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsAdapter.kt @@ -26,7 +26,7 @@ class BrowserTabsAdapter( interface Handler { - fun tabClicked(item: BrowserTabRvItem) + fun tabClicked(item: BrowserTabRvItem, view: View) fun tabCloseClicked(item: BrowserTabRvItem) } @@ -58,7 +58,7 @@ class BrowserTabViewHolder( ) : BaseViewHolder(view) { fun bind(item: BrowserTabRvItem) = with(itemView) { - browserTabCard.setOnClickListener { itemHandler.tabClicked(item) } + browserTabCard.setOnClickListener { itemHandler.tabClicked(item, browserTabScreenshot) } browserTabClose.setOnClickListener { itemHandler.tabCloseClicked(item) } browserTabScreenshot.load(item.tabScreenshotPath?.asFile(), imageLoader) { transformations(TopCropTransformation()) diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt index 5bfbe3569d..517d543842 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsFragment.kt @@ -64,7 +64,7 @@ class BrowserTabsFragment : BaseFragment(), BrowserTabsAda } } - override fun tabClicked(item: BrowserTabRvItem) { + override fun tabClicked(item: BrowserTabRvItem, view: View) { viewModel.openTab(item.tabId) } diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt index 3686655d4c..3951940598 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/tab/BrowserTabsViewModel.kt @@ -34,6 +34,7 @@ class BrowserTabsViewModel( fun openTab(tabId: String) = launch { browserTabPoolService.selectTab(tabId) + router.back() } fun closeTab(tabId: String) = launch { diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt index 2d582d5d90..bd09d813ee 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/utils/tabs/BrowserTabPoolService.kt @@ -12,7 +12,6 @@ import java.util.* import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt index 56399837b5..fee5f07403 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/di/StakingFeatureDependencies.kt @@ -195,5 +195,4 @@ interface StakingFeatureDependencies { @Caching fun cachingIconGenerator(): AddressIconGenerator - } diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt index a7adec534b..f0f84aae58 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/MoreStakingOptionsViewModel.kt @@ -10,7 +10,6 @@ import io.novafoundation.nova.feature_staking_api.domain.dashboard.model.Staking import io.novafoundation.nova.feature_staking_api.domain.dashboard.model.allStakingTypes import io.novafoundation.nova.feature_staking_impl.data.StakingSharedState import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter -import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.StartMultiStakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.common.StakingDashboardPresentationMapper import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.more.model.MoreStakingOptionsModel diff --git a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt index 414ee068bf..7e47a9a2ce 100644 --- a/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt +++ b/feature-staking-impl/src/main/java/io/novafoundation/nova/feature_staking_impl/presentation/dashboard/more/di/MoreStakingOptionsModule.kt @@ -12,7 +12,6 @@ import io.novafoundation.nova.feature_dapp_api.DAppRouter import io.novafoundation.nova.feature_staking_api.domain.dashboard.StakingDashboardInteractor import io.novafoundation.nova.feature_staking_impl.data.StakingSharedState import io.novafoundation.nova.feature_staking_impl.presentation.StakingDashboardRouter -import io.novafoundation.nova.feature_staking_impl.presentation.StakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.StartMultiStakingRouter import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.common.StakingDashboardPresentationMapper import io.novafoundation.nova.feature_staking_impl.presentation.dashboard.more.MoreStakingOptionsViewModel From eda0dacac21f02b881bd5145871ecc13fc1bc219 Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Thu, 21 Nov 2024 12:08:37 +0100 Subject: [PATCH 12/83] Clean code --- .../nova/app/root/navigation/Ext.kt | 27 ------------------- .../app/root/presentation/RootActivity.kt | 1 - .../main/res/layout/fragment_split_screen.xml | 3 +-- .../utils/tabs/BrowserTabPoolService.kt | 3 ++- 4 files changed, 3 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt index c85a26b8d4..b0384d2f05 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/Ext.kt @@ -1,9 +1,7 @@ package io.novafoundation.nova.app.root.navigation import android.annotation.SuppressLint -import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes -import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController import androidx.navigation.NavGraph @@ -24,28 +22,3 @@ fun NavController.getBackStackEntryBefore(@IdRes id: Int): NavBackStackEntry { return backStack[previousIndex] } - -fun AppCompatActivity.setupBackNavigation(mainNavController: NavController, dAppNavController: NavController) { - onBackPressedDispatcher.addCallback( - this, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - // Firstly handle dapp back navigation - if (dAppNavController.popBackStack()) { - // If back navigation is handled - return - return - } - - // Secondly handle main back navigation - if (mainNavController.popBackStack()) { - // If back navigation is handled - return - return - } - - isEnabled = false - onBackPressedDispatcher.onBackPressed() - isEnabled = true - } - } - ) -} diff --git a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt index 23576af62a..8b54a4de3f 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/presentation/RootActivity.kt @@ -56,7 +56,6 @@ class RootActivity : BaseActivity(), SplashBackgroundHolder { super.onCreate(savedInstanceState) rootNavigationHolder.attach(rootNavController) - // setupBackNavigation(mainNavController, dappNavController) contextManager.attachActivity(this) diff --git a/app/src/main/res/layout/fragment_split_screen.xml b/app/src/main/res/layout/fragment_split_screen.xml index 9652493590..e5bd526226 100644 --- a/app/src/main/res/layout/fragment_split_screen.xml +++ b/app/src/main/res/layout/fragment_split_screen.xml @@ -2,8 +2,7 @@ + android:layout_height="match_parent"> Date: Thu, 21 Nov 2024 12:29:16 +0100 Subject: [PATCH 13/83] Update DAppBrowserFragment.kt --- .../presentation/browser/main/DAppBrowserFragment.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt index 698c4389c5..b433280a08 100644 --- a/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt +++ b/feature-dapp-impl/src/main/java/io/novafoundation/nova/feature_dapp_impl/presentation/browser/main/DAppBrowserFragment.kt @@ -201,6 +201,7 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS webView.loadUrl(session.startUrl) } + clearProgress() session.attachSession(createChromeClient(), this) webViewHolder.set(session.webView) webViewClient = session.webViewClient @@ -209,6 +210,10 @@ class DAppBrowserFragment : BaseFragment(), OptionsBottomS dappBrowserWebViewContainer.addView(session.webView) } + private fun clearProgress() { + dappBrowserProgress.progress = 0 + } + private fun createChromeClient() = Web3ChromeClient(fileChooser, dappBrowserProgress) private fun showCloseConfirmation(pendingConfirmation: DappPendingConfirmation<*>) { From 1dc6cc35e7a99f636eaa666f779e834b22c6475c Mon Sep 17 00:00:00 2001 From: antonijzelinskij Date: Fri, 22 Nov 2024 13:57:17 +0100 Subject: [PATCH 14/83] New DApp UI --- .../root/navigation/navigators/Navigator.kt | 14 +-- .../res/drawable/bg_browser_tabs_outline.xml | 8 ++ .../res/drawable/ic_favorite_heart_filled.xml | 14 +-- .../drawable/ic_favorite_heart_filled_20.xml | 9 ++ .../drawable/ic_favorite_heart_outline.xml | 12 +-- .../drawable/ic_favorite_heart_outline_20.xml | 10 +++ common/src/main/res/drawable/ic_siri_paw.xml | 25 ++++++ common/src/main/res/values/colors.xml | 1 + common/src/main/res/values/styles.xml | 5 ++ .../src/main/res/layout/view_dapp.xml | 2 +- .../browser/main/DAppBrowserFragment.kt | 50 ++++++----- .../browser/main/DAppBrowserViewModel.kt | 34 +++---- .../browser/main/DappPendingConfirmation.kt | 2 - .../browser/main/view/AddressBarView.kt | 14 ++- .../browser/options/DAppOptionsPayload.kt | 5 +- .../options/OptionsBottomSheetDialog.kt | 14 --- .../presentation/common/DappListAdapter.kt | 4 +- .../search/DAppSearchViewModel.kt | 2 +- .../main/res/layout/fragment_dapp_browser.xml | 88 +++++++++++++------ 19 files changed, 201 insertions(+), 112 deletions(-) create mode 100644 common/src/main/res/drawable/bg_browser_tabs_outline.xml create mode 100644 common/src/main/res/drawable/ic_favorite_heart_filled_20.xml create mode 100644 common/src/main/res/drawable/ic_favorite_heart_outline_20.xml create mode 100644 common/src/main/res/drawable/ic_siri_paw.xml diff --git a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt index 151fa909eb..1b1dd326c6 100644 --- a/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt +++ b/app/src/main/java/io/novafoundation/nova/app/root/navigation/navigators/Navigator.kt @@ -186,7 +186,7 @@ class Navigator( override fun openConfirmMnemonicOnCreate(confirmMnemonicPayload: ConfirmMnemonicPayload) { val bundle = ConfirmMnemonicFragment.getBundle(confirmMnemonicPayload) - mainNavController?.navigate( + rootNavController?.navigate( R.id.action_backupMnemonicFragment_to_confirmMnemonicFragment, bundle ) @@ -199,7 +199,7 @@ class Navigator( R.id.splashFragment -> R.id.action_splashFragment_to_import_nav_graph else -> R.id.action_import_nav_graph } - mainNavController?.navigate(actionId, ImportAccountFragment.getBundle(payload)) + rootNavController?.navigate(actionId, ImportAccountFragment.getBundle(payload)) } override fun openMnemonicScreen(accountName: String?, addAccountPayload: AddAccountPayload) { @@ -211,7 +211,7 @@ class Navigator( } val payload = BackupMnemonicPayload.Create(accountName, addAccountPayload) - mainNavController?.navigate(destination, BackupMnemonicFragment.getBundle(payload)) + rootNavController?.navigate(destination, BackupMnemonicFragment.getBundle(payload)) } override fun openContribute(payload: ContributePayload) { @@ -641,7 +641,7 @@ class Navigator( } override fun openCreateWatchWallet() { - mainNavController?.navigate(R.id.action_importWalletOptionsFragment_to_createWatchWalletFragment) + rootNavController?.navigate(R.id.action_importWalletOptionsFragment_to_createWatchWalletFragment) } override fun openStartImportParitySigner() { @@ -653,9 +653,9 @@ class Navigator( } override fun openImportOptionsScreen() { - when (mainNavController?.currentDestination?.id) { - R.id.welcomeFragment -> mainNavController?.navigate(R.id.action_welcomeFragment_to_importWalletOptionsFragment) - else -> mainNavController?.navigate(R.id.action_importWalletOptionsFragment) + when (rootNavController?.currentDestination?.id) { + R.id.welcomeFragment -> rootNavController?.navigate(R.id.action_welcomeFragment_to_importWalletOptionsFragment) + else -> rootNavController?.navigate(R.id.action_importWalletOptionsFragment) } } diff --git a/common/src/main/res/drawable/bg_browser_tabs_outline.xml b/common/src/main/res/drawable/bg_browser_tabs_outline.xml new file mode 100644 index 0000000000..c535992186 --- /dev/null +++ b/common/src/main/res/drawable/bg_browser_tabs_outline.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/common/src/main/res/drawable/ic_favorite_heart_filled.xml b/common/src/main/res/drawable/ic_favorite_heart_filled.xml index f6c6e297a0..674d63afa6 100644 --- a/common/src/main/res/drawable/ic_favorite_heart_filled.xml +++ b/common/src/main/res/drawable/ic_favorite_heart_filled.xml @@ -1,9 +1,9 @@ - + android:width="25dp" + android:height="24dp" + android:viewportWidth="25" + android:viewportHeight="24"> + diff --git a/common/src/main/res/drawable/ic_favorite_heart_filled_20.xml b/common/src/main/res/drawable/ic_favorite_heart_filled_20.xml new file mode 100644 index 0000000000..f6c6e297a0 --- /dev/null +++ b/common/src/main/res/drawable/ic_favorite_heart_filled_20.xml @@ -0,0 +1,9 @@ + + + diff --git a/common/src/main/res/drawable/ic_favorite_heart_outline.xml b/common/src/main/res/drawable/ic_favorite_heart_outline.xml index c6281aa2d0..2ff9b2f831 100644 --- a/common/src/main/res/drawable/ic_favorite_heart_outline.xml +++ b/common/src/main/res/drawable/ic_favorite_heart_outline.xml @@ -1,10 +1,10 @@ + android:width="25dp" + android:height="24dp" + android:viewportWidth="25" + android:viewportHeight="24"> diff --git a/common/src/main/res/drawable/ic_favorite_heart_outline_20.xml b/common/src/main/res/drawable/ic_favorite_heart_outline_20.xml new file mode 100644 index 0000000000..c6281aa2d0 --- /dev/null +++ b/common/src/main/res/drawable/ic_favorite_heart_outline_20.xml @@ -0,0 +1,10 @@ + + + diff --git a/common/src/main/res/drawable/ic_siri_paw.xml b/common/src/main/res/drawable/ic_siri_paw.xml new file mode 100644 index 0000000000..1331cb199a --- /dev/null +++ b/common/src/main/res/drawable/ic_siri_paw.xml @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml index 409cd3792e..c47b92432d 100644 --- a/common/src/main/res/values/colors.xml +++ b/common/src/main/res/values/colors.xml @@ -86,6 +86,7 @@ #1FEDCE36 #1F2AB0F2 #66151D27 + #CC151D27 #0F111A #7A08090E #3D999EC7 diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml index 63d87457d5..92437f1f75 100644 --- a/common/src/main/res/values/styles.xml +++ b/common/src/main/res/values/styles.xml @@ -64,6 +64,11 @@ 11sp + +