Skip to content

Commit

Permalink
Method to get Meta Install referrer
Browse files Browse the repository at this point in the history
  • Loading branch information
nsingh-branch committed Jan 12, 2024
1 parent 5d55d8d commit 01a9697
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 82 deletions.
7 changes: 7 additions & 0 deletions Branch-SDK/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0" >
<queries>
<package android:name="com.facebook.katana" />
</queries>

<queries>
<package android:name="com.instagram.android" />
</queries>
</manifest>
108 changes: 103 additions & 5 deletions Branch-SDK/src/main/java/io/branch/coroutines/InstallReferrers.kt
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
package io.branch.coroutines

import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.RemoteException
import android.util.Log
import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener
import io.branch.data.InstallReferrerResult
import io.branch.referral.AppStoreReferrer
import io.branch.referral.BranchLogger
import io.branch.referral.Defines.Jsonkey
import io.branch.referral.PrefHelper
import io.branch.referral.util.classExists
import io.branch.referral.util.huaweiInstallReferrerClass
import io.branch.referral.util.samsungInstallReferrerClass
import io.branch.referral.util.xiaomiInstallReferrerClass
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.supervisorScope
import kotlinx.coroutines.withContext
import org.json.JSONObject

suspend fun getGooglePlayStoreReferrerDetails(context: Context): InstallReferrerResult? {
return withContext(Dispatchers.Default) {
Expand Down Expand Up @@ -230,6 +229,104 @@ suspend fun getXiaomiGetAppsReferrerDetails(context: Context): InstallReferrerRe
}
}

suspend fun getMetaInstallReferrerDetails(context: Context): InstallReferrerResult? {
BranchLogger.d("MetaTest: Calling getMetaInstallReferrerDetails")
return withContext(Dispatchers.Default) {
try {
val deferredReferrerDetails = CompletableDeferred<InstallReferrerResult?>()
val fbAppID = context.getString(
context.resources.getIdentifier(
"facebook_app_id",
"string",
context.packageName
)
)

if (fbAppID.isNullOrEmpty()) {
deferredReferrerDetails.complete(null)
}

val referrerData = queryMetaInstallReferrer(context, fbAppID)
BranchLogger.d("MetaTest: getMetaInstallReferrerDetails got referrerData: $referrerData")

if (referrerData != null) {
deferredReferrerDetails.complete(
try {
referrerData
} catch (e: Exception) {
BranchLogger.d("Error processing Meta Install Referrer: $e")
null
}
)
} else {
deferredReferrerDetails.complete(null)
}

deferredReferrerDetails.await()
} catch (exception: Exception) {
BranchLogger.d("Exception in getMetaInstallReferrerDetails: $exception")
null
}
}
}

fun queryMetaInstallReferrer(context: Context, fbAppId: String): InstallReferrerResult? {
var cursor: Cursor? = null
try {
val projection = arrayOf("install_referrer", "is_ct", "actual_timestamp")
var providerUri: Uri? = null

if (context.packageManager.resolveContentProvider(
"com.facebook.katana.provider.InstallReferrerProvider", 0
) != null
) {
providerUri = Uri.parse(
"content://com.facebook.katana.provider.InstallReferrerProvider/$fbAppId"
);
} else if (context.packageManager.resolveContentProvider(
"com.instagram.contentprovider.InstallReferrerProvider", 0
) != null
) {
providerUri = Uri.parse(
"content://com.instagram.contentprovider.InstallReferrerProvider/$fbAppId"
);
} else {
return null;
}

cursor = context.contentResolver.query(providerUri, projection, null, null, null)
if (cursor == null || !cursor.moveToFirst()) {
return null
}

val installReferrerIndex: Int = cursor.getColumnIndex("install_referrer")
val timestampIndex: Int = cursor.getColumnIndex("actual_timestamp")
val isClickThroughIndex: Int = cursor.getColumnIndex("is_ct")

val actualTimestamp: Long =
cursor.getLong(timestampIndex)
val isClickThrough: Int = cursor.getInt(isClickThroughIndex);

val installReferrerString = cursor.getString(installReferrerIndex);
val installReferrerJson = JSONObject(installReferrerString)
val utmContentJson = installReferrerJson.getJSONObject("install_referrer").getJSONObject("utm_content")
val installTimestamp = utmContentJson.getLong("t")

return InstallReferrerResult(
Jsonkey.Meta_Install_Referrer.key,
installTimestamp,
installReferrerString,
actualTimestamp
)
} catch (e: Exception) {
return null
} finally {
cursor?.close()
}
}



/**
* Invokes the source install referrer's coroutines in parallel.
* Await all and then do list operations
Expand All @@ -240,8 +337,9 @@ suspend fun fetchLatestInstallReferrer(context: Context): InstallReferrerResult?
val huaweiReferrer = async { getHuaweiAppGalleryReferrerDetails(context) }
val samsungReferrer = async { getSamsungGalaxyStoreReferrerDetails(context) }
val xiaomiReferrer = async { getXiaomiGetAppsReferrerDetails(context) }
val metaReferrer = async { getMetaInstallReferrerDetails(context) }

val allReferrers: List<InstallReferrerResult?> = listOf(googleReferrer.await(), huaweiReferrer.await(), samsungReferrer.await(), xiaomiReferrer.await())
val allReferrers: List<InstallReferrerResult?> = listOf(googleReferrer.await(), huaweiReferrer.await(), samsungReferrer.await(), xiaomiReferrer.await(), metaReferrer.await())
val latestReferrer = getLatestValidReferrerStore(allReferrers)

latestReferrer
Expand Down

This file was deleted.

3 changes: 2 additions & 1 deletion Branch-SDK/src/main/java/io/branch/referral/Defines.java
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ public enum Jsonkey {
Google_Play_Store("PlayStore"),
Huawei_App_Gallery("AppGallery"),
Samsung_Galaxy_Store("GalaxyStore"),
Xiaomi_Get_Apps("GetApps");
Xiaomi_Get_Apps("GetApps"),
Meta_Install_Referrer("MetaInstallReferrer");

private final String key;

Expand Down

0 comments on commit 01a9697

Please sign in to comment.