Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.anytypeio.anytype.di.feature

import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.core_utils.di.scope.PerDialog
import com.anytypeio.anytype.core_utils.di.scope.PerScreen
import com.anytypeio.anytype.domain.account.AccountStatusChannel
import com.anytypeio.anytype.domain.account.AwaitAccountStartManager
Expand All @@ -14,6 +15,8 @@ import com.anytypeio.anytype.domain.config.ConfigStorage
import com.anytypeio.anytype.domain.config.UserSettingsRepository
import com.anytypeio.anytype.domain.device.PathProvider
import com.anytypeio.anytype.domain.misc.LocaleProvider
import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver
import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer
import com.anytypeio.anytype.domain.notifications.SystemNotificationService
import com.anytypeio.anytype.domain.platform.InitialParamsProvider
import com.anytypeio.anytype.domain.subscriptions.GlobalSubscriptionManager
Expand All @@ -22,6 +25,7 @@ import com.anytypeio.anytype.domain.wallpaper.ObserveWallpaper
import com.anytypeio.anytype.domain.wallpaper.RestoreWallpaper
import com.anytypeio.anytype.domain.wallpaper.WallpaperStore
import com.anytypeio.anytype.domain.workspace.SpaceManager
import com.anytypeio.anytype.other.DefaultSpaceInviteResolver
import com.anytypeio.anytype.presentation.main.MainViewModelFactory
import com.anytypeio.anytype.presentation.membership.provider.MembershipProvider
import com.anytypeio.anytype.presentation.navigation.DeepLinkToObjectDelegate
Expand Down Expand Up @@ -70,7 +74,8 @@ object MainEntryModule {
deepLinkToObjectDelegate: DeepLinkToObjectDelegate,
awaitAccountStartManager: AwaitAccountStartManager,
membershipProvider: MembershipProvider,
globalSubscriptionManager: GlobalSubscriptionManager
globalSubscriptionManager: GlobalSubscriptionManager,
spaceInviteResolver: SpaceInviteResolver
): MainViewModelFactory = MainViewModelFactory(
resumeAccount = resumeAccount,
analytics = analytics,
Expand All @@ -87,7 +92,8 @@ object MainEntryModule {
deepLinkToObjectDelegate = deepLinkToObjectDelegate,
awaitAccountStartManager = awaitAccountStartManager,
membershipProvider = membershipProvider,
globalSubscriptionManager = globalSubscriptionManager
globalSubscriptionManager = globalSubscriptionManager,
spaceInviteResolver = spaceInviteResolver
)

@JvmStatic
Expand Down Expand Up @@ -192,4 +198,9 @@ object MainEntryModule {
fun provideDeepLinkToObjectDelegate(
default: DeepLinkToObjectDelegate.Default
): DeepLinkToObjectDelegate = default

@JvmStatic
@PerScreen
@Provides
fun provideSpaceInviteResolver(): SpaceInviteResolver = DefaultSpaceInviteResolver
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import com.anytypeio.anytype.domain.dashboard.interactor.SetObjectListIsFavorite
import com.anytypeio.anytype.domain.misc.DateProvider
import com.anytypeio.anytype.domain.misc.DeepLinkResolver
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.multiplayer.GetSpaceInviteLink
import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer
import com.anytypeio.anytype.domain.`object`.DuplicateObject
import com.anytypeio.anytype.domain.`object`.SetObjectDetails
import com.anytypeio.anytype.domain.objects.SetObjectListIsArchived
Expand Down Expand Up @@ -119,7 +121,9 @@ object ObjectMenuModule {
payloadDelegator: PayloadDelegator,
setObjectListIsFavorite: SetObjectListIsFavorite,
setObjectIsArchived: SetObjectListIsArchived,
fieldParser: FieldParser
fieldParser: FieldParser,
spaceViewSubscriptionContainer: SpaceViewSubscriptionContainer,
getSpaceInviteLink: GetSpaceInviteLink
): ObjectMenuViewModel.Factory = ObjectMenuViewModel.Factory(
setObjectIsArchived = setObjectIsArchived,
duplicateObject = duplicateObject,
Expand All @@ -142,7 +146,9 @@ object ObjectMenuModule {
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
payloadDelegator = payloadDelegator,
setObjectListIsFavorite = setObjectListIsFavorite,
fieldParser = fieldParser
fieldParser = fieldParser,
getSpaceInviteLink = getSpaceInviteLink,
spaceViewSubscriptionContainer = spaceViewSubscriptionContainer
)

@JvmStatic
Expand Down Expand Up @@ -237,6 +243,8 @@ object ObjectSetMenuModule {
setObjectListIsFavorite: SetObjectListIsFavorite,
setObjectIsArchived: SetObjectListIsArchived,
fieldParser: FieldParser,
getSpaceInviteLink: GetSpaceInviteLink,
spaceViewSubscriptionContainer: SpaceViewSubscriptionContainer
): ObjectSetMenuViewModel.Factory = ObjectSetMenuViewModel.Factory(
setObjectListIsArchived = setObjectIsArchived,
addBackLinkToObject = addBackLinkToObject,
Expand All @@ -255,7 +263,9 @@ object ObjectSetMenuModule {
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
payloadDelegator = payloadDelegator,
setObjectListIsFavorite = setObjectListIsFavorite,
fieldParser = fieldParser
fieldParser = fieldParser,
getSpaceInviteLink = getSpaceInviteLink,
spaceViewSubscriptionContainer = spaceViewSubscriptionContainer
)

@JvmStatic
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.anytypeio.anytype.domain.misc.AppActionManager
import com.anytypeio.anytype.domain.misc.DateProvider
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.multiplayer.ActiveSpaceMemberSubscriptionContainer
import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver
import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer
import com.anytypeio.anytype.domain.multiplayer.UserPermissionProvider
import com.anytypeio.anytype.domain.`object`.GetObject
Expand All @@ -38,6 +39,7 @@ import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
import com.anytypeio.anytype.domain.templates.GetTemplates
import com.anytypeio.anytype.domain.workspace.NotificationsChannel
import com.anytypeio.anytype.domain.workspace.SpaceManager
import com.anytypeio.anytype.other.DefaultSpaceInviteResolver
import com.anytypeio.anytype.presentation.analytics.AnalyticSpaceHelperDelegate
import com.anytypeio.anytype.presentation.common.PayloadDelegator
import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider
Expand Down Expand Up @@ -207,6 +209,11 @@ object HomeScreenModule {
@PerScreen
fun coverHashProvider() : CoverImageHashProvider = DefaultCoverImageHashProvider()

@JvmStatic
@PerScreen
@Provides
fun provideSpaceInviteResolver(): SpaceInviteResolver = DefaultSpaceInviteResolver

@Module
interface Declarations {
@PerScreen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.anytypeio.anytype.di.feature.vault

import androidx.lifecycle.ViewModelProvider
import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.core_utils.di.scope.PerDialog
import com.anytypeio.anytype.core_utils.di.scope.PerScreen
import com.anytypeio.anytype.di.common.ComponentDependencies
import com.anytypeio.anytype.domain.account.AwaitAccountStartManager
Expand All @@ -12,15 +13,18 @@ import com.anytypeio.anytype.domain.config.UserSettingsRepository
import com.anytypeio.anytype.domain.debugging.Logger
import com.anytypeio.anytype.domain.misc.AppActionManager
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver
import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer
import com.anytypeio.anytype.domain.multiplayer.UserPermissionProvider
import com.anytypeio.anytype.domain.workspace.SpaceManager
import com.anytypeio.anytype.other.DefaultSpaceInviteResolver
import com.anytypeio.anytype.presentation.navigation.DeepLinkToObjectDelegate
import com.anytypeio.anytype.presentation.vault.VaultViewModel
import com.anytypeio.anytype.ui.vault.VaultFragment
import dagger.Binds
import dagger.Component
import dagger.Module
import dagger.Provides

@Component(
dependencies = [VaultComponentDependencies::class],
Expand Down Expand Up @@ -56,6 +60,10 @@ object VaultModule {
default: DeepLinkToObjectDelegate.Default
) : DeepLinkToObjectDelegate
}

@PerScreen
@Provides
fun provideSpaceInviteResolver() : SpaceInviteResolver = DefaultSpaceInviteResolver
}

interface VaultComponentDependencies : ComponentDependencies {
Expand Down
33 changes: 30 additions & 3 deletions app/src/main/java/com/anytypeio/anytype/other/Deeplinks.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver

const val DEEP_LINK_PATTERN = "anytype://"

const val DEEP_LINK_INVITE_DOMAIN = "invite.any.coop"

/**
* Regex pattern for matching
*/
Expand All @@ -25,6 +27,8 @@ const val MEMBERSHIP_PATH = "membership"
const val TYPE_PARAM = "type"
const val OBJECT_ID_PARAM = "objectId"
const val SPACE_ID_PARAM = "spaceId"
const val CONTENT_ID_PARAM = "cid"
const val ENCRYPTION_KEY_PARAM = "key"
const val SOURCE_PARAM = "source"
const val TYPE_VALUE_EXPERIENCE = "experience"
const val TIER_ID_PARAM = "tier"
Expand Down Expand Up @@ -61,9 +65,19 @@ object DefaultDeepLinkResolver : DeepLinkResolver {
val obj = uri.getQueryParameter(OBJECT_ID_PARAM)
val space = uri.getQueryParameter(SPACE_ID_PARAM)
if (!obj.isNullOrEmpty() && !space.isNullOrEmpty()) {
val cid = uri.getQueryParameter(CONTENT_ID_PARAM)
val key = uri.getQueryParameter(ENCRYPTION_KEY_PARAM)
DeepLinkResolver.Action.DeepLinkToObject(
obj = obj,
space = SpaceId(space)
space = SpaceId(space),
invite = if (!cid.isNullOrEmpty() && !key.isNullOrEmpty()) {
DeepLinkResolver.Action.DeepLinkToObject.Invite(
cid = cid,
key = key
)
} else {
null
}
)
} else {
DeepLinkResolver.Action.Unknown
Expand All @@ -82,6 +96,15 @@ object DefaultDeepLinkResolver : DeepLinkResolver {
return "${DEEP_LINK_PATTERN}${OBJECT_PATH}?${OBJECT_ID_PARAM}=$obj&${SPACE_ID_PARAM}=${space.id}"
}

override fun createObjectDeepLinkWithInvite(
obj: Id,
space: SpaceId,
invite: Id,
encryptionKey: String
): Url {
return "${DEEP_LINK_PATTERN}${OBJECT_PATH}?${OBJECT_ID_PARAM}=$obj&${SPACE_ID_PARAM}=${space.id}&${DefaultSpaceInviteResolver.CONTENT_ID_KEY}=$invite&${DefaultSpaceInviteResolver.FILE_KEY_KEY}=$encryptionKey"
}

override fun isDeepLink(link: String): Boolean {
return link.contains(defaultInviteRegex) || link.contains(DEEP_LINK_PATTERN)
}
Expand Down Expand Up @@ -112,8 +135,12 @@ object DefaultSpaceInviteResolver : SpaceInviteResolver {
}
}

override fun createInviteLink(contentId: String, encryptionKey: String) : String {
return "https://$DEEP_LINK_INVITE_DOMAIN/$contentId#$encryptionKey"
}

private const val CONTENT_INDEX = 1
private const val KEY_INDEX = 2
private const val CONTENT_ID_KEY = "cid"
private const val FILE_KEY_KEY = "key"
const val CONTENT_ID_KEY = "cid"
const val FILE_KEY_KEY = "key"
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ interface DeepLinkResolver {

fun createObjectDeepLink(obj: Id, space: SpaceId) : Url

fun createObjectDeepLinkWithInvite(
obj: Id,
space: SpaceId,
invite: Id,
encryptionKey: String
) : Url

fun isDeepLink(link: String) : Boolean

sealed class Action {
Expand All @@ -21,8 +28,14 @@ interface DeepLinkResolver {
data class Invite(val link: String) : Action()
data class DeepLinkToObject(
val obj: Id,
val space: SpaceId
) : Action()
val space: SpaceId,
val invite: Invite? = null
) : Action() {
data class Invite(
val cid: String,
val key: String
)
}
data class DeepLinkToMembership(
val tierId: String?
) : Action()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ import com.anytypeio.anytype.core_models.Id
interface SpaceInviteResolver {
fun parseContentId(link: String) : Id?
fun parseFileKey(link: String) : Id?
fun createInviteLink(contentId: String, encryptionKey: String) : String
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import com.anytypeio.anytype.domain.misc.DateProvider
import com.anytypeio.anytype.domain.misc.DeepLinkResolver
import com.anytypeio.anytype.domain.misc.Reducer
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver
import com.anytypeio.anytype.domain.multiplayer.UserPermissionProvider
import com.anytypeio.anytype.domain.`object`.GetObject
import com.anytypeio.anytype.domain.`object`.OpenObject
Expand Down Expand Up @@ -207,7 +208,8 @@ class HomeScreenViewModel(
private val clearLastOpenedObject: ClearLastOpenedObject,
private val spaceBinWidgetContainer: SpaceBinWidgetContainer,
private val featureToggles: FeatureToggles,
private val fieldParser: FieldParser
private val fieldParser: FieldParser,
private val spaceInviteResolver: SpaceInviteResolver
) : NavigationViewModel<HomeScreenViewModel.Navigation>(),
Reducer<ObjectView, Payload>,
WidgetActiveViewStateHolder by widgetActiveViewStateHolder,
Expand Down Expand Up @@ -1339,7 +1341,19 @@ class HomeScreenViewModel(
).collect { result ->
when(result) {
is DeepLinkToObjectDelegate.Result.Error -> {
commands.emit(Command.Deeplink.DeepLinkToObjectNotWorking)
val link = deeplink.invite
if (link != null) {
commands.emit(
Command.Deeplink.Invite(
link = spaceInviteResolver.createInviteLink(
contentId = link.cid,
encryptionKey = link.key
)
)
)
} else {
commands.emit(Command.Deeplink.DeepLinkToObjectNotWorking)
}
}
is DeepLinkToObjectDelegate.Result.Success -> {
proceedWithNavigation(result.obj.navigation())
Expand Down Expand Up @@ -2196,7 +2210,8 @@ class HomeScreenViewModel(
private val clearLastOpenedObject: ClearLastOpenedObject,
private val spaceBinWidgetContainer: SpaceBinWidgetContainer,
private val featureToggles: FeatureToggles,
private val fieldParser: FieldParser
private val fieldParser: FieldParser,
private val spaceInviteResolver: SpaceInviteResolver
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = HomeScreenViewModel(
Expand Down Expand Up @@ -2248,7 +2263,8 @@ class HomeScreenViewModel(
clearLastOpenedObject = clearLastOpenedObject,
spaceBinWidgetContainer = spaceBinWidgetContainer,
featureToggles = featureToggles,
fieldParser = fieldParser
fieldParser = fieldParser,
spaceInviteResolver = spaceInviteResolver
) as T
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.anytypeio.anytype.domain.base.Interactor
import com.anytypeio.anytype.domain.config.ConfigStorage
import com.anytypeio.anytype.domain.misc.DeepLinkResolver
import com.anytypeio.anytype.domain.misc.LocaleProvider
import com.anytypeio.anytype.domain.multiplayer.SpaceInviteResolver
import com.anytypeio.anytype.domain.notifications.SystemNotificationService
import com.anytypeio.anytype.domain.subscriptions.GlobalSubscriptionManager
import com.anytypeio.anytype.domain.wallpaper.ObserveWallpaper
Expand Down Expand Up @@ -62,7 +63,8 @@ class MainViewModel(
private val deepLinkToObjectDelegate: DeepLinkToObjectDelegate,
private val awaitAccountStartManager: AwaitAccountStartManager,
private val membershipProvider: MembershipProvider,
private val globalSubscriptionManager: GlobalSubscriptionManager
private val globalSubscriptionManager: GlobalSubscriptionManager,
private val spaceInviteResolver: SpaceInviteResolver
) : ViewModel(),
NotificationActionDelegate by notificationActionDelegate,
DeepLinkToObjectDelegate by deepLinkToObjectDelegate {
Expand Down Expand Up @@ -336,7 +338,19 @@ class MainViewModel(
)
when (result) {
is DeepLinkToObjectDelegate.Result.Error -> {
toasts.emit("Error: $result")
val link = deeplink.invite
if (link != null) {
commands.emit(
Command.Deeplink.Invite(
spaceInviteResolver.createInviteLink(
contentId = link.cid,
encryptionKey = link.key
)
)
)
} else {
toasts.emit("Error: $result")
}
}
is DeepLinkToObjectDelegate.Result.Success -> {
commands.emit(
Expand Down
Loading
Loading