Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.8.10'
ext.kotlin_version = '2.0.20'
if (!project.hasProperty('version') || project.version.equals('unspecified')) {
project.version = '+'
}
Expand All @@ -9,16 +9,17 @@ buildscript {
mavenLocal()
mavenCentral()
}

dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
classpath 'com.android.tools.build:gradle:8.1.4'
classpath 'com.mparticle:android-kit-plugin:' + project.version
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

plugins {
id "org.sonarqube" version "3.5.0.2730"
id "org.jlleitschuh.gradle.ktlint" version "11.2.0"
id "org.jlleitschuh.gradle.ktlint" version "13.0.0"
}

sonarqube {
Expand All @@ -30,8 +31,30 @@ sonarqube {
}

apply plugin: 'org.jlleitschuh.gradle.ktlint'
apply plugin: 'com.mparticle.kit'
apply plugin: 'kotlin-android'
apply plugin: 'com.mparticle.kit'

android {
namespace 'com.mparticle.kits.skyhook'
buildFeatures {
buildConfig = true
}
defaultConfig {
minSdkVersion 21
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
testOptions {
unitTests.all {
jvmArgs += ['--add-opens', 'java.base/java.lang=ALL-UNNAMED']
}
}
}

dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
3 changes: 1 addition & 2 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<manifest package="com.mparticle.kits.skyhook" xmlns:android="http://schemas.android.com/apk/res/android">

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Expand Down
25 changes: 18 additions & 7 deletions src/main/kotlin/com/mparticle/kits/SkyhookBootReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,20 @@ import android.content.Intent
import com.mparticle.kits.SkyhookLog.e
import com.mparticle.kits.SkyhookLog.i
import com.skyhookwireless.accelerator.AcceleratorClient
import com.skyhookwireless.accelerator.AcceleratorClient.*
import com.skyhookwireless.accelerator.AcceleratorClient.ConnectionCallbacks
import com.skyhookwireless.accelerator.AcceleratorClient.OnConnectionFailedListener
import com.skyhookwireless.accelerator.AcceleratorClient.OnRegisterForCampaignMonitoringResultListener
import com.skyhookwireless.accelerator.AcceleratorStatusCodes

class SkyhookBootReceiver : BroadcastReceiver(), ConnectionCallbacks, OnConnectionFailedListener,
class SkyhookBootReceiver :
BroadcastReceiver(),
ConnectionCallbacks,
OnConnectionFailedListener,
OnRegisterForCampaignMonitoringResultListener {
override fun onReceive(context: Context, intent: Intent) {
override fun onReceive(
context: Context,
intent: Intent,
) {
val apiKey = SkyhookPreferences(context).apiKey
if (apiKey == null || apiKey == "") {
e("not resuming monitoring after reboot")
Expand All @@ -26,14 +34,14 @@ class SkyhookBootReceiver : BroadcastReceiver(), ConnectionCallbacks, OnConnecti
context,
0,
serviceIntent,
PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_MUTABLE,
)
} else {
PendingIntent.getService(
context,
0,
serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT
PendingIntent.FLAG_UPDATE_CURRENT,
)
}
i("resuming monitoring after reboot")
Expand All @@ -42,16 +50,19 @@ class SkyhookBootReceiver : BroadcastReceiver(), ConnectionCallbacks, OnConnecti
}

override fun onConnected() {}

override fun onDisconnected() {}

override fun onConnectionFailed(errorCode: Int) {}

override fun onRegisterForCampaignMonitoringResult(
statusCode: Int,
pendingIntent: PendingIntent
pendingIntent: PendingIntent,
) {
if (statusCode == AcceleratorStatusCodes.SUCCESS) {
i("resumed monitoring after reboot")
} else {
e("failed to resume monitoring after reboot: $statusCode")
}
}
}
}
17 changes: 9 additions & 8 deletions src/main/kotlin/com/mparticle/kits/SkyhookIntentService.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package com.mparticle.kits

import com.mparticle.kits.SkyhookLog.i
import com.mparticle.kits.SkyhookLog.e
import android.app.IntentService
import android.content.Intent
import com.skyhookwireless.accelerator.CampaignVenue
import com.skyhookwireless.accelerator.AcceleratorClient
import com.mparticle.kits.SkyhookLog
import com.mparticle.kits.SkyhookLog.e
import com.mparticle.kits.SkyhookLog.i
import com.skyhookwireless.accelerator.AcceleratorClient
import com.skyhookwireless.accelerator.CampaignVenue

class SkyhookIntentService : IntentService("com.mparticle.kits.SkyhookIntentService") {
override fun onHandleIntent(intent: Intent?) {
val campaignVenue = AcceleratorClient.getTriggeringCampaignVenue(intent)
if (campaignVenue != null) {
when (AcceleratorClient.getCampaignVenueTransition(intent)) {
CampaignVenue.CAMPAIGN_VENUE_TRANSITION_ENTER -> i(
"entered: $campaignVenue"
)
CampaignVenue.CAMPAIGN_VENUE_TRANSITION_ENTER ->
i(
"entered: $campaignVenue",
)
CampaignVenue.CAMPAIGN_VENUE_TRANSITION_EXIT -> i("exited: $campaignVenue")
else -> e("unknown trigger type: $campaignVenue")
}
Expand All @@ -25,4 +26,4 @@ class SkyhookIntentService : IntentService("com.mparticle.kits.SkyhookIntentServ
e("unknown intent type: $intent")
}
}
}
}
83 changes: 47 additions & 36 deletions src/main/kotlin/com/mparticle/kits/SkyhookKit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,53 @@ import android.os.Bundle
import com.mparticle.internal.MPUtility
import com.mparticle.kits.KitIntegration.ActivityListener
import com.skyhookwireless.accelerator.AcceleratorClient
import com.skyhookwireless.accelerator.AcceleratorClient.*
import com.skyhookwireless.accelerator.AcceleratorClient.ConnectionCallbacks
import com.skyhookwireless.accelerator.AcceleratorClient.OnConnectionFailedListener
import com.skyhookwireless.accelerator.AcceleratorClient.OnRegisterForCampaignMonitoringResultListener
import com.skyhookwireless.accelerator.AcceleratorClient.OnStartCampaignMonitoringResultListener
import com.skyhookwireless.accelerator.AcceleratorClient.OnStopCampaignMonitoringResultListener
import com.skyhookwireless.accelerator.AcceleratorStatusCodes

class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,
OnConnectionFailedListener, OnRegisterForCampaignMonitoringResultListener,
OnStartCampaignMonitoringResultListener, OnStopCampaignMonitoringResultListener {
private var _client: AcceleratorClient? = null
private var _isInitialized = false
private var _isRegistered = false
private var _preferences: SkyhookPreferences? = null
class SkyhookKit :
KitIntegration(),
ActivityListener,
ConnectionCallbacks,
OnConnectionFailedListener,
OnRegisterForCampaignMonitoringResultListener,
OnStartCampaignMonitoringResultListener,
OnStopCampaignMonitoringResultListener {
private var client: AcceleratorClient? = null
private var isInitialized = false
private var isRegistered = false
private var preferences: SkyhookPreferences? = null

override fun getName(): String = KIT_NAME

override fun onKitCreate(
settings: Map<String, String>,
context: Context
context: Context,
): List<ReportingMessage> {
SkyhookLog.d(ON_KIT_CREATE)
val apiKey = settings[API_KEY]
_preferences = SkyhookPreferences(context)
_preferences?.apiKey = apiKey
_client = AcceleratorClient(context, apiKey, this, this)
SkyhookLog.i(ACCELERATOR_SDK_VERSION + _client?.version)
preferences = SkyhookPreferences(context)
preferences?.apiKey = apiKey
client = AcceleratorClient(context, apiKey, this, this)
SkyhookLog.i(ACCELERATOR_SDK_VERSION + client?.version)
initialize()
return emptyList()
}

override fun onKitDestroy() {
SkyhookLog.d(ON_KIT_DESTROY_MESSAGE)
shutdown()
_preferences?.clearApiKey()
preferences?.clearApiKey()
SkyhookLog.d(DESTROYED_MESSAGE)
}

override fun onSettingsUpdated(settings: Map<String, String>) {
SkyhookLog.d(ON_SETTINGS_UPDATED_MESSAGE)
val newApiKey = settings[API_KEY]
when (_preferences?.apiKey) {
when (preferences?.apiKey) {
null -> {
SkyhookLog.i(NOT_RUNNING_MESSAGE)
}
Expand All @@ -56,7 +65,7 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,
else -> {
SkyhookLog.i(SHUTTING_DOWN_CHANGED_KEY_MESSAGE)
shutdown()
_preferences!!.clearApiKey()
preferences!!.clearApiKey()
}
}
}
Expand All @@ -65,7 +74,7 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,

override fun onConnected() {
SkyhookLog.d(CONNECTED_MESSAGE)
_client?.registerForCampaignMonitoring(getServiceIntent(context), this)
client?.registerForCampaignMonitoring(getServiceIntent(context), this)
}

override fun onDisconnected() {
Expand All @@ -78,19 +87,19 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,

override fun onRegisterForCampaignMonitoringResult(
statusCode: Int,
pendingIntent: PendingIntent
pendingIntent: PendingIntent,
) {
if (statusCode == AcceleratorStatusCodes.SUCCESS) {
_isRegistered = true
_client?.startMonitoringForAllCampaigns(this)
isRegistered = true
client?.startMonitoringForAllCampaigns(this)
} else {
SkyhookLog.e("failed to register: $statusCode")
}
}

override fun onStartCampaignMonitoringResult(
statusCode: Int,
campaignName: String
campaignName: String,
) {
if (statusCode == AcceleratorStatusCodes.SUCCESS) {
SkyhookLog.i("monitoring started")
Expand All @@ -101,7 +110,7 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,

override fun onStopCampaignMonitoringResult(
statusCode: Int,
campaignName: String
campaignName: String,
) {
if (statusCode == AcceleratorStatusCodes.SUCCESS) {
SkyhookLog.i("monitoring stopped")
Expand All @@ -110,8 +119,10 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,
}
}

override fun onActivityCreated(activity: Activity, bundle: Bundle?): List<ReportingMessage> =
emptyList()
override fun onActivityCreated(
activity: Activity,
bundle: Bundle?,
): List<ReportingMessage> = emptyList()

override fun onActivityStarted(activity: Activity): List<ReportingMessage> = emptyList()

Expand All @@ -133,39 +144,39 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,

override fun onActivitySaveInstanceState(
activity: Activity,
bundle: Bundle?
bundle: Bundle?,
): List<ReportingMessage> = emptyList()

override fun onActivityDestroyed(activity: Activity): List<ReportingMessage> = emptyList()

private fun initialize() {
if (_client == null || _isInitialized) {
if (client == null || isInitialized) {
return
}
if (MPUtility.checkPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
SkyhookLog.i(LOCATION_PERMISSION_GRANTED_MESSAGE)
_client?.connect()
_isInitialized = true
client?.connect()
isInitialized = true
} else {
SkyhookLog.i(LOCATION_PERMISSION_NOT_GRANTED_MESSAGE)
}
}

private fun shutdown() {
_client?.let { _client ->
if (_client.isConnected) {
client?.let { client ->
if (client.isConnected) {
return
} else if (_isRegistered) {
_client.stopMonitoringForAllCampaigns(this)
} else if (isRegistered) {
client.stopMonitoringForAllCampaigns(this)
}
_client.disconnect()
client.disconnect()
} ?: return
}

companion object {
private const val API_KEY = "apiKey"
private const val KIT_NAME = "Skyhook"
private const val NOT_RUNNING_MESSAGE ="not running"
private const val NOT_RUNNING_MESSAGE = "not running"
private const val ON_KIT_CREATE = "onKitCreate"
private const val ACCELERATOR_SDK_VERSION = "Accelerator SDK v"
private const val ON_KIT_DESTROY_MESSAGE = "onKitDestroy"
Expand All @@ -187,14 +198,14 @@ class SkyhookKit : KitIntegration(), ActivityListener, ConnectionCallbacks,
context,
0,
serviceIntent,
PendingIntent.FLAG_MUTABLE
PendingIntent.FLAG_MUTABLE,
)
} else {
PendingIntent.getService(
context,
0,
serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT
PendingIntent.FLAG_UPDATE_CURRENT,
)
}
return pendingIntent
Expand Down
3 changes: 2 additions & 1 deletion src/main/kotlin/com/mparticle/kits/SkyhookLog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.mparticle.MParticle

internal object SkyhookLog {
private const val TAG = "mParticle Skyhook Kit"

fun d(msg: String) {
if (isEnabled) {
Log.d(TAG, msg)
Expand All @@ -26,5 +27,5 @@ internal object SkyhookLog {
}

private val isEnabled: Boolean
get() = MParticle.getInstance()!!.environment == MParticle.Environment.Development
get() = MParticle.getInstance()!!.environment == MParticle.Environment.Development
}
Loading