Skip to content

Commit f81b89b

Browse files
committed
- Added Authorization Data local storage savings
- Migration from deprecated android prefs to androidx.preference - Fixes prefs issue with clearExtraData()
1 parent 2a3f555 commit f81b89b

File tree

14 files changed

+84
-73
lines changed

14 files changed

+84
-73
lines changed

app/src/main/java/com/sendsay/example/managers/CustomerTokenStorage.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,16 @@ class CustomerTokenStorage(
3333
Logger.d(this, "[CTS] Conf loaded $confJson")
3434
}
3535

36-
private var host: String? = null
37-
private var projectToken: String? = null
38-
private var publicKey: String? = null
39-
private var customerIds: HashMap<String, String>? = null
40-
private var expiration: Int? = null
36+
var host: String? = null
37+
var projectToken: String? = null
38+
var authToken: String? = null
39+
var publicKey: String? = null
40+
var customerIds: HashMap<String, String>? = null
41+
var expiration: Int? = null
4142

42-
private var tokenCache: String? = null
43+
var tokenCache: String? = null
4344

44-
private var lastTokenRequestTime: Long = 0
45+
var lastTokenRequestTime: Long = 0
4546

4647
fun retrieveJwtToken(): String? {
4748
val now = System.currentTimeMillis()
@@ -114,12 +115,14 @@ class CustomerTokenStorage(
114115
fun configure(
115116
host: String? = this.host,
116117
projectToken: String? = this.projectToken,
118+
authToken: String? = this.authToken,
117119
publicKey: String? = this.publicKey,
118120
customerIds: HashMap<String, String>? = this.customerIds,
119121
expiration: Int? = this.expiration
120122
) {
121123
this.host = host
122124
this.projectToken = projectToken
125+
this.authToken = authToken
123126
this.publicKey = publicKey
124127
this.customerIds = customerIds
125128
this.expiration = expiration
@@ -140,6 +143,7 @@ class CustomerTokenStorage(
140143
return mapOf(
141144
"host" to this.host,
142145
"projectToken" to this.projectToken,
146+
"authToken" to this.authToken,
143147
"publicKey" to this.publicKey,
144148
"customerIds" to this.customerIds?.let { gson.toJson(it) },
145149
"expiration" to this.expiration?.toString()
@@ -157,6 +161,7 @@ class CustomerTokenStorage(
157161
)
158162
this.host = confAsMap["host"]
159163
this.projectToken = confAsMap["projectToken"]
164+
this.authToken = confAsMap["authToken"]
160165
this.publicKey = confAsMap["publicKey"]
161166
val customerIdsMap = gson.fromJson<HashMap<String, String>>(
162167
confAsMap["customerIds"] ?: "{}", object : TypeToken<HashMap<String, String>>() {}.type

app/src/main/java/com/sendsay/example/managers/NetworkManager.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import okhttp3.OkHttpClient
88
import okhttp3.Protocol
99
import okhttp3.Request
1010
import okhttp3.RequestBody
11+
import okhttp3.RequestBody.Companion.toRequestBody
1112
import okhttp3.Response
1213
import okhttp3.ResponseBody
14+
import okhttp3.ResponseBody.Companion.toResponseBody
1315

1416
class NetworkManager {
1517
private val mediaTypeJson: MediaType = "application/json".toMediaTypeOrNull()!!
@@ -33,7 +35,7 @@ class NetworkManager {
3335
.protocol(Protocol.HTTP_2)
3436
.message(message)
3537
.request(it.request())
36-
.body(ResponseBody.create("text/plain".toMediaTypeOrNull(), message))
38+
.body(message.toResponseBody("text/plain".toMediaTypeOrNull()))
3739
.build()
3840
}
3941
}
@@ -58,10 +60,10 @@ class NetworkManager {
5860
if (body != null) {
5961
when (method) {
6062
"GET" -> requestBuilder.get()
61-
"POST" -> requestBuilder.post(RequestBody.create(mediaTypeJson, body))
63+
"POST" -> requestBuilder.post(body.toRequestBody(mediaTypeJson))
6264
else -> throw RuntimeException("Http method $method not supported.")
6365
}
64-
requestBuilder.post(RequestBody.create(mediaTypeJson, body))
66+
requestBuilder.post(body.toRequestBody(mediaTypeJson))
6567
}
6668

6769
return networkClient.newCall(requestBuilder.build())

app/src/main/java/com/sendsay/example/utils/Extensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import com.google.android.material.textfield.TextInputEditText
1010
import java.io.Serializable
1111

1212
fun TextInputEditText.isValid(): Boolean {
13-
val isValid = !text.toString().isEmpty()
13+
val isValid = !text.isNullOrEmpty()
1414
error = if (isValid) {
1515
null
1616
} else {
@@ -20,7 +20,7 @@ fun TextInputEditText.isValid(): Boolean {
2020
}
2121

2222
fun TextInputEditText.isVaildUrl(): Boolean {
23-
val isEmpty = text.toString().isEmpty()
23+
val isEmpty = text.isNullOrEmpty()
2424
val text = text ?: ""
2525
val isUrl = Patterns.WEB_URL.matcher(text).matches() && (text.startsWith("https://") || text.startsWith("http://"))
2626
error = when {

app/src/main/java/com/sendsay/example/view/AuthenticationActivity.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,28 @@ import com.sendsay.sdk.models.FlushMode
1818
import com.sendsay.sdk.models.SendsayConfiguration
1919
import com.sendsay.sdk.models.SendsayConfiguration.Companion.TOKEN_AUTH_PREFIX
2020
import com.sendsay.sdk.models.SendsayConfiguration.TokenFrequency.EVERY_LAUNCH
21+
import com.sendsay.sdk.repository.SendsayConfigRepository
22+
import com.sendsay.sdk.services.SendsayContextProvider
23+
import com.sendsay.sdk.util.Logger
2124
import kotlin.collections.set
2225

2326
class AuthenticationActivity : AppCompatActivity() {
24-
// Start our sendsay configuration
25-
val configuration = SendsayConfiguration()
27+
// Simple Sendsay configuration - without SDK init
28+
val defaultProperties = CustomerTokenStorage.INSTANCE
2629

27-
var projectToken = "${configuration.defaultProperties["projectToken"] ?: ""}"
28-
var apiUrl =
29-
"${configuration.defaultProperties["apiUrl"] ?: "https://mobi.sendsay.ru/xnpe/v100"}"
30+
var projectToken = defaultProperties.projectToken ?: ""
31+
var apiUrl = defaultProperties.host ?: "https://mobi.sendsay.ru/xnpe/v100"
3032
var authorizationToken =
31-
"Token ${configuration.defaultProperties["authorizationToken"] ?: ""}"
32-
var advancedPublicKey = "${configuration.defaultProperties["advancedPublicKey"] ?: "PK"}"
33-
var registeredIds = "${configuration.defaultProperties["registeredIds"] ?: ""}"
33+
"Token ${defaultProperties.authToken ?: ""}"
34+
var advancedPublicKey = defaultProperties.publicKey ?: "PK"
35+
var registeredIds = defaultProperties.customerIds?.values?.last() ?: ""
3436

3537
private lateinit var viewBinding: ActivityAuthenticationBinding
3638

3739
override fun onCreate(savedInstanceState: Bundle?) {
3840
super.onCreate(savedInstanceState)
3941
viewBinding = ActivityAuthenticationBinding.inflate(layoutInflater)
4042
setContentView(viewBinding.root)
41-
// setSupportActionBar(viewBinding.toolbar)
4243

4344
viewBinding.editTextAuthCode.setText(authorizationToken)
4445
viewBinding.editTextAdvancedPublicKey.setText(advancedPublicKey)
@@ -69,6 +70,7 @@ class AuthenticationActivity : AppCompatActivity() {
6970
}
7071

7172
private fun initSdk() {
73+
val configuration = SendsayConfiguration()
7274
// Saving current field state
7375
configuration.defaultProperties["projectToken"] = projectToken
7476
configuration.defaultProperties["apiUrl"] = apiUrl
@@ -94,6 +96,7 @@ class AuthenticationActivity : AppCompatActivity() {
9496
CustomerTokenStorage.INSTANCE.configure(
9597
host = apiUrl,
9698
projectToken = projectToken,
99+
authToken = authorizationToken.split(" ").last(),
97100
publicKey = advancedPublicKey,
98101
customerIds = null,
99102
expiration = null

app/src/main/java/com/sendsay/example/view/MainActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ class MainActivity : AppCompatActivity() {
383383
}
384384
}
385385

386-
// internal fun openCarousel() {
387-
// getNavController().navigate(NavigationItem.InAppCarousel.navigationId)
388-
// }
386+
internal fun openCarousel() {
387+
getNavController().navigate(NavigationItem.InAppCarousel.navigationId)
388+
}
389389
}

app/src/main/java/com/sendsay/example/view/fragments/InAppContentBlocksFragment.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class InAppContentBlocksFragment : BaseFragment() {
6161

6262
private val OPEN_CAROUSEL_ACTION_ID = 1
6363

64+
65+
@Deprecated("")
6466
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
6567
menu.add(
6668
Menu.NONE,
@@ -71,19 +73,20 @@ class InAppContentBlocksFragment : BaseFragment() {
7173
super.onCreateOptionsMenu(menu, inflater)
7274
}
7375

76+
@Deprecated("")
7477
override fun onOptionsItemSelected(item: MenuItem): Boolean {
7578
return when (item.itemId) {
7679
OPEN_CAROUSEL_ACTION_ID -> {
77-
// openCarousel()
80+
openCarousel()
7881
true
7982
}
8083
else -> super.onOptionsItemSelected(item)
8184
}
8285
}
8386

84-
// private fun openCarousel() {
85-
// (activity as? MainActivity)?.openCarousel()
86-
// }
87+
private fun openCarousel() {
88+
(activity as? MainActivity)?.openCarousel()
89+
}
8790

8891
private fun prepareExampleListCbPlaceholder() {
8992
viewBinding.contentBlocksList.layoutManager = LinearLayoutManager(requireContext())

sdk/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ dependencies {
109109
// Kotlin DateTime
110110
implementation "org.jetbrains.kotlinx:kotlinx-datetime:0.7.1"
111111
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.9'
112+
// Android X prefs
113+
implementation "androidx.preference:preference:1.2.1"
114+
implementation "androidx.preference:preference-ktx:1.2.1"
112115

113116
// Base Test
114117
testImplementation 'junit:junit:4.13.2'

sdk/src/main/java/com/sendsay/sdk/Sendsay.kt

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import android.content.Intent
99
import android.content.pm.ApplicationInfo
1010
import android.os.Build
1111
import android.os.Looper
12-
import android.util.Log
1312
import android.view.View
1413
import android.widget.Button
1514
import androidx.fragment.app.Fragment
@@ -34,10 +33,6 @@ import com.sendsay.sdk.models.CustomerRecommendationOptions
3433
import com.sendsay.sdk.models.CustomerRecommendationRequest
3534
import com.sendsay.sdk.models.DeviceProperties
3635
import com.sendsay.sdk.models.EventType
37-
import com.sendsay.sdk.models.SendsayConfiguration
38-
import com.sendsay.sdk.models.SendsayConfiguration.TokenFrequency
39-
import com.sendsay.sdk.models.SendsayNotificationActionType
40-
import com.sendsay.sdk.models.SendsayProject
4136
import com.sendsay.sdk.models.FetchError
4237
import com.sendsay.sdk.models.FlushMode
4338
import com.sendsay.sdk.models.FlushMode.APP_CLOSE
@@ -61,21 +56,23 @@ import com.sendsay.sdk.models.PushOpenedData
6156
import com.sendsay.sdk.models.Result
6257
import com.sendsay.sdk.models.Segment
6358
import com.sendsay.sdk.models.SegmentationDataCallback
59+
import com.sendsay.sdk.models.SendsayConfiguration
60+
import com.sendsay.sdk.models.SendsayConfiguration.TokenFrequency
61+
import com.sendsay.sdk.models.SendsayNotificationActionType
62+
import com.sendsay.sdk.models.SendsayProject
6463
import com.sendsay.sdk.models.TrackSSECData
6564
import com.sendsay.sdk.models.TrackingSSECType
6665
import com.sendsay.sdk.preferences.SendsayPreferencesImpl
6766
import com.sendsay.sdk.receiver.NotificationsPermissionReceiver
68-
import com.sendsay.sdk.repository.SendsayConfigRepository
6967
import com.sendsay.sdk.repository.PushNotificationRepository
7068
import com.sendsay.sdk.repository.PushNotificationRepositoryImpl
71-
import com.sendsay.sdk.repository.PushNotificationRepositoryImpl.Companion.KEY_ISSUE
72-
import com.sendsay.sdk.repository.PushNotificationRepositoryImpl.Companion.KEY_LETTER
7369
import com.sendsay.sdk.repository.PushTokenRepositoryProvider
70+
import com.sendsay.sdk.repository.SendsayConfigRepository
7471
import com.sendsay.sdk.services.AppInboxProvider
75-
import com.sendsay.sdk.services.SendsayContextProvider
76-
import com.sendsay.sdk.services.SendsayInitManager
7772
import com.sendsay.sdk.services.MessagingUtils
73+
import com.sendsay.sdk.services.SendsayContextProvider
7874
import com.sendsay.sdk.services.SendsayDeintegrateManager
75+
import com.sendsay.sdk.services.SendsayInitManager
7976
import com.sendsay.sdk.services.inappcontentblock.ContentBlockCarouselViewController.Companion.DEFAULT_MAX_MESSAGES_COUNT
8077
import com.sendsay.sdk.services.inappcontentblock.ContentBlockCarouselViewController.Companion.DEFAULT_SCROLL_DELAY
8178
import com.sendsay.sdk.telemetry.TelemetryManager
@@ -93,18 +90,11 @@ import com.sendsay.sdk.util.logOnException
9390
import com.sendsay.sdk.util.logOnExceptionWithResult
9491
import com.sendsay.sdk.util.returnOnException
9592
import com.sendsay.sdk.util.runOnMainThread
96-
import com.sendsay.sdk.util.toMap
9793
import com.sendsay.sdk.view.ContentBlockCarouselView
9894
import com.sendsay.sdk.view.InAppContentBlockPlaceholderView
9995
import com.sendsay.sdk.view.InAppMessagePresenter
10096
import com.sendsay.sdk.view.InAppMessageView
101-
import java.text.SimpleDateFormat
102-
import java.time.LocalDateTime
103-
import java.util.Date
104-
import java.util.Locale
10597
import java.util.concurrent.CopyOnWriteArrayList
106-
import kotlin.math.absoluteValue
107-
import kotlin.random.Random
10898

10999
//@SuppressLint("StaticFieldLeak")
110100
object Sendsay {
@@ -240,16 +230,18 @@ object Sendsay {
240230
if (value == null) {
241231
return@runCatching
242232
}
243-
val repository = getPushNotificationRepository()
244-
repository?.popDeliveredPushData()?.forEach {
245-
value.handleReceivedPushUpdate(it)
246-
}
247-
repository?.popClickedPushData()?.forEach {
248-
value.handleClickedPushUpdate(it)
233+
val storeData = component.pushNotificationRepository.getExtraData()
234+
if (storeData != null) {
235+
val repository = getPushNotificationRepository()
236+
repository?.popDeliveredPushData()?.forEach {
237+
value.handleReceivedPushUpdate(it)
238+
}
239+
repository?.popClickedPushData()?.forEach {
240+
value.handleClickedPushUpdate(it)
241+
}
242+
243+
// component.pushNotificationRepository.clearExtraData()
249244
}
250-
//
251-
// val issue = repository?.getExtraData()?.entries?.any { it.key == KEY_ISSUE }
252-
// val letter = repository?.getExtraData()?.entries?.any { it.key == KEY_LETTER }
253245
}.logOnException()
254246

255247
/**
@@ -794,9 +786,7 @@ object Sendsay {
794786
): Boolean = runCatching {
795787
if (!isSendsayPushNotification(messageData)) return@runCatching false
796788
val fcmManagerInstance = getFcmManager(applicationContext)
797-
if (fcmManagerInstance != null) {
798-
fcmManagerInstance.handleRemoteMessage(messageData, manager, showNotification)
799-
}
789+
fcmManagerInstance?.handleRemoteMessage(messageData, manager, showNotification)
800790
return true
801791
}.returnOnException { true }
802792

sdk/src/main/java/com/sendsay/sdk/models/SendsayConfiguration.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.sendsay.sdk.models
22

33
import android.app.NotificationManager
44
import com.sendsay.sdk.exceptions.InvalidConfigurationException
5+
import kotlin.time.Duration.Companion.hours
6+
import kotlin.time.DurationUnit
57

68
data class SendsayConfiguration(
79
/** Default project token. */
@@ -103,9 +105,12 @@ data class SendsayConfiguration(
103105
) {
104106

105107
companion object {
106-
public val TOKEN_AUTH_PREFIX = "Token "
107-
public val BASIC_AUTH_PREFIX = "Basic "
108-
public val BEARER_AUTH_PREFIX = "Bearer "
108+
val TOKEN_AUTH_PREFIX = "Token "
109+
val BASIC_AUTH_PREFIX = "Basic "
110+
val BEARER_AUTH_PREFIX = "Bearer "
111+
112+
val ISSUE_LETTER_EXPIRE_DURATION: Long = 24.hours.toLong(DurationUnit.MILLISECONDS)
113+
// val ISSUE_LETTER_EXPIRE_DURATION: Long = 15.minutes.toLong(DurationUnit.MILLISECONDS)
109114
}
110115

111116
enum class HttpLoggingLevel {

sdk/src/main/java/com/sendsay/sdk/models/TrackSSECBuilders.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sendsay.sdk.models
22

3+
import com.sendsay.sdk.Sendsay.getPushNotificationRepository
34
import com.sendsay.sdk.preferences.SendsayPreferencesImpl
45
import com.sendsay.sdk.repository.PushNotificationRepositoryImpl
56
import com.sendsay.sdk.repository.PushNotificationRepositoryImpl.Companion.KEY_ISSUE
@@ -260,7 +261,7 @@ internal class TrackSSECDataCore(private val type: TrackingSSECType) {
260261
private var subscriptionDelete: List<Int>? = null
261262
private var subscriptionClear: Int? = null
262263

263-
fun setIssueLetter(
264+
private fun setIssueLetter(
264265
issue: Int? = null,
265266
letter: Int? = null,
266267
issueDt: String? = null,
@@ -442,11 +443,12 @@ internal class TrackSSECDataCore(private val type: TrackingSSECType) {
442443
val formattedPaymentDt = paymentDt
443444

444445
// Передача данных о выпуске CDP Sendsay (Redmine 14014)
445-
val prefs =
446-
PushNotificationRepositoryImpl(SendsayPreferencesImpl(SendsayContextProvider.applicationContext!!)).getExtraData() as HashMap<String, Any>
446+
val prefs = getPushNotificationRepository()?.getExtraData() as? HashMap<String, Any>
447+
// val prefs =
448+
// PushNotificationRepositoryImpl(SendsayPreferencesImpl(SendsayContextProvider.applicationContext!!)).getExtraData() as? HashMap<String, Any>
447449
setIssueLetter(
448-
issue = (prefs.entries.find { it.key == KEY_ISSUE }?.value as String).toIntOrNull() ?: -1,
449-
letter = (prefs.entries.find { it.key == KEY_LETTER }?.value as String).toIntOrNull() ?: -1,
450+
issue = (prefs?.entries?.find { it.key == KEY_ISSUE }?.value as String?)?.toIntOrNull(), // ?: -1,
451+
letter = (prefs?.entries?.find { it.key == KEY_LETTER }?.value as String?)?.toIntOrNull(), //?: -1,
450452
// issueDt = prefs.entries.find { it.key == KEY_ISSUE_LETTER_DATETIME_DATA_UTC }?.value as String
451453
)
452454

0 commit comments

Comments
 (0)