Skip to content

Remove FeatureExceptions.Store and all its implementations #5877

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
May 8, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,6 @@ annotation class ContributesRemoteFeature(
@Deprecated("Not needed anymore. Settings is now supported in top-level and sub-features and Toggle#getSettings returns it")
val settingsStore: KClass<*> = Unit::class,

/** The class that implements the [FeatureExceptions.Store] interface */
val exceptionsStore: KClass<*> = Unit::class,

/** The class that implements the [Toggle.Store] interface */
val toggleStore: KClass<*> = Unit::class,
)
Original file line number Diff line number Diff line change
Expand Up @@ -152,27 +152,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
.build(),
)
}
if (!customStorePresence.exceptionStorePresent) {
addFunction(
FunSpec.builder("providesNoopExceptionsStore")
.addAnnotation(Provides::class.asClassName())
.addAnnotation(
AnnotationSpec.builder(RemoteFeatureStoreNamed::class.asClassName())
.addMember("value = %T::class", boundType.asClassName())
.build(),
)
.addCode(
CodeBlock.of(
"""
return %T.EMPTY_STORE
""".trimIndent(),
FeatureExceptions::class.asClassName(),
),
)
.returns(FeatureExceptions.Store::class.asClassName())
.build(),
)
}
addFunction(
FunSpec.builder("provides${boundType.shortName}Inventory")
.addAnnotation(Provides::class.asClassName())
Expand Down Expand Up @@ -264,20 +243,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
.primaryConstructor(
FunSpec.constructorBuilder()
.addAnnotation(AnnotationSpec.builder(Inject::class).build())
.addParameter(
ParameterSpec
.builder(
"exceptionStore",
FeatureExceptions.Store::class,
)
.addAnnotation(
AnnotationSpec
.builder(RemoteFeatureStoreNamed::class).addMember("value = %T::class", boundType.asClassName())
.build(),

)
.build(),
)
.addParameter(
ParameterSpec
.builder(
Expand All @@ -298,16 +263,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
.addParameter("context", context.asClassName(module))
.build(),
)
.addProperty(
PropertySpec
.builder(
"exceptionStore",
FeatureExceptions.Store::class,
KModifier.PRIVATE,
)
.initializer("exceptionStore")
.build(),
)
.addProperty(
PropertySpec
.builder(
Expand Down Expand Up @@ -400,18 +355,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
.returns(FeatureSettings.Store::class.java.asClassName())
.build(),
)
.addFunction(
FunSpec.builder("bindOptionalExceptionsStore")
.addModifiers(KModifier.ABSTRACT)
.addAnnotation(BindsOptionalOf::class.asClassName())
.addAnnotation(
AnnotationSpec.builder(RemoteFeatureStoreNamed::class.asClassName())
.addMember("value = %T::class", boundType.asClassName())
.build(),
)
.returns(FeatureExceptions.Store::class.java.asClassName())
.build(),
)
.build(),
)
}
Expand Down Expand Up @@ -487,8 +430,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
}

val exceptions = parseExceptions(feature.exceptions)
// TODO: Remove once migrating everything to getExceptions()
exceptionStore.insertAll(exceptions)

val isEnabled = (feature.state == "enabled") || (appBuildConfig.flavor == %T && feature.state == "internal")
this.feature.get().invokeMethod("self").setRawStoredState(
Expand Down Expand Up @@ -656,11 +597,11 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
}
return featureExceptions.toList()
""".trimIndent(),
FeatureExceptions.FeatureException::class.fqName.asClassName(module),
FeatureExceptions.FeatureException::class.fqName.asClassName(module),
FeatureException::class.fqName.asClassName(module),
FeatureException::class.fqName.asClassName(module),
).build(),
)
.returns(List::class.asClassName().parameterizedBy(FeatureExceptions.FeatureException::class.asClassName()))
.returns(List::class.asClassName().parameterizedBy(FeatureException::class.asClassName()))
.build()
}

Expand Down Expand Up @@ -1025,7 +966,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
}
}

var exceptionStore = false
var settingsStore = false
var toggleStore = false

Expand Down Expand Up @@ -1080,20 +1020,6 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
requireFeatureAndStoreCrossReference(vmClass, this)
}
}
with(annotation.exceptionsStoreOrNull()) {
exceptionStore = this != null
if (this != null) {
if (this.directSuperTypeReferences()
.none { it.asClassReferenceOrNull()?.fqName == FeatureExceptions.Store::class.fqName }
) {
throw AnvilCompilationException(
"${vmClass.fqName} [exceptionsStore] must extend [FeatureExceptions.Store]",
element = vmClass.clazz.identifyingElement,
)
}
requireFeatureAndStoreCrossReference(vmClass, this)
}
}
with(annotation.toggleStoreOrNull()) {
toggleStore = this != null
if (this != null) {
Expand Down Expand Up @@ -1152,30 +1078,33 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {
}

return CustomStorePresence(
exceptionStorePresent = exceptionStore,
toggleStorePresent = toggleStore,
settingsStorePresent = settingsStore,
)
}

private enum class ContributesRemoteFeatureValues {
SCOPE,
BOUND_TYPE,
FEATURE_NAME,
SETTINGS_STORE,
TOGGLE_STORE,
}

private fun AnnotationReference.remoteFeatureStoreValueOrNull(): ClassReference? {
return argumentAt("value", 0)?.value()
return argumentAt("value", ContributesRemoteFeatureValues.SCOPE.ordinal)?.value()
}

private fun AnnotationReference.featureNameOrNull(): String? {
return argumentAt("featureName", 2)?.value()
return argumentAt("featureName", ContributesRemoteFeatureValues.FEATURE_NAME.ordinal)?.value()
}

private fun AnnotationReference.settingsStoreOrNull(): ClassReference? {
return argumentAt("settingsStore", 3)?.value()
}

private fun AnnotationReference.exceptionsStoreOrNull(): ClassReference? {
return argumentAt("exceptionsStore", 4)?.value()
return argumentAt("settingsStore", ContributesRemoteFeatureValues.SETTINGS_STORE.ordinal)?.value()
}

private fun AnnotationReference.toggleStoreOrNull(): ClassReference? {
return argumentAt("toggleStore", 5)?.value()
return argumentAt("toggleStore", ContributesRemoteFeatureValues.TOGGLE_STORE.ordinal)?.value()
}

private fun ClassReference.declaredFunctions(): List<MemberFunctionReference> {
Expand Down Expand Up @@ -1208,6 +1137,5 @@ class ContributesRemoteFeatureCodeGenerator : CodeGenerator {

private data class CustomStorePresence(
val settingsStorePresent: Boolean = false,
val exceptionStorePresent: Boolean = false,
val toggleStorePresent: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import com.duckduckgo.cookies.store.CookieExceptionEntity
import com.duckduckgo.cookies.store.CookiesRepository
import com.duckduckgo.cookies.store.FirstPartyCookiePolicyEntity
import com.duckduckgo.cookies.store.toFeatureException
import com.duckduckgo.feature.toggles.api.FeatureExceptions.FeatureException
import com.duckduckgo.feature.toggles.api.FeatureException
import com.duckduckgo.privacy.config.api.UnprotectedTemporary
import com.duckduckgo.privacy.config.impl.models.JsonPrivacyConfig
import com.duckduckgo.privacy.config.impl.network.JSONObjectAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import com.duckduckgo.common.test.CoroutineTestRule
import com.duckduckgo.common.test.FileUtilities
import com.duckduckgo.common.utils.isHttps
import com.duckduckgo.common.utils.store.BinaryDataStore
import com.duckduckgo.feature.toggles.api.FeatureExceptions.FeatureException
import com.duckduckgo.feature.toggles.api.FeatureException
import com.duckduckgo.feature.toggles.api.FeatureToggle
import com.duckduckgo.httpsupgrade.api.HttpsEmbeddedDataPersister
import com.duckduckgo.httpsupgrade.api.HttpsUpgrader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import com.duckduckgo.common.utils.DefaultDispatcherProvider
import com.duckduckgo.cookies.impl.SQLCookieRemover
import com.duckduckgo.cookies.store.CookiesRepository
import com.duckduckgo.cookies.store.FirstPartyCookiePolicyEntity
import com.duckduckgo.feature.toggles.api.FeatureExceptions.FeatureException
import com.duckduckgo.feature.toggles.api.FeatureException
import com.duckduckgo.privacy.config.api.UnprotectedTemporary
import java.time.Instant
import java.time.ZoneOffset
Expand Down
20 changes: 0 additions & 20 deletions app/src/main/java/com/duckduckgo/app/browser/di/BrowserModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import android.content.pm.PackageManager
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
import androidx.room.Room
import androidx.work.WorkManager
import com.duckduckgo.adclick.api.AdClickManager
import com.duckduckgo.app.browser.*
Expand All @@ -45,9 +44,6 @@ import com.duckduckgo.app.browser.httperrors.HttpCodeSiteErrorHandlerImpl
import com.duckduckgo.app.browser.httperrors.StringSiteErrorHandler
import com.duckduckgo.app.browser.httperrors.StringSiteErrorHandlerImpl
import com.duckduckgo.app.browser.logindetection.*
import com.duckduckgo.app.browser.mediaplayback.store.ALL_MIGRATIONS
import com.duckduckgo.app.browser.mediaplayback.store.MediaPlaybackDao
import com.duckduckgo.app.browser.mediaplayback.store.MediaPlaybackDatabase
import com.duckduckgo.app.browser.pageloadpixel.PageLoadedPixelDao
import com.duckduckgo.app.browser.pageloadpixel.firstpaint.PagePaintedPixelDao
import com.duckduckgo.app.browser.session.WebViewSessionInMemoryStorage
Expand Down Expand Up @@ -340,22 +336,6 @@ class BrowserModule {
return appDatabase.pagePaintedPixelDao()
}

@Provides
@SingleInstanceIn(AppScope::class)
fun provideMediaPlaybackDatabase(context: Context): MediaPlaybackDatabase {
return Room.databaseBuilder(context, MediaPlaybackDatabase::class.java, "media_playback.db")
.enableMultiInstanceInvalidation()
.fallbackToDestructiveMigration()
.addMigrations(*ALL_MIGRATIONS)
.build()
}

@Provides
@SingleInstanceIn(AppScope::class)
fun providesMediaPlaybackDao(mediaPlaybackDatabase: MediaPlaybackDatabase): MediaPlaybackDao {
return mediaPlaybackDatabase.mediaPlaybackDao()
}

private val Context.indonesiaNewTabSectionDataStore: DataStore<Preferences> by preferencesDataStore(
name = "indonesia_new_tab_section_store",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@
package com.duckduckgo.app.browser.mediaplayback

import com.duckduckgo.anvil.annotations.ContributesRemoteFeature
import com.duckduckgo.app.browser.mediaplayback.store.MediaPlaybackStore
import com.duckduckgo.di.scopes.AppScope

@ContributesRemoteFeature(
scope = AppScope::class,
featureName = "mediaPlaybackRequiresUserGesture",
exceptionsStore = MediaPlaybackStore::class,
boundType = MediaPlaybackFeature::class,
)
@Suppress("unused")
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading