Skip to content

Commit

Permalink
[deep link] added a http client to deep link service, connect tests w…
Browse files Browse the repository at this point in the history
…ith deep link controller .validateLinks() (flutter#8220)

* Add tests

* resolve comments

* Update deep_links_screen_test.dart

* resolve comments

* resolve comments

* lint

* lint
  • Loading branch information
hangyujin committed Aug 29, 2024
1 parent 54187dc commit cd729bd
Show file tree
Hide file tree
Showing 6 changed files with 465 additions and 276 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,19 @@ class DisplayOptions {

class DeepLinksController extends DisposableController
with AutoDisposeControllerMixin {
@override
void dispose() {
deepLinksService.dispose();
super.dispose();
}

DisplayOptions get displayOptions => displayOptionsNotifier.value;
String get applicationId =>
_androidAppLinks[selectedAndroidVariantIndex.value]?.applicationId ?? '';
androidAppLinks[selectedAndroidVariantIndex.value]?.applicationId ?? '';
String get bundleId =>
_iosLinks[selectedIosConfigurationIndex.value]?.bundleIdentifier ?? '';
iosLinks[selectedIosConfigurationIndex.value]?.bundleIdentifier ?? '';
String get teamId =>
_iosLinks[selectedIosConfigurationIndex.value]?.teamIdentifier ?? '';
iosLinks[selectedIosConfigurationIndex.value]?.teamIdentifier ?? '';

@visibleForTesting
List<LinkData> linkDatasByPath(List<LinkData> linkdatas) {
Expand Down Expand Up @@ -212,10 +218,13 @@ class DeepLinksController extends DisposableController
}

AppLinkSettings? get currentAppLinkSettings =>
_androidAppLinks[selectedAndroidVariantIndex.value];
androidAppLinks[selectedAndroidVariantIndex.value];

final _androidAppLinks = <int, AppLinkSettings>{};
final _iosLinks = <int, UniversalLinkSettings>{};
@visibleForTesting
final androidAppLinks = <int, AppLinkSettings>{};

@visibleForTesting
final iosLinks = <int, UniversalLinkSettings>{};

ValueListenable<int> get selectedAndroidVariantIndex =>
_selectedAndroidVariantIndex;
Expand Down Expand Up @@ -303,7 +312,7 @@ class DeepLinksController extends DisposableController
selectedProject.value!.path,
buildVariant: variant,
);
_androidAppLinks[selectedAndroidVariantIndex.value] = result;
androidAppLinks[selectedAndroidVariantIndex.value] = result;
} catch (_) {
ga.select(
gac.deeplink,
Expand Down Expand Up @@ -331,7 +340,7 @@ class DeepLinksController extends DisposableController
configuration: configuration,
target: target,
);
_iosLinks[selectedIosConfigurationIndex.value] = result;
iosLinks[selectedIosConfigurationIndex.value] = result;
} catch (_) {
pagePhase.value = PagePhase.validationErrorPage;
}
Expand Down Expand Up @@ -378,8 +387,7 @@ class DeepLinksController extends DisposableController

/// Get all unverified link data.
List<LinkData> get _rawAndroidLinkDatas {
final appLinksSettings =
_androidAppLinks[selectedAndroidVariantIndex.value];
final appLinksSettings = androidAppLinks[selectedAndroidVariantIndex.value];
if (appLinksSettings == null) {
return const <LinkData>[];
}
Expand Down Expand Up @@ -420,7 +428,7 @@ class DeepLinksController extends DisposableController

List<LinkData> get _rawIosLinkDatas {
final iosDomains =
_iosLinks[selectedIosConfigurationIndex.value]?.associatedDomains ?? [];
iosLinks[selectedIosConfigurationIndex.value]?.associatedDomains ?? [];
return iosDomains
.map(
(domain) => LinkData(
Expand Down Expand Up @@ -455,7 +463,7 @@ class DeepLinksController extends DisposableController

/// The [TextEditingController] for the search text field.
final textEditingController = TextEditingController();
final deepLinksServices = DeepLinksServices();
final deepLinksService = DeepLinksService();

bool addLocalFingerprint(String fingerprint) {
// A valid fingerprint consists of 32 pairs of hexadecimal digits separated by colons.
Expand All @@ -481,7 +489,7 @@ class DeepLinksController extends DisposableController
final domain = selectedLink.value!.domain;
if (domain != null) {
generatedAssetLinksForSelectedLink.value =
await deepLinksServices.generateAssetLinks(
await deepLinksService.generateAssetLinks(
domain: domain,
applicationId: applicationId,
localFingerprint: localFingerprint.value,
Expand All @@ -504,7 +512,7 @@ class DeepLinksController extends DisposableController
Map<String, List<DomainError>> iosDomainErrors =
<String, List<DomainError>>{};
try {
final androidResult = await deepLinksServices.validateAndroidDomain(
final androidResult = await deepLinksService.validateAndroidDomain(
domains: domains,
applicationId: applicationId,
localFingerprint: localFingerprint.value,
Expand All @@ -513,7 +521,7 @@ class DeepLinksController extends DisposableController
googlePlayFingerprintsAvailability.value =
androidResult.googlePlayFingerprintsAvailability;
if (FeatureFlags.deepLinkIosCheck) {
final iosResult = await deepLinksServices.validateIosDomain(
final iosResult = await deepLinksService.validateIosDomain(
bundleId: bundleId,
teamId: teamId,
domains: domains,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,21 @@
import 'dart:async';
import 'dart:convert';

import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';

import 'deep_links_model.dart';

const _apiKey = 'AIzaSyCf_2E9N2AUZR-YSnZTQ72YbCNhKIskIsw';
const _assetLinksGenerationURL =

@visibleForTesting
const assetLinksGenerationURL =
'https://deeplinkassistant-pa.googleapis.com/android/generation/v1/assetlinks:generate?key=$_apiKey';
const _androidDomainValidationURL =
@visibleForTesting
const androidDomainValidationURL =
'https://deeplinkassistant-pa.googleapis.com/android/validation/v1/domains:batchValidate?key=$_apiKey';
const _iosDomainValidationURL =
@visibleForTesting
const iosDomainValidationURL =
'https://deeplinkassistant-pa.googleapis.com/ios/validation/v1/domains:batchValidate?key=$_apiKey';
const postHeader = {'Content-Type': 'application/json'};

Expand Down Expand Up @@ -84,7 +89,13 @@ class ValidateAndroidDomainResult {
Map<String, List<DomainError>> domainErrors;
}

class DeepLinksServices {
class DeepLinksService {
final client = Client();

void dispose() {
client.close();
}

Future<ValidateAndroidDomainResult> validateAndroidDomain({
required List<String> domains,
required String applicationId,
Expand All @@ -98,8 +109,8 @@ class DeepLinksServices {
late bool googlePlayFingerprintsAvailable;

for (final domainList in domainsByBatch) {
final response = await http.post(
Uri.parse(_androidDomainValidationURL),
final response = await client.post(
Uri.parse(androidDomainValidationURL),
headers: postHeader,
body: jsonEncode({
_packageNameKey: applicationId,
Expand Down Expand Up @@ -151,8 +162,8 @@ class DeepLinksServices {
final domainsByBatch = _splitDomains(domains);

for (final domainList in domainsByBatch) {
final response = await http.post(
Uri.parse(_iosDomainValidationURL),
final response = await client.post(
Uri.parse(iosDomainValidationURL),
headers: postHeader,
body: jsonEncode({
_appIdKey: {
Expand Down Expand Up @@ -209,8 +220,8 @@ class DeepLinksServices {
required String domain,
required String? localFingerprint,
}) async {
final response = await http.post(
Uri.parse(_assetLinksGenerationURL),
final response = await client.post(
Uri.parse(assetLinksGenerationURL),
headers: postHeader,
body: jsonEncode(
{
Expand Down
Loading

0 comments on commit cd729bd

Please sign in to comment.