Skip to content

Commit 35ab8af

Browse files
authored
Add support for DynamicLinkData on app invite links. (#2519)
1 parent 187910b commit 35ab8af

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

firebase-dynamic-links/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ dependencies {
4242
// api project(':firebase-common-ktx')
4343
// api project(':firebase-components')
4444
api 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10'
45+
annotationProcessor project(':safe-parcel-processor')
4546
}
4647

4748
apply from: '../gradle/publish-android.gradle'

firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
import android.os.Parcel;
1111
import androidx.annotation.NonNull;
1212
import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable;
13+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable;
1314
import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter;
1415

1516
import android.os.Bundle;
1617
import android.net.Uri;
1718
import org.microg.gms.utils.ToStringHelper;
1819

20+
@SafeParcelable.Class
1921
public class DynamicLinkData extends AbstractSafeParcelable {
2022
@Field(1)
2123
public final String dynamicLink;
@@ -35,6 +37,7 @@ public class DynamicLinkData extends AbstractSafeParcelable {
3537
@Field(6)
3638
public final Uri redirectUrl;
3739

40+
@Constructor
3841
public DynamicLinkData(@Param(1) String dynamicLink, @Param(2) String deepLink, @Param(3) int minVersion, @Param(4) long clickTimestamp, @Param(5) Bundle extensionBundle, @Param(6) Uri redirectUrl) {
3942
this.dynamicLink = dynamicLink;
4043
this.deepLink = deepLink;

play-services-appinvite/core/src/main/kotlin/org/microg/gms/appinivite/AppInviteActivity.kt

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ import androidx.core.view.setPadding
2121
import androidx.lifecycle.lifecycleScope
2222
import com.android.volley.*
2323
import com.android.volley.toolbox.Volley
24+
import com.google.android.gms.common.internal.safeparcel.SafeParcelableSerializer
25+
import com.google.firebase.dynamiclinks.internal.DynamicLinkData
2426
import com.squareup.wire.Message
2527
import com.squareup.wire.ProtoAdapter
2628
import kotlinx.coroutines.CompletableDeferred
2729
import okio.ByteString.Companion.decodeHex
2830
import org.microg.gms.appinvite.*
2931
import org.microg.gms.common.Constants
3032
import org.microg.gms.utils.singleInstanceOf
31-
import org.microg.gms.utils.toBase64
3233
import java.util.*
3334

3435
private const val TAG = "AppInviteActivity"
@@ -37,6 +38,7 @@ private const val APPINVITE_DEEP_LINK = "com.google.android.gms.appinvite.DEEP_L
3738
private const val APPINVITE_INVITATION_ID = "com.google.android.gms.appinvite.INVITATION_ID"
3839
private const val APPINVITE_OPENED_FROM_PLAY_STORE = "com.google.android.gms.appinvite.OPENED_FROM_PLAY_STORE"
3940
private const val APPINVITE_REFERRAL_BUNDLE = "com.google.android.gms.appinvite.REFERRAL_BUNDLE"
41+
private const val DYNAMIC_LINK_DATA = "com.google.firebase.dynamiclinks.DYNAMIC_LINK_DATA"
4042

4143
class AppInviteActivity : AppCompatActivity() {
4244
private val queue by lazy { singleInstanceOf { Volley.newRequestQueue(applicationContext) } }
@@ -71,6 +73,8 @@ class AppInviteActivity : AppCompatActivity() {
7173
}
7274

7375
private fun open(appInviteLink: MutateAppInviteLinkResponse) {
76+
val dynamicLinkData = DynamicLinkData(appInviteLink.metadata?.info?.url, appInviteLink.data_?.intentData,
77+
(appInviteLink.data_?.app?.minAppVersion ?: 0).toInt(), System.currentTimeMillis(), null, null)
7478
val intent = Intent(Intent.ACTION_VIEW).apply {
7579
addCategory(Intent.CATEGORY_DEFAULT)
7680
data = appInviteLink.data_?.intentData?.let { Uri.parse(it) }
@@ -83,17 +87,31 @@ class AppInviteActivity : AppCompatActivity() {
8387
APPINVITE_OPENED_FROM_PLAY_STORE to false
8488
)
8589
)
90+
putExtra(DYNAMIC_LINK_DATA, SafeParcelableSerializer.serializeToBytes(dynamicLinkData))
8691
}
8792
val fallbackIntent = Intent(Intent.ACTION_VIEW).apply {
8893
addCategory(Intent.CATEGORY_DEFAULT)
8994
data = appInviteLink.data_?.fallbackUrl?.let { Uri.parse(it) }
9095
}
9196
val installedVersionCode = runCatching {
92-
intent.resolveActivity(packageManager)?.let {
93-
PackageInfoCompat.getLongVersionCode(packageManager.getPackageInfo(it.packageName, 0))
97+
if (appInviteLink.data_?.packageName != null) {
98+
PackageInfoCompat.getLongVersionCode(packageManager.getPackageInfo(appInviteLink.data_.packageName, 0))
99+
} else {
100+
null
94101
}
95102
}.getOrNull()
96103
if (installedVersionCode != null && (appInviteLink.data_?.app?.minAppVersion == null || installedVersionCode >= appInviteLink.data_.app.minAppVersion)) {
104+
val componentName = intent.resolveActivity(packageManager)
105+
if (componentName == null) {
106+
Log.w(TAG, "open resolve activity is null")
107+
if (appInviteLink.data_?.packageName != null) {
108+
val intentLaunch =
109+
packageManager.getLaunchIntentForPackage(appInviteLink.data_.packageName)
110+
if (intentLaunch != null) {
111+
intent.setComponent(intentLaunch.component)
112+
}
113+
}
114+
}
97115
startActivity(intent)
98116
finish()
99117
} else {

0 commit comments

Comments
 (0)