Skip to content

Commit bc03593

Browse files
Merge pull request #311 from mindbox-cloud/release-2.5.0-rc
Release 2.5.0 - rc
2 parents 4b8bffe + 69cc511 commit bc03593

File tree

83 files changed

+3706
-2951
lines changed

Some content is hidden

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

83 files changed

+3706
-2951
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ android.enableJetifier=true
2121
kotlin.code.style=official
2222

2323
# SDK version property
24-
SDK_VERSION_NAME=2.4.0
24+
SDK_VERSION_NAME=2.5.0-rc
Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package cloud.mindbox.mobile_sdk
22

3-
import android.util.Log
3+
import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl
44
import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
5-
import java.time.*
5+
import java.time.Instant
6+
import java.time.LocalDateTime
7+
import java.time.ZoneOffset
8+
import java.time.ZonedDateTime
69
import java.time.format.DateTimeFormatter
710

811
internal fun Map<String, String>.toUrlQueryString() = LoggingExceptionHandler.runCatching(
@@ -13,25 +16,38 @@ internal fun Map<String, String>.toUrlQueryString() = LoggingExceptionHandler.ru
1316
}
1417

1518
internal fun ZonedDateTime.convertToString() = runCatching {
16-
this.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
19+
this.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"))
1720
}.getOrElse {
18-
Log.e("Mindbox", "Error converting date", it)
21+
MindboxLoggerImpl.e("Mindbox", "Error converting date", it)
1922
""
2023
}
2124

2225
internal fun Instant.convertToZonedDateTimeAtUTC(): ZonedDateTime {
23-
return this.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneOffset.UTC)
26+
return ZonedDateTime.ofInstant(this, ZoneOffset.UTC)
2427
}
2528

