/*
* Copyright 2020 Allan Wang
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package com.pitchedapps.frost.prefs
import android.content.Context
import ca.allanwang.kau.kpref.KPrefFactory
import ca.allanwang.kau.kpref.KPrefFactoryAndroid
import com.pitchedapps.frost.prefs.sections.BehaviourPrefs
import com.pitchedapps.frost.prefs.sections.BehaviourPrefsImpl
import com.pitchedapps.frost.prefs.sections.CorePrefs
import com.pitchedapps.frost.prefs.sections.CorePrefsImpl
import com.pitchedapps.frost.prefs.sections.FeedPrefs
import com.pitchedapps.frost.prefs.sections.FeedPrefsImpl
import com.pitchedapps.frost.prefs.sections.NotifPrefs
import com.pitchedapps.frost.prefs.sections.NotifPrefsImpl
import com.pitchedapps.frost.prefs.sections.ShowcasePrefs
import com.pitchedapps.frost.prefs.sections.ShowcasePrefsImpl
import com.pitchedapps.frost.prefs.sections.ThemePrefs
import com.pitchedapps.frost.prefs.sections.ThemePrefsImpl
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import org.koin.core.context.GlobalContext
import org.koin.dsl.module
import javax.inject.Inject
import javax.inject.Singleton
/**
* [Prefs] is no longer an actual pref, but we will expose the reset function as it is used elsewhere
*/
interface PrefsBase {
fun reset()
fun deleteKeys(vararg keys: String)
}
interface Prefs :
BehaviourPrefs,
CorePrefs,
FeedPrefs,
NotifPrefs,
ThemePrefs,
ShowcasePrefs,
PrefsBase {
companion object {
fun get(): Prefs = GlobalContext.get().get()
fun module() = module {
single { BehaviourPrefsImpl(get(), get()) }
single { CorePrefsImpl(get(), get()) }
single { FeedPrefsImpl(get(), get()) }
single { NotifPrefsImpl(get(), get()) }
single { ThemePrefsImpl(get(), get()) }
single { ShowcasePrefsImpl(get()) }
single {
PrefsImpl(
behaviourPrefs = get(),
corePrefs = get(),
feedPrefs = get(),
notifPrefs = get(),
themePrefs = get(),
showcasePrefs = get()
)
}
// Needed for migration
single { OldPrefs(factory = get()) }
}
}
}
class PrefsImpl @Inject internal constructor(
private val behaviourPrefs: BehaviourPrefs,
private val corePrefs: CorePrefs,
private val feedPrefs: FeedPrefs,
private val notifPrefs: NotifPrefs,
private val themePrefs: ThemePrefs,
private val showcasePrefs: ShowcasePrefs
) : Prefs,
BehaviourPrefs by behaviourPrefs,
CorePrefs by corePrefs,
FeedPrefs by feedPrefs,
NotifPrefs by notifPrefs,
ThemePrefs by themePrefs,
ShowcasePrefs by showcasePrefs {
override fun reset() {
behaviourPrefs.reset()
corePrefs.reset()
feedPrefs.reset()
notifPrefs.reset()
themePrefs.reset()
showcasePrefs.reset()
}
override fun deleteKeys(vararg keys: String) {
behaviourPrefs.deleteKeys()
corePrefs.deleteKeys()
feedPrefs.deleteKeys()
notifPrefs.deleteKeys()
themePrefs.deleteKeys()
showcasePrefs.deleteKeys()
}
}
@Module
@InstallIn(SingletonComponent::class)
interface PrefModule {
@Binds
@Singleton
fun behaviour(to: BehaviourPrefsImpl): BehaviourPrefs
@Binds
@Singleton
fun core(to: CorePrefsImpl): CorePrefs
@Binds
@Singleton
fun feed(to: FeedPrefsImpl): FeedPrefs
@Binds
@Singleton
fun notif(to: NotifPrefsImpl): NotifPrefs
@Binds
@Singleton
fun theme(to: ThemePrefsImpl): ThemePrefs
@Binds
@Singleton
fun showcase(to: ShowcasePrefsImpl): ShowcasePrefs
@Binds
@Singleton
fun prefs(to: PrefsImpl): Prefs
}
@Module
@InstallIn(SingletonComponent::class)
object PrefFactoryModule {
@Provides
@Singleton
fun factory(@ApplicationContext context: Context): KPrefFactory = KPrefFactoryAndroid(context)
}