From bac24cae92549f6562a1543c073b6ea85f02c79f Mon Sep 17 00:00:00 2001 From: jigar-f <132374182+jigar-f@users.noreply.github.com> Date: Mon, 4 Mar 2024 18:35:09 +0530 Subject: [PATCH] DeepLink support for Android [ReportIssue] (#993) * Updates to LanternHttpClient and integrate MockK (#900) * Add Kotlin-based LanternHttpClient * Kotlin-based LanternHttpClient * Kotlin-based LanternHttpClient * Updates to LanternHttpClient * Add tests * Add tests * Add LanternHttpClientTest * formatting * Add ProUser data class * Formatting --------- Co-authored-by: atavism * Use Plausible for app analytics (#929) * Remove datadog * Update CI * update Makefile * update Makefile * remove datadog directory * Use Sentry for crash reporting (#927) * update Makefile * Add back Sentry for crash reporting * remove datadog from gradle config * Add plausible * integrate plausible analytics * integrate plausible analytics * track when ads are shown * track when ads are shown * add Plausible class * track when Replica content is viewed * track searches and uploads * Formatting * Track when ads fail to load as well * updated translations... * Don't switch languages that we don't support. (#944) * Google Pay updates (#948) * play payments updates * Add check isPlayVersion * skip play check * Add play checkout page * Add play checkout page * clean-ups * show dialog after successful payment * clean-ups, show loading spinner submitting payment * Add plan step and enter email text * Add Flexible * show price summary * Add com.android.vending.BILLING permission * Add logging * Add logging * Remove use of ProgressDialog and some clean-ups * Remove use of ProgressDialog and some clean-ups * Update Google Play billing client * Add liblantern-all * Update go.sum * Update golang.org/x/mobile/cmd/gomobile * run go mod tidy * Update go.sum * set GOPRIVATE var * formatting * code review updates * Fix typo, do not append currency in-app billing * fix typo, run ktlint * fix typo, run ktlint * Add setState and do not push page do pop * Simplify method and fix error message. * Removed billing-ktx since its not needed. --------- Co-authored-by: Jigar-f * Updated to the latest flashlight with go 1.19 support * update branch name * update branch name * use GITHUB_TOKEN * use GITHUB_TOKEN * Get build working with latest flashlight * update golang.org/x/mobile (#958) * update branch name * update branch name * use GITHUB_TOKEN * use GITHUB_TOKEN * update golang.org/x/mobile * update golang.org/x/mobile * Test building release * run go mod tidy * fix email validation on play checkout page * fix email validation on play checkout page * Update how release workflow is triggered * rename branch to android-legacy to trigger release workflow * Ads update (#953) * Added artificial delay while connecting VPN. * Remove static delay. * fix typo and do not show delay if user does not have permissions. * don't set changesNotSentForReview * initialize plausible sdk in application class (#959) * initialize Plausible after Lantern starts * Make accountInitDialog nullable (#960) * set accountInitDialog to null instead of lateinit * remove unused imports * Update to latest flashlight * fixed missing device linking functionality (#965) * bumped flashlight to version that properly notifies on geo updates * Update PlausibleClient to check files for cached events exist (#966) * Date Fix (#967) * Refresh user data after purchase request. * Refactor code and Hide date is vaules comes null or 0 from server. * Fixed merge conflicts. * Added Ads delay changes in go model. * Downgrade to flashlight 7.6.19 due to IOS issue * Make changes to run on Android & IOS. * Implemented google ads. * Updated Google Ads sdk. * Update ipproxy * check for null * check for null * remove changesNotSentForReview since its causing an error * Fix Expecting a condition in parentheses * add pathdb dependency * Updating to latest flashlight supporting go 1.20 * fix compile error * Bump go version * bump go.mod version * do not check go version in Makefile * Test building Android installer * quick test * Remove more references to datadog * update flashlight * ipproxy updates * Android crash fixes (#975) * Refactor reportIssue code on Kotlin and flutter. * Upgrade webview and fix onStartCommand issue * change Device linking API. * Updated error message. * Upgrade stripe and updated error object to multiple place * Revert back stripe version. * Added try catch and added formatter * Update dnsgrab * protect connections again * Change null condition on payment method. * use working ipproxy * revert CI changes * Update ipproxy again * run go mod tidy, update protected * Update ipproxy * Update ipproxy * update ipproxy, restore DialUDP * Update ipproxy * Added GDPR consent and updated google ads plugin. (#978) * Update ipproxy and flashlight, use Go 1.21 (#970) * Update ipproxy * Fix Expecting a condition in parentheses * add pathdb dependency * Test building Android installer * quick test * update flashlight * ipproxy updates * Update dnsgrab * protect connections again * use working ipproxy * revert CI changes * Update ipproxy again * run go mod tidy, update protected * Update ipproxy * Update ipproxy * update ipproxy, restore DialUDP * Update ipproxy * use go version from go.mod * Update ipproxy * Update flashlight to v7.6.42 * update flashlight * Use ios specific flashlight version and fix proto duplicate issue. * use flashlight v7.6.43 again * use flashlight v7.6.44 and restore protobuf messages * Payment changes (#982) * Added icon payload in plansV3 API. * Removed plans API. * Updated API payload and use Network images. * Update vpn.proto * Added search feature in split tunneling screen. (#980) * Added search feature in split tunneling screen. * Made UI changes to split tunneling screen. * Fix issue with update ui while search * Added padding to bottom. * fix showError call in report issue * Updates to Plausible client (#981) * updates to Plausible client * do not track when user switches vpn on/off * update domain for now * override X-Forwarded-For header with the correct IP address of the client * use magnet link when tracking Replica page views * Add comment * Add comment * revert domain to android.lantern.io * fix tests * Upgrade sentry * Remove changes to protect connections (#986) * Update sentry * remove changes to protect connections * upgrade flashlight to v7.6.47 * update release workflow branch * update CI to install protoc-gen-go * set default selected tab to vpn/home screen * use ANDROID_ARCH=all in make android-release * Migrate to go-llsqlite/crawshaw (#987) * Migrate to go-llsqlite/crawshaw * Fix error fetching metadata for object info response * Update liblantern-all.aar * Minor fixes * Update flashlight * Updated flashlight and pods * Use http client that goes uses domain fronting and proxying * update flashlight * Fix missing method error in invokeMethod getlantern/engineering#1193 * do not use BuildContext across async boundaries * Remove secret and use env file (#990) * Update .gitignore * Added env file support. * updated file name and fix ios issue. * updated emoji picker. * merge latest * Start working on deeplink support. * Added support for description on deeplink. * Changes on deeplink. * Updated packages and routes. * Change report and issue route. * added integration_test --------- Co-authored-by: atavism Co-authored-by: atavism Co-authored-by: git Co-authored-by: Adam Fisk Co-authored-by: atavism Co-authored-by: Eli Yukelzon Co-authored-by: Matt Joiner --- Makefile | 2 +- android/app/src/main/AndroidManifest.xml | 111 +++++++++++++---------- lib/account/report_issue.dart | 7 +- lib/app.dart | 22 ++++- lib/core/router/router.gr.dart | 48 +++++----- pubspec.yaml | 6 +- 6 files changed, 114 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index 5a09cedb2..bab6b2e73 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ internalsdk/protos/vpn.pb.go: protos_shared/vpn.proto routes: lib/core/router/router.gr.dart lib/core/router/router.gr.dart: $(shell find lib -name \*.dart -print) - @flutter packages pub run build_runner build --delete-conflicting-outputs + @dart run build_runner build --delete-conflicting-outputs test: @flutter test diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f8f0010eb..7b5e6b360 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,11 +1,12 @@ + package="org.getlantern.lantern" + android:installLocation="auto"> + - - + + @@ -27,76 +28,88 @@ android:label="Request for sending mobiamobroadcast to Mobiamo" android:protectionLevel="signature" /> - + + tools:replace="allowBackup, label" + > + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/LaunchTheme" /> - - + + + + + + + + + + + + + - + android:stopWithTask="false"/> - + - + - + - + android:screenOrientation="portrait"> - + android:noHistory="true" + android:screenOrientation="portrait"/> + android:screenOrientation="portrait" /> - - + - @@ -125,17 +140,21 @@ - - - - - - - - + + + + + + + + - - + + @@ -145,6 +164,6 @@ + android:value="ca-app-pub-2685698271254859~9283700921" /> diff --git a/lib/account/report_issue.dart b/lib/account/report_issue.dart index d278ff650..cf465ffa8 100644 --- a/lib/account/report_issue.dart +++ b/lib/account/report_issue.dart @@ -6,9 +6,9 @@ import 'package:lantern/common/ui/app_loading_dialog.dart'; @RoutePage(name: 'ReportIssue') class ReportIssue extends StatefulWidget { - ReportIssue({ - Key? key, - }) : super(key: key); + final String? description; + + const ReportIssue({Key? key, this.description}) : super(key: key); @override State createState() => _ReportIssueState(); @@ -40,6 +40,7 @@ class _ReportIssueState extends State { final descFieldKey = GlobalKey(); late final descController = CustomTextEditingController( + text: widget.description ?? '', formKey: descFieldKey, validator: (value) { if (value!.isEmpty) { diff --git a/lib/app.dart b/lib/app.dart index 937b5b043..6334c1793 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -113,8 +113,9 @@ class LanternApp extends StatelessWidget { GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], - routeInformationParser: globalRouter.defaultRouteParser(), - routerDelegate: globalRouter.delegate(), + routerConfig: globalRouter.config( + deepLinkBuilder: navigateToDeepLink, + ), supportedLocales: const [ Locale('ar', 'EG'), Locale('fr', 'FR'), @@ -140,6 +141,23 @@ class LanternApp extends StatelessWidget { ); } + DeepLink navigateToDeepLink(PlatformDeepLink deepLink) { + logger.d("DeepLink configuration: ${deepLink.configuration.toString()}"); + if (deepLink.path.toLowerCase().startsWith('/report-issue')) { + logger.d("DeepLink uri: ${deepLink.uri.toString()}"); + final pathUrl = deepLink.uri.toString(); + final segment = pathUrl.split('#'); + //If deeplink doesn't have data it should send to report issue with empty description' + if (segment.length >= 2) { + final description = segment[1]; + return DeepLink([const Home(), ReportIssue(description: '#$description')]); + } + return DeepLink([const Home(), ReportIssue()]); + } else { + return DeepLink.defaultPath; + } + } + Locale currentLocale(String lang) { if (lang == '' || lang.startsWith('en')) { return const Locale('en', 'US'); diff --git a/lib/core/router/router.gr.dart b/lib/core/router/router.gr.dart index 6d078f41d..427bd68ca 100644 --- a/lib/core/router/router.gr.dart +++ b/lib/core/router/router.gr.dart @@ -11,7 +11,6 @@ import 'dart:io' as _i46; import 'package:auto_route/auto_route.dart' as _i42; -import 'package:flutter/cupertino.dart' as _i47; import 'package:lantern/account/account.dart' as _i2; import 'package:lantern/account/account_management.dart' as _i1; import 'package:lantern/account/blocked_users.dart' as _i9; @@ -374,7 +373,10 @@ abstract class $AppRouter extends _i42.RootStackRouter { orElse: () => const ReportIssueArgs()); return _i42.AutoRoutePage( routeData: routeData, - child: _i36.ReportIssue(key: args.key), + child: _i36.ReportIssue( + key: args.key, + description: args.description, + ), ); }, ResellerCodeCheckout.name: (routeData) { @@ -396,11 +398,9 @@ abstract class $AppRouter extends _i42.RootStackRouter { ); }, SplitTunneling.name: (routeData) { - final args = routeData.argsAs( - orElse: () => const SplitTunnelingArgs()); return _i42.AutoRoutePage( routeData: routeData, - child: _i39.SplitTunneling(key: args.key), + child: const _i39.SplitTunneling(), ); }, StripeCheckout.name: (routeData) { @@ -1498,10 +1498,14 @@ class ReplicaVideoViewerArgs { class ReportIssue extends _i42.PageRouteInfo { ReportIssue({ _i44.Key? key, + String? description, List<_i42.PageRouteInfo>? children, }) : super( ReportIssue.name, - args: ReportIssueArgs(key: key), + args: ReportIssueArgs( + key: key, + description: description, + ), initialChildren: children, ); @@ -1512,13 +1516,18 @@ class ReportIssue extends _i42.PageRouteInfo { } class ReportIssueArgs { - const ReportIssueArgs({this.key}); + const ReportIssueArgs({ + this.key, + this.description, + }); final _i44.Key? key; + final String? description; + @override String toString() { - return 'ReportIssueArgs{key: $key}'; + return 'ReportIssueArgs{key: $key, description: $description}'; } } @@ -1592,31 +1601,16 @@ class SettingsArgs { /// generated route for /// [_i39.SplitTunneling] -class SplitTunneling extends _i42.PageRouteInfo { - SplitTunneling({ - _i47.Key? key, - List<_i42.PageRouteInfo>? children, - }) : super( +class SplitTunneling extends _i42.PageRouteInfo { + const SplitTunneling({List<_i42.PageRouteInfo>? children}) + : super( SplitTunneling.name, - args: SplitTunnelingArgs(key: key), initialChildren: children, ); static const String name = 'SplitTunneling'; - static const _i42.PageInfo page = - _i42.PageInfo(name); -} - -class SplitTunnelingArgs { - const SplitTunnelingArgs({this.key}); - - final _i47.Key? key; - - @override - String toString() { - return 'SplitTunnelingArgs{key: $key}'; - } + static const _i42.PageInfo page = _i42.PageInfo(name); } /// generated route for diff --git a/pubspec.yaml b/pubspec.yaml index a7fb9fe0a..8ab9560f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: flutter_switch: ^0.3.2 flag: ^7.0.0 - #Loogs and crash reporting + #Loogs and crash reporting catcher_2: ^1.0.0 sentry_flutter: ^7.16.1 @@ -162,8 +162,8 @@ flutter: # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true -# module: -# androidX: true + # module: + # androidX: true # To add assets to your application, add an assets section, like this: assets: