diff --git a/data/build.gradle b/data/build.gradle index e023ae7a..d4803080 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -82,6 +82,7 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-reactive:$coroutines_version" + implementation 'com.android.installreferrer:installreferrer:1.1' implementation 'com.callcontrol:datashare:1.2.0' implementation "com.f2prateek.rx.preferences2:rx-preferences:$rx_preferences_version" implementation "com.jakewharton.timber:timber:$timber_version" diff --git a/data/src/main/java/com/moez/QKSMS/manager/ReferralManagerImpl.kt b/data/src/main/java/com/moez/QKSMS/manager/ReferralManagerImpl.kt new file mode 100644 index 00000000..4446d674 --- /dev/null +++ b/data/src/main/java/com/moez/QKSMS/manager/ReferralManagerImpl.kt @@ -0,0 +1,57 @@ +package com.moez.QKSMS.manager + +import android.content.Context +import com.android.installreferrer.api.InstallReferrerClient +import com.android.installreferrer.api.InstallReferrerStateListener +import com.moez.QKSMS.util.Preferences +import kotlinx.coroutines.suspendCancellableCoroutine +import javax.inject.Inject +import kotlin.coroutines.resume + +class ReferralManagerImpl @Inject constructor( + private val analytics: AnalyticsManager, + private val context: Context, + private val prefs: Preferences +) : ReferralManager { + + override suspend fun trackReferrer() { + if (prefs.didSetReferrer.get()) { + return + } + + context.packageManager.getInstallerPackageName(context.packageName)?.let { installer -> + analytics.setUserProperty("Installer", installer) + } + + val referrerClient = InstallReferrerClient.newBuilder(context).build() + val responseCode = suspendCancellableCoroutine { cont -> + referrerClient.startConnection(object : InstallReferrerStateListener { + override fun onInstallReferrerSetupFinished(responseCode: Int) { + cont.resume(responseCode) + } + + override fun onInstallReferrerServiceDisconnected() { + cont.resume(InstallReferrerClient.InstallReferrerResponse.SERVICE_DISCONNECTED) + } + }) + + cont.invokeOnCancellation { + referrerClient.endConnection() + } + } + + when (responseCode) { + InstallReferrerClient.InstallReferrerResponse.OK -> { + analytics.setUserProperty("Referrer", referrerClient.installReferrer.installReferrer) + prefs.didSetReferrer.set(true) + } + + InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED -> { + prefs.didSetReferrer.set(true) + } + } + + referrerClient.endConnection() + } + +} diff --git a/domain/src/main/java/com/moez/QKSMS/manager/ReferralManager.kt b/domain/src/main/java/com/moez/QKSMS/manager/ReferralManager.kt new file mode 100644 index 00000000..30bcfff4 --- /dev/null +++ b/domain/src/main/java/com/moez/QKSMS/manager/ReferralManager.kt @@ -0,0 +1,7 @@ +package com.moez.QKSMS.manager + +interface ReferralManager { + + suspend fun trackReferrer() + +} diff --git a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt index f21adcc9..dbb79612 100644 --- a/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/domain/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -75,6 +75,7 @@ class Preferences @Inject constructor( } // Internal + val didSetReferrer = rxPrefs.getBoolean("didSetReferrer", false) val night = rxPrefs.getBoolean("night", false) val canUseSubId = rxPrefs.getBoolean("canUseSubId", true) val version = rxPrefs.getInteger("version", context.versionCode) diff --git a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt index 57208769..723a8b4f 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/QKApplication.kt @@ -31,6 +31,7 @@ import com.moez.QKSMS.common.util.FileLoggingTree import com.moez.QKSMS.injection.AppComponentManager import com.moez.QKSMS.injection.appComponent import com.moez.QKSMS.manager.AnalyticsManager +import com.moez.QKSMS.manager.ReferralManager import com.moez.QKSMS.migration.QkMigration import com.moez.QKSMS.migration.QkRealmMigration import com.moez.QKSMS.util.NightModeManager @@ -43,6 +44,9 @@ import dagger.android.HasBroadcastReceiverInjector import dagger.android.HasServiceInjector import io.realm.Realm import io.realm.RealmConfiguration +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -62,6 +66,7 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn @Inject lateinit var fileLoggingTree: FileLoggingTree @Inject lateinit var nightModeManager: NightModeManager @Inject lateinit var realmMigration: QkRealmMigration + @Inject lateinit var referralManager: ReferralManager override fun onCreate() { super.onCreate() @@ -76,8 +81,8 @@ class QKApplication : Application(), HasActivityInjector, HasBroadcastReceiverIn .schemaVersion(QkRealmMigration.SchemaVersion) .build()) - packageManager.getInstallerPackageName(packageName)?.let { installer -> - analyticsManager.setUserProperty("Installer", installer) + GlobalScope.launch(Dispatchers.IO) { + referralManager.trackReferrer() } nightModeManager.updateCurrentTheme() diff --git a/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt b/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt index ee8e75b5..0350da76 100644 --- a/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt +++ b/presentation/src/main/java/com/moez/QKSMS/injection/AppModule.kt @@ -48,6 +48,8 @@ import com.moez.QKSMS.manager.NotificationManager import com.moez.QKSMS.manager.PermissionManager import com.moez.QKSMS.manager.PermissionManagerImpl import com.moez.QKSMS.manager.RatingManager +import com.moez.QKSMS.manager.ReferralManager +import com.moez.QKSMS.manager.ReferralManagerImpl import com.moez.QKSMS.manager.ShortcutManager import com.moez.QKSMS.manager.WidgetManager import com.moez.QKSMS.manager.WidgetManagerImpl @@ -160,6 +162,9 @@ class AppModule(private var application: Application) { @Provides fun provideShortcutManager(manager: ShortcutManagerImpl): ShortcutManager = manager + @Provides + fun provideReferralManager(manager: ReferralManagerImpl): ReferralManager = manager + @Provides fun provideWidgetManager(manager: WidgetManagerImpl): WidgetManager = manager