26-
2729
internal fun String.convertToZonedDateTime(): ZonedDateTime = runCatching {
2830
return LocalDateTime.parse(this, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")).atZone(
2931
ZoneOffset.UTC
3032
)
3133
}.getOrElse {
32-
Log.e("Mindbox", "Error converting date", it)
34+
MindboxLoggerImpl.e("Mindbox", "Error converting date", it)
35+
LocalDateTime.parse("1970-01-01T00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
36+
.atZone(
37+
ZoneOffset.UTC
38+
)
39+
}
40+
41+
internal fun String.convertToZonedDateTimeWithZ(): ZonedDateTime = runCatching {
42+
return LocalDateTime.parse(this, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"))
43+
.atZone(
44+
ZoneOffset.UTC
45+
)
46+
}.getOrElse {
47+
MindboxLoggerImpl.e("Mindbox", "Error converting date", it)
3348
LocalDateTime.parse("1970-01-01T00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
3449
.atZone(
35-
ZoneId.systemDefault()
50+
ZoneOffset.UTC
3651
)
3752
}
53+

sdk/src/main/java/cloud/mindbox/mobile_sdk/Mindbox.kt

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import androidx.lifecycle.Lifecycle.State.RESUMED
99
import androidx.lifecycle.ProcessLifecycleOwner
1010
import androidx.work.WorkerFactory
1111
import cloud.mindbox.mobile_sdk.di.MindboxKoin
12-
import cloud.mindbox.mobile_sdk.inapp.domain.InAppMessageManager
1312
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppCallback
13+
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageManager
14+
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageViewDisplayerImpl
1415
import cloud.mindbox.mobile_sdk.logger.Level
1516
import cloud.mindbox.mobile_sdk.logger.MindboxLoggerImpl
1617
import cloud.mindbox.mobile_sdk.managers.*
@@ -410,6 +411,20 @@ object Mindbox {
410411
MindboxEventManager.sendEventsIfExist(context)
411412
}
412413
MindboxPreferences.uuidDebugEnabled = configuration.uuidDebugEnabled
414+
}.invokeOnCompletion { throwable ->
415+
if (throwable == null) {
416+
if (firstInitCall) {
417+
val activity = context as? Activity
418+
if (activity != null && lifecycleManager.isCurrentActivityResumed) {
419+
inAppMessageManager.registerCurrentActivity(activity)
420+
}
421+
inAppMessageManager.initInAppMessages()
422+
mindboxScope.launch {
423+
MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted())
424+
}
425+
}
426+
firstInitCall = false
427+
}
413428
}
414429
// Handle back app in foreground
415430
(context.applicationContext as? Application)?.apply {
@@ -470,17 +485,6 @@ object Mindbox {
470485

471486
registerActivityLifecycleCallbacks(lifecycleManager)
472487
applicationLifecycle.addObserver(lifecycleManager)
473-
if (firstInitCall) {
474-
val activity = context as? Activity
475-
if (activity != null && lifecycleManager.isCurrentActivityResumed) {
476-
inAppMessageManager.registerCurrentActivity(activity)
477-
}
478-
inAppMessageManager.initInAppMessages()
479-
mindboxScope.launch {
480-
MindboxEventManager.eventFlow.emit(MindboxEventManager.appStarted())
481-
}
482-
}
483-
firstInitCall = false
484488
}
485489
}
486490
}
@@ -860,7 +864,6 @@ object Mindbox {
860864
}
861865
}, DELIVER_TOKEN_DELAY, TimeUnit.SECONDS)
862866
}
863-
864867
internal fun initComponents(context: Context, pushServices: List<MindboxPushService>? = null) {
865868
MindboxKoin.init(context.applicationContext)
866869
MindboxLoggerImpl.d(this, "initComponents. pushServices: " +

sdk/src/main/java/cloud/mindbox/mobile_sdk/di/MindboxKoin.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cloud.mindbox.mobile_sdk.di
22

33
import android.content.Context
4-
import kotlinx.coroutines.runBlocking
54
import org.koin.android.ext.koin.androidContext
65
import org.koin.core.Koin
76
import org.koin.core.component.KoinComponent
@@ -17,7 +16,7 @@ internal object MindboxKoin {
1716
if (isInitialized()) return
1817
koin = koinApplication {
1918
androidContext(appContext)
20-
modules(appModule, dataModule, monitoringModule)
19+
modules(presentationModule, dataModule, monitoringModule, domainModule)
2120
}.koin
2221
}
2322

sdk/src/main/java/cloud/mindbox/mobile_sdk/di/Modules.kt

Lines changed: 116 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,50 @@
11
package cloud.mindbox.mobile_sdk.di
22

33
import androidx.room.Room
4-
import cloud.mindbox.mobile_sdk.inapp.data.InAppGeoRepositoryImpl
5-
import cloud.mindbox.mobile_sdk.inapp.data.InAppRepositoryImpl
64
import cloud.mindbox.mobile_sdk.inapp.data.InAppValidatorImpl
7-
import cloud.mindbox.mobile_sdk.inapp.domain.*
8-
import cloud.mindbox.mobile_sdk.inapp.mapper.InAppMessageMapper
5+
import cloud.mindbox.mobile_sdk.inapp.data.managers.GeoSerializationManagerImpl
6+
import cloud.mindbox.mobile_sdk.inapp.data.managers.InAppSerializationManagerImpl
7+
import cloud.mindbox.mobile_sdk.inapp.data.managers.MobileConfigSerializationManagerImpl
8+
import cloud.mindbox.mobile_sdk.inapp.data.managers.SessionStorageManager
9+
import cloud.mindbox.mobile_sdk.inapp.data.mapper.InAppMapper
10+
import cloud.mindbox.mobile_sdk.inapp.data.repositories.InAppGeoRepositoryImpl
11+
import cloud.mindbox.mobile_sdk.inapp.data.repositories.InAppRepositoryImpl
12+
import cloud.mindbox.mobile_sdk.inapp.data.repositories.InAppSegmentationRepositoryImpl
13+
import cloud.mindbox.mobile_sdk.inapp.data.repositories.MobileConfigRepositoryImpl
14+
import cloud.mindbox.mobile_sdk.inapp.domain.InAppChoosingManagerImpl
15+
import cloud.mindbox.mobile_sdk.inapp.domain.InAppEventManagerImpl
16+
import cloud.mindbox.mobile_sdk.inapp.domain.InAppFilteringManagerImpl
17+
import cloud.mindbox.mobile_sdk.inapp.domain.InAppInteractorImpl
18+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.interactors.InAppInteractor
19+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.GeoSerializationManager
20+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppChoosingManager
21+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppEventManager
22+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppFilteringManager
23+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppSerializationManager
24+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.MobileConfigSerializationManager
25+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppGeoRepository
26+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository
27+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppSegmentationRepository
28+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.MobileConfigRepository
29+
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.validators.InAppValidator
30+
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageManager
931
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageManagerImpl
32+
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageViewDisplayer
1033
import cloud.mindbox.mobile_sdk.inapp.presentation.InAppMessageViewDisplayerImpl
1134
import cloud.mindbox.mobile_sdk.models.TreeTargetingDto
1235
import cloud.mindbox.mobile_sdk.models.operation.response.PayloadDto
1336
import cloud.mindbox.mobile_sdk.monitoring.MonitoringInteractorImpl
1437
import cloud.mindbox.mobile_sdk.monitoring.data.checkers.LogStoringDataCheckerImpl
38+
import cloud.mindbox.mobile_sdk.monitoring.data.mappers.MonitoringMapper
1539
import cloud.mindbox.mobile_sdk.monitoring.data.repositories.MonitoringRepositoryImpl
16-
import cloud.mindbox.mobile_sdk.monitoring.data.rmappers.MonitoringMapper
1740
import cloud.mindbox.mobile_sdk.monitoring.data.room.MonitoringDatabase
1841
import cloud.mindbox.mobile_sdk.monitoring.data.validators.MonitoringValidator
1942
import cloud.mindbox.mobile_sdk.monitoring.domain.interfaces.*
2043
import cloud.mindbox.mobile_sdk.monitoring.domain.managers.LogRequestDataManagerImpl
2144
import cloud.mindbox.mobile_sdk.monitoring.domain.managers.LogResponseDataManagerImpl
2245
import cloud.mindbox.mobile_sdk.utils.RuntimeTypeAdapterFactory
2346
import com.google.gson.GsonBuilder
47+
import kotlinx.coroutines.Dispatchers
2448
import org.koin.android.ext.koin.androidContext
2549
import org.koin.dsl.module
2650
import java.io.File
@@ -35,7 +59,8 @@ internal val monitoringModule = module {
3559
monitoringMapper = get(),
3660
context = get(),
3761
gson = get(),
38-
logStoringDataChecker = get()
62+
logStoringDataChecker = get(),
63+
monitoringValidator = get()
3964
)
4065
}
4166
single { MonitoringValidator() }
@@ -55,90 +80,149 @@ internal val monitoringModule = module {
5580
}
5681
single<MonitoringInteractor> {
5782
MonitoringInteractorImpl(
58-
inAppRepository = get(),
83+
mobileConfigRepository = get(),
5984
monitoringRepository = get(),
6085
logResponseDataManager = get(),
6186
logRequestDataManager = get()
6287
)
6388
}
64-
factory {
89+
single {
6590
Room.databaseBuilder(
6691
androidContext(),
6792
MonitoringDatabase::class.java,
6893
monitoringDatabaseName
69-
).fallbackToDestructiveMigration().build()
94+
)
95+
.fallbackToDestructiveMigration()
96+
.addMigrations(MonitoringDatabase.MIGRATION_1_2)
97+
.build()
7098
}
7199
single { get<MonitoringDatabase>().monitoringDao() }
72100
}
73-
internal val appModule = module {
101+
internal val presentationModule = module {
74102
single<InAppMessageViewDisplayer> { InAppMessageViewDisplayerImpl() }
75-
factory<InAppMessageManager> {
103+
single<InAppMessageManager> {
76104
InAppMessageManagerImpl(
77105
inAppMessageViewDisplayer = get(),
78-
inAppInteractorImpl = get(), monitoringRepository = get()
106+
inAppInteractorImpl = get(),
107+
defaultDispatcher = Dispatchers.IO,
108+
monitoringRepository = get()
109+
)
110+
}
111+
}
112+
113+
internal val domainModule = module {
114+
single<InAppInteractor> {
115+
InAppInteractorImpl(
116+
mobileConfigRepository = get(),
117+
inAppRepository = get(),
118+
inAppSegmentationRepository = get(),
119+
inAppFilteringManager = get(),
120+
inAppEventManager = get(),
121+
inAppChoosingManager = get()
122+
)
123+
}
124+
single<InAppChoosingManager> {
125+
InAppChoosingManagerImpl(
126+
inAppGeoRepository = get(), inAppSegmentationRepository = get(),
127+
inAppFilteringManager =
128+
get()
79129
)
80130
}
131+
factory<InAppEventManager> {
132+
InAppEventManagerImpl()
133+
}
134+
factory<InAppFilteringManager> {
135+
InAppFilteringManagerImpl(inAppRepository = get())
136+
}
81137
}
82138
internal val dataModule = module {
83-
single<InAppRepository> {
84-
InAppRepositoryImpl(
139+
single {
140+
SessionStorageManager()
141+
}
142+
single<MobileConfigRepository> {
143+
MobileConfigRepositoryImpl(
85144
inAppMapper = get(),
86-
gson = get(),
145+
mobileConfigSerializationManager = get(),
87146
context = androidContext(),
88147
inAppValidator = get(),
89148
monitoringValidator = get()
90149
)
91150
}
92-
factory<InAppGeoRepository> {
151+
factory<MobileConfigSerializationManager> {
152+
MobileConfigSerializationManagerImpl(
153+
gson = get()
154+
)
155+
}
156+
single<InAppGeoRepository> {
93157
InAppGeoRepositoryImpl(
94158
context = androidContext(),
95-
inAppMessageMapper = get(),
159+
inAppMapper = get(),
160+
geoSerializationManager = get(),
161+
sessionStorageManager = get()
162+
)
163+
}
164+
single<InAppRepository> {
165+
InAppRepositoryImpl(
166+
context = androidContext(),
167+
sessionStorageManager = get(),
168+
inAppSerializationManager = get()
169+
)
170+
}
171+
factory<GeoSerializationManager> {
172+
GeoSerializationManagerImpl(gson = get())
173+
}
174+
factory<InAppSerializationManager> {
175+
InAppSerializationManagerImpl(
96176
gson = get()
97177
)
98178
}
99-
factory<InAppInteractor> {
100-
InAppInteractorImpl(
101-
inAppRepositoryImpl = get(),
102-
inAppGeoRepositoryImpl = get()
179+
single<InAppSegmentationRepository> {
180+
InAppSegmentationRepositoryImpl(
181+
context = androidContext(),
182+
inAppMapper = get(),
183+
sessionStorageManager = get()
103184
)
104185
}
105186
single<InAppValidator> { InAppValidatorImpl() }
106-
single { InAppMessageMapper() }
187+
single { InAppMapper() }
107188
single {
108189
GsonBuilder().registerTypeAdapterFactory(
109190
RuntimeTypeAdapterFactory.of(
110191
PayloadDto::class.java,
111-
InAppRepositoryImpl.TYPE_JSON_NAME, true
192+
TreeTargetingDto.TYPE_JSON_NAME, true
112193
).registerSubtype(
113194
PayloadDto.SimpleImage::class.java,
114-
InAppRepositoryImpl.SIMPLE_IMAGE_JSON_NAME
195+
PayloadDto.SimpleImage.SIMPLE_IMAGE_JSON_NAME
115196
)
116197
).registerTypeAdapterFactory(
117198
RuntimeTypeAdapterFactory.of(
118199
TreeTargetingDto::class.java,
119-
InAppRepositoryImpl.TYPE_JSON_NAME,
200+
TreeTargetingDto.TYPE_JSON_NAME,
120201
true
121202
).registerSubtype(
122203
TreeTargetingDto.TrueNodeDto::class.java,
123-
InAppRepositoryImpl.TRUE_JSON_NAME
204+
TreeTargetingDto.TrueNodeDto.TRUE_JSON_NAME
124205
).registerSubtype(
125206
TreeTargetingDto.IntersectionNodeDto::class.java,
126-
InAppRepositoryImpl.AND_JSON_NAME
207+
TreeTargetingDto.IntersectionNodeDto.AND_JSON_NAME
127208
).registerSubtype(
128209
TreeTargetingDto.UnionNodeDto::class.java,
129-
InAppRepositoryImpl.OR_JSON_NAME
210+
TreeTargetingDto.UnionNodeDto.OR_JSON_NAME
130211
).registerSubtype(
131212
TreeTargetingDto.SegmentNodeDto::class.java,
132-
InAppRepositoryImpl.SEGMENT_JSON_NAME
213+
TreeTargetingDto.SegmentNodeDto.SEGMENT_JSON_NAME
133214
).registerSubtype(
134215
TreeTargetingDto.CountryNodeDto::class.java,
135-
InAppRepositoryImpl.COUNTRY_JSON_NAME
216+
TreeTargetingDto.CountryNodeDto.COUNTRY_JSON_NAME
136217
).registerSubtype(
137218
TreeTargetingDto.CityNodeDto::class.java,
138-
InAppRepositoryImpl.CITY_JSON_NAME
219+
TreeTargetingDto.CityNodeDto.CITY_JSON_NAME
139220
).registerSubtype(
140221
TreeTargetingDto.RegionNodeDto::class.java,
141-
InAppRepositoryImpl.REGION_JSON_NAME
222+
TreeTargetingDto.RegionNodeDto.REGION_JSON_NAME
223+
).registerSubtype(
224+
TreeTargetingDto.OperationNodeDto::class.java,
225+
TreeTargetingDto.OperationNodeDto.API_METHOD_CALL_JSON_NAME
142226
)
143227
).create()
144228
}

0 commit comments

Comments
 (0)