Skip to content

Commit 66090ff

Browse files
committed
Merge branch 'release/1.5.2'
2 parents 0739869 + aff365e commit 66090ff

File tree

9 files changed

+144
-82
lines changed

9 files changed

+144
-82
lines changed

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
plugins {
3-
id 'com.android.application' version '7.3.0' apply false
4-
id 'com.android.library' version '7.3.0' apply false
5-
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
3+
id 'com.android.application' version '7.4.1' apply false
4+
id 'com.android.library' version '7.4.1' apply false
5+
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
66
}
77

88
task clean(type: Delete) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#Thu Mar 17 18:19:13 ICT 2022
22
distributionBase=GRADLE_USER_HOME
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
44
distributionPath=wrapper/dists
55
zipStorePath=wrapper/dists
66
zipStoreBase=GRADLE_USER_HOME

pam-android-kotlin/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ android {
3838

3939
dependencies {
4040
implementation 'androidx.core:core-ktx:1.9.0'
41-
implementation 'androidx.appcompat:appcompat:1.5.1'
42-
implementation 'com.google.android.material:material:1.6.1'
41+
implementation 'androidx.appcompat:appcompat:1.6.1'
42+
implementation 'com.google.android.material:material:1.8.0'
4343
testImplementation 'junit:junit:4.13.2'
44-
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
45-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
44+
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
45+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
4646
implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.10"
47-
implementation 'com.google.firebase:firebase-messaging-ktx:23.1.0'
47+
implementation 'com.google.firebase:firebase-messaging-ktx:23.1.2'
4848
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
4949
implementation 'com.google.code.gson:gson:2.9.0'
5050
implementation ('com.github.mrmike:ok2curl:0.7.0'){
@@ -60,5 +60,5 @@ dependencies {
6060
testImplementation('org.threeten:threetenbp:1.4.2') {
6161
exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
6262
}
63-
testImplementation "androidx.test:core-ktx:1.4.0"
63+
testImplementation "androidx.test:core-ktx:1.5.0"
6464
}

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/Pam.kt

Lines changed: 74 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ import com.jakewharton.threetenabp.AndroidThreeTen
2626
import kotlinx.coroutines.*
2727
import java.util.*
2828

29+
30+
data class AppVersionInfo(
31+
val platformVersion: String?,
32+
val appVersion: String?,
33+
val osVersion: String?
34+
)
35+
2936
data class PamResponse(
3037
@SerializedName("code") val code: String? = null,
3138
@SerializedName("message") val message: String? = null,
@@ -149,43 +156,37 @@ class Pam {
149156
shared.allowTracking = false
150157
}
151158

152-
fun initialize(application: Application, enableLog: Boolean = false) {
153-
AndroidThreeTen.init(application)
154-
155-
shared.allowTracking = shared.readBoolValue(SaveKey.AllowTracking) ?: false
156-
157-
shared.isLogEnable = enableLog
158-
shared.app = application
159-
160-
val config = application.packageManager.getApplicationInfo(
161-
application.packageName,
162-
PackageManager.GET_META_DATA
163-
)
164-
165-
var pamServer = config.metaData.get("pam-server").toString()
166-
if (pamServer.endsWith("/")) {
167-
while(pamServer.endsWith("/")){
168-
pamServer = pamServer.dropLast(1)
169-
}
159+
private fun getPamOption(application: Application):PamOption {
160+
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
161+
val flag = PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
162+
application.packageManager.getApplicationInfo(application.packageName, flag).metaData
163+
} else {
164+
@Suppress("DEPRECATION") application.packageManager.getApplicationInfo(application.packageName, PackageManager.GET_META_DATA).metaData
170165
}
171166

172-
config.metaData.get("pam-tracking-consent-message-id")
167+
val pamServer = info.getString("pam-server") ?: ""
168+
val trackingConsentMessageID = info.getString( "pam-tracking-consent-message-id") ?: ""
169+
val publicDBAlias = info.getString("public-db-alias") ?: ""
170+
val loginDBAlias = info.getString("login-db-alias") ?: ""
171+
val trackingConsentMessageInterval = info.getString("pam-tracking-consent-message-interval")
173172

174-
val publicDBAlias = config.metaData.get("public-db-alias").toString()
175-
val loginDBAlias = config.metaData.get("login-db-alias").toString()
176-
val teckingConsentMessageID =
177-
config.metaData.get("pam-tracking-consent-message-id").toString()
178-
val trackingConsentInterval = (config.metaData.get("pam-tracking-consent-message-interval") ?: "150").toString().toLong()
173+
val interval = trackingConsentMessageInterval?.toLong() ?: 20000
179174

180-
181-
shared.options = PamOption(
182-
pamServer = pamServer,
183-
publicDbAlias = publicDBAlias,
184-
loginDbAlias = loginDBAlias,
185-
trackingConsentMessageID = teckingConsentMessageID,
186-
trackingConsentInterval = trackingConsentInterval
175+
return PamOption(
176+
pamServer=pamServer,
177+
publicDbAlias=publicDBAlias,
178+
loginDbAlias=loginDBAlias,
179+
trackingConsentMessageID= trackingConsentMessageID,
180+
trackingConsentInterval=interval,
187181
)
182+
}
188183

184+
fun initialize(application: Application, enableLog: Boolean = false) {
185+
AndroidThreeTen.init(application)
186+
shared.allowTracking = shared.readBoolValue(SaveKey.AllowTracking) ?: false
187+
shared.isLogEnable = enableLog
188+
shared.app = application
189+
shared.options = Pam.getPamOption(application)
189190
}
190191

191192
fun track(
@@ -259,9 +260,8 @@ class Pam {
259260
var onMessageListener = mutableListOf<ListenerFunction>()
260261
var pendingMessage = mutableListOf<Map<String, Any>>()
261262

262-
private var platformVersionCache: String? = null
263-
private var osVersionCache: String? = null
264-
private var appVersionCache: String? = null
263+
private var appVersionInfoCache: AppVersionInfo? = null
264+
265265
private var publicContactID: String? = null
266266
private var loginContactID: String? = null
267267
private var custID: String? = null
@@ -582,30 +582,58 @@ class Pam {
582582
return custID != null
583583
}
584584

585+
586+
private fun getAppVersion(application: Application?): AppVersionInfo? {
587+
if(application == null){
588+
return null
589+
}
590+
591+
if ( appVersionInfoCache != null) {
592+
return appVersionInfoCache
593+
}
594+
595+
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
596+
val flag = PackageManager.PackageInfoFlags.of(0)
597+
application.packageManager.getPackageInfo(application.packageName, flag)
598+
} else {
599+
@Suppress("DEPRECATION") application.packageManager.getPackageInfo(application.packageName, 0)
600+
}
601+
602+
val packageName = application.packageName ?: ""
603+
val appVersion = "$packageName (${info?.versionName ?: ""})"
604+
val osVersion = "Android: ${Build.VERSION.SDK_INT}"
605+
606+
val platformVersion =
607+
"Android: ${Build.VERSION.SDK_INT} (${Build.VERSION.RELEASE}), $packageName: $appVersion"
608+
609+
appVersionInfoCache = AppVersionInfo(
610+
platformVersion=platformVersion,
611+
appVersion = appVersion,
612+
osVersion = osVersion
613+
)
614+
615+
return appVersionInfoCache
616+
}
617+
585618
private fun buildPayload(
586619
eventName: String,
587620
payload: Map<String, Any>? = null,
588621
trackingConsentMessageID: String? = null
589622
): Map<String, Any> {
590623

591-
if (platformVersionCache == null) {
592-
val pInfo = app?.packageManager?.getPackageInfo(app?.packageName ?: "", 0)
593-
val packageName = app?.packageName ?: ""
594-
appVersionCache = "$packageName (${pInfo?.versionName ?: ""})"
595-
osVersionCache = "Android: ${Build.VERSION.SDK_INT}"
596-
597-
platformVersionCache =
598-
"Android: ${Build.VERSION.SDK_INT} (${Build.VERSION.RELEASE}), $packageName: $appVersionCache"
599-
}
624+
val appVersionInfo = getAppVersion(app)
625+
val platformVersion = appVersionInfo?.platformVersion ?: ""
626+
val osVersion = appVersionInfo?.osVersion ?: ""
627+
val appVersion = appVersionInfo?.appVersion ?: ""
600628

601629
val body = mutableMapOf<String, Any>(
602630
"event" to eventName,
603-
"platform" to (platformVersionCache ?: ""),
631+
"platform" to platformVersion,
604632
)
605633

606634
val formField = mutableMapOf<String, Any>(
607-
"os_version" to (osVersionCache ?: ""),
608-
"app_version" to (appVersionCache ?: ""),
635+
"os_version" to osVersion ,
636+
"app_version" to appVersion ,
609637
"_session_id" to getSessionID()
610638
)
611639

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/api/ConsentAPI.kt

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import android.util.Log
1212
import kotlinx.coroutines.CoroutineScope
1313
import kotlinx.coroutines.Dispatchers
1414
import kotlinx.coroutines.launch
15+
import org.json.JSONException
1516
import org.json.JSONObject
1617

1718
typealias OnLoadConsentMessage = (messages: Map<String, BaseConsentMessage>)->Unit
@@ -143,27 +144,41 @@ class ConsentAPI {
143144

144145
isLoading = true
145146
val pamServerURL = Pam.shared.options?.pamServer ?: ""
147+
146148
val contactID = Pam.shared.getContactID() ?: ""
147149

148-
Log.d("PAMHTTP","${pamServerURL}/contacts/$contactID/consents/$consentMessageID" )
150+
if(contactID == ""){
151+
startLoadPermissions()
152+
return
153+
}
154+
155+
if(Pam.shared.isLogEnable) {
156+
Log.d("PAMHTTP", "${pamServerURL}/contacts/$contactID/consents/$consentMessageID")
157+
}
149158

150159
Http.getInstance()
151160
.get("${pamServerURL}/contacts/$contactID/consents/$consentMessageID") { result, error ->
152161
Log.d("PAMHTTP","$result" )
153162
if (error == null) {
154163
if(result != null) {
155-
val json = JSONObject(result)
156-
val userConsent = UserConsentPermissions.parse(json)
157-
resultUserConsentLoad?.put(consentMessageID, userConsent)
158-
159-
Pam.shared.options?.trackingConsentMessageID?.let{ trackingConsentMessageID ->
160-
if(consentMessageID == trackingConsentMessageID){
161-
userConsent.permissions?.forEach { permission ->
162-
if(permission.name == ConsentPermissionName.PreferencesCookies ){
163-
Pam.shared.allowTracking = permission.allow
164+
try {
165+
val json = JSONObject(result)
166+
val userConsent = UserConsentPermissions.parse(json)
167+
resultUserConsentLoad?.put(consentMessageID, userConsent)
168+
169+
Pam.shared.options?.trackingConsentMessageID?.let { trackingConsentMessageID ->
170+
if (consentMessageID == trackingConsentMessageID) {
171+
userConsent.permissions?.forEach { permission ->
172+
if (permission.name == ConsentPermissionName.PreferencesCookies) {
173+
Pam.shared.allowTracking = permission.allow
174+
}
164175
}
165176
}
166177
}
178+
}catch (e: JSONException){
179+
if(Pam.shared.isLogEnable) {
180+
Log.d("PAMHTTP", e.localizedMessage ?: "")
181+
}
167182
}
168183
}
169184
}
@@ -197,9 +212,15 @@ class ConsentAPI {
197212
.get("${pamServerURL}/consent-message/$consentMessageID") { result, error ->
198213
if (error == null) {
199214
if(result != null) {
200-
val json = JSONObject(result)
201-
val consentMessage = ConsentMessage.parse(json)
202-
resultMessages?.put(consentMessageID, consentMessage)
215+
try{
216+
val json = JSONObject(result)
217+
val consentMessage = ConsentMessage.parse(json)
218+
resultMessages?.put(consentMessageID, consentMessage)
219+
}catch (e: JSONException){
220+
if(Pam.shared.isLogEnable) {
221+
Log.d("PAMHTTP", e.localizedMessage ?: "")
222+
}
223+
}
203224
}else{
204225
val msg = ConsentMessageError(
205226
errorMessage = "Empty Response From Server.",

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/flex/parser/FlexParser.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public class FlexParser(val context: Context?) {
2525
return textSize[sizeName.name] ?: 6
2626
}
2727

28-
public fun parse(flex: String): PContainer? {
29-
val flex = removingWhitespaces(flex)
28+
public fun parse(flexString: String): PContainer? {
29+
val flex = removingWhitespaces(flexString)
3030
var buffer = ""
3131
var root: PContainer? = null
3232
var currentElement: PView? = null

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/models/notification/NotificationIist.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package ai.pams.android.kotlin.models.notification
33
import ai.pams.android.kotlin.utils.DateUtils
44
import ai.pams.android.kotlin.utils.PAMUtils
55
import android.content.Context
6+
import org.json.JSONArray
67
import org.json.JSONException
78
import org.json.JSONObject
89

@@ -29,10 +30,10 @@ class NotificationList(
2930
return noti
3031
}
3132

32-
val itemsArray = json.optJSONArray("items")
33-
val count = itemsArray?.length() ?: 0
33+
val itemsArray = json.optJSONArray("items") ?: JSONArray()
34+
val count = itemsArray.length()
3435
for(i in 0 until count){
35-
itemsArray?.getJSONObject(i)?.let{ jsonItem->
36+
itemsArray.getJSONObject(i)?.let{ jsonItem->
3637

3738
val createdDate = jsonItem.optString("created_date")
3839

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/models/notification/NotificationItem.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@ package ai.pams.android.kotlin.models.notification
44
import ai.pams.android.kotlin.flex.parser.FlexParser
55
import ai.pams.android.kotlin.flex.parser.PImage
66
import ai.pams.android.kotlin.http.Http
7-
import ai.pams.android.kotlin.utils.DateUtils
87
import android.content.Context
9-
import android.os.Parcel
108
import android.os.Parcelable
119
import kotlinx.parcelize.IgnoredOnParcel
12-
import org.json.JSONObject
13-
import java.text.SimpleDateFormat
14-
import java.util.*
1510
import kotlinx.parcelize.Parcelize
1611
import kotlinx.parcelize.RawValue
12+
import java.util.*
1713

1814
@Parcelize
1915
data class NotificationItem(
@@ -29,7 +25,7 @@ data class NotificationItem(
2925
val url: String? = null,
3026
val popupType: String? = null,
3127
): Parcelable {
32-
var bannerUrl: String? = null
28+
@IgnoredOnParcel var bannerUrl: String? = null
3329

3430
@Deprecated("createdDate is deprecated use date instead.", ReplaceWith("date"))
3531
val createdDate: Date?

pam-android-kotlin/src/main/java/ai/pams/android/kotlin/utils/PAMUtils.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package ai.pams.android.kotlin.utils
22

3+
import ai.pams.android.kotlin.Pam
34
import ai.pams.android.kotlin.models.notification.NotificationItem
45
import android.content.Context
56
import android.content.Intent
7+
import android.util.Log
68
import com.google.firebase.messaging.RemoteMessage
9+
import org.json.JSONException
710
import org.json.JSONObject
811
import org.threeten.bp.LocalDateTime
912
import java.util.*
@@ -27,7 +30,15 @@ class PAMUtils {
2730
return when(remoteMessage.data.containsKey("pam")){
2831
true-> {
2932
val pam = remoteMessage.data["pam"] ?: "{}"
30-
val pamObj = JSONObject(pam)
33+
34+
val pamObj = try{
35+
JSONObject(pam)
36+
}catch (e: JSONException){
37+
if(Pam.shared.isLogEnable) {
38+
Log.d("PAMHTTP", e.localizedMessage ?: "")
39+
}
40+
JSONObject("{}")
41+
}
3142

3243
val payload = mutableMapOf<String, Any>()
3344
pamObj.keys().forEach { key->
@@ -71,7 +82,12 @@ class PAMUtils {
7182
val message = intent.extras?.getString("message")
7283

7384
val pam = intent.extras?.getString("pam") ?: "{}"
74-
val pamObj = JSONObject(pam)
85+
86+
val pamObj = try {
87+
JSONObject(pam)
88+
}catch (e: JSONException){
89+
return@readPamNotificationFromIntent null
90+
}
7591

7692
val payload = mutableMapOf<String, Any>()
7793
pamObj.keys().forEach { key->

0 commit comments

Comments
 (0)