Skip to content

Commit 8968d71

Browse files
authored
Anddev 8995/add new di (#62)
* ANDDEV-8995 | Add koin to analytics-logger module * ANDDEV-8995 | Add koin to debug-menu module * ANDDEV-8995 | Add koin to deeplink-launcher module * ANDDEV-8995 | Add koin to environment-manager module * ANDDEV-8995 | Add koin to sharedpref-manager module * ANDDEV-8995 | Update README.md * ANDDEV-8995 | Fix lint errors * ANDDEV-8995 | Change SharedPrefManagerActivity.kt to RetainedScopeActivity * ANDDEV-8995 | Fix debug menu toolbar overlap issue in API 35
1 parent 2082e2a commit 8968d71

51 files changed

Lines changed: 460 additions & 516 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,4 @@ lint/tmp/
7878
*.hprof
7979

8080
publish.properties
81+
.kotlin/

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Android Dev Tools is a library that contains various QA/Debug tools to speed up
88
![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/http-inspector?label=Http%20Inspector&color=%2373c248)
99
![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/environment-manager?label=Environment%20Manager&color=%2373c248)
1010
![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/debug-menu?label=Debug%20Menu&color=%2373c248)
11+
![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/deeplink-launcher?label=Deeplink%20Launcher&color=%2373c248)
12+
![Maven Central](https://img.shields.io/maven-central/v/com.trendyol.android.devtools/sharedpref-manager?label=SharedPref%20Manager&color=%2373c248)
1113

1214
## Tools ##
1315
* [Autofill Service](#autofill-service)

gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ sqlite-ktx = "2.5.1"
4545
startup = "1.1.1"
4646
dialogs = "dialogs-1.4.0"
4747
maven-publish = "0.33.0"
48+
embeddedKoin = "3.5.6"
4849

4950
[libraries]
5051
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
100101
squareup-okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
101102
trendyol-uiComponents-dialogs = { group = "com.github.Trendyol.android-ui-components", name = "dialogs", version.ref = "dialogs" }
102103
gradle-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "maven-publish" }
104+
embeddedKoinCore = { group = "io.insert-koin", name = "embedded-koin-core", version.ref = "embeddedKoin" }
105+
embeddedKoinAndroid = { group = "io.insert-koin", name = "embedded-koin-android", version.ref = "embeddedKoin" }
103106

104107
[plugins]
105108
android-application = { id = "com.android.application", version.ref = "agp" }

libraries/analytics-logger/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ android {
3939
}
4040

4141
group = "com.trendyol.android.devtools"
42-
version = "0.7.1"
42+
version = "0.8.0"
4343

4444
publishConfig {
4545
defaultConfiguration(
@@ -57,4 +57,6 @@ dependencies {
5757
implementation(libs.moshi)
5858
implementation(libs.androidx.room.runtime)
5959
ksp(libs.androidx.room.compiler)
60+
implementation(libs.embeddedKoinCore)
61+
implementation(libs.embeddedKoinAndroid)
6062
}

libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/AnalyticsLogger.kt

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
package com.trendyol.android.devtools.analyticslogger
22

33
import android.app.Application
4-
import android.util.Log
4+
import android.content.SharedPreferences
55
import androidx.core.content.edit
66
import com.trendyol.android.devtools.analyticslogger.internal.NotificationManager
7-
import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer
7+
import com.trendyol.android.devtools.analyticslogger.internal.di.analyticsLoggerModule
8+
import embedded.koin.android.ext.koin.androidContext
9+
import embedded.koin.android.ext.koin.androidLogger
10+
import embedded.koin.core.Koin
11+
import embedded.koin.core.logger.Level
12+
import embedded.koin.dsl.koinApplication
13+
import kotlin.getValue
814

915
object AnalyticsLogger {
1016

11-
internal var instance: NotificationManager? = null
12-
private const val TAG = "AnalyticsLogger"
13-
private const val INIT_ERROR_MESSAGE = "Should call AnalyticsLogger.init(Application, Boolean) first."
17+
internal lateinit var koin: Koin
18+
19+
private val instance: NotificationManager by lazy { koin.get() }
20+
private val sharedPreferences: SharedPreferences by lazy { koin.get() }
1421

1522
fun init(application: Application, showNotification: Boolean = true) {
16-
ContextContainer.initialize(application)
17-
instance = NotificationManager(showNotification)
23+
koin = koinApplication {
24+
androidContext(application.applicationContext)
25+
androidLogger(Level.DEBUG)
26+
27+
modules(
28+
analyticsLoggerModule(
29+
application = application,
30+
showNotification = showNotification,
31+
)
32+
)
33+
}.koin
1834
}
1935

2036
/**
@@ -32,36 +48,32 @@ object AnalyticsLogger {
3248
* ```
3349
*/
3450
fun setEventTransformFunction(jsFunction: String) {
35-
ContextContainer
36-
.analyticsContainer
37-
.sharedPreferencesManager
51+
sharedPreferences
3852
.edit {
3953
putString("jsTransformFunction", jsFunction)
4054
}
4155
}
4256

4357
fun getEventTransformFunction(): String {
44-
return ContextContainer
45-
.analyticsContainer
46-
.sharedPreferencesManager
58+
return sharedPreferences
4759
.getString("jsTransformFunction", "")
4860
.orEmpty()
4961
}
5062

5163
fun show() {
52-
instance?.show() ?: Log.w(TAG, INIT_ERROR_MESSAGE)
64+
instance.show()
5365
}
5466

5567
fun showNotification() {
56-
instance?.showNotification() ?: Log.w(TAG, INIT_ERROR_MESSAGE)
68+
instance.showNotification()
5769
}
5870

5971
fun hideNotification() {
60-
instance?.hideNotification() ?: Log.w(TAG, INIT_ERROR_MESSAGE)
72+
instance.hideNotification()
6173
}
6274

6375
fun report(key: String?, value: String?, platform: String?, source: String?) {
64-
instance?.reportEvent(key, value, platform, source) ?: Log.w(TAG, INIT_ERROR_MESSAGE)
76+
instance.reportEvent(key, value, platform, source)
6577
}
6678

6779
/**
@@ -80,6 +92,6 @@ object AnalyticsLogger {
8092
source: String?,
8193
isSuccess: Boolean? = null,
8294
) {
83-
instance?.reportEvent(key, value, platform, source, isSuccess) ?: Log.w(TAG, INIT_ERROR_MESSAGE)
95+
instance.reportEvent(key, value, platform, source, isSuccess)
8496
}
8597
}

libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/NotificationManager.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,23 @@ import androidx.core.app.ActivityCompat
1212
import androidx.core.app.NotificationCompat
1313
import androidx.core.app.NotificationManagerCompat
1414
import com.trendyol.android.devtools.analyticslogger.R
15-
import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsContainer
16-
import com.trendyol.android.devtools.analyticslogger.internal.di.ContextContainer
15+
import com.trendyol.android.devtools.analyticslogger.internal.di.AnalyticsLoggerKoinComponent
16+
import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManager
1717
import com.trendyol.android.devtools.analyticslogger.internal.ui.MainActivity
18+
import embedded.koin.core.component.inject
1819
import kotlinx.coroutines.CoroutineScope
1920
import kotlinx.coroutines.Dispatchers
2021
import kotlinx.coroutines.SupervisorJob
2122
import kotlinx.coroutines.launch
2223

23-
internal class NotificationManager constructor(private var showNotification: Boolean) {
24+
internal class NotificationManager(private var showNotification: Boolean) : AnalyticsLoggerKoinComponent {
2425

2526
private val superVisorJob = SupervisorJob()
2627
private val scope = CoroutineScope(superVisorJob + Dispatchers.IO)
27-
private val analyticsContainer: AnalyticsContainer by lazy { ContextContainer.analyticsContainer }
28+
private val context: Context by inject()
29+
private val eventManager: EventManager by inject()
2830
private val intent by lazy {
29-
Intent(ContextContainer.getContext(), MainActivity::class.java)
31+
Intent(context, MainActivity::class.java)
3032
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
3133
}
3234
private var lastEvent: Pair<String?, String?>? = null
@@ -36,7 +38,7 @@ internal class NotificationManager constructor(private var showNotification: Boo
3638
}
3739

3840
internal fun show() {
39-
ContextContainer.getContext().startActivity(intent)
41+
context.startActivity(intent)
4042
}
4143

4244
internal fun showNotification() {
@@ -52,7 +54,7 @@ internal class NotificationManager constructor(private var showNotification: Boo
5254
}
5355

5456
internal fun cancelNotification() {
55-
NotificationManagerCompat.from(ContextContainer.getContext()).cancel(NOTIFICATION_ID)
57+
NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)
5658
}
5759

5860
internal fun reportEvent(
@@ -62,7 +64,7 @@ internal class NotificationManager constructor(private var showNotification: Boo
6264
source: String?,
6365
isSuccess: Boolean? = null,
6466
) = scope.launch {
65-
analyticsContainer.eventManager.insert(
67+
eventManager.insert(
6668
key = key,
6769
value = value,
6870
platform = platform,
@@ -79,43 +81,43 @@ internal class NotificationManager constructor(private var showNotification: Boo
7981
private fun updateNotification(key: String?, platform: String?) {
8082
if (showNotification.not()) return
8183
val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
82-
PendingIntent.getActivity(ContextContainer.getContext(), 0, intent, PendingIntent.FLAG_IMMUTABLE)
84+
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
8385
} else {
84-
PendingIntent.getActivity(ContextContainer.getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
86+
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
8587
}
86-
val content = ContextContainer.getContext().getString(
88+
val content = context.getString(
8789
R.string.analytics_logger_notification_content,
8890
platform,
8991
key,
9092
)
9193
val builder = NotificationCompat.Builder(
92-
ContextContainer.getContext(),
93-
ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_id),
94+
context,
95+
context.getString(R.string.analytics_logger_notification_channel_id),
9496
)
9597
.setSmallIcon(R.drawable.analytics_logger_insights)
96-
.setContentTitle(ContextContainer.getContext().getString(R.string.analytics_logger_notification_title))
98+
.setContentTitle(context.getString(R.string.analytics_logger_notification_title))
9799
.setContentText(content)
98100
.setPriority(NotificationCompat.PRIORITY_LOW)
99101
.setContentIntent(pendingIntent)
100102

101103
if (ActivityCompat.checkSelfPermission(
102-
ContextContainer.getContext(),
104+
context,
103105
Manifest.permission.POST_NOTIFICATIONS,
104106
) == PackageManager.PERMISSION_GRANTED
105107
) {
106-
NotificationManagerCompat.from(ContextContainer.getContext()).notify(NOTIFICATION_ID, builder.build())
108+
NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, builder.build())
107109
}
108110
}
109111

110112
private fun initNotificationChannel() {
111113
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
112114
val channel = NotificationChannel(
113-
ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_id),
114-
ContextContainer.getContext().getString(R.string.analytics_logger_notification_channel_name),
115+
context.getString(R.string.analytics_logger_notification_channel_id),
116+
context.getString(R.string.analytics_logger_notification_channel_name),
115117
NotificationManager.IMPORTANCE_LOW,
116118
)
117119
val notificationManager: NotificationManager =
118-
ContextContainer.getContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
120+
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
119121
notificationManager.createNotificationChannel(channel)
120122
}
121123
}

libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/AnalyticsContainer.kt

Lines changed: 0 additions & 38 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.trendyol.android.devtools.analyticslogger.internal.di
2+
3+
import com.trendyol.android.devtools.analyticslogger.AnalyticsLogger
4+
import embedded.koin.core.Koin
5+
import embedded.koin.core.component.KoinComponent
6+
7+
internal interface AnalyticsLoggerKoinComponent : KoinComponent {
8+
9+
override fun getKoin(): Koin {
10+
return AnalyticsLogger.koin
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.trendyol.android.devtools.analyticslogger.internal.di
2+
3+
import android.app.Application
4+
import android.content.Context
5+
import com.squareup.moshi.Moshi
6+
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
7+
import com.trendyol.android.devtools.analyticslogger.internal.NotificationManager
8+
import com.trendyol.android.devtools.analyticslogger.internal.data.database.EventDatabase
9+
import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepository
10+
import com.trendyol.android.devtools.analyticslogger.internal.data.repository.EventRepositoryImpl
11+
import com.trendyol.android.devtools.analyticslogger.internal.data.repository.ExcludeKeysRepository
12+
import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManager
13+
import com.trendyol.android.devtools.analyticslogger.internal.domain.manager.EventManagerImpl
14+
import com.trendyol.android.devtools.analyticslogger.internal.domain.usecase.ExcludeKeysUseCase
15+
import com.trendyol.android.devtools.analyticslogger.internal.ui.MainViewModel
16+
import embedded.koin.android.ext.koin.androidContext
17+
import embedded.koin.androidx.viewmodel.dsl.viewModelOf
18+
import embedded.koin.core.module.Module
19+
import embedded.koin.dsl.bind
20+
import embedded.koin.dsl.module
21+
22+
internal fun analyticsLoggerModule(
23+
application: Application,
24+
showNotification: Boolean,
25+
): Module = module {
26+
single<Context> { application.applicationContext }
27+
single { NotificationManager(showNotification) }
28+
single {
29+
androidContext().getSharedPreferences("analytics_logger", Context.MODE_PRIVATE)
30+
}
31+
single { EventDatabase.create(get()) }
32+
single { Moshi.Builder().add(KotlinJsonAdapterFactory()).build() }
33+
34+
single { EventRepositoryImpl(get()) } bind(EventRepository::class)
35+
single { EventManagerImpl(get(), get()) } bind(EventManager::class)
36+
37+
single { ExcludeKeysRepository(get()) }
38+
single { ExcludeKeysUseCase(get()) }
39+
40+
viewModelOf(::MainViewModel)
41+
}

libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/di/ContextContainer.kt

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)