diff --git a/.gitignore b/.gitignore index 19579d5..97e502e 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ lint/tmp/ *.hprof publish.properties +.kotlin/ \ No newline at end of file diff --git a/README.md b/README.md index 545a6a8..9e02cac 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Android Dev Tools is a library that contains various QA/Debug tools to speed up ![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/http-inspector?label=Http%20Inspector&color=%2373c248) ![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/environment-manager?label=Environment%20Manager&color=%2373c248) ![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/debug-menu?label=Debug%20Menu&color=%2373c248) +![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/deeplink-launcher?label=Deeplink%20Launcher&color=%2373c248) +![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/sharedpref-manager?label=SharedPref%20Manager&color=%2373c248) ## Tools ## * [Autofill Service](#autofill-service) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6496833..b419a3f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,6 +45,7 @@ sqlite-ktx = "2.5.1" startup = "1.1.1" dialogs = "dialogs-1.4.0" maven-publish = "0.33.0" +embeddedKoin = "3.5.6" [libraries] androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity-compose" } @@ -100,6 +101,8 @@ squareup-moshi-kotlin = { group = "com.squareup.moshi", name = "moshi-kotlin", v squareup-okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } trendyol-uiComponents-dialogs = { group = "com.github.Trendyol.android-ui-components", name = "dialogs", version.ref = "dialogs" } gradle-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "maven-publish" } +embeddedKoinCore = { group = "io.insert-koin", name = "embedded-koin-core", version.ref = "embeddedKoin" } +embeddedKoinAndroid = { group = "io.insert-koin", name = "embedded-koin-android", version.ref = "embeddedKoin" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/libraries/analytics-logger/build.gradle.kts b/libraries/analytics-logger/build.gradle.kts index 34e52c9..31889d5 100644 --- a/libraries/analytics-logger/build.gradle.kts +++ b/libraries/analytics-logger/build.gradle.kts @@ -39,7 +39,7 @@ android { } group = "com.trendyol.android.devtools" -version = "0.7.1" +version = "0.8.0" publishConfig { defaultConfiguration( @@ -57,4 +57,6 @@ dependencies { implementation(libs.moshi) implementation(libs.androidx.room.runtime) ksp(libs.androidx.room.compiler) + implementation(libs.embeddedKoinCore) + implementation(libs.embeddedKoinAndroid) } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/AnalyticsLogger.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/AnalyticsLogger.kt index fa891d0..5bdb9ae 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/AnalyticsLogger.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/AnalyticsLogger.kt @@ -1,20 +1,36 @@ package com.trendyol.android.devtools.analyticslogger import android.app.Application -import android.util.Log +import android.content.SharedPreferences import androidx.core.content.edit import com.trendyol.android.devtools.analyticslogger.internal.NotificationManager -import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer +import com.trendyol.android.devtools.analyticslogger.internal.di.analyticsLoggerModule +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.android.ext.koin.androidLogger +import embedded.koin.core.Koin +import embedded.koin.core.logger.Level +import embedded.koin.dsl.koinApplication +import kotlin.getValue object AnalyticsLogger { - internal var instance: NotificationManager? = null - private const val TAG = "AnalyticsLogger" - private const val INIT_ERROR_MESSAGE = "Should call AnalyticsLogger.init(Application, Boolean) first." + internal lateinit var koin: Koin + + private val instance: NotificationManager by lazy { koin.get() } + private val sharedPreferences: SharedPreferences by lazy { koin.get() } fun init(application: Application, showNotification: Boolean = true) { - ContextContainer.initialize(application) - instance = NotificationManager(showNotification) + koin = koinApplication { + androidContext(application.applicationContext) + androidLogger(Level.DEBUG) + + modules( + analyticsLoggerModule( + application = application, + showNotification = showNotification, + ) + ) + }.koin } /** @@ -32,36 +48,32 @@ object AnalyticsLogger { * ``` */ fun setEventTransformFunction(jsFunction: String) { - ContextContainer - .analyticsContainer - .sharedPreferencesManager + sharedPreferences .edit { putString("jsTransformFunction", jsFunction) } } fun getEventTransformFunction(): String { - return ContextContainer - .analyticsContainer - .sharedPreferencesManager + return sharedPreferences .getString("jsTransformFunction", "") .orEmpty() } fun show() { - instance?.show() ?: Log.w(TAG, INIT_ERROR_MESSAGE) + instance.show() } fun showNotification() { - instance?.showNotification() ?: Log.w(TAG, INIT_ERROR_MESSAGE) + instance.showNotification() } fun hideNotification() { - instance?.hideNotification() ?: Log.w(TAG, INIT_ERROR_MESSAGE) + instance.hideNotification() } fun report(key: String?, value: String?, platform: String?, source: String?) { - instance?.reportEvent(key, value, platform, source) ?: Log.w(TAG, INIT_ERROR_MESSAGE) + instance.reportEvent(key, value, platform, source) } /** @@ -80,6 +92,6 @@ object AnalyticsLogger { source: String?, isSuccess: Boolean? = null, ) { - instance?.reportEvent(key, value, platform, source, isSuccess) ?: Log.w(TAG, INIT_ERROR_MESSAGE) + instance.reportEvent(key, value, platform, source, isSuccess) } } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/NotificationManager.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/NotificationManager.kt index e1841cb..f376413 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/NotificationManager.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/NotificationManager.kt @@ -12,21 +12,23 @@ import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.trendyol.android.devtools.analyticslogger.R -import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsContainer -import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer +import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsLoggerKoinComponent +import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManager import com.trendyol.android.devtools.analyticslogger.internal.ui.MainActivity +import embedded.koin.core.component.inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -internal class NotificationManager constructor(private var showNotification: Boolean) { +internal class NotificationManager(private var showNotification: Boolean) : AnalyticsLoggerKoinComponent { private val superVisorJob = SupervisorJob() private val scope = CoroutineScope(superVisorJob + Dispatchers.IO) - private val analyticsContainer: AnalyticsContainer by lazy { ContextContainer.analyticsContainer } + private val context: Context by inject() + private val eventManager: EventManager by inject() private val intent by lazy { - Intent(ContextContainer.getContext(), MainActivity::class.java) + Intent(context, MainActivity::class.java) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } private var lastEvent: Pair? = null @@ -36,7 +38,7 @@ internal class NotificationManager constructor(private var showNotification: Boo } internal fun show() { - ContextContainer.getContext().startActivity(intent) + context.startActivity(intent) } internal fun showNotification() { @@ -52,7 +54,7 @@ internal class NotificationManager constructor(private var showNotification: Boo } internal fun cancelNotification() { - NotificationManagerCompat.from(ContextContainer.getContext()).cancel(NOTIFICATION_ID) + NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID) } internal fun reportEvent( @@ -62,7 +64,7 @@ internal class NotificationManager constructor(private var showNotification: Boo source: String?, isSuccess: Boolean? = null, ) = scope.launch { - analyticsContainer.eventManager.insert( + eventManager.insert( key = key, value = value, platform = platform, @@ -79,43 +81,43 @@ internal class NotificationManager constructor(private var showNotification: Boo private fun updateNotification(key: String?, platform: String?) { if (showNotification.not()) return val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.getActivity(ContextContainer.getContext(), 0, intent, PendingIntent.FLAG_IMMUTABLE) + PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) } else { - PendingIntent.getActivity(ContextContainer.getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } - val content = ContextContainer.getContext().getString( + val content = context.getString( R.string.analytics_logger_notification_content, platform, key, ) val builder = NotificationCompat.Builder( - ContextContainer.getContext(), - ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_id), + context, + context.getString(R.string.analytics_logger_notification_channel_id), ) .setSmallIcon(R.drawable.analytics_logger_insights) - .setContentTitle(ContextContainer.getContext().getString(R.string.analytics_logger_notification_title)) + .setContentTitle(context.getString(R.string.analytics_logger_notification_title)) .setContentText(content) .setPriority(NotificationCompat.PRIORITY_LOW) .setContentIntent(pendingIntent) if (ActivityCompat.checkSelfPermission( - ContextContainer.getContext(), + context, Manifest.permission.POST_NOTIFICATIONS, ) == PackageManager.PERMISSION_GRANTED ) { - NotificationManagerCompat.from(ContextContainer.getContext()).notify(NOTIFICATION_ID, builder.build()) + NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, builder.build()) } } private fun initNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_id), - ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_name), + context.getString(R.string.analytics_logger_notification_channel_id), + context.getString(R.string.analytics_logger_notification_channel_name), NotificationManager.IMPORTANCE_LOW, ) val notificationManager: NotificationManager = - ContextContainer.getContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsContainer.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsContainer.kt deleted file mode 100644 index 32c3040..0000000 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsContainer.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.trendyol.android.devtools.analyticslogger.internal.di - -import android.content.Context -import android.content.SharedPreferences -import com.squareup.moshi.Moshi -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import com.trendyol.android.devtools.analyticslogger.internal.data.database.EventDatabase -import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepository -import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepositoryImpl -import com.trendyol.android.devtools.analyticslogger.internal.data.repository.ExcludeKeysRepository -import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManager -import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManagerImpl -import com.trendyol.android.devtools.analyticslogger.internal.domain.usecase.ExcludeKeysUseCase - -internal class AnalyticsContainer(private val context: Context) { - - private val moshi: Moshi by lazy { - Moshi.Builder().add(KotlinJsonAdapterFactory()).build() - } - - private val eventDatabase: EventDatabase by lazy { EventDatabase.create(context) } - - private val eventRepository: EventRepository by lazy { EventRepositoryImpl(eventDatabase) } - - val eventManager: EventManager by lazy { EventManagerImpl(eventRepository, moshi) } - - val sharedPreferencesManager: SharedPreferences by lazy { - context.getSharedPreferences("analytics_logger", Context.MODE_PRIVATE) - } - - private val excludeKeysRepository: ExcludeKeysRepository by lazy { - ExcludeKeysRepository(sharedPreferencesManager) - } - - val excludeKeysUseCase: ExcludeKeysUseCase by lazy { - ExcludeKeysUseCase(excludeKeysRepository) - } -} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerKoinComponent.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerKoinComponent.kt new file mode 100644 index 0000000..52edd30 --- /dev/null +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerKoinComponent.kt @@ -0,0 +1,12 @@ +package com.trendyol.android.devtools.analyticslogger.internal.di + +import com.trendyol.android.devtools.analyticslogger.AnalyticsLogger +import embedded.koin.core.Koin +import embedded.koin.core.component.KoinComponent + +internal interface AnalyticsLoggerKoinComponent : KoinComponent { + + override fun getKoin(): Koin { + return AnalyticsLogger.koin + } +} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerModule.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerModule.kt new file mode 100644 index 0000000..a54f283 --- /dev/null +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsLoggerModule.kt @@ -0,0 +1,41 @@ +package com.trendyol.android.devtools.analyticslogger.internal.di + +import android.app.Application +import android.content.Context +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import com.trendyol.android.devtools.analyticslogger.internal.NotificationManager +import com.trendyol.android.devtools.analyticslogger.internal.data.database.EventDatabase +import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepository +import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepositoryImpl +import com.trendyol.android.devtools.analyticslogger.internal.data.repository.ExcludeKeysRepository +import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManager +import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManagerImpl +import com.trendyol.android.devtools.analyticslogger.internal.domain.usecase.ExcludeKeysUseCase +import com.trendyol.android.devtools.analyticslogger.internal.ui.MainViewModel +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.androidx.viewmodel.dsl.viewModelOf +import embedded.koin.core.module.Module +import embedded.koin.dsl.bind +import embedded.koin.dsl.module + +internal fun analyticsLoggerModule( + application: Application, + showNotification: Boolean, +): Module = module { + single { application.applicationContext } + single { NotificationManager(showNotification) } + single { + androidContext().getSharedPreferences("analytics_logger", Context.MODE_PRIVATE) + } + single { EventDatabase.create(get()) } + single { Moshi.Builder().add(KotlinJsonAdapterFactory()).build() } + + single { EventRepositoryImpl(get()) } bind(EventRepository::class) + single { EventManagerImpl(get(), get()) } bind(EventManager::class) + + single { ExcludeKeysRepository(get()) } + single { ExcludeKeysUseCase(get()) } + + viewModelOf(::MainViewModel) +} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/ContextContainer.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/ContextContainer.kt deleted file mode 100644 index 88ef32a..0000000 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/ContextContainer.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.trendyol.android.devtools.analyticslogger.internal.di - -import android.app.Application -import android.content.Context - -internal object ContextContainer { - - val analyticsContainer by lazy { AnalyticsContainer(application.applicationContext) } - - val mainContainer by lazy { MainContainer(analyticsContainer) } - - private lateinit var application: Application - - fun getContext(): Context = - if (::application.isInitialized) { - application.applicationContext - } else { - throw NullPointerException("Analytics Logger library is not initialized.") - } - - fun initialize(application: Application) { - this.application = application - } -} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/MainContainer.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/MainContainer.kt deleted file mode 100644 index 04a8b82..0000000 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/MainContainer.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.trendyol.android.devtools.analyticslogger.internal.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.android.devtools.analyticslogger.internal.ui.MainViewModel - -internal class MainContainer(private val analyticsContainer: AnalyticsContainer) { - - inner class MainViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return MainViewModel(eventManager = analyticsContainer.eventManager) as T - } - } -} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/detail/DetailFragment.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/detail/DetailFragment.kt index a3ffdb0..3e0599b 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/detail/DetailFragment.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/detail/DetailFragment.kt @@ -19,26 +19,23 @@ import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import com.trendyol.android.devtools.analyticslogger.AnalyticsLogger import com.trendyol.android.devtools.analyticslogger.R import com.trendyol.android.devtools.analyticslogger.databinding.AnalyticsLoggerFragmentDetailBinding -import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer +import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsLoggerKoinComponent +import com.trendyol.android.devtools.analyticslogger.internal.domain.usecase.ExcludeKeysUseCase import com.trendyol.android.devtools.analyticslogger.internal.factory.ColorFactory import com.trendyol.android.devtools.analyticslogger.internal.ui.MainViewModel import com.trendyol.android.devtools.analyticslogger.internal.util.executeJS +import embedded.koin.android.ext.android.inject +import embedded.koin.androidx.viewmodel.ext.android.activityViewModel import kotlinx.coroutines.launch -internal class DetailFragment : Fragment() { +internal class DetailFragment : Fragment(), AnalyticsLoggerKoinComponent { - private val viewModel: MainViewModel by activityViewModels { - ContextContainer.mainContainer.MainViewModelFactory() - } - - private val excludeKeysUseCase by lazy { - ContextContainer.analyticsContainer.excludeKeysUseCase - } + private val viewModel: MainViewModel by activityViewModel() + private val excludeKeysUseCase: ExcludeKeysUseCase by inject() private var _binding: AnalyticsLoggerFragmentDetailBinding? = null private var originalJsonText: String = "" diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt index 3a80768..19c361e 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt @@ -11,26 +11,26 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.trendyol.android.devtools.analyticslogger.AnalyticsLogger import com.trendyol.android.devtools.analyticslogger.R import com.trendyol.android.devtools.analyticslogger.databinding.AnalyticsLoggerFragmentEventsBinding -import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer +import com.trendyol.android.devtools.analyticslogger.internal.NotificationManager +import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsLoggerKoinComponent import com.trendyol.android.devtools.analyticslogger.internal.domain.model.Event import com.trendyol.android.devtools.analyticslogger.internal.ui.EventAdapter import com.trendyol.android.devtools.analyticslogger.internal.ui.MainActivity import com.trendyol.android.devtools.analyticslogger.internal.ui.MainViewModel import com.trendyol.android.devtools.analyticslogger.internal.ui.detail.DetailFragment +import embedded.koin.android.ext.android.inject +import embedded.koin.androidx.viewmodel.ext.android.activityViewModel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -internal class EventsFragment : Fragment() { +internal class EventsFragment : Fragment(), AnalyticsLoggerKoinComponent { - private val viewModel: MainViewModel by activityViewModels { - ContextContainer.mainContainer.MainViewModelFactory() - } + private val viewModel: MainViewModel by activityViewModel() + private val notificationManager: NotificationManager by inject() private var _binding: AnalyticsLoggerFragmentEventsBinding? = null @@ -94,7 +94,7 @@ internal class EventsFragment : Fragment() { private fun deleteAll() { viewModel.deleteAll() eventAdapter?.refresh() - AnalyticsLogger.instance?.cancelNotification() + notificationManager.cancelNotification() } private fun navigateToEventDetail(event: Event) { diff --git a/libraries/debug-menu/build.gradle.kts b/libraries/debug-menu/build.gradle.kts index ca27a57..46feb05 100644 --- a/libraries/debug-menu/build.gradle.kts +++ b/libraries/debug-menu/build.gradle.kts @@ -12,7 +12,7 @@ plugins { java.toolchain.languageVersion = JavaLanguageVersion.of(libs.versions.java.get().toString().toInt()) android { - compileSdk = 34 + compileSdk = 35 namespace = "com.trendyol.android.devtools.debugmenu" defaultConfig { @@ -37,7 +37,7 @@ android { } group = "com.trendyol.android.devtools" -version = "0.5.1" +version = "0.6.0" publishConfig { defaultConfiguration( @@ -54,4 +54,6 @@ dependencies { implementation(libs.google.android.material) implementation(libs.androidx.lifecycle.viewmodel.ktx) implementation(libs.androidx.fragment.ktx) + implementation(libs.embeddedKoinCore) + implementation(libs.embeddedKoinAndroid) } diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugActionItem.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugActionItem.kt index 46c5417..6028a7f 100644 --- a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugActionItem.kt +++ b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugActionItem.kt @@ -1,7 +1,7 @@ package com.trendyol.android.devtools.debugmenu import androidx.annotation.DrawableRes -import com.trendyol.android.devtools.debugmenu.internal.di.ContextContainer +import com.trendyol.android.devtools.debugmenu.internal.domain.DebugMenuUseCase sealed class DebugActionItem( internal open var text: String, @@ -34,18 +34,20 @@ sealed class DebugActionItem( abstract fun onCheckboxStatusChanged(isChecked: Boolean) } + private val debugMenuUseCase: DebugMenuUseCase by lazy { DebugMenu.koin.get() } + fun updateDescription(newDescription: String) { description = newDescription - ContextContainer.debugMenuContainer.debugMenuUseCase.onDebugActionItemUpdated(this) + debugMenuUseCase.onDebugActionItemUpdated(this) } fun updateText(newText: String) { text = newText - ContextContainer.debugMenuContainer.debugMenuUseCase.onDebugActionItemUpdated(this) + debugMenuUseCase.onDebugActionItemUpdated(this) } fun updateIconDrawableRes(@DrawableRes newIconDrawableRes: Int) { iconDrawableRes = newIconDrawableRes - ContextContainer.debugMenuContainer.debugMenuUseCase.onDebugActionItemUpdated(this) + debugMenuUseCase.onDebugActionItemUpdated(this) } } diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugMenu.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugMenu.kt index a63e9c8..6a96b79 100644 --- a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugMenu.kt +++ b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/DebugMenu.kt @@ -2,13 +2,20 @@ package com.trendyol.android.devtools.debugmenu import android.content.Context import android.content.Intent -import com.trendyol.android.devtools.debugmenu.internal.di.ContextContainer +import com.trendyol.android.devtools.debugmenu.internal.di.debugMenuModule import com.trendyol.android.devtools.debugmenu.internal.domain.DebugMenuUseCase import com.trendyol.android.devtools.debugmenu.internal.ui.DebugMenuActivity +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.android.ext.koin.androidLogger +import embedded.koin.core.Koin +import embedded.koin.dsl.koinApplication object DebugMenu { - private lateinit var debugMenuUseCase: DebugMenuUseCase + internal lateinit var koin: Koin + + private val context: Context by lazy { koin.get() } + private val debugMenuUseCase: DebugMenuUseCase by lazy { koin.get() } /** * Initializes library, should be called earlier than [show]. @@ -16,8 +23,16 @@ object DebugMenu { * @param context application context. */ fun init(context: Context) { - ContextContainer.setContext(context) - debugMenuUseCase = ContextContainer.debugMenuContainer.debugMenuUseCase + koin = koinApplication { + androidContext(context) + androidLogger() + + modules( + debugMenuModule( + context = context, + ) + ) + }.koin } /** @@ -26,7 +41,7 @@ object DebugMenu { * @param title to show above menu. Default is "Debug Menu". */ fun show(title: String = "Debug Menu") { - ContextContainer.getContext().startActivity(newIntent(title)) + context.startActivity(newIntent(title)) } /** @@ -37,7 +52,7 @@ object DebugMenu { * @return intent for Debug Menu's activity. */ fun newIntent(title: String = "Debug Menu"): Intent = - DebugMenuActivity.newIntent(ContextContainer.getContext(), title) + DebugMenuActivity.newIntent(context, title) fun addDebugAction(debugAction: DebugActionItem) { addDebugActionItems(listOf(debugAction)) diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/ContextContainer.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/ContextContainer.kt deleted file mode 100644 index d695adb..0000000 --- a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/ContextContainer.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.trendyol.android.devtools.debugmenu.internal.di - -import android.annotation.SuppressLint -import android.content.Context - -@SuppressLint("StaticFieldLeak") -internal object ContextContainer { - - val debugMenuContainer by lazy { DebugMenuContainer() } - private lateinit var context: Context - - fun getContext(): Context = if (ContextContainer::context.isInitialized) { - context - } else { - throw NullPointerException( - "Library is not initialized, please call init(Context) earlier than " + - "[com.trendyol.android.devtools.debugmenu.DebugMenu.show]", - ) - } - - fun setContext(context: Context) { - ContextContainer.context = context - } -} diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuContainer.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuContainer.kt deleted file mode 100644 index 454841e..0000000 --- a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuContainer.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.trendyol.android.devtools.debugmenu.internal.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.android.devtools.debugmenu.internal.domain.DebugMenuUseCase -import com.trendyol.android.devtools.debugmenu.internal.ui.DebugMenuViewModel - -internal class DebugMenuContainer { - - val debugMenuUseCase by lazy { DebugMenuUseCase() } - - inner class DebugMenuViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return DebugMenuViewModel(debugMenuUseCase) as T - } - } -} diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuKoinComponent.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuKoinComponent.kt new file mode 100644 index 0000000..089ab47 --- /dev/null +++ b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuKoinComponent.kt @@ -0,0 +1,12 @@ +package com.trendyol.android.devtools.debugmenu.internal.di + +import com.trendyol.android.devtools.debugmenu.DebugMenu +import embedded.koin.core.Koin +import embedded.koin.core.component.KoinComponent + +internal interface DebugMenuKoinComponent : KoinComponent { + + override fun getKoin(): Koin { + return DebugMenu.koin + } +} diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuModule.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuModule.kt new file mode 100644 index 0000000..7c56d34 --- /dev/null +++ b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/di/DebugMenuModule.kt @@ -0,0 +1,16 @@ +package com.trendyol.android.devtools.debugmenu.internal.di + +import android.content.Context +import com.trendyol.android.devtools.debugmenu.internal.domain.DebugMenuUseCase +import com.trendyol.android.devtools.debugmenu.internal.ui.DebugMenuViewModel +import embedded.koin.androidx.viewmodel.dsl.viewModelOf +import embedded.koin.core.module.Module +import embedded.koin.dsl.module + +internal fun debugMenuModule( + context: Context, +): Module = module { + single { context } + single { DebugMenuUseCase() } + viewModelOf(::DebugMenuViewModel) +} diff --git a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/ui/DebugMenuFragment.kt b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/ui/DebugMenuFragment.kt index 435950d..eb0a102 100644 --- a/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/ui/DebugMenuFragment.kt +++ b/libraries/debug-menu/src/main/java/com/trendyol/android/devtools/debugmenu/internal/ui/DebugMenuFragment.kt @@ -4,20 +4,18 @@ import android.os.Bundle import android.view.View import androidx.core.os.bundleOf import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels import com.trendyol.android.devtools.debugmenu.DebugActionItem import com.trendyol.android.devtools.debugmenu.R import com.trendyol.android.devtools.debugmenu.databinding.DebugMenuFragmentBinding -import com.trendyol.android.devtools.debugmenu.internal.di.ContextContainer +import com.trendyol.android.devtools.debugmenu.internal.di.DebugMenuKoinComponent import com.trendyol.android.devtools.debugmenu.internal.ext.viewBinding import com.trendyol.android.devtools.debugmenu.internal.ui.DebugMenuActivity.Companion.KEY_TITLE +import embedded.koin.androidx.viewmodel.ext.android.viewModel -internal class DebugMenuFragment : Fragment(R.layout.debug_menu_fragment) { +internal class DebugMenuFragment : Fragment(R.layout.debug_menu_fragment), DebugMenuKoinComponent { private val binding: DebugMenuFragmentBinding by viewBinding(DebugMenuFragmentBinding::bind) - private val viewModel by viewModels { - ContextContainer.debugMenuContainer.DebugMenuViewModelFactory() - } + private val viewModel: DebugMenuViewModel by viewModel() private val adapter: DebugMenuAdapter = DebugMenuAdapter() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/libraries/debug-menu/src/main/res/layout/debug_menu_activity.xml b/libraries/debug-menu/src/main/res/layout/debug_menu_activity.xml index be04893..c3fbafc 100644 --- a/libraries/debug-menu/src/main/res/layout/debug_menu_activity.xml +++ b/libraries/debug-menu/src/main/res/layout/debug_menu_activity.xml @@ -1,6 +1,7 @@ () val moshiAdapter = moshi.adapter(DeepLinkList::class.java) - val useCase = ContextContainer.appDeepLinkUseCase + val appDeepLinkUseCase = koin.get() scope.launch { moshiAdapter.fromJson(deepLinkListJson)?.let { - useCase.deleteAll() - useCase.insertAll(it) + appDeepLinkUseCase.deleteAll() + appDeepLinkUseCase.insertAll(it) } } } fun show() { - val context = ContextContainer.getContext() + val context = koin.get() context.startActivity( Intent(context, MainActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/ContextContainer.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/ContextContainer.kt deleted file mode 100644 index a10cfa5..0000000 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/ContextContainer.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.trendyol.devtools.deeplinklauncher.internal.di - -import android.annotation.SuppressLint -import android.content.Context - -@SuppressLint("StaticFieldLeak") -internal object ContextContainer { - - private val deeplinkContainer by lazy { DeepLinkContainer(context) } - - val mainContainer by lazy { MainContainer(deeplinkContainer) } - val deepLinkListContainer by lazy { DeepLinkListContainer(deeplinkContainer) } - - val appDeepLinkUseCase by lazy { deeplinkContainer.appDeepLinkUseCase } - - private lateinit var context: Context - - fun getContext(): Context = - if (::context.isInitialized) { - context - } else { - throw NullPointerException( - "Library is not initialized, please call init(Application) on Application.onCreate()" - ) - } - - fun setContext(context: Context) { - this.context = context - } -} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkContainer.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkContainer.kt deleted file mode 100644 index 256349d..0000000 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkContainer.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.trendyol.devtools.deeplinklauncher.internal.di - -import android.content.Context -import com.trendyol.devtools.deeplinklauncher.internal.data.database.DeepLinkDatabase -import com.trendyol.devtools.deeplinklauncher.internal.data.repository.AppDeepLinkRepository -import com.trendyol.devtools.deeplinklauncher.internal.data.repository.AppDeepLinkRepositoryImpl -import com.trendyol.devtools.deeplinklauncher.internal.data.repository.DeepLinkHistoryRepository -import com.trendyol.devtools.deeplinklauncher.internal.data.repository.DeepLinkHistoryRepositoryImpl -import com.trendyol.devtools.deeplinklauncher.internal.domain.AppDeepLinkUseCase -import com.trendyol.devtools.deeplinklauncher.internal.domain.AppDeepLinkUseCaseImpl -import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkHistoryUseCase -import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkHistoryUseCaseImpl -import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkValidator - -internal class DeepLinkContainer(private val context: Context) { - private val deeplinkDatabase: DeepLinkDatabase by lazy { DeepLinkDatabase.create(context) } - - private val deeplinkHistoryRepository: DeepLinkHistoryRepository by lazy { - DeepLinkHistoryRepositoryImpl(deeplinkDatabase) - } - - private val appDeepLinkRepository: AppDeepLinkRepository by lazy { AppDeepLinkRepositoryImpl(deeplinkDatabase) } - - val deeplinkHistoryUseCase: DeepLinkHistoryUseCase by lazy { DeepLinkHistoryUseCaseImpl(deeplinkHistoryRepository) } - - val appDeepLinkUseCase: AppDeepLinkUseCase by lazy { AppDeepLinkUseCaseImpl(appDeepLinkRepository) } - - val deeplinkValidator: DeepLinkValidator by lazy { DeepLinkValidator() } -} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherKoinComponent.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherKoinComponent.kt new file mode 100644 index 0000000..e065eb9 --- /dev/null +++ b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherKoinComponent.kt @@ -0,0 +1,12 @@ +package com.trendyol.devtools.deeplinklauncher.internal.di + +import com.trendyol.devtools.deeplinklauncher.DeepLinkLauncher +import embedded.koin.core.Koin +import embedded.koin.core.component.KoinComponent + +internal interface DeepLinkLauncherKoinComponent : KoinComponent { + + override fun getKoin(): Koin { + return DeepLinkLauncher.koin + } +} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherModule.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherModule.kt new file mode 100644 index 0000000..8e4f4f7 --- /dev/null +++ b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkLauncherModule.kt @@ -0,0 +1,42 @@ +package com.trendyol.devtools.deeplinklauncher.internal.di + +import android.app.Application +import android.content.Context +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import com.trendyol.devtools.deeplinklauncher.internal.data.database.DeepLinkDatabase +import com.trendyol.devtools.deeplinklauncher.internal.data.repository.AppDeepLinkRepository +import com.trendyol.devtools.deeplinklauncher.internal.data.repository.AppDeepLinkRepositoryImpl +import com.trendyol.devtools.deeplinklauncher.internal.data.repository.DeepLinkHistoryRepository +import com.trendyol.devtools.deeplinklauncher.internal.data.repository.DeepLinkHistoryRepositoryImpl +import com.trendyol.devtools.deeplinklauncher.internal.domain.AppDeepLinkUseCase +import com.trendyol.devtools.deeplinklauncher.internal.domain.AppDeepLinkUseCaseImpl +import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkHistoryUseCase +import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkHistoryUseCaseImpl +import com.trendyol.devtools.deeplinklauncher.internal.domain.DeepLinkValidator +import com.trendyol.devtools.deeplinklauncher.internal.ui.MainViewModel +import com.trendyol.devtools.deeplinklauncher.internal.ui.list.DeepLinkListViewModel +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.androidx.viewmodel.dsl.viewModelOf +import embedded.koin.core.module.Module +import embedded.koin.dsl.bind +import embedded.koin.dsl.module + +internal fun deepLinkLauncherModule( + application: Application, +): Module = module { + single { application.applicationContext } + single { Moshi.Builder().add(KotlinJsonAdapterFactory()).build() } + single { DeepLinkDatabase.create(androidContext()) } + + single { AppDeepLinkRepositoryImpl(get()) } bind (AppDeepLinkRepository::class) + single { DeepLinkHistoryRepositoryImpl(get()) } bind (DeepLinkHistoryRepository::class) + + single { AppDeepLinkUseCaseImpl(get()) } bind (AppDeepLinkUseCase::class) + single { DeepLinkHistoryUseCaseImpl(get()) } bind (DeepLinkHistoryUseCase::class) + + single { DeepLinkValidator() } + + viewModelOf(::MainViewModel) + viewModelOf(::DeepLinkListViewModel) +} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkListContainer.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkListContainer.kt deleted file mode 100644 index ee5d9a8..0000000 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/DeepLinkListContainer.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.trendyol.devtools.deeplinklauncher.internal.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.devtools.deeplinklauncher.internal.ui.list.DeepLinkListViewModel - -internal class DeepLinkListContainer( - private val deeplinkContainer: DeepLinkContainer -) { - - inner class DeepLinkListViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return DeepLinkListViewModel( - deeplinkContainer.deeplinkHistoryUseCase, - deeplinkContainer.appDeepLinkUseCase - ) as T - } - } -} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/MainContainer.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/MainContainer.kt deleted file mode 100644 index 8618fc4..0000000 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/di/MainContainer.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.trendyol.devtools.deeplinklauncher.internal.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.devtools.deeplinklauncher.internal.ui.MainViewModel - -internal class MainContainer( - private val deeplinkContainer: DeepLinkContainer -) { - - inner class MainViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return MainViewModel(deeplinkContainer.deeplinkHistoryUseCase, deeplinkContainer.deeplinkValidator) as T - } - } -} diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/MainFragment.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/MainFragment.kt index 8501902..ec4197e 100644 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/MainFragment.kt +++ b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/MainFragment.kt @@ -6,21 +6,22 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayoutMediator import com.trendyol.devtools.deeplinklauncher.R import com.trendyol.devtools.deeplinklauncher.databinding.DeeplinkLauncherFragmentMainBinding -import com.trendyol.devtools.deeplinklauncher.internal.di.ContextContainer +import com.trendyol.devtools.deeplinklauncher.internal.di.DeepLinkLauncherKoinComponent import com.trendyol.devtools.deeplinklauncher.internal.ext.getView import com.trendyol.devtools.deeplinklauncher.internal.ext.viewBinding import com.trendyol.devtools.deeplinklauncher.internal.ui.list.DeepLinkListSharedViewModel -import java.lang.Exception +import embedded.koin.androidx.viewmodel.ext.android.viewModel -class MainFragment : Fragment(R.layout.deeplink_launcher_fragment_main) { +class MainFragment : + Fragment(R.layout.deeplink_launcher_fragment_main), + DeepLinkLauncherKoinComponent { private val binding: DeeplinkLauncherFragmentMainBinding by viewBinding(DeeplinkLauncherFragmentMainBinding::bind) - private val viewModel: MainViewModel by viewModels { ContextContainer.mainContainer.MainViewModelFactory() } + private val viewModel: MainViewModel by viewModel() private val deepLinkSharedViewModel: DeepLinkListSharedViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/list/DeepLinkListFragment.kt b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/list/DeepLinkListFragment.kt index 8f146eb..fce7025 100644 --- a/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/list/DeepLinkListFragment.kt +++ b/libraries/deeplink-launcher/src/main/java/com/trendyol/devtools/deeplinklauncher/internal/ui/list/DeepLinkListFragment.kt @@ -1,23 +1,25 @@ package com.trendyol.devtools.deeplinklauncher.internal.ui.list import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.View import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels import androidx.recyclerview.widget.DividerItemDecoration import com.trendyol.devtools.deeplinklauncher.R import com.trendyol.devtools.deeplinklauncher.databinding.DeeplinkLauncherFragmentDeeplinkListBinding -import com.trendyol.devtools.deeplinklauncher.internal.di.ContextContainer +import com.trendyol.devtools.deeplinklauncher.internal.di.DeepLinkLauncherKoinComponent import com.trendyol.devtools.deeplinklauncher.internal.ext.viewBinding +import embedded.koin.androidx.viewmodel.ext.android.viewModel -class DeepLinkListFragment : Fragment(R.layout.deeplink_launcher_fragment_deeplink_list) { +class DeepLinkListFragment : + Fragment(R.layout.deeplink_launcher_fragment_deeplink_list), + DeepLinkLauncherKoinComponent { private val binding: DeeplinkLauncherFragmentDeeplinkListBinding by viewBinding( DeeplinkLauncherFragmentDeeplinkListBinding::bind ) - private val viewModel: DeepLinkListViewModel by viewModels { ContextContainer.deepLinkListContainer.DeepLinkListViewModelFactory() } + private val viewModel: DeepLinkListViewModel by viewModel() private val deepLinkSharedViewModel: DeepLinkListSharedViewModel by activityViewModels() private val adapter: DeepLinkListAdapter = DeepLinkListAdapter().apply { diff --git a/libraries/environment-manager/build.gradle.kts b/libraries/environment-manager/build.gradle.kts index 3a970c8..288de3b 100644 --- a/libraries/environment-manager/build.gradle.kts +++ b/libraries/environment-manager/build.gradle.kts @@ -37,7 +37,7 @@ android { } group = "com.trendyol.android.devtools" -version = "0.2.0" +version = "0.3.0" publishConfig { defaultConfiguration( @@ -55,4 +55,6 @@ dependencies { implementation(libs.trendyol.uiComponents.dialogs) implementation(libs.rxjava) implementation(libs.rxandroid) + implementation(libs.embeddedKoinCore) + implementation(libs.embeddedKoinAndroid) } diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/EnvironmentManager.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/EnvironmentManager.kt index f1b4c49..4b16f92 100644 --- a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/EnvironmentManager.kt +++ b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/EnvironmentManager.kt @@ -1,26 +1,42 @@ package com.trendyol.devtools.environmentmanager import android.app.Application +import android.content.Context import android.content.Intent import androidx.lifecycle.LiveData -import com.trendyol.devtools.environmentmanager.internal.di.ContextContainer +import com.trendyol.devtools.environmentmanager.internal.di.environmentManagerModule import com.trendyol.devtools.environmentmanager.internal.domain.EnvironmentUseCase import com.trendyol.devtools.environmentmanager.internal.domain.EnvironmentValidator import com.trendyol.devtools.environmentmanager.internal.service.EnvironmentService import com.trendyol.devtools.environmentmanager.internal.ui.MainActivity +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.android.ext.koin.androidLogger +import embedded.koin.core.Koin +import embedded.koin.core.logger.Level +import embedded.koin.dsl.koinApplication object EnvironmentManager { - private lateinit var environmentsUseCase: EnvironmentUseCase + internal lateinit var koin: Koin + + private val environmentsUseCase: EnvironmentUseCase by lazy { koin.get() } fun init(application: Application) { - ContextContainer.setContext(application) - environmentsUseCase = ContextContainer.environmentsContainer.environmentUseCase + koin = koinApplication { + androidContext(application.applicationContext) + androidLogger(Level.DEBUG) + + modules( + environmentManagerModule( + application = application, + ) + ) + }.koin EnvironmentService.initializeService(application) } fun show() { - val context = ContextContainer.getContext() + val context = koin.get() context.startActivity( Intent(context, MainActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) @@ -31,8 +47,9 @@ object EnvironmentManager { environmentsUseCase.updateEnvironments(environments) } - fun getCurrentEnvironment(): String = - environmentsUseCase.getCurrentEnvironment() + fun getCurrentEnvironment(): String { + return environmentsUseCase.getCurrentEnvironment() + } fun getEnvironmentChangedLiveData(): LiveData { return environmentsUseCase.getEnvironmentChangedLiveData() diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/ContextContainer.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/ContextContainer.kt deleted file mode 100644 index 37770b7..0000000 --- a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/ContextContainer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.trendyol.devtools.environmentmanager.internal.di - -import android.annotation.SuppressLint -import android.content.Context - -@SuppressLint("StaticFieldLeak") -internal object ContextContainer { - - val environmentsContainer by lazy { EnvironmentContainer(context) } - val mainContainer by lazy { MainContainer(environmentsContainer) } - - private lateinit var context: Context - - fun getContext(): Context = - if (::context.isInitialized) { - context - } else { - throw NullPointerException( - "Library is not initialized, please call init(Application) on Application.onCreate()" - ) - } - - fun setContext(context: Context) { - this.context = context - } -} diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentContainer.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentContainer.kt deleted file mode 100644 index 91ba091..0000000 --- a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentContainer.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.trendyol.devtools.environmentmanager.internal.di - -import android.content.Context -import android.content.SharedPreferences -import com.trendyol.devtools.environmentmanager.internal.data.EnvironmentRepository -import com.trendyol.devtools.environmentmanager.internal.domain.EnvironmentUseCase - -internal class EnvironmentContainer(private val context: Context) { - - val environmentUseCase by lazy { EnvironmentUseCase(repository = provideEnvironmentRepository()) } - - private fun provideEnvironmentRepository(): EnvironmentRepository = - EnvironmentRepository(sharedPreferences = provideSharedPreferences()) - - private fun provideSharedPreferences(): SharedPreferences = - context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - - companion object { - - private const val SHARED_PREFERENCES_NAME = "dev_tools_preferences" - } -} diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerKoinComponent.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerKoinComponent.kt new file mode 100644 index 0000000..f646f50 --- /dev/null +++ b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerKoinComponent.kt @@ -0,0 +1,12 @@ +package com.trendyol.devtools.environmentmanager.internal.di + +import com.trendyol.devtools.environmentmanager.EnvironmentManager +import embedded.koin.core.Koin +import embedded.koin.core.component.KoinComponent + +internal interface EnvironmentManagerKoinComponent : KoinComponent { + + override fun getKoin(): Koin { + return EnvironmentManager.koin + } +} diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerModule.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerModule.kt new file mode 100644 index 0000000..fe747c5 --- /dev/null +++ b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/EnvironmentManagerModule.kt @@ -0,0 +1,25 @@ +package com.trendyol.devtools.environmentmanager.internal.di + +import android.app.Application +import android.content.Context +import com.trendyol.devtools.environmentmanager.internal.data.EnvironmentRepository +import com.trendyol.devtools.environmentmanager.internal.domain.EnvironmentUseCase +import com.trendyol.devtools.environmentmanager.internal.ui.MainViewModel +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.androidx.viewmodel.dsl.viewModelOf +import embedded.koin.core.module.Module +import embedded.koin.dsl.module + +internal fun environmentManagerModule( + application: Application, +): Module = module { + single { application.applicationContext } + single { + androidContext().getSharedPreferences("dev_tools_preferences", Context.MODE_PRIVATE) + } + + single { EnvironmentRepository(get()) } + single { EnvironmentUseCase(get()) } + + viewModelOf(::MainViewModel) +} diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/MainContainer.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/MainContainer.kt deleted file mode 100644 index 1a1e258..0000000 --- a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/di/MainContainer.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.trendyol.devtools.environmentmanager.internal.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.devtools.environmentmanager.internal.ui.MainViewModel - -internal class MainContainer(private val environmentContainer: EnvironmentContainer) { - - inner class MainViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return MainViewModel(environmentUseCase = environmentContainer.environmentUseCase) as T - } - } -} diff --git a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/ui/MainFragment.kt b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/ui/MainFragment.kt index e643ef3..479ffe6 100644 --- a/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/ui/MainFragment.kt +++ b/libraries/environment-manager/src/main/java/com/trendyol/devtools/environmentmanager/internal/ui/MainFragment.kt @@ -3,17 +3,19 @@ package com.trendyol.devtools.environmentmanager.internal.ui import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels import com.trendyol.devtools.environmentmanager.R import com.trendyol.devtools.environmentmanager.databinding.DevToolsFragmentMainBinding -import com.trendyol.devtools.environmentmanager.internal.di.ContextContainer +import com.trendyol.devtools.environmentmanager.internal.di.EnvironmentManagerKoinComponent import com.trendyol.devtools.environmentmanager.internal.ext.viewBinding import com.trendyol.uicomponents.dialogs.selectionDialog +import embedded.koin.androidx.viewmodel.ext.android.viewModel -internal class MainFragment : Fragment(R.layout.dev_tools_fragment_main) { +internal class MainFragment : + Fragment(R.layout.dev_tools_fragment_main), + EnvironmentManagerKoinComponent { private val binding: DevToolsFragmentMainBinding by viewBinding(DevToolsFragmentMainBinding::bind) - private val viewModel: MainViewModel by viewModels { ContextContainer.mainContainer.MainViewModelFactory() } + private val viewModel: MainViewModel by viewModel() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/libraries/sharedpref-manager/build.gradle.kts b/libraries/sharedpref-manager/build.gradle.kts index 3258a09..31d8175 100644 --- a/libraries/sharedpref-manager/build.gradle.kts +++ b/libraries/sharedpref-manager/build.gradle.kts @@ -38,7 +38,7 @@ android { } group = "com.trendyol.android.devtools" -version = "0.3.1" +version = "0.4.0" publishConfig { defaultConfiguration( @@ -53,4 +53,6 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.activity.ktx) + implementation(libs.embeddedKoinCore) + implementation(libs.embeddedKoinAndroid) } diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/SharedPrefManager.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/SharedPrefManager.kt index 9ed591d..a3d858b 100644 --- a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/SharedPrefManager.kt +++ b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/SharedPrefManager.kt @@ -1,37 +1,65 @@ package com.trendyol.android.devtools.sharedprefmanager import android.app.Application +import android.content.Context import android.content.Intent import android.content.SharedPreferences -import com.trendyol.android.devtools.sharedprefmanager.di.ContextContainer -import com.trendyol.android.devtools.sharedprefmanager.di.SharedPreferencesProvider +import com.trendyol.android.devtools.sharedprefmanager.di.sharedPrefManagerModule import com.trendyol.android.devtools.sharedprefmanager.ui.SharedPrefManagerActivity +import embedded.koin.android.ext.koin.androidContext +import embedded.koin.android.ext.koin.androidLogger +import embedded.koin.core.Koin +import embedded.koin.core.logger.Level +import embedded.koin.dsl.koinApplication +import embedded.koin.dsl.module object SharedPrefManager { + internal lateinit var koin: Koin + + private val context: Context by lazy { koin.get() } private val intent by lazy { - Intent(ContextContainer.getContext(), SharedPrefManagerActivity::class.java).apply { + Intent(context, SharedPrefManagerActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK } } fun init(application: Application) { - ContextContainer.initialize(application) + koin = koinApplication { + androidContext(application.applicationContext) + androidLogger(Level.DEBUG) + + modules( + sharedPrefManagerModule( + application = application, + ) + ) + }.koin } fun show(sharedPrefName: String) { - ContextContainer.setSharedPreferencesProvider( - SharedPreferencesProvider.ByName(sharedPrefName) + koin.loadModules( + listOf( + module { + scope { + scoped { androidContext().getSharedPreferences(sharedPrefName, Context.MODE_PRIVATE) } + } + } + ) ) - ContextContainer.getContext().startActivity(intent) + context.startActivity(intent) } fun show(sharedPreferences: SharedPreferences) { - ContextContainer.setSharedPreferencesProvider( - SharedPreferencesProvider.ProvidedSharedPreferences( - sharedPreferences, - ), + koin.loadModules( + listOf( + module { + scope { + scoped { sharedPreferences } + } + } + ) ) - ContextContainer.getContext().startActivity(intent) + context.startActivity(intent) } } diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/ContextContainer.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/ContextContainer.kt deleted file mode 100644 index 37c2a59..0000000 --- a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/ContextContainer.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.trendyol.android.devtools.sharedprefmanager.di - -import android.app.Application -import android.content.Context -import android.content.SharedPreferences -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefUpdateTypeValidator - -internal object ContextContainer { - - val mainContainer by lazy { - MainContainer( - sharedPrefUseCaseContainer = sharedPrefUseCaseContainer, - sharedPrefUpdateTypeValidator = sharedPrefUpdateTypeValidator, - ) - } - - private val sharedPrefUseCaseContainer by lazy { - SharedPrefUseCaseContainer(application.applicationContext, sharedPreferencesProvider) - } - private val sharedPrefUpdateTypeValidator by lazy { - SharedPrefUpdateTypeValidator() - } - private lateinit var application: Application - private lateinit var sharedPreferencesProvider: SharedPreferencesProvider - fun getContext(): Context = - if (::application.isInitialized) { - application.applicationContext - } else { - throw NullPointerException("SharedPref Manager library is not initialized.") - } - - fun initialize(application: Application) { - this.application = application - } - - fun setSharedPreferencesProvider(provider: SharedPreferencesProvider) { - this.sharedPreferencesProvider = provider - } -} - -sealed class SharedPreferencesProvider { - abstract fun provide(context: Context): SharedPreferences - class ByName(val name: String) : SharedPreferencesProvider() { - override fun provide(context: Context): SharedPreferences { - return context.getSharedPreferences(name, Context.MODE_PRIVATE) - } - } - - class ProvidedSharedPreferences(val sharedPreferences: SharedPreferences) : SharedPreferencesProvider() { - override fun provide(context: Context): SharedPreferences { - return sharedPreferences - } - } -} diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/MainContainer.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/MainContainer.kt deleted file mode 100644 index 0013459..0000000 --- a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/MainContainer.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.trendyol.android.devtools.sharedprefmanager.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefUpdateTypeValidator -import com.trendyol.android.devtools.sharedprefmanager.ui.SharedPrefManagerViewModel - -internal class MainContainer( - private val sharedPrefUseCaseContainer: SharedPrefUseCaseContainer, - private val sharedPrefUpdateTypeValidator: SharedPrefUpdateTypeValidator -) { - - inner class SharedPrefManagerViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - return SharedPrefManagerViewModel( - sharedPrefManagerUseCase = sharedPrefUseCaseContainer.sharedPrefManagerUseCase, - sharedPrefUpdateTypeValidator = sharedPrefUpdateTypeValidator - ) as T - } - } -} diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerKoinComponent.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerKoinComponent.kt new file mode 100644 index 0000000..38814db --- /dev/null +++ b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerKoinComponent.kt @@ -0,0 +1,12 @@ +package com.trendyol.android.devtools.sharedprefmanager.di + +import com.trendyol.android.devtools.sharedprefmanager.SharedPrefManager +import embedded.koin.core.Koin +import embedded.koin.core.component.KoinComponent + +internal interface SharedPrefManagerKoinComponent : KoinComponent { + + override fun getKoin(): Koin { + return SharedPrefManager.koin + } +} diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerModule.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerModule.kt new file mode 100644 index 0000000..c5de9a9 --- /dev/null +++ b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefManagerModule.kt @@ -0,0 +1,28 @@ +package com.trendyol.android.devtools.sharedprefmanager.di + +import android.app.Application +import android.content.Context +import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerRepository +import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerRepositoryImpl +import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerUseCase +import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerUseCaseImpl +import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefUpdateTypeValidator +import com.trendyol.android.devtools.sharedprefmanager.ui.SharedPrefManagerActivity +import com.trendyol.android.devtools.sharedprefmanager.ui.SharedPrefManagerViewModel +import embedded.koin.androidx.viewmodel.dsl.viewModelOf +import embedded.koin.core.module.Module +import embedded.koin.dsl.bind +import embedded.koin.dsl.module + +internal fun sharedPrefManagerModule( + application: Application, +): Module = module { + single { application.applicationContext } + single { SharedPrefUpdateTypeValidator() } + + scope { + scoped { SharedPrefManagerRepositoryImpl(get()) } bind SharedPrefManagerRepository::class + scoped { SharedPrefManagerUseCaseImpl(get()) } bind SharedPrefManagerUseCase::class + viewModelOf(::SharedPrefManagerViewModel) + } +} diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefUseCaseContainer.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefUseCaseContainer.kt deleted file mode 100644 index 041ad2f..0000000 --- a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/di/SharedPrefUseCaseContainer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.trendyol.android.devtools.sharedprefmanager.di - -import android.content.Context -import android.content.SharedPreferences -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerRepository -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerRepositoryImpl -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerUseCase -import com.trendyol.android.devtools.sharedprefmanager.domain.SharedPrefManagerUseCaseImpl - -internal class SharedPrefUseCaseContainer( - private val context: Context, - private val provider: SharedPreferencesProvider, -) { - - private val sharedPref: SharedPreferences by lazy { - provider.provide(context) - } - - private val sharedPrefManagerRepository: SharedPrefManagerRepository by lazy { - SharedPrefManagerRepositoryImpl(sharedPref) - } - - val sharedPrefManagerUseCase: SharedPrefManagerUseCase by lazy { - SharedPrefManagerUseCaseImpl(sharedPrefManagerRepository) - } -} diff --git a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/ui/SharedPrefManagerActivity.kt b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/ui/SharedPrefManagerActivity.kt index 1a400cf..5dc24a2 100644 --- a/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/ui/SharedPrefManagerActivity.kt +++ b/libraries/sharedpref-manager/src/main/java/com/trendyol/android/devtools/sharedprefmanager/ui/SharedPrefManagerActivity.kt @@ -2,24 +2,24 @@ package com.trendyol.android.devtools.sharedprefmanager.ui import android.annotation.SuppressLint import android.os.Bundle -import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.ui.Modifier import androidx.navigation.compose.rememberNavController -import com.trendyol.android.devtools.sharedprefmanager.di.ContextContainer +import com.trendyol.android.devtools.sharedprefmanager.di.SharedPrefManagerKoinComponent import com.trendyol.android.devtools.sharedprefmanager.navigation.NavigationComponent import com.trendyol.android.devtools.sharedprefmanager.ui.ui.theme.DevToolsTheme +import embedded.koin.androidx.scope.RetainedScopeActivity +import embedded.koin.androidx.viewmodel.ext.android.viewModel -internal class SharedPrefManagerActivity : ComponentActivity() { +internal class SharedPrefManagerActivity : + RetainedScopeActivity(), + SharedPrefManagerKoinComponent { - private val sharedPrefManagerViewModel: SharedPrefManagerViewModel by viewModels { - ContextContainer.mainContainer.SharedPrefManagerViewModelFactory() - } + private val sharedPrefManagerViewModel: SharedPrefManagerViewModel by viewModel() @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") override fun onCreate(savedInstanceState: Bundle?) { diff --git a/libraries/sharedpref-manager/src/main/res/values/themes.xml b/libraries/sharedpref-manager/src/main/res/values/themes.xml index d729fc2..37bdb04 100644 --- a/libraries/sharedpref-manager/src/main/res/values/themes.xml +++ b/libraries/sharedpref-manager/src/main/res/values/themes.xml @@ -1,5 +1,5 @@ -