Skip to content

Commit 78a7098

Browse files
author
Zilin Zhang
committed
Add AppLink support from Intent Extra
Summary: `al_applink_data` can be put in intent's bundle extra and we also need to support that Differential Revision: D62169805 fbshipit-source-id: d35a7ab1694a73ce16d34a806505efba48cf3494
1 parent dc54ece commit 78a7098

2 files changed

Lines changed: 48 additions & 10 deletions

File tree

facebook-core/src/main/java/com/facebook/appevents/internal/AppLinkManager.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ package com.facebook.appevents.internal
1111
import android.app.Activity
1212
import android.app.Application
1313
import android.content.Context
14+
import android.content.Intent
1415
import android.content.SharedPreferences
1516
import android.net.Uri
1617
import android.os.Bundle
18+
import android.util.Log
1719
import com.facebook.FacebookSdk
1820
import com.facebook.internal.instrument.crashshield.AutoHandleExceptions
1921
import org.json.JSONObject
@@ -44,16 +46,30 @@ class AppLinkManager private constructor() {
4446

4547
fun handleURL(activity: Activity) {
4648
val uri = activity.intent.data ?: return
47-
processCampaignIds(uri)
49+
processCampaignIds(uri, activity.intent)
4850
}
4951

50-
fun processCampaignIds(uri: Uri) {
51-
val applinkData = uri.getQueryParameter(APPLINK_DATA_KEY) ?: return
52+
fun processCampaignIds(uri: Uri, intent: Intent) {
53+
val campaignIDs = getCampaignIDFromUri(uri) ?: getCampaignIDFromIntentExtra(intent)
54+
if (campaignIDs != null) {
55+
preferences.edit().putString(CAMPAIGN_IDS_KEY, campaignIDs).apply()
56+
}
57+
}
58+
59+
fun getCampaignIDFromUri(uri: Uri): String? {
60+
val applinkData = uri.getQueryParameter(APPLINK_DATA_KEY) ?: return null
5261
try {
5362
val json = JSONObject(applinkData)
54-
val campaignIDs = json.getString(CAMPAIGN_IDS_KEY) ?: return
55-
preferences.edit().putString(CAMPAIGN_IDS_KEY, campaignIDs).apply()
56-
} catch (_: Exception) {}
63+
return json.getString(CAMPAIGN_IDS_KEY)
64+
} catch (_: Exception) {
65+
Log.d("AppLinkManager", "Fail to parse Applink data from Uri")
66+
}
67+
return null
68+
}
69+
70+
fun getCampaignIDFromIntentExtra(intent: Intent): String? {
71+
val applinkBundle = intent.getBundleExtra(APPLINK_DATA_KEY) ?: return null
72+
return applinkBundle.getString(CAMPAIGN_IDS_KEY)
5773
}
5874

5975
fun getInfo(key: String): String? {

facebook-core/src/test/kotlin/com/facebook/appevents/internal/AppLinkManagerTest.kt

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import android.content.Context
1313
import android.content.Intent
1414
import android.content.SharedPreferences
1515
import android.net.Uri
16+
import android.os.Bundle
1617
import com.facebook.FacebookPowerMockTestCase
1718
import com.facebook.FacebookSdk
1819
import com.facebook.MockSharedPreference
20+
import org.junit.After
1921
import org.junit.Before
2022
import org.junit.Test
2123
import org.mockito.kotlin.any
@@ -31,14 +33,16 @@ import kotlin.test.assertNull
3133
class AppLinkManagerTest: FacebookPowerMockTestCase() {
3234

3335
private lateinit var mockApplicationContext: Context
34-
private lateinit var mockSharedPreference: SharedPreferences
3536
private lateinit var mockActivity: Activity
3637

38+
companion object {
39+
private val mockSharedPreference: SharedPreferences = MockSharedPreference()
40+
}
41+
3742
@Before
3843
fun init() {
3944
mockActivity = mock()
4045
mockApplicationContext = mock()
41-
mockSharedPreference = MockSharedPreference()
4246
PowerMockito.mockStatic(FacebookSdk::class.java)
4347
whenever(FacebookSdk.isInitialized()).thenReturn(true)
4448
whenever(FacebookSdk.getApplicationId()).thenReturn("123456789")
@@ -47,6 +51,11 @@ class AppLinkManagerTest: FacebookPowerMockTestCase() {
4751
.thenReturn(mockSharedPreference)
4852
}
4953

54+
@After
55+
fun after() {
56+
mockSharedPreference.edit().clear()
57+
}
58+
5059
@Test
5160
fun testGetInstance() {
5261
assertNotNull(AppLinkManager.getInstance())
@@ -72,10 +81,23 @@ class AppLinkManagerTest: FacebookPowerMockTestCase() {
7281
}
7382

7483
@Test
75-
fun testHandleNonnullCampaignIDs() {
84+
fun testHandleNonnullCampaignIDsFromURL() {
7685
val intent = Intent()
77-
whenever(mockActivity.intent).thenReturn(intent)
7886
intent.setData(Uri.parse("fb123://test.com?al_applink_data=%7B%22acs_token%22%3A+%22test_token_1234567%22%2C+%22campaign_ids%22%3A+%22test_campaign_1234%22%2C+%22advertiser_id%22%3A+%22test_advertiserid_12345%22%7D"))
87+
whenever(mockActivity.intent).thenReturn(intent)
88+
AppLinkManager.getInstance()?.handleURL(mockActivity)
89+
90+
assertEquals("test_campaign_1234", mockSharedPreference.getString("campaign_ids", null))
91+
}
92+
93+
@Test
94+
fun testHandleNonnullCampaignIDsFromExtra() {
95+
val intent = Intent()
96+
val bundle = Bundle()
97+
bundle.putString("campaign_ids", "test_campaign_1234")
98+
intent.putExtra("al_applink_data", bundle)
99+
whenever(mockActivity.intent).thenReturn(intent)
100+
intent.setData(Uri.parse("fb123://test.com"))
79101
AppLinkManager.getInstance()?.handleURL(mockActivity)
80102

81103
assertEquals("test_campaign_1234", mockSharedPreference.getString("campaign_ids", null))

0 commit comments

Comments
 (0)