CAKE-192 | parse_address_from_domain.dart fixed and split on 2 files (current and parse_address_from_domain_alert.dart), then moved to the entities directory; used one channel for native calls; removed unneeded spaces; fixed handle of unstoppable domain error in the MainActivity.java

OleksandrSobol committed Jul 7, 2021 at 16:50 UTC f995342491d1517a06390038a7acc63090fa5a57
8 files changed +97 -100
android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
+2 -8
@@ -21,7 +21,6 @@ import java.security.SecureRandom;
21
22 public class MainActivity extends FlutterFragmentActivity {
23 final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
24 - final String UNSTOPPABLE_DOMAIN_CHANNEL = "com.cakewallet.cake_wallet/unstoppable-domain";
24 final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
25
26 @Override
@@ -33,12 +32,6 @@ public class MainActivity extends FlutterFragmentActivity {
32 UTILS_CHANNEL);
33
34 utilsChannel.setMethodCallHandler(this::handle);
36 -
37 - MethodChannel unstoppableDomainChannel =
38 - new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(),
39 - UNSTOPPABLE_DOMAIN_CHANNEL);
40 -
41 - unstoppableDomainChannel.setMethodCallHandler(this::handle);
35 }
36
37 private void handle(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
@@ -80,7 +73,8 @@ public class MainActivity extends FlutterFragmentActivity {
73 String address = resolution.getAddress(domain, ticker);
74 handler.post(() -> result.success(address));
75 } catch (Exception e) {
83 - handler.post(() -> result.error("INVALID DOMAIN", e.getMessage(), null));
76 + System.out.println("Expected Address, but got " + e.getMessage());
77 + handler.post(() -> result.success(""));
78 }
79 });
80 }
ios/Runner/AppDelegate.swift
+22 -35
@@ -5,7 +5,7 @@ import UnstoppableDomainsResolution
5 @UIApplicationMain
6 @objc class AppDelegate: FlutterAppDelegate {
7 lazy var resolution : Resolution? = {
8 - return try? Resolution()
8 + return try? Resolution()
9 }()
10
11 override func application(
@@ -75,45 +75,32 @@ import UnstoppableDomainsResolution
75 }
76
77 result(secRandom(count: count))
78 + case "getUnstoppableDomainAddress":
79 + guard let args = call.arguments as? Dictionary<String, String>,
80 + let domain = args["domain"],
81 + let ticker = args["ticker"],
82 + let resolution = self?.resolution else {
83 + result(nil)
84 + return
85 + }
86 +
87 + resolution.addr(domain: domain, ticker: ticker) { addrResult in
88 + var address : String = ""
89 +
90 + switch addrResult {
91 + case .success(let returnValue):
92 + address = returnValue
93 + case .failure(let error):
94 + print("Expected Address, but got \(error)")
95 + }
96 +
97 + result(address)
98 + }
99 default:
100 result(FlutterMethodNotImplemented)
101 }
102 })
103
83 - let unstoppableDomainChannel = FlutterMethodChannel(name: "com.cakewallet.cake_wallet/unstoppable-domain", binaryMessenger: controller.binaryMessenger)
84 - unstoppableDomainChannel.setMethodCallHandler({ [weak self]
85 - (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
86 - switch call.method {
87 - case "getUnstoppableDomainAddress":
88 - guard let args = call.arguments as? Dictionary<String, String>,
89 - let domain = args["domain"],
90 - let ticker = args["ticker"] else {
91 - result(nil)
92 - return
93 - }
94 -
95 - guard let resolution = self?.resolution else {
96 - result(nil)
97 - return
98 - }
99 -
100 - resolution.addr(domain: domain, ticker: ticker) { addrResult in
101 - var address : String = ""
102 -
103 - switch addrResult {
104 - case .success(let returnValue):
105 - address = returnValue
106 - case .failure(let error):
107 - print("Expected Address, but got \(error)")
108 - }
109 -
110 - result(address)
111 - }
112 - default:
113 - result(FlutterMethodNotImplemented)
114 - }
115 - })
116 -
104 GeneratedPluginRegistrant.register(with: self)
105 return super.application(application, didFinishLaunchingWithOptions: launchOptions)
106 }
lib/entities/parse_address_from_domain.dart new
+52
@@ -0,0 +1,52 @@
1 +import 'package:cake_wallet/entities/openalias_record.dart';
2 +import 'package:cake_wallet/entities/unstoppable_domain_address.dart';
3 +import 'package:cake_wallet/src/screens/send/widgets/parse_address_from_domain_alert.dart';
4 +import 'package:flutter/material.dart';
5 +import 'package:cake_wallet/generated/i18n.dart';
6 +
7 +const topLevelDomain = 'crypto';
8 +
9 +Future<String> parseAddressFromDomain(
10 + BuildContext context, String domain, String ticker) async {
11 + try {
12 + final domainParts = domain.split('.');
13 + final name = domainParts.last;
14 +
15 + if (domainParts.length <= 1 || domainParts.first.isEmpty || name.isEmpty) {
16 + return domain;
17 + }
18 +
19 + if (name.contains(topLevelDomain)) {
20 + final address = await fetchUnstoppableDomainAddress(domain, ticker);
21 +
22 + if (address?.isEmpty ?? true) {
23 + return domain;
24 + }
25 +
26 + showAddressAlert(
27 + context,
28 + S.of(context).address_detected,
29 + S.of(context).address_from_domain(domain));
30 +
31 + return address;
32 + }
33 +
34 + final record = await OpenaliasRecord.fetchAddressAndName(
35 + OpenaliasRecord.formatDomainName(domain));
36 +
37 + if (record == null || record.address.contains(domain)) {
38 + return domain;
39 + }
40 +
41 + showAddressAlert(
42 + context,
43 + S.of(context).openalias_alert_title,
44 + S.of(context).openalias_alert_content(domain));
45 +
46 + return record.address;
47 + } catch (e) {
48 + print(e.toString());
49 + }
50 +
51 + return domain;
52 +}
\ No newline at end of file
lib/entities/unstoppable_domain_address.dart
+2 -2
@@ -1,9 +1,9 @@
1 import 'package:flutter/services.dart';
2
3 -const channel = MethodChannel('com.cakewallet.cake_wallet/unstoppable-domain');
3 +const channel = MethodChannel('com.cake_wallet/native_utils');
4
5 Future<String> fetchUnstoppableDomainAddress(String domain, String ticker) async {
6 - String address;
6 + var address = '';
7
8 try {
9 address = await channel.invokeMethod(
lib/src/screens/exchange/exchange_page.dart
+1 -1
@@ -1,7 +1,7 @@
1 import 'dart:ui';
2 import 'package:cake_wallet/entities/sync_status.dart';
3 import 'package:cake_wallet/entities/wallet_type.dart';
4 -import 'package:cake_wallet/src/screens/send/parse_address_from_domain.dart';
4 +import 'package:cake_wallet/entities/parse_address_from_domain.dart';
5 import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
6 import 'package:dotted_border/dotted_border.dart';
7 import 'package:flutter/cupertino.dart';
lib/src/screens/send/parse_address_from_domain.dart deleted
-53
@@ -1,53 +0,0 @@
1 -import 'package:cake_wallet/entities/openalias_record.dart';
2 -import 'package:cake_wallet/entities/unstoppable_domain_address.dart';
3 -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
4 -import 'package:cake_wallet/utils/show_pop_up.dart';
5 -import 'package:flutter/material.dart';
6 -import 'package:cake_wallet/generated/i18n.dart';
7 -
8 -const topLevelDomain = 'crypto';
9 -
10 -Future<String> parseAddressFromDomain(
11 - BuildContext context, String domain, String ticker) async {
12 - try {
13 - final name = domain.split('.').last;
14 -
15 - if (name.contains(topLevelDomain)) {
16 - final address = await fetchUnstoppableDomainAddress(domain, ticker);
17 - if (address.isNotEmpty) {
18 - showAddressAlert(
19 - context,
20 - S.of(context).address_detected,
21 - S.of(context).address_from_domain(domain));
22 - return address;
23 - }
24 - } else if (name.isNotEmpty) {
25 - final record = await OpenaliasRecord.fetchAddressAndName(
26 - OpenaliasRecord.formatDomainName(domain));
27 - if (record.name != null && record.name != domain) {
28 - showAddressAlert(
29 - context,
30 - S.of(context).openalias_alert_title,
31 - S.of(context).openalias_alert_content(domain));
32 - return record.address;
33 - }
34 - }
35 - } catch (e) {
36 - print(e.toString());
37 - }
38 -
39 - return domain;
40 -}
41 -
42 -void showAddressAlert(BuildContext context, String title, String content) async {
43 - await showPopUp<void>(
44 - context: context,
45 - builder: (BuildContext context) {
46 -
47 - return AlertWithOneAction(
48 - alertTitle: title,
49 - alertContent: content,
50 - buttonText: S.of(context).ok,
51 - buttonAction: () => Navigator.of(context).pop());
52 - });
53 -}
\ No newline at end of file
lib/src/screens/send/send_page.dart
+1 -1
@@ -1,6 +1,6 @@
1 import 'dart:ui';
2 import 'package:cake_wallet/entities/transaction_priority.dart';
3 -import 'package:cake_wallet/src/screens/send/parse_address_from_domain.dart';
3 +import 'package:cake_wallet/entities/parse_address_from_domain.dart';
4 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
5 import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
6 import 'package:cake_wallet/src/widgets/picker.dart';
lib/src/screens/send/widgets/parse_address_from_domain_alert.dart new
+17
@@ -0,0 +1,17 @@
1 +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
2 +import 'package:cake_wallet/utils/show_pop_up.dart';
3 +import 'package:flutter/material.dart';
4 +import 'package:cake_wallet/generated/i18n.dart';
5 +
6 +void showAddressAlert(BuildContext context, String title, String content) async {
7 + await showPopUp<void>(
8 + context: context,
9 + builder: (BuildContext context) {
10 +
11 + return AlertWithOneAction(
12 + alertTitle: title,
13 + alertContent: content,
14 + buttonText: S.of(context).ok,
15 + buttonAction: () => Navigator.of(context).pop());
16 + });
17 +}
\ No newline at end of file