Skip to content

Commit

Permalink
Add matchesAppLinkUri to BrowserSwitchRequest for App Link support
Browse files Browse the repository at this point in the history
  • Loading branch information
tdchow committed May 7, 2024
1 parent a0ac5d3 commit 2439cab
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,10 @@ public BrowserSwitchResult getResult(@NonNull FragmentActivity activity) {

BrowserSwitchResult result = null;

Uri deepLinkUrl = intent.getData();
if (deepLinkUrl != null && request.matchesDeepLinkUrlScheme(deepLinkUrl)) {
result = new BrowserSwitchResult(BrowserSwitchStatus.SUCCESS, request, deepLinkUrl);
Uri linkUrl = intent.getData();
if (linkUrl != null &&
(request.matchesDeepLinkUrlScheme(linkUrl) || request.matchesAppLinkUri(linkUrl))) {
result = new BrowserSwitchResult(BrowserSwitchStatus.SUCCESS, request, linkUrl);
} else if (request.getShouldNotifyCancellation()) {
result = new BrowserSwitchResult(BrowserSwitchStatus.CANCELED, request);
}
Expand All @@ -196,9 +197,9 @@ public BrowserSwitchResult parseResult(@NonNull Context context, int requestCode
BrowserSwitchRequest request =
persistentStore.getActiveRequest(context.getApplicationContext());
if (request != null && request.getRequestCode() == requestCode) {
Uri deepLinkUrl = intent.getData();
if (request.matchesDeepLinkUrlScheme(deepLinkUrl)) {
result = new BrowserSwitchResult(BrowserSwitchStatus.SUCCESS, request, deepLinkUrl);
Uri linkUrl = intent.getData();
if (request.matchesDeepLinkUrlScheme(linkUrl) || request.matchesAppLinkUri(linkUrl)) {
result = new BrowserSwitchResult(BrowserSwitchStatus.SUCCESS, request, linkUrl);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

class BrowserSwitchRequest {


private final Uri url;
private final int requestCode;
private final JSONObject metadata;
Expand Down Expand Up @@ -105,4 +104,8 @@ String toJson() throws JSONException {
boolean matchesDeepLinkUrlScheme(@NonNull Uri url) {
return url.getScheme() != null && url.getScheme().equalsIgnoreCase(returnUrlScheme);
}

boolean matchesAppLinkUri(@NonNull Uri uri) {
return appLinkUri != null && uri.toString().equals(appLinkUri.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,47 @@ public void start_whenNoAppLinkUriOrReturnUrlSchemeSet_throwsError() {
}
}

@Test
public void getResult_whenAppLinkMatches_successReturnedWithAppLink() {
BrowserSwitchClient sut = new BrowserSwitchClient(browserSwitchInspector, persistentStore, customTabsInternalClient);
Intent deepLinkIntent = new Intent().setData(appLinkUri);
when(activity.getIntent()).thenReturn(deepLinkIntent);
BrowserSwitchRequest request = new BrowserSwitchRequest(
123,
browserSwitchDestinationUrl,
new JSONObject(),
null,
appLinkUri,
true
);
when(persistentStore.getActiveRequest(applicationContext)).thenReturn(request);

BrowserSwitchResult result = sut.getResult(activity);

assertEquals(BrowserSwitchStatus.SUCCESS, result.getStatus());
assertEquals(appLinkUri, result.getDeepLinkUrl());
}

@Test
public void getResult_whenAppLinkDoesNotMatch_canceledIsReturned() {
BrowserSwitchClient sut = new BrowserSwitchClient(browserSwitchInspector, persistentStore, customTabsInternalClient);
Intent deepLinkIntent = new Intent().setData(appLinkUri);
when(activity.getIntent()).thenReturn(deepLinkIntent);
BrowserSwitchRequest request = new BrowserSwitchRequest(
123,
browserSwitchDestinationUrl,
new JSONObject(),
null,
Uri.parse("https://different-example.com"),
true
);
when(persistentStore.getActiveRequest(applicationContext)).thenReturn(request);

BrowserSwitchResult result = sut.getResult(activity);

assertEquals(BrowserSwitchStatus.CANCELED, result.getStatus());
}

@Test
public void deliverResult_whenDeepLinkUrlExistsAndReturnUrlSchemeMatchesAndNoPendingRequest_returnsNull() {
when(activity.getApplicationContext()).thenReturn(applicationContext);
Expand Down Expand Up @@ -498,7 +539,7 @@ public void parseResult_whenActiveRequestMatchesRequestCodeAndDeepLinkResultURLS
browserSwitchDestinationUrl,
requestMetadata,
"fake-url-scheme",
appLinkUri,
null,
false
);
when(persistentStore.getActiveRequest(same(applicationContext))).thenReturn(request);
Expand All @@ -522,7 +563,7 @@ public void parseResult_whenActiveRequestMatchesRequestCodeAndDeepLinkResultURLS
browserSwitchDestinationUrl,
requestMetadata,
"fake-url-scheme",
appLinkUri,
null,
false
);
when(persistentStore.getActiveRequest(same(applicationContext))).thenReturn(request);
Expand All @@ -534,6 +575,50 @@ public void parseResult_whenActiveRequestMatchesRequestCodeAndDeepLinkResultURLS
assertNull(browserSwitchResult);
}

@Test
public void parseResult_whenActiveRequestMatchesRequestCodeAndAppLinkUri_returnsBrowserSwitchSuccessResult() {
String appLinkUrl = "https://example.com";
BrowserSwitchClient sut = new BrowserSwitchClient(browserSwitchInspector, persistentStore, customTabsInternalClient);
BrowserSwitchRequest request = new BrowserSwitchRequest(
123,
browserSwitchDestinationUrl,
new JSONObject(),
null,
Uri.parse(appLinkUrl),
false
);
when(persistentStore.getActiveRequest(same(applicationContext))).thenReturn(request);

Uri appLinkUri = Uri.parse(appLinkUrl);
Intent intent = new Intent(Intent.ACTION_VIEW, appLinkUri);
BrowserSwitchResult browserSwitchResult = sut.parseResult(applicationContext, 123, intent);

assertNotNull(browserSwitchResult);
assertEquals(BrowserSwitchStatus.SUCCESS, browserSwitchResult.getStatus());
assertEquals(appLinkUri, browserSwitchResult.getDeepLinkUrl());
}

@Test
public void parseResult_whenActiveRequestMatchesRequestCodeAndAppLinkDoesntMatch_returnsNull() {
BrowserSwitchClient sut = new BrowserSwitchClient(browserSwitchInspector, persistentStore, customTabsInternalClient);

BrowserSwitchRequest request = new BrowserSwitchRequest(
123,
browserSwitchDestinationUrl,
new JSONObject(),
null,
Uri.parse("https://example.com"),
false
);
when(persistentStore.getActiveRequest(same(applicationContext))).thenReturn(request);

Uri appLinkUri = Uri.parse("https://different-example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, appLinkUri);
BrowserSwitchResult browserSwitchResult = sut.parseResult(applicationContext, 123, intent);

assertNull(browserSwitchResult);
}

@Test
public void parseResult_whenActiveRequestDoesntMatchRequestCode_returnsNull() {
BrowserSwitchClient sut = new BrowserSwitchClient(browserSwitchInspector, persistentStore, customTabsInternalClient);
Expand All @@ -544,7 +629,7 @@ public void parseResult_whenActiveRequestDoesntMatchRequestCode_returnsNull() {
browserSwitchDestinationUrl,
requestMetadata,
"fake-url-scheme",
appLinkUri,
null,
false
);
when(persistentStore.getActiveRequest(same(applicationContext))).thenReturn(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,52 @@ public void matchesDeepLinkUrlScheme_whenDifferentScheme_returnsFalse() throws J
BrowserSwitchRequest request = BrowserSwitchRequest.fromJson(json);
assertFalse(request.matchesDeepLinkUrlScheme(Uri.parse("not-my-return-url-scheme://example.com")));
}

@Test
public void matchesAppLinkUri_whenTheSame_returnsTrue() throws JSONException {
String json = "{\n" +
" \"requestCode\": 123,\n" +
" \"url\": \"https://example.com\",\n" +
" \"returnUrlScheme\": \"my-return-url-scheme\",\n" +
" \"appLinkUri\": \"https://example.com\",\n" +
" \"shouldNotify\": false,\n" +
" \"metadata\": {\n" +
" \"testKey\": \"testValue\"" +
" }" +
"}";
BrowserSwitchRequest request = BrowserSwitchRequest.fromJson(json);
assertTrue(request.matchesAppLinkUri(Uri.parse("https://example.com")));
}

@Test
public void matchesAppLinkUri_whenDifferent_returnsFalse() throws JSONException {
String json = "{\n" +
" \"requestCode\": 123,\n" +
" \"url\": \"https://example.com\",\n" +
" \"returnUrlScheme\": \"my-return-url-scheme\",\n" +
" \"appLinkUri\": \"https://example.com\",\n" +
" \"shouldNotify\": false,\n" +
" \"metadata\": {\n" +
" \"testKey\": \"testValue\"" +
" }" +
"}";
BrowserSwitchRequest request = BrowserSwitchRequest.fromJson(json);
assertFalse(request.matchesAppLinkUri(Uri.parse("https://another-example.com")));
}

@Test
public void matchesAppLinkUri_whenNull_returnsFalse() throws JSONException {
String json = "{\n" +
" \"requestCode\": 123,\n" +
" \"url\": \"https://example.com\",\n" +
" \"returnUrlScheme\": \"my-return-url-scheme\",\n" +
" \"shouldNotify\": false,\n" +
" \"metadata\": {\n" +
" \"testKey\": \"testValue\"" +
" }" +
"}";
BrowserSwitchRequest request = BrowserSwitchRequest.fromJson(json);
assertNull(request.getAppLinkUri());
assertFalse(request.matchesAppLinkUri(Uri.parse("https://example.com")));
}
}

0 comments on commit 2439cab

Please sign in to comment.