From f442aec7325b5c8ee4eebf0a58ecfc186a039ded Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 23 Sep 2021 22:42:26 -0400 Subject: [PATCH 01/33] must use xc* to build ipa from xarchive --- .github/workflows/artifacts.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index a8682de4..70095300 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -92,7 +92,13 @@ jobs: run: flutter build appbundle --build-number=42$GITHUB_RUN_NUMBER - name: Build IPA (IOS) - run: flutter build ipa --build-number=42$GITHUB_RUN_NUMBER + env: + CONNECT_USERNAME: ${{ secrets.CONNECT_USERNAME }} + CONNECT_PASSWORD: ${{ secrets.CONNECT_PASSWORD }} + run: | + flutter build ipa --build-number=42$GITHUB_RUN_NUMBER + xcodebuild -exportArchive -exportOptionsPlist ios/exportOptionsUpload.plist -archivePath build/ios/archive/Runner.xcarchive -exportPath build/ios/release/ + xcrun altool --validate-app -t ios -f build/ios/release/app.ipa -u "$CONNECT_USERNAME" -p "$CONNECT_PASSWORD" - name: Create Release uses: ncipollo/release-action@v1 From ca4008fae1600b07a4c18a9a5956ecbffba20751 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 23 Sep 2021 22:51:47 -0400 Subject: [PATCH 02/33] release failing --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 759d8d7d..ae091c54 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,6 +110,7 @@ jobs: packageName: com.mytiki.app releaseFiles: build/app/outputs/bundle/release/app-release.aab track: internal + status: completed sentry_release: name: Sentry Release From 9de5c4e1a53ad681c98761d9cd9db8439a557ad3 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Mon, 27 Sep 2021 16:07:05 -0400 Subject: [PATCH 03/33] try adding apks to gh artifacts fingers crossed this works for those stranded without google play or apple app store --- .github/workflows/artifacts.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 70095300..66de885f 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -89,7 +89,9 @@ jobs: pod install --project-directory=ios/ - name: Build App Bundle (Android) - run: flutter build appbundle --build-number=42$GITHUB_RUN_NUMBER + run: | + flutter build appbundle --build-number=42$GITHUB_RUN_NUMBER + flutter build apk --split-per-abi --build-number=42$GITHUB_RUN_NUMBER - name: Build IPA (IOS) env: @@ -103,6 +105,6 @@ jobs: - name: Create Release uses: ncipollo/release-action@v1 with: - artifacts: "build/app/outputs/bundle/release/*.aab,build/ios/release/app.ipa" + artifacts: "build/app/outputs/bundle/release/*.aab,build/ios/release/app.ipa,build/app/outputs/apk/release/app-armeabi-v7a-release.apk,build/app/outputs/apk/release/app-arm64-v8a-release.apk,build/app/outputs/apk/release/app-x86_64-release.apk" replacesArtifacts: false token: ${{ secrets.GH_TOKEN }} From c02ead052e2b23c89c759a58dce439eb5e41afe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Mon, 27 Sep 2021 19:53:34 -0300 Subject: [PATCH 04/33] update dependencies --- pubspec.lock | 46 +++++++++++++++++++++++----------------------- pubspec.yaml | 32 ++++++++++++++++---------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d7bf4a05..bdd0f70b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,14 +21,14 @@ packages: name: amplitude_flutter url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "3.4.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "1.7.1" + version: "1.7.2" android_intent: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.6.1" + version: "2.8.1" barcode_scan2: dependency: "direct main" description: @@ -147,7 +147,7 @@ packages: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" checked_yaml: dependency: transitive description: @@ -231,7 +231,7 @@ packages: name: extension_google_sign_in_as_googleapis_auth url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" fake_async: dependency: transitive description: @@ -259,7 +259,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.6.0" firebase_core_platform_interface: dependency: transitive description: @@ -280,7 +280,7 @@ packages: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.9" fixnum: dependency: transitive description: @@ -299,7 +299,7 @@ packages: name: flutter_appauth url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.0+1" flutter_appauth_platform_interface: dependency: transitive description: @@ -332,7 +332,7 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.4" + version: "0.6.6" flutter_secure_storage: dependency: "direct main" description: @@ -391,7 +391,7 @@ packages: name: googleapis url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "5.0.1" googleapis_auth: dependency: transitive description: @@ -468,14 +468,14 @@ packages: name: logging url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" lottie: dependency: "direct main" description: name: lottie url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.1" markdown: dependency: transitive description: @@ -496,7 +496,7 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.7.0" mime: dependency: transitive description: @@ -580,7 +580,7 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.5" path_provider_linux: dependency: transitive description: @@ -622,7 +622,7 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "8.1.4+2" + version: "8.1.6" permission_handler_platform_interface: dependency: transitive description: @@ -657,7 +657,7 @@ packages: name: pointycastle url: "https://pub.dartlang.org" source: hosted - version: "3.3.1" + version: "3.3.4" pool: dependency: transitive description: @@ -685,7 +685,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.0" + version: "6.0.1" pub_semver: dependency: transitive description: @@ -727,14 +727,14 @@ packages: name: sentry url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "6.0.1" sentry_flutter: dependency: "direct main" description: name: sentry_flutter url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "6.0.1" share_plus: dependency: "direct main" description: @@ -797,7 +797,7 @@ packages: name: sizer url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.15" sky_engine: dependency: transitive description: flutter @@ -881,7 +881,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.4.2" time: dependency: transitive description: @@ -1009,5 +1009,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.13.0 <3.0.0" - flutter: ">=2.2.3" + dart: ">=2.14.0 <3.0.0" + flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index b1db621a..31b1eb78 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: app description: It's your data. Take back control. -version: 0.2.5+5 +version: 0.2.6+1 publish_to: 'none' environment: @@ -13,33 +13,33 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0 - firebase_core: ^1.5.0 - firebase_dynamic_links: ^2.0.8 + firebase_core: ^1.6.0 + firebase_dynamic_links: ^2.0.9 flutter_secure_storage: ^4.2.1 http: ^0.13.3 package_info: ^2.0.2 - sentry_flutter: ^5.1.0 - pointycastle: ^3.3.1 + sentry_flutter: ^6.0.1 + pointycastle: ^3.3.4 qr_flutter: ^4.0.0 share_plus: ^2.1.4 - path_provider: ^2.0.2 + path_provider: ^2.0.5 url_launcher: ^6.0.3 android_intent: ^2.0.2 - permission_handler: ^8.1.4+2 + permission_handler: ^8.1.6 email_validator: ^2.0.1 - lottie: ^1.1.0 + lottie: ^1.2.1 sqflite_sqlcipher: 2.0.0 - amplitude_flutter: ^3.2.1 + amplitude_flutter: ^3.4.0 barcode_scan2: ^4.1.4 - flutter_markdown: ^0.6.4 + flutter_markdown: ^0.6.6 carousel_slider: ^4.0.0 - googleapis: ^4.0.0 - extension_google_sign_in_as_googleapis_auth: ^2.0.2 + googleapis: ^5.0.1 + extension_google_sign_in_as_googleapis_auth: ^2.0.3 intl_utils: ^2.4.0 - provider: ^6.0.0 - sizer: ^2.0.13 - logging: ^1.0.1 - flutter_appauth: ^1.1.0 + provider: ^6.0.1 + sizer: ^2.0.15 + logging: ^1.0.2 + flutter_appauth: ^1.1.0+1 dependency_overrides: sqflite: From 2d38496048d6a5e063a4538f42e9498de860d3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Mon, 27 Sep 2021 19:54:39 -0300 Subject: [PATCH 05/33] delete data on logout --- .../slices/api_email_msg/api_email_msg_service.dart | 5 +++++ .../repository/api_email_msg_repository.dart | 5 +++++ .../api_email_sender/api_email_sender_service.dart | 5 +++++ .../repository/api_email_sender_repository.dart | 5 +++++ lib/src/slices/api_google/api_google_service.dart | 2 -- .../slices/api_google/api_google_service_email.dart | 2 ++ lib/src/slices/api_oauth/api_oauth_service.dart | 11 +++++------ lib/src/slices/data_bkg/data_bkg_service_email.dart | 5 +++++ lib/src/slices/data_screen/data_screen_service.dart | 5 ++++- 9 files changed, 36 insertions(+), 9 deletions(-) diff --git a/lib/src/slices/api_email_msg/api_email_msg_service.dart b/lib/src/slices/api_email_msg/api_email_msg_service.dart index 9718319d..05a83572 100644 --- a/lib/src/slices/api_email_msg/api_email_msg_service.dart +++ b/lib/src/slices/api_email_msg/api_email_msg_service.dart @@ -37,4 +37,9 @@ class ApiEmailMsgService { Future> getByExtMessageIds( List extMessageIds) async => _repository.getByExtMessageIds(extMessageIds); + + Future deleteAll() async { + await _repository.deleteAll(); + return true; + } } diff --git a/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart b/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart index e22142f1..2c6beafc 100644 --- a/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart +++ b/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart @@ -115,4 +115,9 @@ class ApiEmailMsgRepository { return messageMap; }).toList(); } + + Future deleteAll() async { + await _database.delete(_table); + return true; + } } diff --git a/lib/src/slices/api_email_sender/api_email_sender_service.dart b/lib/src/slices/api_email_sender/api_email_sender_service.dart index 9b597a76..bbb4f3d8 100644 --- a/lib/src/slices/api_email_sender/api_email_sender_service.dart +++ b/lib/src/slices/api_email_sender/api_email_sender_service.dart @@ -48,4 +48,9 @@ class ApiEmailSenderService { sender.ignoreUntil = DateTime.now().add(Duration(days: 60)); _repository.update(sender); } + + Future deleteAll() async { + await _repository.deleteAll(); + return true; + } } diff --git a/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart b/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart index f53b88cc..24efda5b 100644 --- a/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart +++ b/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart @@ -98,4 +98,9 @@ class ApiEmailSenderRepository { return senderMap; }).toList(); } + + Future deleteAll() async { + await _database.delete(_table); + return true; + } } diff --git a/lib/src/slices/api_google/api_google_service.dart b/lib/src/slices/api_google/api_google_service.dart index 3f2c8b30..d8283db2 100644 --- a/lib/src/slices/api_google/api_google_service.dart +++ b/lib/src/slices/api_google/api_google_service.dart @@ -3,7 +3,6 @@ * MIT license. See LICENSE file in root directory. */ - import '../../config/config_sentry.dart'; import '../../utils/helper_json.dart'; import '../api_app_data/api_app_data_service.dart'; @@ -37,7 +36,6 @@ class ApiGoogleService return (await _apiAuthService.getUserInfo(account)) != null; } - @override Future revokeToken(ApiOAuthModelAccount account) async { await ConfigSentry.http.post(Uri.parse( 'https://oauth2.googleapis.com/revoke?token=' + account.accessToken!)); diff --git a/lib/src/slices/api_google/api_google_service_email.dart b/lib/src/slices/api_google/api_google_service_email.dart index 68cae60b..17a3f182 100644 --- a/lib/src/slices/api_google/api_google_service_email.dart +++ b/lib/src/slices/api_google/api_google_service_email.dart @@ -218,4 +218,6 @@ class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { return categoryLabel.replaceFirst('CATEGORY_', ''); } } + + void logOut(ApiOAuthModelAccount account) {} } diff --git a/lib/src/slices/api_oauth/api_oauth_service.dart b/lib/src/slices/api_oauth/api_oauth_service.dart index f2fa292c..91f0eba7 100644 --- a/lib/src/slices/api_oauth/api_oauth_service.dart +++ b/lib/src/slices/api_oauth/api_oauth_service.dart @@ -5,8 +5,6 @@ import 'dart:convert'; -import 'package:app/src/slices/api_app_data/api_app_data_key.dart'; -import 'package:app/src/slices/api_oauth/model/api_oauth_model.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:http/http.dart'; import 'package:sqflite_sqlcipher/sqflite.dart'; @@ -17,6 +15,7 @@ import '../../utils/api/helper_api_utils.dart'; import '../api_app_data/api_app_data_service.dart'; import '../api_google/api_google_service.dart'; import 'api_oauth_interface_provider.dart'; +import 'model/api_oauth_model.dart'; import 'model/api_oauth_model_account.dart'; import 'model/api_oauth_model_provider.dart'; import 'repository/api_oauth_repository_account.dart'; @@ -76,11 +75,11 @@ class ApiOAuthService { Future signOut(ApiOAuthModelAccount account) async { ApiOAuthInterfaceProvider? provider = _model.interfaceProviders[account.provider]; - if (provider != null) await provider.revokeToken(account); + if (provider != null) { + await provider.revokeToken(account); + await _apiAppDataService.logout(); + } await _apiAuthRepositoryAccount.delete(account); - await _apiAppDataService.delete(ApiAppDataKey.emailIndexEpoch); - await _apiAppDataService.delete(ApiAppDataKey.emailIndexPage); - await _apiAppDataService.delete(ApiAppDataKey.emailIndexLabel); } Future getUserInfo( diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_bkg/data_bkg_service_email.dart index ef4e0a63..ab5f4c77 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_service_email.dart @@ -369,4 +369,9 @@ revolution today.
return apiOauthInterface != null && await apiOauthInterface.isConnected(account); } + + Future logOut() async { + await _apiEmailSenderService.deleteAll(); + await _apiEmailMsgService.deleteAll(); + } } diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index ca428606..5bf6ad3e 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -46,7 +46,10 @@ class DataScreenService extends ChangeNotifier { Future removeAccount() async { ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); - if (account != null) _apiAuthService.signOut(account); + if (account != null) { + _apiAuthService.signOut(account); + _dataBkgService.email.logOut(); + } _model.account = null; notifyListeners(); } From 574b09d758567619acb5e5d79d3b4b01e430c467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Wed, 29 Sep 2021 14:28:47 -0300 Subject: [PATCH 06/33] delete messages and senders --- android/build.gradle | 2 +- .../api_app_data/api_app_data_service.dart | 20 +++++++++++++++++-- .../api_email_msg/api_email_msg_service.dart | 14 ++++++++++--- .../repository/api_email_msg_repository.dart | 13 +++++++++--- .../api_email_sender_service.dart | 8 +++++--- .../api_email_sender_repository.dart | 6 +++--- .../slices/api_oauth/api_oauth_service.dart | 1 - .../data_bkg/data_bkg_service_email.dart | 11 +++++++--- .../data_screen/data_screen_service.dart | 2 +- .../slices/login_flow/login_flow_service.dart | 2 +- 10 files changed, 58 insertions(+), 21 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index d5aef906..1d6428f7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.5.21' repositories { google() jcenter() diff --git a/lib/src/slices/api_app_data/api_app_data_service.dart b/lib/src/slices/api_app_data/api_app_data_service.dart index 05ca06be..afb79ad9 100644 --- a/lib/src/slices/api_app_data/api_app_data_service.dart +++ b/lib/src/slices/api_app_data/api_app_data_service.dart @@ -28,9 +28,8 @@ class ApiAppDataService { if (data != null) await _repository.delete(data.id!); } - Future logout() async { + Future deleteEmailData() async { List keysToDelete = [ - ApiAppDataKey.userReferCode, ApiAppDataKey.emailIndexLabel, ApiAppDataKey.emailIndexEpoch, ApiAppDataKey.emailIndexPage, @@ -39,4 +38,21 @@ class ApiAppDataService { await _repository.deleteByKey(key.value!); }); } + + Future deleteUserData() async { + List keysToDelete = [ + ApiAppDataKey.userReferCode, + ApiAppDataKey.testCardsDone, + ApiAppDataKey.decisionOverlayShown, + ]; + keysToDelete.forEach((key) async { + await _repository.deleteByKey(key.value!); + }); + } + + Future deleteAllData() async { + ApiAppDataKey.values.forEach((key) async { + await _repository.deleteByKey(key.value!); + }); + } } diff --git a/lib/src/slices/api_email_msg/api_email_msg_service.dart b/lib/src/slices/api_email_msg/api_email_msg_service.dart index 05a83572..fcdae2f3 100644 --- a/lib/src/slices/api_email_msg/api_email_msg_service.dart +++ b/lib/src/slices/api_email_msg/api_email_msg_service.dart @@ -5,6 +5,7 @@ import 'package:sqflite_sqlcipher/sqlite_api.dart'; +import '../api_oauth/model/api_oauth_model_account.dart'; import 'model/api_email_msg_model.dart'; import 'repository/api_email_msg_repository.dart'; @@ -38,8 +39,15 @@ class ApiEmailMsgService { List extMessageIds) async => _repository.getByExtMessageIds(extMessageIds); - Future deleteAll() async { - await _repository.deleteAll(); - return true; + Future> getByAccount( + ApiOAuthModelAccount account) async { + return await _repository.getByAccount(account.email!); + } + + Future deleteList(List messages) async { + for (int i = 0; i < messages.length; i++) { + ApiEmailMsgModel message = messages[i]; + await _repository.delete(message); + } } } diff --git a/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart b/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart index 2c6beafc..f2059b6e 100644 --- a/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart +++ b/lib/src/slices/api_email_msg/repository/api_email_msg_repository.dart @@ -116,8 +116,15 @@ class ApiEmailMsgRepository { }).toList(); } - Future deleteAll() async { - await _database.delete(_table); - return true; + Future> getByAccount(String account) async { + final List> rows = + await _select(where: 'account = ?', whereArgs: [account]); + if (rows.isEmpty) return List.empty(); + return rows.map((row) => ApiEmailMsgModel.fromMap(row)).toList(); + } + + Future delete(ApiEmailMsgModel message) async { + await _database.delete(_table, + where: 'message_id = ?', whereArgs: [message.messageId]); } } diff --git a/lib/src/slices/api_email_sender/api_email_sender_service.dart b/lib/src/slices/api_email_sender/api_email_sender_service.dart index bbb4f3d8..60ecc414 100644 --- a/lib/src/slices/api_email_sender/api_email_sender_service.dart +++ b/lib/src/slices/api_email_sender/api_email_sender_service.dart @@ -49,8 +49,10 @@ class ApiEmailSenderService { _repository.update(sender); } - Future deleteAll() async { - await _repository.deleteAll(); - return true; + Future deleteList(List senders) async { + for (int i = 0; i < senders.length; i++) { + ApiEmailSenderModel sender = senders[i]; + await _repository.delete(sender); + } } } diff --git a/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart b/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart index 24efda5b..e325eeff 100644 --- a/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart +++ b/lib/src/slices/api_email_sender/repository/api_email_sender_repository.dart @@ -99,8 +99,8 @@ class ApiEmailSenderRepository { }).toList(); } - Future deleteAll() async { - await _database.delete(_table); - return true; + Future delete(ApiEmailSenderModel sender) async { + await _database + .delete(_table, where: 'sender_id = ?', whereArgs: [sender.senderId]); } } diff --git a/lib/src/slices/api_oauth/api_oauth_service.dart b/lib/src/slices/api_oauth/api_oauth_service.dart index 91f0eba7..1244e22d 100644 --- a/lib/src/slices/api_oauth/api_oauth_service.dart +++ b/lib/src/slices/api_oauth/api_oauth_service.dart @@ -77,7 +77,6 @@ class ApiOAuthService { _model.interfaceProviders[account.provider]; if (provider != null) { await provider.revokeToken(account); - await _apiAppDataService.logout(); } await _apiAuthRepositoryAccount.delete(account); } diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_bkg/data_bkg_service_email.dart index ab5f4c77..1dc5722f 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_service_email.dart @@ -370,8 +370,13 @@ revolution today.
await apiOauthInterface.isConnected(account); } - Future logOut() async { - await _apiEmailSenderService.deleteAll(); - await _apiEmailMsgService.deleteAll(); + Future deleteAccountData(ApiOAuthModelAccount account) async { + List messages = + await _apiEmailMsgService.getByAccount(account); + await _apiEmailMsgService.deleteList(messages); + List senders = + messages.map((message) => message.sender!).toSet().toList(); + await _apiEmailSenderService.deleteList(senders); + await _apiAppDataService.deleteEmailData(); } } diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index 5bf6ad3e..c5d30acb 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -48,7 +48,7 @@ class DataScreenService extends ChangeNotifier { ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); if (account != null) { _apiAuthService.signOut(account); - _dataBkgService.email.logOut(); + _dataBkgService.email.deleteAccountData(account); } _model.account = null; notifyListeners(); diff --git a/lib/src/slices/login_flow/login_flow_service.dart b/lib/src/slices/login_flow/login_flow_service.dart index 9ec9b61e..38f5deca 100644 --- a/lib/src/slices/login_flow/login_flow_service.dart +++ b/lib/src/slices/login_flow/login_flow_service.dart @@ -238,7 +238,7 @@ class LoginFlowService extends ChangeNotifier { await HelperDb().open(this.model.user!.keys!.signPrivateKey!); ApiAppDataService apiAppDataService = ApiAppDataService(database: database); - registerLogout(() async => await apiAppDataService.logout()); + registerLogout(() async => await apiAppDataService.deleteAllData()); ApiEmailSenderService apiEmailSenderService = ApiEmailSenderService(database: database); From ba39fe2d2348c32c4d551bbd70b06c9c37d9763c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Wed, 29 Sep 2021 20:19:53 -0300 Subject: [PATCH 07/33] remove logout from api google --- lib/src/slices/api_google/api_google_service_email.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/slices/api_google/api_google_service_email.dart b/lib/src/slices/api_google/api_google_service_email.dart index 17a3f182..6172ddd4 100644 --- a/lib/src/slices/api_google/api_google_service_email.dart +++ b/lib/src/slices/api_google/api_google_service_email.dart @@ -219,5 +219,4 @@ class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { } } - void logOut(ApiOAuthModelAccount account) {} } From 0ec1c57ac9db6677206c63fbb21c5b95af98b9d0 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Sun, 3 Oct 2021 17:06:02 -0400 Subject: [PATCH 08/33] move company index to knowledge graph --- lib/src/config/config_domain.dart | 5 ++--- .../api_company/repository/api_company_repository_index.dart | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/src/config/config_domain.dart b/lib/src/config/config_domain.dart index 5ff2e145..14416ebc 100644 --- a/lib/src/config/config_domain.dart +++ b/lib/src/config/config_domain.dart @@ -12,9 +12,8 @@ class ConfigDomain { ConfigEnvironment.isLocal ? "localhost:10252" : "blockchain.mytiki.com"; static const String signup = ConfigEnvironment.isLocal ? "localhost:3000" : "signup.mytiki.com"; - static const String companyIndex = ConfigEnvironment.isLocal - ? "localhost:10224" - : "company-index.mytiki.com"; + static const String knowledge = + ConfigEnvironment.isLocal ? "localhost:10544" : "knowledge.mytiki.com"; static Uri asUri(String authority, String path, [Map? query]) { diff --git a/lib/src/slices/api_company/repository/api_company_repository_index.dart b/lib/src/slices/api_company/repository/api_company_repository_index.dart index 07ae6dc3..64c3e97b 100644 --- a/lib/src/slices/api_company/repository/api_company_repository_index.dart +++ b/lib/src/slices/api_company/repository/api_company_repository_index.dart @@ -14,13 +14,12 @@ import '../../../utils/api/helper_api_rsp.dart'; import '../model/api_company_model_index.dart'; class ApiCompanyRepositoryIndex { - static final String _path = '/api/latest/company'; + static final String _path = '/api/latest/vertex/company'; static Future> find( String? bearer, String domain) async { Response rsp = await ConfigSentry.http.get( - ConfigDomain.asUri( - ConfigDomain.companyIndex, _path, {"domain": domain}), + ConfigDomain.asUri(ConfigDomain.knowledge, _path, {"domain": domain}), headers: HelperApiHeaders(auth: bearer).header); Map? rspMap = jsonDecode(rsp.body); return HelperApiRsp.fromJson(rspMap as Map?, From a3e92dc5246bb00ac05afd90f2c6ca4edd08410b Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Sun, 3 Oct 2021 20:14:44 -0400 Subject: [PATCH 09/33] adding all of the api models --- .../slices/api_knowledge/api_knowledge.dart | 0 .../company/api_knowledge_model_company.dart | 34 ++++++++++++++ .../api_knowledge_model_company_about.dart | 45 +++++++++++++++++++ .../api_knowledge_model_company_score.dart | 27 +++++++++++ .../api_knowledge_model_company_social.dart | 23 ++++++++++ .../api_knowledge_model_company_type.dart | 30 +++++++++++++ .../model/edge/api_knowledge_model_edge.dart | 28 ++++++++++++ .../edge/api_knowledge_model_edge_vertex.dart | 23 ++++++++++ .../api_knowledge_model_fingerprint_req.dart | 21 +++++++++ .../api_knowledge_model_fingerprint_rsp.dart | 29 ++++++++++++ ..._knowledge_model_fingerprint_rsp_edge.dart | 27 +++++++++++ .../vertex/api_knowledge_model_vertex.dart | 28 ++++++++++++ .../api_knowledge_model_vertex_field.dart | 23 ++++++++++ .../repository/api_knowledge_repository.dart | 4 ++ 14 files changed, 342 insertions(+) create mode 100644 lib/src/slices/api_knowledge/api_knowledge.dart create mode 100644 lib/src/slices/api_knowledge/model/company/api_knowledge_model_company.dart create mode 100644 lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_about.dart create mode 100644 lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_score.dart create mode 100644 lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_social.dart create mode 100644 lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_type.dart create mode 100644 lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge.dart create mode 100644 lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge_vertex.dart create mode 100644 lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_req.dart create mode 100644 lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp.dart create mode 100644 lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp_edge.dart create mode 100644 lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart create mode 100644 lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex_field.dart create mode 100644 lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart diff --git a/lib/src/slices/api_knowledge/api_knowledge.dart b/lib/src/slices/api_knowledge/api_knowledge.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company.dart b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company.dart new file mode 100644 index 00000000..2713189a --- /dev/null +++ b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company.dart @@ -0,0 +1,34 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'api_knowledge_model_company_about.dart'; +import 'api_knowledge_model_company_score.dart'; +import 'api_knowledge_model_company_social.dart'; +import 'api_knowledge_model_company_type.dart'; + +class ApiKnowledgeModelCompany { + ApiKnowledgeModelCompanyAbout? about; + ApiKnowledgeModelCompanyScore? score; + ApiKnowledgeModelCompanySocial? social; + ApiKnowledgeModelCompanyType? type; + + ApiKnowledgeModelCompany({this.about, this.score, this.social, this.type}); + + ApiKnowledgeModelCompany.fromJson(Map? json) { + if (json != null) { + this.about = ApiKnowledgeModelCompanyAbout.fromJson(json['about']); + this.score = ApiKnowledgeModelCompanyScore.fromJson(json['score']); + this.social = ApiKnowledgeModelCompanySocial.fromJson(json['social']); + this.type = ApiKnowledgeModelCompanyType.fromJson(json['type']); + } + } + + Map toJson() => { + 'about': about?.toJson(), + 'score': score?.toJson(), + 'social': social?.toJson(), + 'type': type?.toJson() + }; +} diff --git a/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_about.dart b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_about.dart new file mode 100644 index 00000000..af6d1451 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_about.dart @@ -0,0 +1,45 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelCompanyAbout { + String? domain; + String? name; + String? description; + String? logo; + String? url; + String? address; + String? phone; + + ApiKnowledgeModelCompanyAbout( + {this.domain, + this.name, + this.description, + this.logo, + this.url, + this.address, + this.phone}); + + ApiKnowledgeModelCompanyAbout.fromJson(Map? json) { + if (json != null) { + this.domain = json['domain']; + this.name = json['name']; + this.description = json['description']; + this.logo = json['logo']; + this.url = json['url']; + this.address = json['address']; + this.phone = json['phone']; + } + } + + Map toJson() => { + 'domain': domain, + 'name': name, + 'description': description, + 'logo': logo, + 'url': url, + 'address': address, + 'phone': phone + }; +} diff --git a/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_score.dart b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_score.dart new file mode 100644 index 00000000..569f718a --- /dev/null +++ b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_score.dart @@ -0,0 +1,27 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelCompanyScore { + double? sensitivityScore; + double? breachScore; + double? securityScore; + + ApiKnowledgeModelCompanyScore( + {this.sensitivityScore, this.breachScore, this.securityScore}); + + ApiKnowledgeModelCompanyScore.fromJson(Map? json) { + if (json != null) { + this.sensitivityScore = json['sensitivityScore']; + this.breachScore = json['breachScore']; + this.securityScore = json['securityScore']; + } + } + + Map toJson() => { + 'sensitivityScore': sensitivityScore, + 'breachScore': breachScore, + 'securityScore': securityScore + }; +} diff --git a/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_social.dart b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_social.dart new file mode 100644 index 00000000..c83d6683 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_social.dart @@ -0,0 +1,23 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelCompanySocial { + String? facebook; + String? twitter; + String? linkedin; + + ApiKnowledgeModelCompanySocial({this.facebook, this.twitter, this.linkedin}); + + ApiKnowledgeModelCompanySocial.fromJson(Map? json) { + if (json != null) { + this.facebook = json['facebook']; + this.twitter = json['twitter']; + this.linkedin = json['linkedin']; + } + } + + Map toJson() => + {'facebook': facebook, 'twitter': twitter, 'linkedin': linkedin}; +} diff --git a/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_type.dart b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_type.dart new file mode 100644 index 00000000..1cbf7280 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/company/api_knowledge_model_company_type.dart @@ -0,0 +1,30 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelCompanyType { + String? sector; + String? industry; + String? subIndustry; + List? tags; + + ApiKnowledgeModelCompanyType( + {this.sector, this.industry, this.subIndustry, this.tags}); + + ApiKnowledgeModelCompanyType.fromJson(Map? json) { + if (json != null) { + this.sector = json['sector']; + this.industry = json['industry']; + this.subIndustry = json['subIndustry']; + this.tags = json['tags'] != null ? List.from(json['tags']) : null; + } + } + + Map toJson() => { + 'sector': sector, + 'industry': industry, + 'subIndustry': subIndustry, + 'tags': tags, + }; +} diff --git a/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge.dart b/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge.dart new file mode 100644 index 00000000..2a9e0151 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge.dart @@ -0,0 +1,28 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'api_knowledge_model_edge_vertex.dart'; + +class ApiKnowledgeModelEdge { + ApiKnowledgeModelEdgeVertex? to; + ApiKnowledgeModelEdgeVertex? from; + String? fingerprint; + + ApiKnowledgeModelEdge({this.to, this.from, this.fingerprint}); + + ApiKnowledgeModelEdge.fromJson(Map? json) { + if (json != null) { + this.to = ApiKnowledgeModelEdgeVertex.fromJson(json['to']); + this.from = ApiKnowledgeModelEdgeVertex.fromJson(json['from']); + this.fingerprint = json['fingerprint']; + } + } + + Map toJson() => { + 'to': to?.toJson(), + 'from': from?.toJson(), + 'fingerprint': fingerprint, + }; +} diff --git a/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge_vertex.dart b/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge_vertex.dart new file mode 100644 index 00000000..d929bec1 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/edge/api_knowledge_model_edge_vertex.dart @@ -0,0 +1,23 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelEdgeVertex { + String? type; + String? value; + + ApiKnowledgeModelEdgeVertex({this.type, this.value}); + + ApiKnowledgeModelEdgeVertex.fromJson(Map? json) { + if (json != null) { + this.type = json['type']; + this.value = json['value']; + } + } + + Map toJson() => { + 'type': type, + 'value': value, + }; +} diff --git a/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_req.dart b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_req.dart new file mode 100644 index 00000000..539ba663 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_req.dart @@ -0,0 +1,21 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelFingerprintReq { + Set? fingerprints; + + ApiKnowledgeModelFingerprintReq({this.fingerprints}); + + ApiKnowledgeModelFingerprintReq.fromJson(Map? json) { + if (json != null) { + this.fingerprints = + json['fingerprints'] != null ? Set.from(json['fingerprints']) : null; + } + } + + Map toJson() => { + 'fingerprints': fingerprints, + }; +} diff --git a/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp.dart b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp.dart new file mode 100644 index 00000000..236c72a0 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp.dart @@ -0,0 +1,29 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'api_knowledge_model_fingerprint_rsp_edge.dart'; + +class ApiKnowledgeModelFingerprintRsp { + Set? fingerprints; + ApiKnowledgeModelFingerprintRspEdge? from; + ApiKnowledgeModelFingerprintRspEdge? to; + + ApiKnowledgeModelFingerprintRsp({this.fingerprints, this.from, this.to}); + + ApiKnowledgeModelFingerprintRsp.fromJson(Map? json) { + if (json != null) { + this.fingerprints = + json['fingerprints'] != null ? Set.from(json['fingerprints']) : null; + this.from = ApiKnowledgeModelFingerprintRspEdge.fromJson(json['from']); + this.from = ApiKnowledgeModelFingerprintRspEdge.fromJson(json['to']); + } + } + + Map toJson() => { + 'fingerprints': fingerprints, + 'from': from?.toJson(), + 'to': to?.toJson(), + }; +} diff --git a/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp_edge.dart b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp_edge.dart new file mode 100644 index 00000000..b879ffc2 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/fingerprint/api_knowledge_model_fingerprint_rsp_edge.dart @@ -0,0 +1,27 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelFingerprintRspEdge { + Set? fingerprints; + Map? from; + Map? to; + + ApiKnowledgeModelFingerprintRspEdge({this.fingerprints, this.from, this.to}); + + ApiKnowledgeModelFingerprintRspEdge.fromJson(Map? json) { + if (json != null) { + this.fingerprints = + json['fingerprints'] != null ? Set.from(json['fingerprints']) : null; + this.from = json['from'] != null ? Map.from(json['from']) : null; + this.to = json['to'] != null ? Map.from(json['to']) : null; + } + } + + Map toJson() => { + 'fingerprints': fingerprints, + 'to': to, + 'from': from, + }; +} diff --git a/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart b/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart new file mode 100644 index 00000000..56f77609 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart @@ -0,0 +1,28 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'api_knowledge_model_vertex_field.dart'; + +class ApiKnowledgeModelVertex { + String? type; + List? fields; + + ApiKnowledgeModelVertex({this.type, this.fields}); + + ApiKnowledgeModelVertex.fromJson(Map? json) { + if (json != null) { + this.type = json['type']; + List? fields = json['fields']; + this.fields = fields != null + ? fields.map((f) => ApiKnowledgeModelVertexField.fromJson(f)).toList() + : null; + } + } + + Map toJson() => { + 'type': type, + 'fields': fields?.map((f) => f.toJson()).toList(), + }; +} diff --git a/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex_field.dart b/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex_field.dart new file mode 100644 index 00000000..701d6b16 --- /dev/null +++ b/lib/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex_field.dart @@ -0,0 +1,23 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiKnowledgeModelVertexField { + String? name; + String? dataType; + + ApiKnowledgeModelVertexField({this.name, this.dataType}); + + ApiKnowledgeModelVertexField.fromJson(Map? json) { + if (json != null) { + this.name = json['name']; + this.dataType = json['dataType']; + } + } + + Map toJson() => { + 'name': name, + 'dataType': dataType, + }; +} diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart new file mode 100644 index 00000000..df504460 --- /dev/null +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart @@ -0,0 +1,4 @@ +// vertex api - get (list vertices) +// edge api - post (add) +// fingerprint api - post (search) +// company api - get (lookup) From 85f400d5e4f55d7c534be1d61d1ab7c20fb53e45 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Mon, 4 Oct 2021 01:04:45 -0400 Subject: [PATCH 10/33] added basic kgraph services --- .../api_company/api_company_service.dart | 23 +++++----- .../model/api_company_model_index.dart | 34 -------------- .../model/api_company_model_index_about.dart | 45 ------------------- .../model/api_company_model_index_score.dart | 27 ----------- .../model/api_company_model_index_social.dart | 23 ---------- .../model/api_company_model_index_type.dart | 30 ------------- .../slices/api_knowledge/api_knowledge.dart | 0 .../api_knowledge/api_knowledge_service.dart | 38 ++++++++++++++++ .../repository/api_knowledge_repository.dart | 4 -- .../api_knowledge_repository_company.dart} | 12 ++--- .../api_knowledge_repository_edge.dart | 31 +++++++++++++ .../api_knowledge_repository_fingerprint.dart | 32 +++++++++++++ .../api_knowledge_repository_vertex.dart | 30 +++++++++++++ .../slices/login_flow/login_flow_service.dart | 11 ++++- 14 files changed, 160 insertions(+), 180 deletions(-) delete mode 100644 lib/src/slices/api_company/model/api_company_model_index.dart delete mode 100644 lib/src/slices/api_company/model/api_company_model_index_about.dart delete mode 100644 lib/src/slices/api_company/model/api_company_model_index_score.dart delete mode 100644 lib/src/slices/api_company/model/api_company_model_index_social.dart delete mode 100644 lib/src/slices/api_company/model/api_company_model_index_type.dart delete mode 100644 lib/src/slices/api_knowledge/api_knowledge.dart create mode 100644 lib/src/slices/api_knowledge/api_knowledge_service.dart delete mode 100644 lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart rename lib/src/slices/{api_company/repository/api_company_repository_index.dart => api_knowledge/repository/api_knowledge_repository_company.dart} (67%) create mode 100644 lib/src/slices/api_knowledge/repository/api_knowledge_repository_edge.dart create mode 100644 lib/src/slices/api_knowledge/repository/api_knowledge_repository_fingerprint.dart create mode 100644 lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart diff --git a/lib/src/slices/api_company/api_company_service.dart b/lib/src/slices/api_company/api_company_service.dart index 6716ffbe..45262c9d 100644 --- a/lib/src/slices/api_company/api_company_service.dart +++ b/lib/src/slices/api_company/api_company_service.dart @@ -8,23 +8,29 @@ import 'package:sqflite_sqlcipher/sqlite_api.dart'; import '../../utils/api/helper_api_auth.dart'; import '../../utils/api/helper_api_rsp.dart'; import '../../utils/api/helper_api_utils.dart'; -import '../api_company/repository/api_company_repository_index.dart'; import '../api_company/repository/api_company_repository_local.dart'; -import 'model/api_company_model_index.dart'; +import '../api_knowledge/api_knowledge_service.dart'; +import '../api_knowledge/model/company/api_knowledge_model_company.dart'; import 'model/api_company_model_local.dart'; class ApiCompanyService { final HelperApiAuth helperApiAuth; final ApiCompanyRepositoryLocal _repositoryLocal; + final ApiKnowledgeService _apiKnowledgeService; - ApiCompanyService({required Database database, required this.helperApiAuth}) - : this._repositoryLocal = ApiCompanyRepositoryLocal(database); + ApiCompanyService( + {required Database database, + required this.helperApiAuth, + required ApiKnowledgeService apiKnowledgeService}) + : this._repositoryLocal = ApiCompanyRepositoryLocal(database), + this._apiKnowledgeService = apiKnowledgeService; Future upsert(String domain) async { if (domain.isNotEmpty) { ApiCompanyModelLocal? local = await _repositoryLocal.getByDomain(domain); if (local == null) { - HelperApiRsp indexRsp = await fetch(domain); + HelperApiRsp indexRsp = + await _apiKnowledgeService.getCompany(domain); if (HelperApiUtils.is2xx(indexRsp.code)) return _repositoryLocal.insert(ApiCompanyModelLocal( domain: domain, @@ -37,7 +43,8 @@ class ApiCompanyService { local.securityScore == null || local.modified! .isBefore(DateTime.now().subtract(Duration(days: 30)))) { - HelperApiRsp indexRsp = await fetch(domain); + HelperApiRsp indexRsp = + await _apiKnowledgeService.getCompany(domain); if (HelperApiUtils.is2xx(indexRsp.code)) return _repositoryLocal.update(ApiCompanyModelLocal( companyId: local.companyId, @@ -58,8 +65,4 @@ class ApiCompanyService { var company = await _repositoryLocal.getById(companyId); return company; } - - Future> fetch(String domain) async => - await helperApiAuth.proxy( - () => ApiCompanyRepositoryIndex.find(helperApiAuth.bearer, domain)); } diff --git a/lib/src/slices/api_company/model/api_company_model_index.dart b/lib/src/slices/api_company/model/api_company_model_index.dart deleted file mode 100644 index 319818e6..00000000 --- a/lib/src/slices/api_company/model/api_company_model_index.dart +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) TIKI Inc. - * MIT license. See LICENSE file in root directory. - */ - -import 'api_company_model_index_about.dart'; -import 'api_company_model_index_score.dart'; -import 'api_company_model_index_social.dart'; -import 'api_company_model_index_type.dart'; - -class ApiCompanyModelIndex { - ApiCompanyModelIndexAbout? about; - ApiCompanyModelIndexScore? score; - ApiCompanyModelIndexSocial? social; - ApiCompanyModelIndexType? type; - - ApiCompanyModelIndex({this.about, this.score, this.social, this.type}); - - ApiCompanyModelIndex.fromJson(Map? json) { - if (json != null) { - this.about = ApiCompanyModelIndexAbout.fromJson(json['about']); - this.score = ApiCompanyModelIndexScore.fromJson(json['score']); - this.social = ApiCompanyModelIndexSocial.fromJson(json['social']); - this.type = ApiCompanyModelIndexType.fromJson(json['type']); - } - } - - Map toJson() => { - 'about': about?.toJson(), - 'score': score?.toJson(), - 'social': social?.toJson(), - 'type': type?.toJson() - }; -} diff --git a/lib/src/slices/api_company/model/api_company_model_index_about.dart b/lib/src/slices/api_company/model/api_company_model_index_about.dart deleted file mode 100644 index e2546c92..00000000 --- a/lib/src/slices/api_company/model/api_company_model_index_about.dart +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) TIKI Inc. - * MIT license. See LICENSE file in root directory. - */ - -class ApiCompanyModelIndexAbout { - String? domain; - String? name; - String? description; - String? logo; - String? url; - String? address; - String? phone; - - ApiCompanyModelIndexAbout( - {this.domain, - this.name, - this.description, - this.logo, - this.url, - this.address, - this.phone}); - - ApiCompanyModelIndexAbout.fromJson(Map? json) { - if (json != null) { - this.domain = json['domain']; - this.name = json['name']; - this.description = json['description']; - this.logo = json['logo']; - this.url = json['url']; - this.address = json['address']; - this.phone = json['phone']; - } - } - - Map toJson() => { - 'domain': domain, - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'address': address, - 'phone': phone - }; -} diff --git a/lib/src/slices/api_company/model/api_company_model_index_score.dart b/lib/src/slices/api_company/model/api_company_model_index_score.dart deleted file mode 100644 index 18d998bd..00000000 --- a/lib/src/slices/api_company/model/api_company_model_index_score.dart +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) TIKI Inc. - * MIT license. See LICENSE file in root directory. - */ - -class ApiCompanyModelIndexScore { - double? sensitivityScore; - double? breachScore; - double? securityScore; - - ApiCompanyModelIndexScore( - {this.sensitivityScore, this.breachScore, this.securityScore}); - - ApiCompanyModelIndexScore.fromJson(Map? json) { - if (json != null) { - this.sensitivityScore = json['sensitivityScore']; - this.breachScore = json['breachScore']; - this.securityScore = json['securityScore']; - } - } - - Map toJson() => { - 'sensitivityScore': sensitivityScore, - 'breachScore': breachScore, - 'securityScore': securityScore - }; -} diff --git a/lib/src/slices/api_company/model/api_company_model_index_social.dart b/lib/src/slices/api_company/model/api_company_model_index_social.dart deleted file mode 100644 index ee4d1ad3..00000000 --- a/lib/src/slices/api_company/model/api_company_model_index_social.dart +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) TIKI Inc. - * MIT license. See LICENSE file in root directory. - */ - -class ApiCompanyModelIndexSocial { - String? facebook; - String? twitter; - String? linkedin; - - ApiCompanyModelIndexSocial({this.facebook, this.twitter, this.linkedin}); - - ApiCompanyModelIndexSocial.fromJson(Map? json) { - if (json != null) { - this.facebook = json['facebook']; - this.twitter = json['twitter']; - this.linkedin = json['linkedin']; - } - } - - Map toJson() => - {'facebook': facebook, 'twitter': twitter, 'linkedin': linkedin}; -} diff --git a/lib/src/slices/api_company/model/api_company_model_index_type.dart b/lib/src/slices/api_company/model/api_company_model_index_type.dart deleted file mode 100644 index e5a2c8b6..00000000 --- a/lib/src/slices/api_company/model/api_company_model_index_type.dart +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) TIKI Inc. - * MIT license. See LICENSE file in root directory. - */ - -class ApiCompanyModelIndexType { - String? sector; - String? industry; - String? subIndustry; - List? tags; - - ApiCompanyModelIndexType( - {this.sector, this.industry, this.subIndustry, this.tags}); - - ApiCompanyModelIndexType.fromJson(Map? json) { - if (json != null) { - this.sector = json['sector']; - this.industry = json['industry']; - this.subIndustry = json['subIndustry']; - this.tags = List.from(json['tags']); - } - } - - Map toJson() => { - 'sector': sector, - 'industry': industry, - 'subIndustry': subIndustry, - 'tags': tags - }; -} diff --git a/lib/src/slices/api_knowledge/api_knowledge.dart b/lib/src/slices/api_knowledge/api_knowledge.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/src/slices/api_knowledge/api_knowledge_service.dart b/lib/src/slices/api_knowledge/api_knowledge_service.dart new file mode 100644 index 00000000..347ff460 --- /dev/null +++ b/lib/src/slices/api_knowledge/api_knowledge_service.dart @@ -0,0 +1,38 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import '../../utils/api/helper_api_auth.dart'; +import '../../utils/api/helper_api_rsp.dart'; +import '../../utils/api/helper_api_utils.dart'; +import 'model/company/api_knowledge_model_company.dart'; +import 'model/edge/api_knowledge_model_edge.dart'; +import 'repository/api_knowledge_repository_company.dart'; +import 'repository/api_knowledge_repository_edge.dart'; + +class ApiKnowledgeService { + final HelperApiAuth helperApiAuth; + + ApiKnowledgeService(this.helperApiAuth); + + Future> getCompany( + String domain) async => + await helperApiAuth.proxy(() => + ApiKnowledgeRepositoryCompany.get(helperApiAuth.bearer, domain)); + + Future> addEdge( + ApiKnowledgeModelEdge edge) async => + await helperApiAuth.proxy( + () => ApiKnowledgeRepositoryEdge.post(helperApiAuth.bearer, edge)); + + Future> addEdges( + List edges) async { + List added = new List.empty(growable: true); + for (ApiKnowledgeModelEdge edge in edges) { + HelperApiRsp rsp = await addEdge(edge); + if (HelperApiUtils.isOk(rsp.code)) added.add(rsp.data); + } + return added; + } +} diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart deleted file mode 100644 index df504460..00000000 --- a/lib/src/slices/api_knowledge/repository/api_knowledge_repository.dart +++ /dev/null @@ -1,4 +0,0 @@ -// vertex api - get (list vertices) -// edge api - post (add) -// fingerprint api - post (search) -// company api - get (lookup) diff --git a/lib/src/slices/api_company/repository/api_company_repository_index.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_company.dart similarity index 67% rename from lib/src/slices/api_company/repository/api_company_repository_index.dart rename to lib/src/slices/api_knowledge/repository/api_knowledge_repository_company.dart index 64c3e97b..d60879b0 100644 --- a/lib/src/slices/api_company/repository/api_company_repository_index.dart +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_company.dart @@ -11,18 +11,20 @@ import '../../../config/config_domain.dart'; import '../../../config/config_sentry.dart'; import '../../../utils/api/helper_api_headers.dart'; import '../../../utils/api/helper_api_rsp.dart'; -import '../model/api_company_model_index.dart'; +import '../model/company/api_knowledge_model_company.dart'; -class ApiCompanyRepositoryIndex { +class ApiKnowledgeRepositoryCompany { static final String _path = '/api/latest/vertex/company'; - static Future> find( + static Future> get( String? bearer, String domain) async { Response rsp = await ConfigSentry.http.get( ConfigDomain.asUri(ConfigDomain.knowledge, _path, {"domain": domain}), headers: HelperApiHeaders(auth: bearer).header); Map? rspMap = jsonDecode(rsp.body); - return HelperApiRsp.fromJson(rspMap as Map?, - (json) => ApiCompanyModelIndex.fromJson(json as Map?)); + return HelperApiRsp.fromJson( + rspMap as Map?, + (json) => + ApiKnowledgeModelCompany.fromJson(json as Map?)); } } diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository_edge.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_edge.dart new file mode 100644 index 00000000..ce86aef3 --- /dev/null +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_edge.dart @@ -0,0 +1,31 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'dart:convert'; + +import 'package:http/http.dart'; + +import '../../../config/config_domain.dart'; +import '../../../config/config_sentry.dart'; +import '../../../utils/api/helper_api_headers.dart'; +import '../../../utils/api/helper_api_rsp.dart'; +import '../model/edge/api_knowledge_model_edge.dart'; + +class ApiKnowledgeRepositoryEdge { + static final String _path = '/api/latest/edge'; + + static Future> post( + String? bearer, ApiKnowledgeModelEdge edge) async { + Response rsp = await ConfigSentry.http.post( + ConfigDomain.asUri(ConfigDomain.knowledge, _path), + headers: HelperApiHeaders(auth: bearer).header, + body: jsonEncode(edge.toJson())); + Map? rspMap = jsonDecode(rsp.body); + return HelperApiRsp.fromJson( + rspMap as Map?, + (json) => + ApiKnowledgeModelEdge.fromJson(json as Map?)); + } +} diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository_fingerprint.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_fingerprint.dart new file mode 100644 index 00000000..8898e86c --- /dev/null +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_fingerprint.dart @@ -0,0 +1,32 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'dart:convert'; + +import 'package:http/http.dart'; + +import '../../../config/config_domain.dart'; +import '../../../config/config_sentry.dart'; +import '../../../utils/api/helper_api_headers.dart'; +import '../../../utils/api/helper_api_rsp.dart'; +import '../model/fingerprint/api_knowledge_model_fingerprint_req.dart'; +import '../model/fingerprint/api_knowledge_model_fingerprint_rsp.dart'; + +class ApiKnowledgeRepositoryFingerprint { + static final String _path = '/api/latest/fingerprint'; + + static Future> post( + String? bearer, ApiKnowledgeModelFingerprintReq req) async { + Response rsp = await ConfigSentry.http.post( + ConfigDomain.asUri(ConfigDomain.knowledge, _path), + headers: HelperApiHeaders(auth: bearer).header, + body: jsonEncode(req.toJson())); + Map? rspMap = jsonDecode(rsp.body); + return HelperApiRsp.fromJson( + rspMap as Map?, + (json) => ApiKnowledgeModelFingerprintRsp.fromJson( + json as Map?)); + } +} diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart new file mode 100644 index 00000000..ccdb01b9 --- /dev/null +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart @@ -0,0 +1,30 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'dart:convert'; + +import 'package:app/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart'; +import 'package:http/http.dart'; + +import '../../../config/config_domain.dart'; +import '../../../config/config_sentry.dart'; +import '../../../utils/api/helper_api_headers.dart'; +import '../../../utils/api/helper_api_rsp.dart'; + +class ApiKnowledgeRepositoryVertex { + static final String _path = '/api/latest/vertex'; + + static Future> get( + String? bearer) async { + Response rsp = await ConfigSentry.http.get( + ConfigDomain.asUri(ConfigDomain.knowledge, _path), + headers: HelperApiHeaders(auth: bearer).header); + Map? rspMap = jsonDecode(rsp.body); + return HelperApiRsp.fromJson( + rspMap as Map?, + (json) => + ApiKnowledgeModelVertex.fromJson(json as Map?)); + } +} diff --git a/lib/src/slices/login_flow/login_flow_service.dart b/lib/src/slices/login_flow/login_flow_service.dart index 9ec9b61e..0c3b68ab 100644 --- a/lib/src/slices/login_flow/login_flow_service.dart +++ b/lib/src/slices/login_flow/login_flow_service.dart @@ -24,6 +24,7 @@ import '../api_bouncer/model/api_bouncer_model_otp_rsp.dart'; import '../api_company/api_company_service.dart'; import '../api_email_msg/api_email_msg_service.dart'; import '../api_email_sender/api_email_sender_service.dart'; +import '../api_knowledge/api_knowledge_service.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_user/api_user_service.dart'; import '../api_user/model/api_user_model_current.dart'; @@ -240,12 +241,17 @@ class LoginFlowService extends ChangeNotifier { ApiAppDataService apiAppDataService = ApiAppDataService(database: database); registerLogout(() async => await apiAppDataService.logout()); + ApiKnowledgeService apiKnowledgeService = + ApiKnowledgeService(_helperApiAuth); + ApiEmailSenderService apiEmailSenderService = ApiEmailSenderService(database: database); ApiEmailMsgService apiEmailMsgService = ApiEmailMsgService(database: database); - ApiCompanyService apiCompanyService = - ApiCompanyService(database: database, helperApiAuth: _helperApiAuth); + ApiCompanyService apiCompanyService = ApiCompanyService( + database: database, + helperApiAuth: _helperApiAuth, + apiKnowledgeService: apiKnowledgeService); ApiOAuthService apiAuthService = ApiOAuthService( database: database, apiAppDataService: apiAppDataService); DataBkgService dataBkgService = DataBkgService( @@ -263,6 +269,7 @@ class LoginFlowService extends ChangeNotifier { Provider.value(value: apiEmailMsgService), Provider.value(value: apiAppDataService), Provider.value(value: apiAuthService), + Provider.value(value: apiKnowledgeService), ChangeNotifierProvider.value(value: dataBkgService), ]; } From f8efa1be41439d6c33d5b8f1afa7fb4c918ddfc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Mon, 4 Oct 2021 19:55:22 -0300 Subject: [PATCH 11/33] api microsoft --- .../api_google/api_google_service_email.dart | 14 +- .../api_microsoft/api_microsoft_service.dart | 38 +-- .../api_microsoft_service_email.dart | 162 ++++++++++++- .../model/api_google_model_email.dart | 8 + .../api_google_repository_info.dart | 20 ++ .../slices/api_oauth/api_oauth_service.dart | 9 +- .../data_bkg/data_bkg_interface_email.dart | 3 +- .../data_bkg/data_bkg_service_email.dart | 8 +- .../data_screen/data_screen_controller.dart | 2 +- .../ui/data_screen_layout_accounts.dart | 2 +- res/json/auth_providers_db.json | 16 ++ res/json/auth_providers_db_tmp.json | 31 --- res/json/microsoft_info_outlook_db.json | 225 ++++++++++++++++++ 13 files changed, 467 insertions(+), 71 deletions(-) create mode 100644 lib/src/slices/api_microsoft/model/api_google_model_email.dart create mode 100644 lib/src/slices/api_microsoft/repository/api_google_repository_info.dart delete mode 100644 res/json/auth_providers_db_tmp.json create mode 100644 res/json/microsoft_info_outlook_db.json diff --git a/lib/src/slices/api_google/api_google_service_email.dart b/lib/src/slices/api_google/api_google_service_email.dart index 6172ddd4..d15a626f 100644 --- a/lib/src/slices/api_google/api_google_service_email.dart +++ b/lib/src/slices/api_google/api_google_service_email.dart @@ -103,9 +103,19 @@ class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { } @override - Future send(ApiOAuthModelAccount account, String email) async { + Future send(ApiOAuthModelAccount account, String email, String to, + String subject) async { GmailApi? gmailApi = await _getGmailApi(account); - String base64Email = base64UrlEncode(utf8.encode(email)); + String message = ''' +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: 7bit +to: $to +from: me +subject: $subject + +$email +'''; + String base64Email = base64UrlEncode(utf8.encode(message)); if (gmailApi != null) { await gmailApi.users.messages .send(Message.fromJson({'raw': base64Email}), 'me'); diff --git a/lib/src/slices/api_microsoft/api_microsoft_service.dart b/lib/src/slices/api_microsoft/api_microsoft_service.dart index cfe59dc3..6c6f0d32 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service.dart @@ -3,40 +3,50 @@ * MIT license. See LICENSE file in root directory. */ +import '../../config/config_sentry.dart'; +import '../../utils/helper_json.dart'; +import '../api_app_data/api_app_data_service.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; +import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; import '../data_bkg/data_bkg_interface_email.dart'; import '../data_bkg/data_bkg_interface_provider.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; import 'api_microsoft_service_email.dart'; +import 'repository/api_google_repository_info.dart'; class ApiMicrosoftService implements ApiOAuthInterfaceProvider, DataBkgInterfaceProvider { + final ApiOAuthService _apiAuthService; + final ApiMicrosoftRepositoryInfo _apiMicrosoftRepositoryInfo; final ApiMicrosoftServiceEmail _apiMicrosoftServiceEmail; - ApiMicrosoftService() - : this._apiMicrosoftServiceEmail = ApiMicrosoftServiceEmail(); + ApiMicrosoftService( + {required ApiOAuthService apiAuthService, + required ApiAppDataService apiAppDataService}) + : this._apiAuthService = apiAuthService, + this._apiMicrosoftRepositoryInfo = ApiMicrosoftRepositoryInfo(), + this._apiMicrosoftServiceEmail = + ApiMicrosoftServiceEmail(apiAuthService); @override - // TODO: implement email DataBkgInterfaceEmail? get email => _apiMicrosoftServiceEmail; @override - Future> getInfoCards( - ApiOAuthModelAccount account) { - // TODO: implement getInfoCards - throw UnimplementedError(); + Future isConnected(ApiOAuthModelAccount account) async { + return (await _apiAuthService.getUserInfo(account)) != null; } - @override - Future isConnected(ApiOAuthModelAccount account) { - // TODO: implement isConnected - throw UnimplementedError(); + Future revokeToken(ApiOAuthModelAccount account) async { + await ConfigSentry.http.post(Uri.parse( + 'https://oauth2.googleapis.com/v1.0/me/revokeSignInSessions')); } @override - Future revokeToken(ApiOAuthModelAccount account) { - // TODO: implement revokeToken - throw UnimplementedError(); + Future> getInfoCards( + ApiOAuthModelAccount account) async { + List? infoJson = await _apiMicrosoftRepositoryInfo.outlook(); + return HelperJson.listFromJson( + infoJson, (s) => InfoCarouselCardModel.fromJson(s)); } } diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index 2068dab3..0381a1b9 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -5,40 +5,176 @@ // ignore_for_file: unused_import +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; + +import '../../config/config_sentry.dart'; +import '../../utils/api/helper_api_headers.dart'; +import '../../utils/api/helper_api_utils.dart'; import '../api_email_msg/model/api_email_msg_model.dart'; +import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; +import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; import '../data_bkg/data_bkg_interface_email.dart'; import '../data_bkg/data_bkg_interface_provider.dart'; import '../data_bkg/model/data_bkg_model_page.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; +import 'model/api_google_model_email.dart'; class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { + final ApiMicrosoftModelEmail model; + final _log = Logger('ApiMicrosoftServiceEmail'); + + final ApiOAuthService apiOAuthService; + + String _messagesEndpoint = "https://graph.microsoft.com/v1.0/me/messages"; + + String _sendEmailEndpoint = "https://graph.microsoft.com/v1.0/me/sendMail"; + + ApiMicrosoftServiceEmail(this.apiOAuthService) + : this.model = ApiMicrosoftModelEmail(); + + @override + List get labels => this.model.categories; + @override Future> getList(ApiOAuthModelAccount account, {String? label, String? from, int? afterEpoch, - int? maxResults, - String? page}) { - // TODO: implement getList - throw UnimplementedError(); + int? maxResults = 10, + String? page = "0"}) async { + int pageNum = int.parse(page!); + List messages = List.empty(); + String query = _buildQuery( + afterEpoch: afterEpoch, + from: from, + page: pageNum, + maxResults: maxResults!); + //TODO get "to" email + Uri uri = Uri.parse(_messagesEndpoint + "?\$select=id&\$filter=$query"); + Response rsp = await this + .apiOAuthService + .proxy( + () => ConfigSentry.http.get(uri, + headers: HelperApiHeaders(auth: account.accessToken).header), + account) + .timeout(Duration(seconds: 10), + onTimeout: () => throw new http.ClientException( + 'ApiMicrosoftServiceEmail getList timed out')); + if (HelperApiUtils.is2xx(rsp.statusCode)) { + Map msgBody = json.decode(rsp.body); + List messageList = msgBody['value']; + _log.finest('Got ' + (messageList.length.toString()) + ' messages'); + messages = messageList + .where((message) => message['id'] != null) + .map((message) => message['id'] as String) + .toList(); + page = msgBody['@odata.nextLink'] != null + ? (int.parse(page) + 1).toString() + : "1"; + } + return DataBkgModelPage(next: page, data: messages); } @override Future getMessage( - ApiOAuthModelAccount account, String messageId) { - // TODO: implement getMessage - throw UnimplementedError(); + ApiOAuthModelAccount account, String messageId) async { + Uri uri = Uri.parse(_messagesEndpoint + + '/messageId?\$select=internetMessageHeaders,sender,receivedDateTime'); + Response rsp = await this + .apiOAuthService + .proxy( + () => ConfigSentry.http.get(uri, + headers: HelperApiHeaders(auth: account.accessToken).header), + account) + .timeout(Duration(seconds: 10), + onTimeout: () => throw new http.ClientException( + 'ApiMicrosoftServiceEmail getList timed out')); + Map message = json.decode(rsp.body); + String? unsubscribeMailTo; + _log.finest('Fetched message ids: ' + (message['id'] ?? '')); + message['internetMessageHeaders'].forEach((header) { + switch (header['name']?.trim()) { + case 'List-Unsubscribe': + unsubscribeMailTo = _listUnsubscribeHeader(header['value']); + break; + } + }); + return ApiEmailMsgModel( + extMessageId: messageId, + receivedDate: DateTime.parse(message['receivedDateTime']), + openedDate: null, + // TODO implement + account: account.email, + sender: ApiEmailSenderModel( + category: null, // TODO do we need to use this categories + unsubscribeMailTo: unsubscribeMailTo, + email: message['sender']['emailAddress']['address'], + name: message['sender']['emailAddress']['name'])); } @override - // TODO: implement labels - List get labels => throw UnimplementedError(); + Future send(ApiOAuthModelAccount account, String email, String to, + String subject) async { + Map message = { + "message": { + "subject": subject, + "body": {"contentType": "HTML", "content": email}, + "toRecipients": [ + { + "emailAddress": {"address": to} + } + ] + } + }; + Uri uri = Uri.parse(_sendEmailEndpoint); + Response rsp = await this + .apiOAuthService + .proxy( + () => ConfigSentry.http.post(uri, + headers: HelperApiHeaders(auth: account.accessToken).header, + body: message), + account) + .timeout(Duration(seconds: 10), + onTimeout: () => throw new http.ClientException( + 'ApiMicrosoftServiceEmail sendEmail timed out')); + if (HelperApiUtils.is2xx(rsp.statusCode)) { + _log.finest('unsubscribe mail sent to ' + to); + return true; + } + return false; + } - @override - Future send(ApiOAuthModelAccount account, String email) { - // TODO: implement send - throw UnimplementedError(); + String _buildQuery( + {int? afterEpoch, String? from, int page = 0, int maxResults = 10}) { + StringBuffer queryBuffer = new StringBuffer(); + if (afterEpoch != null) { + DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(afterEpoch); + _appendQuery( + queryBuffer, "receivedDateTime ge ${dateTime.toIso8601String()}"); + } + if (from != null) _appendQuery(queryBuffer, "address eq $from"); + int skip = page * maxResults; + queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); + return queryBuffer.toString(); + } + + StringBuffer _appendQuery(StringBuffer queryBuffer, String append) { + if (queryBuffer.isNotEmpty) { + queryBuffer.write(' and '); + } + queryBuffer.write(append); + return queryBuffer; + } + + String? _listUnsubscribeHeader(String header) { + String removeCaret = header.replaceAll('<', '').replaceAll(">", ''); + List splitMailTo = removeCaret.split('mailto:'); + if (splitMailTo.length > 1) return splitMailTo[1].split(',')[0]; } } diff --git a/lib/src/slices/api_microsoft/model/api_google_model_email.dart b/lib/src/slices/api_microsoft/model/api_google_model_email.dart new file mode 100644 index 00000000..e2530655 --- /dev/null +++ b/lib/src/slices/api_microsoft/model/api_google_model_email.dart @@ -0,0 +1,8 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +class ApiMicrosoftModelEmail { + get categories => ['all']; +} diff --git a/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart b/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart new file mode 100644 index 00000000..ba9299aa --- /dev/null +++ b/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart @@ -0,0 +1,20 @@ +/* + * Copyright (c) TIKI Inc. + * MIT license. See LICENSE file in root directory. + */ + +import 'dart:convert'; + +import 'package:flutter/services.dart'; + +class ApiMicrosoftRepositoryInfo { + // TODO Microsoft cards + static const _dbLocationOutlook = "res/json/microsoft_info_gmail_db.json"; + + Future> outlook() => _load(_dbLocationOutlook); + + Future> _load(String location) async { + String jsonString = await rootBundle.loadString(location); + return jsonDecode(jsonString); + } +} diff --git a/lib/src/slices/api_oauth/api_oauth_service.dart b/lib/src/slices/api_oauth/api_oauth_service.dart index 1244e22d..f3115b12 100644 --- a/lib/src/slices/api_oauth/api_oauth_service.dart +++ b/lib/src/slices/api_oauth/api_oauth_service.dart @@ -14,6 +14,7 @@ import '../../utils/api/helper_api_headers.dart'; import '../../utils/api/helper_api_utils.dart'; import '../api_app_data/api_app_data_service.dart'; import '../api_google/api_google_service.dart'; +import '../api_microsoft/api_microsoft_service.dart'; import 'api_oauth_interface_provider.dart'; import 'model/api_oauth_model.dart'; import 'model/api_oauth_model_account.dart'; @@ -106,7 +107,8 @@ class ApiOAuthService { Future proxy( Future Function() request, ApiOAuthModelAccount account) async { Response rsp = await request(); - if (HelperApiUtils.isUnauthorized(rsp.statusCode)) { + if (HelperApiUtils.isUnauthorized(rsp.statusCode) && + account.refreshToken != null) { await _refreshToken(account); rsp = await request(); } @@ -164,6 +166,11 @@ class ApiOAuthService { case 'google': _model.interfaceProviders[k] = ApiGoogleService( apiAuthService: this, apiAppDataService: _apiAppDataService); + break; + case 'microsoft': + _model.interfaceProviders[k] = ApiMicrosoftService( + apiAuthService: this, apiAppDataService: _apiAppDataService); + break; } }); } diff --git a/lib/src/slices/data_bkg/data_bkg_interface_email.dart b/lib/src/slices/data_bkg/data_bkg_interface_email.dart index 64334250..652bf6fa 100644 --- a/lib/src/slices/data_bkg/data_bkg_interface_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_interface_email.dart @@ -20,5 +20,6 @@ abstract class DataBkgInterfaceEmail { int? maxResults, String? page}); - Future send(ApiOAuthModelAccount account, String email); + Future send( + ApiOAuthModelAccount account, String email, String to, String subject); } diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_bkg/data_bkg_service_email.dart index 1dc5722f..f5fdc304 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_service_email.dart @@ -49,12 +49,6 @@ class DataBkgServiceEmail { String to = uri.path; String subject = uri.queryParameters['subject'] ?? "Unsubscribe from $list"; String email = ''' -Content-Type: text/html; charset=utf-8 -Content-Transfer-Encoding: 7bit -to: $to -from: me -subject: $subject - @@ -76,7 +70,7 @@ revolution today.
'''; DataBkgInterfaceEmail? emailInterface = await _getEmailInterface(account); if (emailInterface != null) - return await emailInterface.send(account, email); + return await emailInterface.send(account, email, to, subject); return false; } diff --git a/lib/src/slices/data_screen/data_screen_controller.dart b/lib/src/slices/data_screen/data_screen_controller.dart index 36dc0760..90e4afad 100644 --- a/lib/src/slices/data_screen/data_screen_controller.dart +++ b/lib/src/slices/data_screen/data_screen_controller.dart @@ -22,7 +22,7 @@ class DataScreenController { } linkAccount() async { - service.linkAccount('google'); + service.linkAccount('microsoft'); } removeAccount() { diff --git a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart index 7219b4f1..bfa4ca23 100644 --- a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart +++ b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart @@ -15,7 +15,7 @@ class DecisionScreenLayoutAccounts extends StatelessWidget { margin: EdgeInsets.only(top: 2.h), child: LinkAccount( username: account?.email, - type: 'Google', + type: 'Microsoft', linkedIcon: "account-soon-google", unlinkedIcon: "google-icon", onLink: () => service.controller.linkAccount(), diff --git a/res/json/auth_providers_db.json b/res/json/auth_providers_db.json index 90c006e5..4cad985f 100644 --- a/res/json/auth_providers_db.json +++ b/res/json/auth_providers_db.json @@ -1,4 +1,20 @@ { + "microsoft": { + "redirectUrl": "com.mytiki.app://oauth", + "iosClientId": "6e52a878-7251-4669-8e42-70655255a263", + "androidClientId": "6e52a878-7251-4669-8e42-70655255a263", + "authorizationEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", + "tokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", + "discoveryUrl": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", + "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", + "scopes": [ + "openid", + "email", + "profile", + "mail.read", + "mail.send" + ] + }, "google": { "androidClientId": "240428403253-8bof2prkdatnsm8d2msgq2r81r12p5np.apps.googleusercontent.com", "iosClientId": "240428403253-v4qk9lt2l07cc8am12gggocpbbsjdvl7.apps.googleusercontent.com", diff --git a/res/json/auth_providers_db_tmp.json b/res/json/auth_providers_db_tmp.json deleted file mode 100644 index 8d2cbcd1..00000000 --- a/res/json/auth_providers_db_tmp.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "microsoft": { - "clientId": "6e52a878-7251-4669-8e42-70655255a263", - "authorizationEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", - "tokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", - "discoveryUrl": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", - "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo" - }, - "oauth0": { - "clientId": "9ShsNLQbVHiBQxAhpVekjG22jlhACLyW", - "authorizationEndpoint": "https://dev-gx7yq-57.us.auth0.com/authorize", - "tokenEndpoint": "https://dev-gx7yq-57.us.auth0.com/oauth/token", - "discoveryUrl": "https://dev-gx7yq-57.us.auth0.com/.well-known/openid-configuration", - "userinfo_endpoint": "https://dev-gx7yq-57.us.auth0.com/userinfo" - }, - "google": { - "androidClientId": "240428403253-8bof2prkdatnsm8d2msgq2r81r12p5np.apps.googleusercontent.com", - "iosClientId": "240428403253-v4qk9lt2l07cc8am12gggocpbbsjdvl7.apps.googleusercontent.com", - "authorizationEndpoint": "https://accounts.google.com/o/oauth2/v2/auth", - "tokenEndpoint": "https://www.googleapis.com/oauth2/v4/token", - "discoveryUrl": "https://accounts.google.com/.well-known/openid-configuration", - "userinfo_endpoint": "https://www.googleapis.com/oauth2/v1/userinfo?alt=json", - "scopes": [ - "openid", - "https://www.googleapis.com/auth/userinfo.profile", - "https://www.googleapis.com/auth/userinfo.email", - "https://www.googleapis.com/auth/gmail.readonly", - "https://www.googleapis.com/auth/gmail.send" - ] - } -} \ No newline at end of file diff --git a/res/json/microsoft_info_outlook_db.json b/res/json/microsoft_info_outlook_db.json new file mode 100644 index 00000000..ab49dcbd --- /dev/null +++ b/res/json/microsoft_info_outlook_db.json @@ -0,0 +1,225 @@ +[ + { + "cover": { + "header": { + "image": "gmail-round-logo", + "title": "Your Gmail account", + "share": { + "message": "Gmail knows where you are when you read your emails. It's your data, start taking it back on https://www.mytiki.com", + "image": "socialmedia1.png" + } + }, + "image": "where-you-are", + "subtitle": "Gmail knows...", + "bigTextLight": "Where you are ", + "bigTextDark": "when you read your emails.", + "text": "Your Gmail account tracks your location when you open your emails...\nEvery single time you do it." + }, + "content": { + "body": { + "explain": [ + { + "text": "Gmail records your ", + "url": null + }, + { + "text": "IP address", + "url": "https://en.wikipedia.org/wiki/IP_address" + }, + { + "text": " every time you open your inbox or send an email.\n\nMost Google products and almost all email services do this. Some, like Outlook, but NOT Gmail, will even send your IP address to the person receiving your email.\n\nThe most common use approximates your location, pinpointing you within 3-5 miles anywhere in the world. In extreme cases, like criminal investigations, your IP address can be tied to your exact device and location by working with an Internet Service Provider.", + "url": null + } + ], + "theySay": [ + { + "image": "info-badge", + "text": "Security monitoring to suspicious access" + }, + { + "image": "search-graph", + "text": "Analyzing patterns to develop new features and products" + } + ], + "shouldKnow": [ + { + "image": "np-tap", + "text": "Used advertisers for location-based targeting and surveillance" + }, + { + "image": "badge", + "text": "Used by law enforcement" + }, + { + "image": "worldwide", + "text": "Saved for 9 months, then obscured and kept permanently" + } + ] + }, + "cta": { + "explain": [ + { + "text": "You can use a ", + "url": null + }, + { + "text": "VPN", + "url": "https://nordvpn.com" + }, + { + "text": " to hide your IP address or, for true anonymity, switch to an ", + "url": null + }, + { + "text": "encrypted email service", + "url": "https://protonmail.com" + }, + { + "text": ".\n\nGmail does not currently use additional location services.\n\nIf you just hate the ads, you can turn off ad personalization for your entire Google account. ", + "url": null + } + ], + "buttonText": "AD PERSONALIZATION", + "buttonUrl": "https://adssettings.google.com" + } + } + }, + { + "cover": { + "header": { + "image": "gmail-round-logo", + "title": "Your Gmail account", + "share": { + "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", + "image": "socialmedia2.png" + } + }, + "image": "what-written", + "subtitle": "Gmail knows...", + "bigTextLight": "What you’ve written to ", + "bigTextDark": "your friends", + "text": "Gmail has all emails you’ve ever written to anyone. They look at the content in the emails, so they know you better." + }, + "content": { + "body": { + "explain": [ + { + "text": "Gmail has access to your emails - it reads, stores and analyzes them.\n\nGoogle uses this information for targeted ads and what they call “smart features” like automatically adding your flight information to your calendar.\n\nIn their own words:\n\n\nCreepy.", + "url": null + } + ], + "theySay": [ + { + "image": "airplane", + "text": "Travel assistance like itineraries, updates, and maps." + }, + { + "image": "email", + "text": "Smart email with suggestions, nudges, prioritization, and filtering" + }, + { + "image": "package", + "text": "Track packages, reservations, loyalty cards, and bills" + } + ], + "shouldKnow": [ + { + "image": "np-tap", + "text": "Used by advertisers for key word targetting" + }, + { + "image": "hammer", + "text": "Used by law enforcement" + }, + { + "image": "worldwide", + "text": "Disabled by default in Europe" + } + ] + }, + "cta": { + "explain": [ + { + "text": "You can turn off both,", + "url": null + }, + { + "url": "https://support.google.com/mail/answer/10079371", + "text": " ad personalization " + }, + { + "text": "and “smart features” to stop Google from scanning your emails.", + "url": null + } + ], + "buttonText": "STOP READING MY EMAILS", + "buttonUrl": "https://support.google.com/mail/answer/10079371" + } + } + }, + { + "cover": { + "header": { + "image": "gmail-round-logo", + "title": "Your Gmail account", + "share": { + "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", + "image": "socialmedia2.png" + } + }, + "image": "everything-you-do", + "subtitle": "Gmail knows...", + "bigTextLight": "Everything\n", + "bigTextDark": "you do in your Gmail app", + "text": "Your Gmail app has quite a lot of analytics packed in and knows quite a few things...." + }, + "content": { + "body": { + "explain": [ + { + "url": null, + "text": "Gmail’s app is designed to track most of the things you do with it. It tracks each action you take, on which device, OS, and time of day.\n\nFor example, when you opened the app, what you searched for and if you saw an ad were all tracked.\n\nYour audio is recorded if you use voice search or assistant with Gmail." + } + ], + "theySay": [ + { + "image": "person-4", + "text": "Personalized experiences" + }, + { + "image": "circle-badge", + "text": "App and content recommendations" + }, + { + "image": "search", + "text": "Faster Search" + } + ], + "shouldKnow": [ + { + "image": "hat-n-glasses", + "text": "Your activity is tracked even when logged out" + }, + { + "image": "badge", + "text": "Used by law enforcement" + }, + { + "image": "bomb", + "text": "You can set your history to auto delete after 3, 18, or 36 months" + } + ] + }, + "cta": { + "explain": [ + { + "text": "You can delete all activities, individual activities, set it to auto-delete, or disable activity tracking entirely.", + "url": null + } + ], + "buttonText": "MY ACTIVITY", + "buttonUrl": "https://myactivity.google.com" + } + } + } +] From 2a27498703adb3c2d3e4130ca82988db7648fed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Mon, 4 Oct 2021 21:29:38 -0300 Subject: [PATCH 12/33] add recipient filtering --- .../api_microsoft_service_email.dart | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index 0381a1b9..17d65b4e 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -48,15 +48,15 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { int? afterEpoch, int? maxResults = 10, String? page = "0"}) async { - int pageNum = int.parse(page!); + int pageNum = int.parse(page ?? "0"); List messages = List.empty(); String query = _buildQuery( afterEpoch: afterEpoch, from: from, page: pageNum, maxResults: maxResults!); - //TODO get "to" email - Uri uri = Uri.parse(_messagesEndpoint + "?\$select=id&\$filter=$query"); + Uri uri = Uri.parse( + _messagesEndpoint + "?\$select=id,toRecipients&\$filter=$query"); Response rsp = await this .apiOAuthService .proxy( @@ -71,12 +71,12 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { List messageList = msgBody['value']; _log.finest('Got ' + (messageList.length.toString()) + ' messages'); messages = messageList - .where((message) => message['id'] != null) + .where((message) => + message['id'] != null && + _findRecipient(message['toRecipients'], account.email!)) .map((message) => message['id'] as String) .toList(); - page = msgBody['@odata.nextLink'] != null - ? (int.parse(page) + 1).toString() - : "1"; + page = msgBody['@odata.nextLink'] != null ? (pageNum + 1).toString() : "1"; } return DataBkgModelPage(next: page, data: messages); } @@ -112,7 +112,9 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { // TODO implement account: account.email, sender: ApiEmailSenderModel( - category: null, // TODO do we need to use this categories + category: message['categories']?.isNotEmpty + ? message['categories'][0] + : null, unsubscribeMailTo: unsubscribeMailTo, email: message['sender']['emailAddress']['address'], name: message['sender']['emailAddress']['name'])); @@ -138,7 +140,7 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { .proxy( () => ConfigSentry.http.post(uri, headers: HelperApiHeaders(auth: account.accessToken).header, - body: message), + body: json.encode(message)), account) .timeout(Duration(seconds: 10), onTimeout: () => throw new http.ClientException( @@ -153,14 +155,15 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { String _buildQuery( {int? afterEpoch, String? from, int page = 0, int maxResults = 10}) { StringBuffer queryBuffer = new StringBuffer(); + int skip = page * maxResults; + queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); if (afterEpoch != null) { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(afterEpoch); _appendQuery( queryBuffer, "receivedDateTime ge ${dateTime.toIso8601String()}"); } - if (from != null) _appendQuery(queryBuffer, "address eq $from"); - int skip = page * maxResults; - queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); + if (from != null) + _appendQuery(queryBuffer, "from/emailAddress/address eq $from"); return queryBuffer.toString(); } @@ -177,4 +180,12 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { List splitMailTo = removeCaret.split('mailto:'); if (splitMailTo.length > 1) return splitMailTo[1].split(',')[0]; } + + bool _findRecipient(List recipients, String email) { + bool found = false; + recipients.forEach((recipient) { + if (recipient['emailAddress']["address"] == email) found = true; + }); + return found; + } } From a3440d080c7f5087f9a56252ab9f4c5d0263a1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Tue, 5 Oct 2021 19:10:56 -0300 Subject: [PATCH 13/33] microsoft api done, missing tests and ui --- .../slices/api_google/api_google_service.dart | 1 - .../api_microsoft_service_email.dart | 29 +++++++++------ .../data_bkg/data_bkg_service_email.dart | 37 +++---------------- .../ui/data_screen_layout_body.dart | 4 +- 4 files changed, 24 insertions(+), 47 deletions(-) diff --git a/lib/src/slices/api_google/api_google_service.dart b/lib/src/slices/api_google/api_google_service.dart index d8283db2..b061b56f 100644 --- a/lib/src/slices/api_google/api_google_service.dart +++ b/lib/src/slices/api_google/api_google_service.dart @@ -41,7 +41,6 @@ class ApiGoogleService 'https://oauth2.googleapis.com/revoke?token=' + account.accessToken!)); } - // TODO in the future we'll have account specific infocards @override Future> getInfoCards( ApiOAuthModelAccount account) async { diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index 17d65b4e..c90eb7dc 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -76,7 +76,8 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { _findRecipient(message['toRecipients'], account.email!)) .map((message) => message['id'] as String) .toList(); - page = msgBody['@odata.nextLink'] != null ? (pageNum + 1).toString() : "1"; + page = + msgBody['@odata.nextLink'] != null ? (pageNum + 1).toString() : null; } return DataBkgModelPage(next: page, data: messages); } @@ -84,8 +85,9 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { @override Future getMessage( ApiOAuthModelAccount account, String messageId) async { - Uri uri = Uri.parse(_messagesEndpoint + - '/messageId?\$select=internetMessageHeaders,sender,receivedDateTime'); + String urlStr = _messagesEndpoint + + '/$messageId?\$select=internetMessageHeaders,sender,receivedDateTime'; + Uri uri = Uri.parse(urlStr); Response rsp = await this .apiOAuthService .proxy( @@ -98,21 +100,24 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { Map message = json.decode(rsp.body); String? unsubscribeMailTo; _log.finest('Fetched message ids: ' + (message['id'] ?? '')); - message['internetMessageHeaders'].forEach((header) { - switch (header['name']?.trim()) { - case 'List-Unsubscribe': - unsubscribeMailTo = _listUnsubscribeHeader(header['value']); - break; - } - }); + if (message['internetMessageHeaders'] != null) { + message['internetMessageHeaders'].forEach((header) { + switch (header['name']?.trim()) { + case 'List-Unsubscribe': + unsubscribeMailTo = _listUnsubscribeHeader(header['value']); + break; + } + }); + } return ApiEmailMsgModel( extMessageId: messageId, receivedDate: DateTime.parse(message['receivedDateTime']), openedDate: null, - // TODO implement + // TODO implement opened date account: account.email, sender: ApiEmailSenderModel( - category: message['categories']?.isNotEmpty + category: message['categories'] != null && + message['categories'].isNotEmpty ? message['categories'][0] : null, unsubscribeMailTo: unsubscribeMailTo, diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_bkg/data_bkg_service_email.dart index f5fdc304..7a20f9c0 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_service_email.dart @@ -92,7 +92,10 @@ revolution today.
DateTime.now() .subtract(Duration(days: 1)) .isAfter(DateTime.fromMillisecondsSinceEpoch(indexEpoch))) { - await _loopLabels(interfaceEmail, account, indexEpoch: indexEpoch); + await _pageList( + interfaceEmail: interfaceEmail, + account: account, + indexEpoch: indexEpoch); await _apiAppDataService.save(ApiAppDataKey.emailIndexEpoch, DateTime.now().millisecondsSinceEpoch.toString()); _log.fine('Email index for ' + @@ -102,46 +105,20 @@ revolution today.
} } - Future _loopLabels( - DataBkgInterfaceEmail interfaceEmail, ApiOAuthModelAccount account, - {int? indexEpoch}) async { - _log.fine('Loop Labels for ${account.email}'); - ApiAppDataModel? appDataIndexLabel = - await _apiAppDataService.getByKey(ApiAppDataKey.emailIndexLabel); - String activeLabel = appDataIndexLabel?.value ?? interfaceEmail.labels[0]; - for (int i = interfaceEmail.labels.indexOf(activeLabel); - i < interfaceEmail.labels.length; - i++) { - String label = interfaceEmail.labels[i]; - await _pageList( - interfaceEmail: interfaceEmail, - account: account, - label: label, - indexEpoch: indexEpoch); - await _apiAppDataService.save( - ApiAppDataKey.emailIndexLabel, - (i + 1 == interfaceEmail.labels.length) - ? interfaceEmail.labels[0] - : interfaceEmail.labels[i + 1]); - } - } - Future _pageList( {required DataBkgInterfaceEmail interfaceEmail, required ApiOAuthModelAccount account, String? page, - String? label, int? indexEpoch}) async { if (page == null) { ApiAppDataModel? appDataIndexPage = await _apiAppDataService.getByKey(ApiAppDataKey.emailIndexPage); page = appDataIndexPage?.value; } - _log.fine('${account.email} List page $page for $label after $indexEpoch'); + _log.fine('${account.email} List page $page after $indexEpoch'); DataBkgModelPage res = await _getList( account: account, interfaceEmail: interfaceEmail, - label: label, afterEpoch: indexEpoch, page: page, maxResults: 5); @@ -161,7 +138,6 @@ revolution today.
return _pageList( interfaceEmail: interfaceEmail, account: account, - label: label, indexEpoch: indexEpoch, page: res.next); } @@ -288,7 +264,6 @@ revolution today.
Future> _getList( {required ApiOAuthModelAccount account, required DataBkgInterfaceEmail interfaceEmail, - String? label, String? from, int? afterEpoch, int? maxResults, @@ -296,7 +271,6 @@ revolution today.
int? retries = 3}) async { try { return await interfaceEmail.getList(account, - label: label, from: from, afterEpoch: afterEpoch, maxResults: maxResults, @@ -312,7 +286,6 @@ revolution today.
return _getList( account: account, interfaceEmail: interfaceEmail, - label: label, from: from, afterEpoch: afterEpoch, maxResults: maxResults, diff --git a/lib/src/slices/data_screen/ui/data_screen_layout_body.dart b/lib/src/slices/data_screen/ui/data_screen_layout_body.dart index 05932a63..bf58f5c1 100644 --- a/lib/src/slices/data_screen/ui/data_screen_layout_body.dart +++ b/lib/src/slices/data_screen/ui/data_screen_layout_body.dart @@ -25,14 +25,14 @@ class DataScreenLayoutBody extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 8.w), child: Column( children: [ - // TODO check the wording for multiple providers/accounts DataScreenViewScore( image: isLinked ? "data-score-happy" : "data-score-sad", summary: isLinked ? "All good!" : "Uh-oh. No data just yet!", description: isLinked - ? "Your account is linked now. See what data Gmail holds by tapping on the button below." + ? "Your account is linked now. See what data ${service.account.provider} holds by tapping on the button below." : "Get started by adding a Gmail account", + // TODO check the wording for multiple providers color: isLinked ? ConfigColor.green : ConfigColor.blue), DecisionScreenLayoutAccounts(), Container( From b2fbbba84ff51cac1d2d873f834626a8effc2e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Tue, 5 Oct 2021 19:29:48 -0300 Subject: [PATCH 14/33] code review --- .../slices/api_app_data/api_app_data_service.dart | 11 ----------- lib/src/slices/api_google/api_google_service.dart | 1 + .../slices/data_bkg/data_bkg_service_email.dart | 14 ++++++++++++-- .../slices/data_screen/data_screen_service.dart | 7 ++++++- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/lib/src/slices/api_app_data/api_app_data_service.dart b/lib/src/slices/api_app_data/api_app_data_service.dart index afb79ad9..8d4d27fb 100644 --- a/lib/src/slices/api_app_data/api_app_data_service.dart +++ b/lib/src/slices/api_app_data/api_app_data_service.dart @@ -28,17 +28,6 @@ class ApiAppDataService { if (data != null) await _repository.delete(data.id!); } - Future deleteEmailData() async { - List keysToDelete = [ - ApiAppDataKey.emailIndexLabel, - ApiAppDataKey.emailIndexEpoch, - ApiAppDataKey.emailIndexPage, - ]; - keysToDelete.forEach((key) async { - await _repository.deleteByKey(key.value!); - }); - } - Future deleteUserData() async { List keysToDelete = [ ApiAppDataKey.userReferCode, diff --git a/lib/src/slices/api_google/api_google_service.dart b/lib/src/slices/api_google/api_google_service.dart index d8283db2..8d497a1b 100644 --- a/lib/src/slices/api_google/api_google_service.dart +++ b/lib/src/slices/api_google/api_google_service.dart @@ -36,6 +36,7 @@ class ApiGoogleService return (await _apiAuthService.getUserInfo(account)) != null; } + @override Future revokeToken(ApiOAuthModelAccount account) async { await ConfigSentry.http.post(Uri.parse( 'https://oauth2.googleapis.com/revoke?token=' + account.accessToken!)); diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_bkg/data_bkg_service_email.dart index 1dc5722f..2780490e 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_bkg/data_bkg_service_email.dart @@ -370,13 +370,23 @@ revolution today.
await apiOauthInterface.isConnected(account); } - Future deleteAccountData(ApiOAuthModelAccount account) async { + Future deleteApiAppData(ApiOAuthModelAccount account) async { + List keysToDelete = [ + ApiAppDataKey.emailIndexLabel, + ApiAppDataKey.emailIndexEpoch, + ApiAppDataKey.emailIndexPage, + ]; + keysToDelete.forEach((key) async { + await _apiAppDataService.delete(key); + }); + } + + Future deleteMessages(ApiOAuthModelAccount account) async { List messages = await _apiEmailMsgService.getByAccount(account); await _apiEmailMsgService.deleteList(messages); List senders = messages.map((message) => message.sender!).toSet().toList(); await _apiEmailSenderService.deleteList(senders); - await _apiAppDataService.deleteEmailData(); } } diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index c5d30acb..b326c5a4 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -48,7 +48,12 @@ class DataScreenService extends ChangeNotifier { ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); if (account != null) { _apiAuthService.signOut(account); - _dataBkgService.email.deleteAccountData(account); + DataBkgInterfaceProvider? provider = _apiAuthService + .interfaceProviders[account.provider] as DataBkgInterfaceProvider?; + if (provider?.email != null) { + await _dataBkgService.email.deleteMessages(account); + await _dataBkgService.email.deleteApiAppData(account); + } } _model.account = null; notifyListeners(); From caf80140e4e9b4dd4a5021413ada670bb92e9ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Tue, 5 Oct 2021 20:22:58 -0300 Subject: [PATCH 15/33] update dependencies --- pubspec.lock | 30 +++++++++++++++--------------- pubspec.yaml | 22 +++++++++++----------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index bdd0f70b..f308dbf4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,21 +14,21 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "22.0.0" + version: "28.0.0" amplitude_flutter: dependency: "direct main" description: name: amplitude_flutter url: "https://pub.dartlang.org" source: hosted - version: "3.4.0" + version: "3.5.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "1.7.2" + version: "2.5.0" android_intent: dependency: "direct main" description: @@ -231,7 +231,7 @@ packages: name: extension_google_sign_in_as_googleapis_auth url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" fake_async: dependency: transitive description: @@ -259,7 +259,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.6.0" + version: "1.7.0" firebase_core_platform_interface: dependency: transitive description: @@ -280,7 +280,7 @@ packages: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" fixnum: dependency: transitive description: @@ -299,7 +299,7 @@ packages: name: flutter_appauth url: "https://pub.dartlang.org" source: hosted - version: "1.1.0+1" + version: "1.1.0+2" flutter_appauth_platform_interface: dependency: transitive description: @@ -313,7 +313,7 @@ packages: name: flutter_gen_core url: "https://pub.dartlang.org" source: hosted - version: "3.1.1" + version: "3.1.2" flutter_gen_runner: dependency: "direct dev" description: @@ -412,7 +412,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.3" + version: "0.13.4" http_multi_server: dependency: transitive description: @@ -440,7 +440,7 @@ packages: name: intl_utils url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" io: dependency: transitive description: @@ -622,14 +622,14 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "8.1.6" + version: "8.2.2" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.6.1" + version: "3.7.0" petitparser: dependency: transitive description: @@ -741,7 +741,7 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "3.0.1" share_plus_linux: dependency: transitive description: @@ -832,7 +832,7 @@ packages: name: sqflite_sqlcipher url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" stack_trace: dependency: transitive description: @@ -916,7 +916,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.9" + version: "6.0.12" url_launcher_linux: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 31b1eb78..be3b2d86 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,33 +13,33 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0 - firebase_core: ^1.6.0 - firebase_dynamic_links: ^2.0.9 + firebase_core: ^1.7.0 + firebase_dynamic_links: ^2.0.10 flutter_secure_storage: ^4.2.1 - http: ^0.13.3 + http: ^0.13.4 package_info: ^2.0.2 sentry_flutter: ^6.0.1 pointycastle: ^3.3.4 qr_flutter: ^4.0.0 - share_plus: ^2.1.4 + share_plus: ^3.0.1 path_provider: ^2.0.5 - url_launcher: ^6.0.3 + url_launcher: ^6.0.12 android_intent: ^2.0.2 - permission_handler: ^8.1.6 + permission_handler: ^8.2.2 email_validator: ^2.0.1 lottie: ^1.2.1 - sqflite_sqlcipher: 2.0.0 - amplitude_flutter: ^3.4.0 + sqflite_sqlcipher: ^2.1.0 + amplitude_flutter: ^3.5.0 barcode_scan2: ^4.1.4 flutter_markdown: ^0.6.6 carousel_slider: ^4.0.0 googleapis: ^5.0.1 - extension_google_sign_in_as_googleapis_auth: ^2.0.3 - intl_utils: ^2.4.0 + extension_google_sign_in_as_googleapis_auth: ^2.0.4 + intl_utils: ^2.4.1 provider: ^6.0.1 sizer: ^2.0.15 logging: ^1.0.2 - flutter_appauth: ^1.1.0+1 + flutter_appauth: ^1.1.0+2 dependency_overrides: sqflite: From 14cf3a8c14172d6fb96260f5a0d67fb023cbcbe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Tue, 5 Oct 2021 20:31:45 -0300 Subject: [PATCH 16/33] rename data_bkg to data_fetch --- .../slices/api_google/api_google_service.dart | 8 ++-- .../api_google/api_google_service_email.dart | 11 +++-- .../api_knowledge_repository_vertex.dart | 2 +- .../api_microsoft/api_microsoft_service.dart | 8 ++-- .../api_microsoft_service_email.dart | 12 +++--- .../data_fetch_interface_email.dart} | 6 +-- .../data_fetch_interface_provider.dart} | 6 +-- .../data_fetch_service.dart} | 14 +++---- .../data_fetch_service_email.dart} | 42 +++++++++---------- .../model/data_fetch_model_page.dart} | 4 +- .../data_screen/data_screen_service.dart | 24 +++++------ .../decision_card_spam_service.dart | 10 ++--- .../decision_screen_service.dart | 6 +-- .../ui/decision_screen_layout.dart | 4 +- .../home_screen/ui/home_screen_layout.dart | 11 ++--- .../slices/login_flow/login_flow_service.dart | 6 +-- 16 files changed, 87 insertions(+), 87 deletions(-) rename lib/src/slices/{data_bkg/data_bkg_interface_email.dart => data_fetch/data_fetch_interface_email.dart} (77%) rename lib/src/slices/{data_bkg/data_bkg_interface_provider.dart => data_fetch/data_fetch_interface_provider.dart} (68%) rename lib/src/slices/{data_bkg/data_bkg_service.dart => data_fetch/data_fetch_service.dart} (80%) rename lib/src/slices/{data_bkg/data_bkg_service_email.dart => data_fetch/data_fetch_service_email.dart} (91%) rename lib/src/slices/{data_bkg/model/data_bkg_model_page.dart => data_fetch/model/data_fetch_model_page.dart} (61%) diff --git a/lib/src/slices/api_google/api_google_service.dart b/lib/src/slices/api_google/api_google_service.dart index 87031243..5be4ef38 100644 --- a/lib/src/slices/api_google/api_google_service.dart +++ b/lib/src/slices/api_google/api_google_service.dart @@ -9,14 +9,14 @@ import '../api_app_data/api_app_data_service.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_email.dart'; -import '../data_bkg/data_bkg_interface_provider.dart'; +import '../data_fetch/data_fetch_interface_email.dart'; +import '../data_fetch/data_fetch_interface_provider.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; import 'api_google_service_email.dart'; import 'repository/api_google_repository_info.dart'; class ApiGoogleService - implements ApiOAuthInterfaceProvider, DataBkgInterfaceProvider { + implements ApiOAuthInterfaceProvider, DataFetchInterfaceProvider { final ApiOAuthService _apiAuthService; final ApiGoogleRepositoryInfo _apiGoogleRepositoryInfo; final ApiGoogleServiceEmail _apiGoogleServiceEmail; @@ -29,7 +29,7 @@ class ApiGoogleService this._apiGoogleServiceEmail = ApiGoogleServiceEmail(); @override - DataBkgInterfaceEmail? get email => _apiGoogleServiceEmail; + DataFetchInterfaceEmail? get email => _apiGoogleServiceEmail; @override Future isConnected(ApiOAuthModelAccount account) async { diff --git a/lib/src/slices/api_google/api_google_service_email.dart b/lib/src/slices/api_google/api_google_service_email.dart index d15a626f..e18d7f7c 100644 --- a/lib/src/slices/api_google/api_google_service_email.dart +++ b/lib/src/slices/api_google/api_google_service_email.dart @@ -15,11 +15,11 @@ import '../../config/config_sentry.dart'; import '../api_email_msg/model/api_email_msg_model.dart'; import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_email.dart'; -import '../data_bkg/model/data_bkg_model_page.dart'; +import '../data_fetch/data_fetch_interface_email.dart'; +import '../data_fetch/model/data_fetch_model_page.dart'; import 'model/api_google_model_email.dart'; -class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { +class ApiGoogleServiceEmail implements DataFetchInterfaceEmail { final ApiGoogleModelEmail model; final _log = Logger('ApiGoogleServiceEmail'); @@ -29,7 +29,7 @@ class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { List get labels => this.model.categories; @override - Future> getList(ApiOAuthModelAccount account, + Future> getList(ApiOAuthModelAccount account, {String? label, String? from, int? afterEpoch, @@ -53,7 +53,7 @@ class ApiGoogleServiceEmail implements DataBkgInterfaceEmail { .where((message) => message.id != null) .map((message) => message.id!) .toList(); - return DataBkgModelPage(next: emails?.nextPageToken, data: messages); + return DataFetchModelPage(next: emails?.nextPageToken, data: messages); } @override @@ -228,5 +228,4 @@ $email return categoryLabel.replaceFirst('CATEGORY_', ''); } } - } diff --git a/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart index ccdb01b9..ba5423a2 100644 --- a/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart +++ b/lib/src/slices/api_knowledge/repository/api_knowledge_repository_vertex.dart @@ -5,13 +5,13 @@ import 'dart:convert'; -import 'package:app/src/slices/api_knowledge/model/vertex/api_knowledge_model_vertex.dart'; import 'package:http/http.dart'; import '../../../config/config_domain.dart'; import '../../../config/config_sentry.dart'; import '../../../utils/api/helper_api_headers.dart'; import '../../../utils/api/helper_api_rsp.dart'; +import '../model/vertex/api_knowledge_model_vertex.dart'; class ApiKnowledgeRepositoryVertex { static final String _path = '/api/latest/vertex'; diff --git a/lib/src/slices/api_microsoft/api_microsoft_service.dart b/lib/src/slices/api_microsoft/api_microsoft_service.dart index 6c6f0d32..18ac53f9 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service.dart @@ -9,14 +9,14 @@ import '../api_app_data/api_app_data_service.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_email.dart'; -import '../data_bkg/data_bkg_interface_provider.dart'; +import '../data_fetch/data_fetch_interface_email.dart'; +import '../data_fetch/data_fetch_interface_provider.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; import 'api_microsoft_service_email.dart'; import 'repository/api_google_repository_info.dart'; class ApiMicrosoftService - implements ApiOAuthInterfaceProvider, DataBkgInterfaceProvider { + implements ApiOAuthInterfaceProvider, DataFetchInterfaceProvider { final ApiOAuthService _apiAuthService; final ApiMicrosoftRepositoryInfo _apiMicrosoftRepositoryInfo; final ApiMicrosoftServiceEmail _apiMicrosoftServiceEmail; @@ -30,7 +30,7 @@ class ApiMicrosoftService ApiMicrosoftServiceEmail(apiAuthService); @override - DataBkgInterfaceEmail? get email => _apiMicrosoftServiceEmail; + DataFetchInterfaceEmail? get email => _apiMicrosoftServiceEmail; @override Future isConnected(ApiOAuthModelAccount account) async { diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index c90eb7dc..e1657cd8 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -19,13 +19,13 @@ import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_email.dart'; -import '../data_bkg/data_bkg_interface_provider.dart'; -import '../data_bkg/model/data_bkg_model_page.dart'; +import '../data_fetch/data_fetch_interface_email.dart'; +import '../data_fetch/data_fetch_interface_provider.dart'; +import '../data_fetch/model/data_fetch_model_page.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; import 'model/api_google_model_email.dart'; -class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { +class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { final ApiMicrosoftModelEmail model; final _log = Logger('ApiMicrosoftServiceEmail'); @@ -42,7 +42,7 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { List get labels => this.model.categories; @override - Future> getList(ApiOAuthModelAccount account, + Future> getList(ApiOAuthModelAccount account, {String? label, String? from, int? afterEpoch, @@ -79,7 +79,7 @@ class ApiMicrosoftServiceEmail implements DataBkgInterfaceEmail { page = msgBody['@odata.nextLink'] != null ? (pageNum + 1).toString() : null; } - return DataBkgModelPage(next: page, data: messages); + return DataFetchModelPage(next: page, data: messages); } @override diff --git a/lib/src/slices/data_bkg/data_bkg_interface_email.dart b/lib/src/slices/data_fetch/data_fetch_interface_email.dart similarity index 77% rename from lib/src/slices/data_bkg/data_bkg_interface_email.dart rename to lib/src/slices/data_fetch/data_fetch_interface_email.dart index 652bf6fa..d53f351b 100644 --- a/lib/src/slices/data_bkg/data_bkg_interface_email.dart +++ b/lib/src/slices/data_fetch/data_fetch_interface_email.dart @@ -5,15 +5,15 @@ import '../api_email_msg/model/api_email_msg_model.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import 'model/data_bkg_model_page.dart'; +import 'model/data_fetch_model_page.dart'; -abstract class DataBkgInterfaceEmail { +abstract class DataFetchInterfaceEmail { List get labels; Future getMessage( ApiOAuthModelAccount account, String messageId); - Future> getList(ApiOAuthModelAccount account, + Future> getList(ApiOAuthModelAccount account, {String? label, String? from, int? afterEpoch, diff --git a/lib/src/slices/data_bkg/data_bkg_interface_provider.dart b/lib/src/slices/data_fetch/data_fetch_interface_provider.dart similarity index 68% rename from lib/src/slices/data_bkg/data_bkg_interface_provider.dart rename to lib/src/slices/data_fetch/data_fetch_interface_provider.dart index 467dc618..7ff2b282 100644 --- a/lib/src/slices/data_bkg/data_bkg_interface_provider.dart +++ b/lib/src/slices/data_fetch/data_fetch_interface_provider.dart @@ -4,11 +4,11 @@ */ import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_email.dart'; +import '../data_fetch/data_fetch_interface_email.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; -abstract class DataBkgInterfaceProvider { - DataBkgInterfaceEmail? get email; +abstract class DataFetchInterfaceProvider { + DataFetchInterfaceEmail? get email; Future> getInfoCards( ApiOAuthModelAccount account); diff --git a/lib/src/slices/data_bkg/data_bkg_service.dart b/lib/src/slices/data_fetch/data_fetch_service.dart similarity index 80% rename from lib/src/slices/data_bkg/data_bkg_service.dart rename to lib/src/slices/data_fetch/data_fetch_service.dart index 05230d37..504a37c5 100644 --- a/lib/src/slices/data_bkg/data_bkg_service.dart +++ b/lib/src/slices/data_fetch/data_fetch_service.dart @@ -12,19 +12,19 @@ import '../api_email_msg/api_email_msg_service.dart'; import '../api_email_sender/api_email_sender_service.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import 'data_bkg_service_email.dart'; +import 'data_fetch_service_email.dart'; -class DataBkgService extends ChangeNotifier { - final _log = Logger('DataBkgService'); - late final DataBkgServiceEmail email; +class DataFetchService extends ChangeNotifier { + final _log = Logger('DataFetchService'); + late final DataFetchServiceEmail email; - DataBkgService( + DataFetchService( {required ApiOAuthService apiAuthService, required ApiAppDataService apiAppDataService, required ApiCompanyService apiCompanyService, required ApiEmailSenderService apiEmailSenderService, required ApiEmailMsgService apiEmailMsgService}) { - this.email = DataBkgServiceEmail( + this.email = DataFetchServiceEmail( apiAuthService: apiAuthService, apiAppDataService: apiAppDataService, apiEmailMsgService: apiEmailMsgService, @@ -34,7 +34,7 @@ class DataBkgService extends ChangeNotifier { } Future index(ApiOAuthModelAccount account) async { - _log.fine('DataBkgService index'); + _log.fine('DataFetchService index'); await email.index(account); notifyListeners(); } diff --git a/lib/src/slices/data_bkg/data_bkg_service_email.dart b/lib/src/slices/data_fetch/data_fetch_service_email.dart similarity index 91% rename from lib/src/slices/data_bkg/data_bkg_service_email.dart rename to lib/src/slices/data_fetch/data_fetch_service_email.dart index ed275d1d..1cc8d384 100644 --- a/lib/src/slices/data_bkg/data_bkg_service_email.dart +++ b/lib/src/slices/data_fetch/data_fetch_service_email.dart @@ -17,12 +17,12 @@ import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/api_oauth_interface_provider.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import 'data_bkg_interface_email.dart'; -import 'data_bkg_interface_provider.dart'; -import 'model/data_bkg_model_page.dart'; +import 'data_fetch_interface_email.dart'; +import 'data_fetch_interface_provider.dart'; +import 'model/data_fetch_model_page.dart'; -class DataBkgServiceEmail { - final _log = Logger('DataBkgServiceEmail'); +class DataFetchServiceEmail { + final _log = Logger('DataFetchServiceEmail'); final ApiOAuthService _apiAuthService; final ApiAppDataService _apiAppDataService; final ApiEmailMsgService _apiEmailMsgService; @@ -30,7 +30,7 @@ class DataBkgServiceEmail { final ApiCompanyService _apiCompanyService; final Function notifyListeners; - DataBkgServiceEmail( + DataFetchServiceEmail( {required ApiOAuthService apiAuthService, required ApiAppDataService apiAppDataService, required ApiEmailMsgService apiEmailMsgService, @@ -68,7 +68,7 @@ revolution today.
'''; - DataBkgInterfaceEmail? emailInterface = await _getEmailInterface(account); + DataFetchInterfaceEmail? emailInterface = await _getEmailInterface(account); if (emailInterface != null) return await emailInterface.send(account, email, to, subject); return false; @@ -80,7 +80,7 @@ revolution today.
' started on: ' + DateTime.now().toIso8601String()); - DataBkgInterfaceEmail? interfaceEmail = await _getEmailInterface(account); + DataFetchInterfaceEmail? interfaceEmail = await _getEmailInterface(account); if (interfaceEmail == null || !await _isConnected(account)) return; ApiAppDataModel? appDataIndexEpoch = @@ -106,7 +106,7 @@ revolution today.
} Future _pageList( - {required DataBkgInterfaceEmail interfaceEmail, + {required DataFetchInterfaceEmail interfaceEmail, required ApiOAuthModelAccount account, String? page, int? indexEpoch}) async { @@ -116,7 +116,7 @@ revolution today.
page = appDataIndexPage?.value; } _log.fine('${account.email} List page $page after $indexEpoch'); - DataBkgModelPage res = await _getList( + DataFetchModelPage res = await _getList( account: account, interfaceEmail: interfaceEmail, afterEpoch: indexEpoch, @@ -142,7 +142,7 @@ revolution today.
page: res.next); } - Future _processMessages(DataBkgInterfaceEmail interfaceEmail, + Future _processMessages(DataFetchInterfaceEmail interfaceEmail, ApiOAuthModelAccount account, List messages) async { Set processed = Set(); _log.fine("Processing ${messages.length} messages"); @@ -180,7 +180,7 @@ revolution today.
} Future> _indexSender( - DataBkgInterfaceEmail interfaceEmail, + DataFetchInterfaceEmail interfaceEmail, ApiOAuthModelAccount account, String email) async { _log.fine("Indexing sender $email"); @@ -236,13 +236,13 @@ revolution today.
} Future> _pageSender( - {required DataBkgInterfaceEmail interfaceEmail, + {required DataFetchInterfaceEmail interfaceEmail, required ApiOAuthModelAccount account, required String email, required List messages, String? page}) async { _log.fine("Page sender $email"); - DataBkgModelPage res = await _getList( + DataFetchModelPage res = await _getList( account: account, interfaceEmail: interfaceEmail, from: email, @@ -261,9 +261,9 @@ revolution today.
return messages; } - Future> _getList( + Future> _getList( {required ApiOAuthModelAccount account, - required DataBkgInterfaceEmail interfaceEmail, + required DataFetchInterfaceEmail interfaceEmail, String? from, int? afterEpoch, int? maxResults, @@ -298,7 +298,7 @@ revolution today.
Future _getMessage( {required ApiOAuthModelAccount account, - required DataBkgInterfaceEmail interfaceEmail, + required DataFetchInterfaceEmail interfaceEmail, required String messageId, int? retries = 3}) async { try { @@ -321,13 +321,13 @@ revolution today.
} } - Future _getEmailInterface( + Future _getEmailInterface( ApiOAuthModelAccount account) async { ApiOAuthInterfaceProvider? apiOAuthProvider = await _apiAuthService.interfaceProviders[account.provider]; - DataBkgInterfaceProvider? dataBkgProvider = - apiOAuthProvider as DataBkgInterfaceProvider?; - return dataBkgProvider?.email; + DataFetchInterfaceProvider? DataFetchProvider = + apiOAuthProvider as DataFetchInterfaceProvider?; + return DataFetchProvider?.email; } Future _isConnected(ApiOAuthModelAccount account) async { diff --git a/lib/src/slices/data_bkg/model/data_bkg_model_page.dart b/lib/src/slices/data_fetch/model/data_fetch_model_page.dart similarity index 61% rename from lib/src/slices/data_bkg/model/data_bkg_model_page.dart rename to lib/src/slices/data_fetch/model/data_fetch_model_page.dart index 6207d986..f7d615cd 100644 --- a/lib/src/slices/data_bkg/model/data_bkg_model_page.dart +++ b/lib/src/slices/data_fetch/model/data_fetch_model_page.dart @@ -3,9 +3,9 @@ * MIT license. See LICENSE file in root directory. */ -class DataBkgModelPage { +class DataFetchModelPage { List? data; dynamic next; - DataBkgModelPage({this.data, this.next}); + DataFetchModelPage({this.data, this.next}); } diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index b326c5a4..9739a29f 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -8,8 +8,8 @@ import 'package:flutter/widgets.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_interface_provider.dart'; -import '../data_bkg/data_bkg_service.dart'; +import '../data_fetch/data_fetch_interface_provider.dart'; +import '../data_fetch/data_fetch_service.dart'; import '../info_carousel_card/model/info_carousel_card_model.dart'; import 'data_screen_controller.dart'; import 'data_screen_presenter.dart'; @@ -19,18 +19,18 @@ class DataScreenService extends ChangeNotifier { late final DataScreenModel _model; late final DataScreenPresenter presenter; late final DataScreenController controller; - final DataBkgService _dataBkgService; + final DataFetchService _DataFetchService; final ApiOAuthService _apiAuthService; get account => _model.account; - DataScreenService(this._dataBkgService, this._apiAuthService) { + DataScreenService(this._DataFetchService, this._apiAuthService) { _model = DataScreenModel(); controller = DataScreenController(this); presenter = DataScreenPresenter(this); _apiAuthService.getAccount().then((account) { _model.account = account; - if (account != null) _dataBkgService.index(account); + if (account != null) _DataFetchService.index(account); notifyListeners(); }); } @@ -39,7 +39,7 @@ class DataScreenService extends ChangeNotifier { ApiOAuthModelAccount? account = await _apiAuthService.signIn(provider); if (account != null) { _model.account = account; - _dataBkgService.index(account); + _DataFetchService.index(account); notifyListeners(); } } @@ -48,11 +48,11 @@ class DataScreenService extends ChangeNotifier { ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); if (account != null) { _apiAuthService.signOut(account); - DataBkgInterfaceProvider? provider = _apiAuthService - .interfaceProviders[account.provider] as DataBkgInterfaceProvider?; + DataFetchInterfaceProvider? provider = _apiAuthService + .interfaceProviders[account.provider] as DataFetchInterfaceProvider?; if (provider?.email != null) { - await _dataBkgService.email.deleteMessages(account); - await _dataBkgService.email.deleteApiAppData(account); + await _DataFetchService.email.deleteMessages(account); + await _DataFetchService.email.deleteApiAppData(account); } } _model.account = null; @@ -62,8 +62,8 @@ class DataScreenService extends ChangeNotifier { Future> getInfoCards(int accountId) async { ApiOAuthModelAccount? account = _model.account; if (account != null) { - DataBkgInterfaceProvider? provider = _apiAuthService - .interfaceProviders[account.provider] as DataBkgInterfaceProvider?; + DataFetchInterfaceProvider? provider = _apiAuthService + .interfaceProviders[account.provider] as DataFetchInterfaceProvider?; if (provider?.email != null) return await provider!.getInfoCards(account); } return List.empty(); diff --git a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart index cc95466b..ae724d41 100644 --- a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart +++ b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart @@ -15,7 +15,7 @@ import '../api_email_sender/api_email_sender_service.dart'; import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; -import '../data_bkg/data_bkg_service.dart'; +import '../data_fetch/data_fetch_service.dart'; import '../decision_card_spam/ui/decision_card_spam_layout.dart'; import 'decision_card_spam_controller.dart'; import 'model/decision_card_spam_model.dart'; @@ -28,7 +28,7 @@ class DecisionCardSpamService extends ChangeNotifier { final ApiCompanyService _apiCompanyService; final ApiOAuthService _apiAuthService; - final DataBkgService _dataBkgService; + final DataFetchService _DataFetchService; DecisionCardSpamService( {required ApiEmailSenderService apiEmailSenderService, @@ -36,12 +36,12 @@ class DecisionCardSpamService extends ChangeNotifier { required ApiAppDataService apiAppDataService, required ApiCompanyService apiCompanyService, required ApiOAuthService apiAuthService, - required DataBkgService dataBkgService}) + required DataFetchService DataFetchService}) : this._apiEmailMsgService = apiEmailMsgService, this._apiEmailSenderService = apiEmailSenderService, this._apiCompanyService = apiCompanyService, this._apiAuthService = apiAuthService, - this._dataBkgService = dataBkgService { + this._DataFetchService = DataFetchService { controller = DecisionCardSpamController(this); } @@ -96,7 +96,7 @@ class DecisionCardSpamService extends ChangeNotifier { String? mailTo = sender.unsubscribeMailTo; if (mailTo != null) { String list = sender.name ?? sender.email!; - _dataBkgService.email.unsubscribe(account, mailTo, list).then( + _DataFetchService.email.unsubscribe(account, mailTo, list).then( (success) => _log.finest( mailTo + ' unsubscribed status: ' + success.toString())); await _apiEmailSenderService.markAsUnsubscribed(sender); diff --git a/lib/src/slices/decision_screen/decision_screen_service.dart b/lib/src/slices/decision_screen/decision_screen_service.dart index c7d9120b..e5121f8c 100644 --- a/lib/src/slices/decision_screen/decision_screen_service.dart +++ b/lib/src/slices/decision_screen/decision_screen_service.dart @@ -7,7 +7,7 @@ import '../api_company/api_company_service.dart'; import '../api_email_msg/api_email_msg_service.dart'; import '../api_email_sender/api_email_sender_service.dart'; import '../api_oauth/api_oauth_service.dart'; -import '../data_bkg/data_bkg_service.dart'; +import '../data_fetch/data_fetch_service.dart'; import '../decision_card_spam/decision_card_spam_service.dart'; import '../decision_card_spam/ui/decision_card_spam_layout.dart'; import '../decision_screen/ui/decision_screen_view_card_test.dart'; @@ -30,7 +30,7 @@ class DecisionScreenService extends ChangeNotifier { required ApiEmailMsgService apiEmailMsgService, required ApiCompanyService apiCompanyService, required ApiOAuthService apiAuthService, - required DataBkgService dataBkgService}) + required DataFetchService DataFetchService}) : this._apiAppDataService = apiAppDataService, this._apiAuthService = apiAuthService, this._decisionCardSpamService = DecisionCardSpamService( @@ -38,7 +38,7 @@ class DecisionScreenService extends ChangeNotifier { apiEmailMsgService: apiEmailMsgService, apiAppDataService: apiAppDataService, apiCompanyService: apiCompanyService, - dataBkgService: dataBkgService, + DataFetchService: DataFetchService, apiAuthService: apiAuthService) { presenter = DecisionScreenPresenter(this); controller = DecisionScreenController(this); diff --git a/lib/src/slices/decision_screen/ui/decision_screen_layout.dart b/lib/src/slices/decision_screen/ui/decision_screen_layout.dart index bac0efb8..3879df3e 100644 --- a/lib/src/slices/decision_screen/ui/decision_screen_layout.dart +++ b/lib/src/slices/decision_screen/ui/decision_screen_layout.dart @@ -3,7 +3,7 @@ import 'package:provider/provider.dart'; import '../../../config/config_color.dart'; import '../../../widgets/header_bar/header_bar.dart'; -import '../../data_bkg/data_bkg_service.dart'; +import '../../data_fetch/data_fetch_service.dart'; import '../decision_screen_service.dart'; import 'decision_screen_abstract_card.dart'; import 'decision_screen_view_card.dart'; @@ -14,7 +14,7 @@ import 'decision_screen_view_stack.dart'; class DecisionScreenLayout extends StatelessWidget { @override Widget build(BuildContext context) { - Provider.of(context); + Provider.of(context); return Scaffold( body: Center( child: Stack(children: [ diff --git a/lib/src/slices/home_screen/ui/home_screen_layout.dart b/lib/src/slices/home_screen/ui/home_screen_layout.dart index 73f21857..599bfd70 100644 --- a/lib/src/slices/home_screen/ui/home_screen_layout.dart +++ b/lib/src/slices/home_screen/ui/home_screen_layout.dart @@ -11,7 +11,7 @@ import '../../api_company/api_company_service.dart'; import '../../api_email_msg/api_email_msg_service.dart'; import '../../api_email_sender/api_email_sender_service.dart'; import '../../api_oauth/api_oauth_service.dart'; -import '../../data_bkg/data_bkg_service.dart'; +import '../../data_fetch/data_fetch_service.dart'; import '../../data_screen/data_screen_service.dart'; import '../../decision_screen/decision_screen_service.dart'; import '../../home_screen/ui/home_screen_view_stack.dart'; @@ -20,8 +20,8 @@ import '../../wallet_screen/wallet_screen_service.dart'; class HomeScreenLayout extends StatelessWidget { @override Widget build(BuildContext context) { - DataBkgService dataBkgService = - Provider.of(context, listen: false); + DataFetchService dataFetchService = + Provider.of(context, listen: false); ApiAppDataService appDataService = Provider.of(context, listen: false); ApiEmailMsgService apiEmailMsgService = @@ -40,9 +40,10 @@ class HomeScreenLayout extends StatelessWidget { apiEmailSenderService: apiEmailSenderService, apiCompanyService: apiCompanyService, apiAppDataService: appDataService, - dataBkgService: dataBkgService, + DataFetchService: dataFetchService, apiAuthService: apiAuthService), - dataScreenService: DataScreenService(dataBkgService, apiAuthService), + dataScreenService: + DataScreenService(dataFetchService, apiAuthService), walletScreenService: WalletScreenService(), )); } diff --git a/lib/src/slices/login_flow/login_flow_service.dart b/lib/src/slices/login_flow/login_flow_service.dart index e9080742..5f4acf61 100644 --- a/lib/src/slices/login_flow/login_flow_service.dart +++ b/lib/src/slices/login_flow/login_flow_service.dart @@ -32,7 +32,7 @@ import '../api_user/model/api_user_model_keys.dart'; import '../api_user/model/api_user_model_otp.dart'; import '../api_user/model/api_user_model_token.dart'; import '../api_user/model/api_user_model_user.dart'; -import '../data_bkg/data_bkg_service.dart'; +import '../data_fetch/data_fetch_service.dart'; import '../home_screen/home_screen_service.dart'; import '../intro_screen/intro_screen_service.dart'; import '../keys_create_screen/keys_create_screen_service.dart'; @@ -254,7 +254,7 @@ class LoginFlowService extends ChangeNotifier { apiKnowledgeService: apiKnowledgeService); ApiOAuthService apiAuthService = ApiOAuthService( database: database, apiAppDataService: apiAppDataService); - DataBkgService dataBkgService = DataBkgService( + DataFetchService dataFetchService = DataFetchService( apiAuthService: apiAuthService, apiAppDataService: apiAppDataService, apiCompanyService: apiCompanyService, @@ -270,7 +270,7 @@ class LoginFlowService extends ChangeNotifier { Provider.value(value: apiAppDataService), Provider.value(value: apiAuthService), Provider.value(value: apiKnowledgeService), - ChangeNotifierProvider.value(value: dataBkgService), + ChangeNotifierProvider.value(value: dataFetchService), ]; } From b0ec4988a3a6d7b40425d4d764bc5f04a9db935d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Tue, 5 Oct 2021 20:43:28 -0300 Subject: [PATCH 17/33] delete messages and senders on logout from data_screen_service.dart --- .../data_fetch/data_fetch_service_email.dart | 9 +----- .../data_screen/data_screen_service.dart | 30 +++++++++++++++---- .../decision_card_spam_service.dart | 6 ++-- .../home_screen/ui/home_screen_layout.dart | 4 +-- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/lib/src/slices/data_fetch/data_fetch_service_email.dart b/lib/src/slices/data_fetch/data_fetch_service_email.dart index 1cc8d384..5e4c820c 100644 --- a/lib/src/slices/data_fetch/data_fetch_service_email.dart +++ b/lib/src/slices/data_fetch/data_fetch_service_email.dart @@ -348,12 +348,5 @@ revolution today.
}); } - Future deleteMessages(ApiOAuthModelAccount account) async { - List messages = - await _apiEmailMsgService.getByAccount(account); - await _apiEmailMsgService.deleteList(messages); - List senders = - messages.map((message) => message.sender!).toSet().toList(); - await _apiEmailSenderService.deleteList(senders); - } + Future deleteMessages(ApiOAuthModelAccount account) async {} } diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index 9739a29f..877defe3 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -6,6 +6,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import '../api_email_msg/api_email_msg_service.dart'; +import '../api_email_msg/model/api_email_msg_model.dart'; +import '../api_email_sender/api_email_sender_service.dart'; +import '../api_email_sender/model/api_email_sender_model.dart'; import '../api_oauth/api_oauth_service.dart'; import '../api_oauth/model/api_oauth_model_account.dart'; import '../data_fetch/data_fetch_interface_provider.dart'; @@ -19,18 +23,23 @@ class DataScreenService extends ChangeNotifier { late final DataScreenModel _model; late final DataScreenPresenter presenter; late final DataScreenController controller; - final DataFetchService _DataFetchService; + final DataFetchService _dataFetchService; final ApiOAuthService _apiAuthService; + ApiEmailMsgService _apiEmailMsgService; + + ApiEmailSenderService _apiEmailSenderService; + get account => _model.account; - DataScreenService(this._DataFetchService, this._apiAuthService) { + DataScreenService(this._dataFetchService, this._apiAuthService, + this._apiEmailMsgService, this._apiEmailSenderService) { _model = DataScreenModel(); controller = DataScreenController(this); presenter = DataScreenPresenter(this); _apiAuthService.getAccount().then((account) { _model.account = account; - if (account != null) _DataFetchService.index(account); + if (account != null) _dataFetchService.index(account); notifyListeners(); }); } @@ -39,7 +48,7 @@ class DataScreenService extends ChangeNotifier { ApiOAuthModelAccount? account = await _apiAuthService.signIn(provider); if (account != null) { _model.account = account; - _DataFetchService.index(account); + _dataFetchService.index(account); notifyListeners(); } } @@ -51,8 +60,8 @@ class DataScreenService extends ChangeNotifier { DataFetchInterfaceProvider? provider = _apiAuthService .interfaceProviders[account.provider] as DataFetchInterfaceProvider?; if (provider?.email != null) { - await _DataFetchService.email.deleteMessages(account); - await _DataFetchService.email.deleteApiAppData(account); + await _deleteMessages(account); + await _dataFetchService.email.deleteApiAppData(account); } } _model.account = null; @@ -68,4 +77,13 @@ class DataScreenService extends ChangeNotifier { } return List.empty(); } + + Future _deleteMessages(ApiOAuthModelAccount account) async { + List messages = + await _apiEmailMsgService.getByAccount(account); + await _apiEmailMsgService.deleteList(messages); + List senders = + messages.map((message) => message.sender!).toSet().toList(); + await _apiEmailSenderService.deleteList(senders); + } } diff --git a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart index ae724d41..06cbff98 100644 --- a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart +++ b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart @@ -28,7 +28,7 @@ class DecisionCardSpamService extends ChangeNotifier { final ApiCompanyService _apiCompanyService; final ApiOAuthService _apiAuthService; - final DataFetchService _DataFetchService; + final DataFetchService _dataFetchService; DecisionCardSpamService( {required ApiEmailSenderService apiEmailSenderService, @@ -41,7 +41,7 @@ class DecisionCardSpamService extends ChangeNotifier { this._apiEmailSenderService = apiEmailSenderService, this._apiCompanyService = apiCompanyService, this._apiAuthService = apiAuthService, - this._DataFetchService = DataFetchService { + this._dataFetchService = DataFetchService { controller = DecisionCardSpamController(this); } @@ -96,7 +96,7 @@ class DecisionCardSpamService extends ChangeNotifier { String? mailTo = sender.unsubscribeMailTo; if (mailTo != null) { String list = sender.name ?? sender.email!; - _DataFetchService.email.unsubscribe(account, mailTo, list).then( + _dataFetchService.email.unsubscribe(account, mailTo, list).then( (success) => _log.finest( mailTo + ' unsubscribed status: ' + success.toString())); await _apiEmailSenderService.markAsUnsubscribed(sender); diff --git a/lib/src/slices/home_screen/ui/home_screen_layout.dart b/lib/src/slices/home_screen/ui/home_screen_layout.dart index 599bfd70..bad3bbbe 100644 --- a/lib/src/slices/home_screen/ui/home_screen_layout.dart +++ b/lib/src/slices/home_screen/ui/home_screen_layout.dart @@ -42,8 +42,8 @@ class HomeScreenLayout extends StatelessWidget { apiAppDataService: appDataService, DataFetchService: dataFetchService, apiAuthService: apiAuthService), - dataScreenService: - DataScreenService(dataFetchService, apiAuthService), + dataScreenService: DataScreenService(dataFetchService, apiAuthService, + apiEmailMsgService, apiEmailSenderService), walletScreenService: WalletScreenService(), )); } From 4ef2f427e076a9eee1fd4790afe44c991b24745a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Wed, 6 Oct 2021 20:42:30 -0300 Subject: [PATCH 18/33] multiple accounts ui --- .../slices/api_google/api_google_service.dart | 6 ++- .../api_microsoft/api_microsoft_service.dart | 7 ++- .../api_oauth_interface_provider.dart | 4 +- .../slices/api_oauth/api_oauth_service.dart | 8 +-- .../data_screen/data_screen_controller.dart | 4 +- .../data_screen/data_screen_service.dart | 2 +- .../ui/data_screen_layout_accounts.dart | 50 +++++++++++++----- .../ui/data_screen_layout_body.dart | 3 +- .../data_screen/ui/data_screen_view_soon.dart | 2 - res/images/windows-logo.png | Bin 0 -> 4709 bytes 10 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 res/images/windows-logo.png diff --git a/lib/src/slices/api_google/api_google_service.dart b/lib/src/slices/api_google/api_google_service.dart index 5be4ef38..f7de0a62 100644 --- a/lib/src/slices/api_google/api_google_service.dart +++ b/lib/src/slices/api_google/api_google_service.dart @@ -3,6 +3,8 @@ * MIT license. See LICENSE file in root directory. */ +import 'package:http/http.dart'; + import '../../config/config_sentry.dart'; import '../../utils/helper_json.dart'; import '../api_app_data/api_app_data_service.dart'; @@ -37,8 +39,8 @@ class ApiGoogleService } @override - Future revokeToken(ApiOAuthModelAccount account) async { - await ConfigSentry.http.post(Uri.parse( + Future revokeToken(ApiOAuthModelAccount account) async { + return await ConfigSentry.http.post(Uri.parse( 'https://oauth2.googleapis.com/revoke?token=' + account.accessToken!)); } diff --git a/lib/src/slices/api_microsoft/api_microsoft_service.dart b/lib/src/slices/api_microsoft/api_microsoft_service.dart index 18ac53f9..15145598 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service.dart @@ -3,6 +3,8 @@ * MIT license. See LICENSE file in root directory. */ +import 'package:http/http.dart'; + import '../../config/config_sentry.dart'; import '../../utils/helper_json.dart'; import '../api_app_data/api_app_data_service.dart'; @@ -37,9 +39,10 @@ class ApiMicrosoftService return (await _apiAuthService.getUserInfo(account)) != null; } - Future revokeToken(ApiOAuthModelAccount account) async { - await ConfigSentry.http.post(Uri.parse( + Future revokeToken(ApiOAuthModelAccount account) async { + Response rsp = await ConfigSentry.http.post(Uri.parse( 'https://oauth2.googleapis.com/v1.0/me/revokeSignInSessions')); + return rsp; } @override diff --git a/lib/src/slices/api_oauth/api_oauth_interface_provider.dart b/lib/src/slices/api_oauth/api_oauth_interface_provider.dart index e40f47af..7eaa49dd 100644 --- a/lib/src/slices/api_oauth/api_oauth_interface_provider.dart +++ b/lib/src/slices/api_oauth/api_oauth_interface_provider.dart @@ -3,10 +3,12 @@ * MIT license. See LICENSE file in root directory. */ +import 'package:http/http.dart'; + import 'model/api_oauth_model_account.dart'; abstract class ApiOAuthInterfaceProvider { - Future revokeToken(ApiOAuthModelAccount account); + Future revokeToken(ApiOAuthModelAccount account); Future isConnected(ApiOAuthModelAccount account); } diff --git a/lib/src/slices/api_oauth/api_oauth_service.dart b/lib/src/slices/api_oauth/api_oauth_service.dart index f3115b12..9832b396 100644 --- a/lib/src/slices/api_oauth/api_oauth_service.dart +++ b/lib/src/slices/api_oauth/api_oauth_service.dart @@ -58,7 +58,8 @@ class ApiOAuthService { Map? userInfo = await this.getUserInfo(apiAuthServiceAccountModel); if (userInfo != null) { apiAuthServiceAccountModel.displayName = userInfo['name']; - apiAuthServiceAccountModel.username = userInfo['id']; + apiAuthServiceAccountModel.username = + userInfo['id'] ?? userInfo['email']; apiAuthServiceAccountModel.email = userInfo['email']; account = await _upsert(apiAuthServiceAccountModel); return account; @@ -77,7 +78,8 @@ class ApiOAuthService { ApiOAuthInterfaceProvider? provider = _model.interfaceProviders[account.provider]; if (provider != null) { - await provider.revokeToken(account); + Response rsp = await provider.revokeToken(account); + print(rsp); } await _apiAuthRepositoryAccount.delete(account); } @@ -147,7 +149,7 @@ class ApiOAuthService { Future _upsert(ApiOAuthModelAccount account) async { String providerName = account.provider!; ApiOAuthModelAccount? dbAccount = - account.provider != null && account.username != null + account.provider != null && account.email != null ? await _apiAuthRepositoryAccount.getByProviderAndUsername( providerName, account.username!) : null; diff --git a/lib/src/slices/data_screen/data_screen_controller.dart b/lib/src/slices/data_screen/data_screen_controller.dart index 90e4afad..7e385863 100644 --- a/lib/src/slices/data_screen/data_screen_controller.dart +++ b/lib/src/slices/data_screen/data_screen_controller.dart @@ -21,8 +21,8 @@ class DataScreenController { InfoCarouselService(cards: cards).presenter.render())); } - linkAccount() async { - service.linkAccount('microsoft'); + linkAccount(String provider) async { + service.linkAccount(provider); } removeAccount() { diff --git a/lib/src/slices/data_screen/data_screen_service.dart b/lib/src/slices/data_screen/data_screen_service.dart index 877defe3..604f3257 100644 --- a/lib/src/slices/data_screen/data_screen_service.dart +++ b/lib/src/slices/data_screen/data_screen_service.dart @@ -56,7 +56,7 @@ class DataScreenService extends ChangeNotifier { Future removeAccount() async { ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); if (account != null) { - _apiAuthService.signOut(account); + await _apiAuthService.signOut(account); DataFetchInterfaceProvider? provider = _apiAuthService .interfaceProviders[account.provider] as DataFetchInterfaceProvider?; if (provider?.email != null) { diff --git a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart index bfa4ca23..df85011a 100644 --- a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart +++ b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart @@ -11,19 +11,41 @@ class DecisionScreenLayoutAccounts extends StatelessWidget { Widget build(BuildContext context) { DataScreenService service = Provider.of(context); ApiOAuthModelAccount? account = service.account; - return Container( - margin: EdgeInsets.only(top: 2.h), - child: LinkAccount( - username: account?.email, - type: 'Microsoft', - linkedIcon: "account-soon-google", - unlinkedIcon: "google-icon", - onLink: () => service.controller.linkAccount(), - onUnlink: () => - account != null ? service.controller.removeAccount() : null, - onSee: () => account != null - ? service.controller.openGmailCards(context, account.accountId!) - : null, - )); + return Column(children: [ + account != null && account.provider != "google" + ? Container() + : Container( + margin: EdgeInsets.only(top: 2.h), + child: LinkAccount( + username: account?.email, + type: 'Google', + linkedIcon: "account-soon-google", + unlinkedIcon: "google-icon", + onLink: () => service.controller.linkAccount('google'), + onUnlink: () => + account != null ? service.controller.removeAccount() : null, + onSee: () => account != null + ? service.controller + .openGmailCards(context, account.accountId!) + : null, + )), + account != null && account.provider != "microsoft" + ? Container() + : Container( + margin: EdgeInsets.only(top: 2.h), + child: LinkAccount( + username: account?.email, + type: 'Microsoft', + linkedIcon: "account-soon-outlook", + unlinkedIcon: "windows-logo", + onLink: () => service.controller.linkAccount('microsoft'), + onUnlink: () => + account != null ? service.controller.removeAccount() : null, + onSee: () => account != null + ? service.controller + .openGmailCards(context, account.accountId!) + : null, + )) + ]); } } diff --git a/lib/src/slices/data_screen/ui/data_screen_layout_body.dart b/lib/src/slices/data_screen/ui/data_screen_layout_body.dart index bf58f5c1..a4a7dbbc 100644 --- a/lib/src/slices/data_screen/ui/data_screen_layout_body.dart +++ b/lib/src/slices/data_screen/ui/data_screen_layout_body.dart @@ -31,8 +31,7 @@ class DataScreenLayoutBody extends StatelessWidget { isLinked ? "All good!" : "Uh-oh. No data just yet!", description: isLinked ? "Your account is linked now. See what data ${service.account.provider} holds by tapping on the button below." - : "Get started by adding a Gmail account", - // TODO check the wording for multiple providers + : "Get started by adding an account", color: isLinked ? ConfigColor.green : ConfigColor.blue), DecisionScreenLayoutAccounts(), Container( diff --git a/lib/src/slices/data_screen/ui/data_screen_view_soon.dart b/lib/src/slices/data_screen/ui/data_screen_view_soon.dart index 21b466b1..e95531e3 100644 --- a/lib/src/slices/data_screen/ui/data_screen_view_soon.dart +++ b/lib/src/slices/data_screen/ui/data_screen_view_soon.dart @@ -46,8 +46,6 @@ class DataScreenViewSoon extends StatelessWidget { children: [ DataScreenViewSoonIcon( image: "account-soon-apple", label: "Apple Mail"), - DataScreenViewSoonIcon( - image: "account-soon-outlook", label: "Outlook"), DataScreenViewSoonIcon( image: "account-soon-yahoo", label: "Yahoo"), DataScreenViewSoonIcon( diff --git a/res/images/windows-logo.png b/res/images/windows-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ceb803a13b75fc94f78632e9d0c0c0e4fce31d GIT binary patch literal 4709 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 na2w6>qn3r) literal 0 HcmV?d00001 From fb48bbc962fe06e653930a95514bf822161ec076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Wed, 6 Oct 2021 21:07:59 -0300 Subject: [PATCH 19/33] multiple accounts ui ready --- .../api_google_repository_info.dart | 2 +- .../info_carousel_card_controller.dart | 7 +- .../info_carousel_card_service.dart | 2 +- .../info_carousel_card_view_cover_arrow.dart | 6 +- .../info_carousel_card_view_cover_header.dart | 16 +- res/json/microsoft_info_outlook_db.json | 224 +----------------- 6 files changed, 29 insertions(+), 228 deletions(-) diff --git a/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart b/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart index ba9299aa..020086bd 100644 --- a/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart +++ b/lib/src/slices/api_microsoft/repository/api_google_repository_info.dart @@ -9,7 +9,7 @@ import 'package:flutter/services.dart'; class ApiMicrosoftRepositoryInfo { // TODO Microsoft cards - static const _dbLocationOutlook = "res/json/microsoft_info_gmail_db.json"; + static const _dbLocationOutlook = "res/json/microsoft_info_outlook_db.json"; Future> outlook() => _load(_dbLocationOutlook); diff --git a/lib/src/slices/info_carousel_card/info_carousel_card_controller.dart b/lib/src/slices/info_carousel_card/info_carousel_card_controller.dart index 7bad065d..6058c9ab 100644 --- a/lib/src/slices/info_carousel_card/info_carousel_card_controller.dart +++ b/lib/src/slices/info_carousel_card/info_carousel_card_controller.dart @@ -12,10 +12,13 @@ import 'info_carousel_card_service.dart'; class InfoCarouselCardController { late DragStartDetails startVerticalDragDetails; late DragUpdateDetails updateVerticalDragDetails; + final InfoCarouselCardService service; AnimationController? animationController; double? scrollStartPos; double scrollUpdatePos = 0.0; + InfoCarouselCardController(this.service); + calculateAnimation(double initialValue, double rate, double minimalValue) { double decrease = rate * initialValue; return initialValue - decrease > minimalValue @@ -30,6 +33,7 @@ class InfoCarouselCardController { updateVerticalDragDetails = dragDetails; onVerticalDragEndCover(endDetails, animationController) { + if (service.model.content == null) return; double dx = updateVerticalDragDetails.globalPosition.dx - startVerticalDragDetails.globalPosition.dx; double dy = updateVerticalDragDetails.globalPosition.dy - @@ -71,6 +75,7 @@ class InfoCarouselCardController { } tapArrowSlideUp(animationController) { - animationController.animateTo(1.0, curve: Curves.easeOut); + if (service.model.content != null) + animationController.animateTo(1.0, curve: Curves.easeOut); } } diff --git a/lib/src/slices/info_carousel_card/info_carousel_card_service.dart b/lib/src/slices/info_carousel_card/info_carousel_card_service.dart index 6f5c49c7..ff4244a7 100644 --- a/lib/src/slices/info_carousel_card/info_carousel_card_service.dart +++ b/lib/src/slices/info_carousel_card/info_carousel_card_service.dart @@ -24,7 +24,7 @@ class InfoCarouselCardService extends ChangeNotifier { InfoCarouselCardService({InfoCarouselCardModel? card}) { presenter = InfoCarouselCardPresenter(this); - controller = InfoCarouselCardController(); + controller = InfoCarouselCardController(this); if (card != null) model = card; else diff --git a/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_arrow.dart b/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_arrow.dart index 745cdd62..b2dc0dcf 100644 --- a/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_arrow.dart +++ b/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_arrow.dart @@ -20,8 +20,10 @@ class InfoCarouselCardViewCoverArrow extends StatelessWidget { @override Widget build(BuildContext context) { - InfoCarouselCardController controller = - Provider.of(context).controller; + InfoCarouselCardService service = + Provider.of(context); + if (service.model.content?.body == null) return Container(); + InfoCarouselCardController controller = service.controller; return GestureDetector( onTap: () => controller.tapArrowSlideUp(_animationController), child: Opacity( diff --git a/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_header.dart b/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_header.dart index a1407248..5d88585f 100644 --- a/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_header.dart +++ b/lib/src/slices/info_carousel_card/ui/cover/info_carousel_card_view_cover_header.dart @@ -37,13 +37,15 @@ class InfoCarouselCardViewCoverHeader extends StatelessWidget { color: ConfigColor.tikiBlue), ) ])), - GestureDetector( - onTap: () => service.controller - .shareCard(context, model.share!.message!, model.share!.image!), - child: Icon(Icons.share, - color: ConfigColor.orange, - size: service.controller - .calculateAnimation(36.sp, _animationValue.value, 0))) + service.model.cover?.header?.share?.message == null + ? Container() + : GestureDetector( + onTap: () => service.controller.shareCard( + context, model.share!.message!, model.share!.image!), + child: Icon(Icons.share, + color: ConfigColor.orange, + size: service.controller + .calculateAnimation(36.sp, _animationValue.value, 0))) ]); } } diff --git a/res/json/microsoft_info_outlook_db.json b/res/json/microsoft_info_outlook_db.json index ab49dcbd..f926d2bc 100644 --- a/res/json/microsoft_info_outlook_db.json +++ b/res/json/microsoft_info_outlook_db.json @@ -2,224 +2,16 @@ { "cover": { "header": { - "image": "gmail-round-logo", - "title": "Your Gmail account", - "share": { - "message": "Gmail knows where you are when you read your emails. It's your data, start taking it back on https://www.mytiki.com", - "image": "socialmedia1.png" - } + "image": "windows-logo", + "title": "Your Outlook account", + "share": null }, "image": "where-you-are", - "subtitle": "Gmail knows...", - "bigTextLight": "Where you are ", - "bigTextDark": "when you read your emails.", - "text": "Your Gmail account tracks your location when you open your emails...\nEvery single time you do it." + "subtitle": "Coming soon...", + "bigTextLight": "", + "bigTextDark": "", + "text": "" }, - "content": { - "body": { - "explain": [ - { - "text": "Gmail records your ", - "url": null - }, - { - "text": "IP address", - "url": "https://en.wikipedia.org/wiki/IP_address" - }, - { - "text": " every time you open your inbox or send an email.\n\nMost Google products and almost all email services do this. Some, like Outlook, but NOT Gmail, will even send your IP address to the person receiving your email.\n\nThe most common use approximates your location, pinpointing you within 3-5 miles anywhere in the world. In extreme cases, like criminal investigations, your IP address can be tied to your exact device and location by working with an Internet Service Provider.", - "url": null - } - ], - "theySay": [ - { - "image": "info-badge", - "text": "Security monitoring to suspicious access" - }, - { - "image": "search-graph", - "text": "Analyzing patterns to develop new features and products" - } - ], - "shouldKnow": [ - { - "image": "np-tap", - "text": "Used advertisers for location-based targeting and surveillance" - }, - { - "image": "badge", - "text": "Used by law enforcement" - }, - { - "image": "worldwide", - "text": "Saved for 9 months, then obscured and kept permanently" - } - ] - }, - "cta": { - "explain": [ - { - "text": "You can use a ", - "url": null - }, - { - "text": "VPN", - "url": "https://nordvpn.com" - }, - { - "text": " to hide your IP address or, for true anonymity, switch to an ", - "url": null - }, - { - "text": "encrypted email service", - "url": "https://protonmail.com" - }, - { - "text": ".\n\nGmail does not currently use additional location services.\n\nIf you just hate the ads, you can turn off ad personalization for your entire Google account. ", - "url": null - } - ], - "buttonText": "AD PERSONALIZATION", - "buttonUrl": "https://adssettings.google.com" - } - } - }, - { - "cover": { - "header": { - "image": "gmail-round-logo", - "title": "Your Gmail account", - "share": { - "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", - "image": "socialmedia2.png" - } - }, - "image": "what-written", - "subtitle": "Gmail knows...", - "bigTextLight": "What you’ve written to ", - "bigTextDark": "your friends", - "text": "Gmail has all emails you’ve ever written to anyone. They look at the content in the emails, so they know you better." - }, - "content": { - "body": { - "explain": [ - { - "text": "Gmail has access to your emails - it reads, stores and analyzes them.\n\nGoogle uses this information for targeted ads and what they call “smart features” like automatically adding your flight information to your calendar.\n\nIn their own words:\n\n\nCreepy.", - "url": null - } - ], - "theySay": [ - { - "image": "airplane", - "text": "Travel assistance like itineraries, updates, and maps." - }, - { - "image": "email", - "text": "Smart email with suggestions, nudges, prioritization, and filtering" - }, - { - "image": "package", - "text": "Track packages, reservations, loyalty cards, and bills" - } - ], - "shouldKnow": [ - { - "image": "np-tap", - "text": "Used by advertisers for key word targetting" - }, - { - "image": "hammer", - "text": "Used by law enforcement" - }, - { - "image": "worldwide", - "text": "Disabled by default in Europe" - } - ] - }, - "cta": { - "explain": [ - { - "text": "You can turn off both,", - "url": null - }, - { - "url": "https://support.google.com/mail/answer/10079371", - "text": " ad personalization " - }, - { - "text": "and “smart features” to stop Google from scanning your emails.", - "url": null - } - ], - "buttonText": "STOP READING MY EMAILS", - "buttonUrl": "https://support.google.com/mail/answer/10079371" - } - } - }, - { - "cover": { - "header": { - "image": "gmail-round-logo", - "title": "Your Gmail account", - "share": { - "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", - "image": "socialmedia2.png" - } - }, - "image": "everything-you-do", - "subtitle": "Gmail knows...", - "bigTextLight": "Everything\n", - "bigTextDark": "you do in your Gmail app", - "text": "Your Gmail app has quite a lot of analytics packed in and knows quite a few things...." - }, - "content": { - "body": { - "explain": [ - { - "url": null, - "text": "Gmail’s app is designed to track most of the things you do with it. It tracks each action you take, on which device, OS, and time of day.\n\nFor example, when you opened the app, what you searched for and if you saw an ad were all tracked.\n\nYour audio is recorded if you use voice search or assistant with Gmail." - } - ], - "theySay": [ - { - "image": "person-4", - "text": "Personalized experiences" - }, - { - "image": "circle-badge", - "text": "App and content recommendations" - }, - { - "image": "search", - "text": "Faster Search" - } - ], - "shouldKnow": [ - { - "image": "hat-n-glasses", - "text": "Your activity is tracked even when logged out" - }, - { - "image": "badge", - "text": "Used by law enforcement" - }, - { - "image": "bomb", - "text": "You can set your history to auto delete after 3, 18, or 36 months" - } - ] - }, - "cta": { - "explain": [ - { - "text": "You can delete all activities, individual activities, set it to auto-delete, or disable activity tracking entirely.", - "url": null - } - ], - "buttonText": "MY ACTIVITY", - "buttonUrl": "https://myactivity.google.com" - } - } + "content": null } ] From 772d6cdfad991c153d79448085ee3bf9ff3ba326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Thu, 7 Oct 2021 18:32:22 -0300 Subject: [PATCH 20/33] microsoft button guidelines --- .../widgets/link_account/link_account.dart | 1 + .../link_account/link_account_view_add.dart | 59 ++++-------------- .../link_account_view_add_google.dart | 55 ++++++++++++++++ .../link_account_view_add_microsoft.dart | 55 ++++++++++++++++ pubspec.yaml | 8 +-- res/fonts/tiki_icons.ttf | Bin 2084 -> 0 bytes 6 files changed, 127 insertions(+), 51 deletions(-) create mode 100644 lib/src/widgets/link_account/link_account_view_add_google.dart create mode 100644 lib/src/widgets/link_account/link_account_view_add_microsoft.dart delete mode 100644 res/fonts/tiki_icons.ttf diff --git a/lib/src/widgets/link_account/link_account.dart b/lib/src/widgets/link_account/link_account.dart index 0f635ebe..298b46f7 100644 --- a/lib/src/widgets/link_account/link_account.dart +++ b/lib/src/widgets/link_account/link_account.dart @@ -31,6 +31,7 @@ class LinkAccount extends StatelessWidget { Widget build(BuildContext context) { return username == null ? LinkAccountViewAdd( + type, text: "Sign in with " + type, icon: unlinkedIcon, onLink: onLink, diff --git a/lib/src/widgets/link_account/link_account_view_add.dart b/lib/src/widgets/link_account/link_account_view_add.dart index 2b7b8ccd..0da4b2a6 100644 --- a/lib/src/widgets/link_account/link_account_view_add.dart +++ b/lib/src/widgets/link_account/link_account_view_add.dart @@ -5,54 +5,19 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:sizer/sizer.dart'; -import '../../config/config_color.dart'; +import 'link_account_view_add_google.dart'; +import 'link_account_view_add_microsoft.dart'; -class LinkAccountViewAdd extends StatelessWidget { - static const double _scale = 0.9; - - final String text; - final String icon; - final Function()? onLink; - - LinkAccountViewAdd({required this.text, required this.icon, this.onLink}); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onLink, // controller.onLink(), - behavior: HitTestBehavior.opaque, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8.sp * _scale), - height: 40.sp * _scale, - decoration: BoxDecoration( - color: ConfigColor.white, - borderRadius: BorderRadius.circular(5.sp * _scale), - boxShadow: [ - BoxShadow( - color: Color(0x0D000000), - blurRadius: 2.w, - offset: Offset(0.75.w, 0.75.w), // Shadow position - ), - ], - ), - child: Row(mainAxisSize: MainAxisSize.min, children: [ - Image( - image: AssetImage('res/images/' + icon + '.png'), - height: 18.sp * _scale, - fit: BoxFit.fitHeight, - ), - Container( - margin: EdgeInsets.only(left: 24.sp * _scale), - child: Text(text, - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 14.sp * _scale, - fontFamily: "Roboto", - fontWeight: FontWeight.w500, - color: Colors.black54))), - ]), - )); +abstract class LinkAccountViewAdd extends StatelessWidget { + factory LinkAccountViewAdd(type, {required text, required icon, onLink}) { + switch (type) { + case 'Google': + return LinkAccountViewAddGoogle(text: text, icon: icon, onLink: onLink); + case 'Microsoft': + return LinkAccountViewAddMicrosoft( + text: text, icon: icon, onLink: onLink); + } + throw 'Unknown provider $type'; } } diff --git a/lib/src/widgets/link_account/link_account_view_add_google.dart b/lib/src/widgets/link_account/link_account_view_add_google.dart new file mode 100644 index 00000000..bb097a3a --- /dev/null +++ b/lib/src/widgets/link_account/link_account_view_add_google.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:sizer/sizer.dart'; + +import '../../config/config_color.dart'; +import 'link_account_view_add.dart'; + +class LinkAccountViewAddGoogle extends StatelessWidget + implements LinkAccountViewAdd { + static const double _scale = 0.9; + + final String text; + final String icon; + final Function()? onLink; + + LinkAccountViewAddGoogle( + {required this.text, required this.icon, this.onLink}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onLink, // controller.onLink(), + behavior: HitTestBehavior.opaque, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8.sp * _scale), + height: 40.sp * _scale, + decoration: BoxDecoration( + color: ConfigColor.white, + borderRadius: BorderRadius.circular(5.sp * _scale), + boxShadow: [ + BoxShadow( + color: Color(0x0D000000), + blurRadius: 2.w, + offset: Offset(0.75.w, 0.75.w), // Shadow position + ), + ], + ), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Image( + image: AssetImage('res/images/' + icon + '.png'), + height: 18.sp * _scale, + fit: BoxFit.fitHeight, + ), + Container( + margin: EdgeInsets.only(left: 24.sp * _scale), + child: Text(text, + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 14.sp * _scale, + fontFamily: "Roboto", + fontWeight: FontWeight.w500, + color: Colors.black54))), + ]), + )); + } +} diff --git a/lib/src/widgets/link_account/link_account_view_add_microsoft.dart b/lib/src/widgets/link_account/link_account_view_add_microsoft.dart new file mode 100644 index 00000000..2759f94c --- /dev/null +++ b/lib/src/widgets/link_account/link_account_view_add_microsoft.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:sizer/sizer.dart'; + +import '../../config/config_color.dart'; +import 'link_account_view_add.dart'; + +class LinkAccountViewAddMicrosoft extends StatelessWidget + implements LinkAccountViewAdd { + static const double _scale = 0.8; + + final String text; + final String icon; + final Function()? onLink; + + LinkAccountViewAddMicrosoft( + {required this.text, required this.icon, this.onLink}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onLink, // controller.onLink(), + behavior: HitTestBehavior.opaque, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12.sp * _scale), + height: 41.sp * _scale, + decoration: BoxDecoration( + color: ConfigColor.white, + border: Border.all(color: Color(0xFF8C8C8C), width: 1.0), + boxShadow: [ + BoxShadow( + color: Color(0x0D000000), + blurRadius: 2.w, + offset: Offset(0.75.w, 0.75.w), // Shadow position + ), + ], + ), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Image( + image: AssetImage('res/images/' + icon + '.png'), + height: 22.sp * _scale, + fit: BoxFit.fitHeight, + ), + Container( + margin: EdgeInsets.only(left: 12.sp * _scale), + child: Text(text, + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 15.sp * _scale, + fontFamily: "Segoe", + fontWeight: FontWeight.w600, + color: Color(0xFF5E5E5E)))), + ]), + )); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index be3b2d86..571b71d9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,9 +64,6 @@ flutter: - res/json/ - res/sql/ fonts: - - family: TikiIcons - fonts: - - asset: res/fonts/tiki_icons.ttf - family: Koara fonts: - asset: res/fonts/Koara-Bold.ttf @@ -114,4 +111,7 @@ flutter: - family: Roboto fonts: - asset: res/fonts/Roboto-Medium.ttf - weight: 500 \ No newline at end of file + weight: 500 + - family: SegoeUI + fonts: + - asset: res/fonts/Segoe-UI.ttf \ No newline at end of file diff --git a/res/fonts/tiki_icons.ttf b/res/fonts/tiki_icons.ttf deleted file mode 100644 index aeb9a8e679f30ae61e823a0c88ab55fda7a32041..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2084 zcmd^A&u<$=6n<}Zz3bSieL z_BJGlLk`djMd}q!AdW~#NJvO6L=^`l_zO6IWJI|jxTV*YH@h3TLirDv^~`?noA14u zH$T>Z0N{mV5MX}&=Ju-kQQ|!Syh`lWjhoqA_Uo5FB>NuOm0G*n{XKi>53)}=x8FLd zul*WQ0R-x2FEsS(-c;0N) z?=9cm@h?9CukG=huR?JF&ffSKza-P`1f(gDCBkdKXKxSS0S}>PmTmWYU>-`qURir% z3w*7r*?~#&v5W0L#Mo-?S1G>jiKOF7BnE*m3fChZ<9%zy7}m*N2mAd5qVNHqgi9dy zoU&1Wbq`hsFkn`8nw_H+(@}HgtP9trJ@CHj9{My=fQ&I-_~3<&bd*L2`iz6}GXT6+M{gA)vq%GzD)B#y#G z+I>jmN|@I$?!!sf| zv4r?eqC7WOe!ZMXl;0BFA`>g3%%+$iyIFW~Iwg;11SZNtI?7~;v1nSLE+G>|K~h(= z;FwlcBZ*HEb^wa<1!HbE(-;#qD_Zj1z@j?Koe?K_C`lZK!qEw3ghH%jf^K>GEXNZ( zfC-qT`vW+iN~V%=nWq+-K_#N(iiI*3@^UeBtFDxwRBig zrx=wf3r?f(U?!6(r_*8I=mkYpl~7C!PNK}>(S?O*oC$7W2sbjN4E=Tk9!X8B(U5E0 zz7c?*(O19?L3jzS!ZNLYNLj)wGlg7G@>{{Ob8Ag%)kft94rw3se?trUpd$X3jE+; ziTGa}?12jW?O-n?an)?zZtgT|MyJ22@84-vdqZM~DtfQqG&<^nHa{fS^^V@Fn);r) zd!+Uc_H(9LSL;2at*#jzQ*X5lwc9gp=`~Ypm}d7{Hd}Xit!A{rgeKgkxWgkZTR2S=0N1ex$qJG&=eb>HY;!ivb4! From e978f25503a57a1bb7806d40e49c69afea37d9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Thu, 7 Oct 2021 18:50:31 -0300 Subject: [PATCH 21/33] microsoft assets --- res/fonts/Segoe-UI.ttf | Bin 0 -> 34164 bytes res/images/2.0x/windows-logo.png | Bin 0 -> 3066 bytes res/images/3.0x/windows-logo.png | Bin 0 -> 3099 bytes res/images/4.0x/windows-logo.png | Bin 0 -> 3140 bytes res/images/microsoft_sign_in.png | Bin 0 -> 1877 bytes res/images/windows-logo.png | Bin 4709 -> 3030 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/fonts/Segoe-UI.ttf create mode 100644 res/images/2.0x/windows-logo.png create mode 100644 res/images/3.0x/windows-logo.png create mode 100644 res/images/4.0x/windows-logo.png create mode 100644 res/images/microsoft_sign_in.png diff --git a/res/fonts/Segoe-UI.ttf b/res/fonts/Segoe-UI.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46b3b99387e33ae81940d9a486ba4e0e9fe5b5e6 GIT binary patch literal 34164 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 t7Gsrp<&4 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1hxmgFc5{MRYw2#B5Iu<5-g|7`1??Rtflg<(co^48qTO!o>~}$BZV$2KbggQ$+r94t zmn!=wm!*pe+q&?Zt{Z%Ul}5ls&f4kNnf0BwF-|}1sl3a)Ib>2Ucl-85XC3tL!Uh&>OkEIik} zbBBuFP79w{YdajJZ5ci)wmbEc*Nep_SKNTttm}4?b7;0_U3kq~)_k2aW*&^8mLZJs z%F~Npb$)Y^NLLfF$!A+ZFRKuR8tOUy#wa+1W%pZH20mT8`^^=809AM}EHh^;u$s1s zXn`--a?8&S;{xtm2r;Fx3xJ6*cYreN-~kia1&(ZzwTT&a%y3YJ=GJ-J-~kT74k&58 zbJ0?=+3MVQC-E9PaM30Brnm}cc^`nE@~DfN+%JlbQ08O@R;=sk0zsM%i)Bu1 zmR~N?@x-0*c2cd(Cdzz%Z(}%bbm3UGBj5G0iqD7!5139)Va`%bk`C9`s7tCo=#q4t z*e)49&Z$q~B?yq7h<*uJcQHI+JqdGIwW^J+XH1%2^>&%o;N#se1nIT4x-GcPlzaYm zkv%OOVcH3;@-Klz?gXTJ7@a`$9zqL2bPp2D^b$l@{ns$UPWv}7(pdW?j1)w`5XlZ9 zY-=w;q)R%65kLeCQCRCf0Y$^}2uLqR>|mmWrau4^Ej0ZBm}sM=-?I{3Vd__`L_3~- z4JX?1^lLcLMoYhECE94|_pC(okAOtxkAOt;7Dzv4B|3)C_pC&J1S3ZZBP>%;6%B4s zo?XO}vgt)8`y?oC^4MsmG^6=_^hzGm7%yRzAn~7rR(wUS0eILhl=MLUFk|$=%Lg04&yyn@`;Lc z(Q#>bR&dqcaQiz2wMJAG=}O1lnwpp`70stgswL?&Q@*z(eeL!qN>aPa1#e0BQN>L` z5J_UN3fGRiMa4~so?2_}CLUJ)8fA0dK z%)L6>LKZWVnb9p)lJ(kzCU^n1Y=~h=pwQh1TRYu$w2nDKLe4JG%#Gr7ZLn3CYg^yd z*_DC#r4FzZh~;@FqO!^eGLz>CZ>EciyCN99YXZ)`*YeVN)u-55iW>Ea012&3&pxEp zCXt*XYoTSRBN|}4u*?XA z4igDs`Ix3^6n4SJ00yd6w;?wc7*In(3M>SiDouC{&6sMm0UH4{p{^Jt8xVxpdr?O( z!`6+|ocU5DU1a`FBps>w6Or_K<)4eBPmTFbBz^CnW0CZ^e~_L{?@M%{SeKBq4A6Lp z!RZ+xaAeI$9T-QT)NM1$NV#rPy@@Oen}N$Q*I1N)YbtsG;=sQ%Z~?0BJIh!V);3Mlo=a71iQ3^6bSP%^F*dx)A zn!1gQA=8eQV&gGYRLlV!gMbPe=t=^FXmQVHP9}i63L?Duu=dmZi>cs;M0K4}GZThiN^ zoEV>mmue>uR7a@$2Nn^w<0R~WLt|AX`q;9qQ_|Bu=~a|RGUS152r1M=WfxOt3yFK3 z6`)c7s?Z`lOjEZaWP)tOgrAgJ*s_f(8^%Ma6)%Q7uw&>mO#^l)g51*~L^_Jh%5Fcd z0LvkXlsfH3af+n?B74y*B?yqAGy+LrVX!18EqQIgd+J?q6m%;2BP`IRffwi$RKs@Y zy-U;o9sJ-<`tXvkHA#RmpW3pOE}fYqIJiG2>=Ve#JW?>tn>{z>z|g~XU~>k_c&};h$T1&V1@mSZ^NHTQ|RN~9%(!jrvU8&rBvkGo&Cpk|J5nS7GUd;BOM%a zlvlQ-su_QQ(*dOf0GLIztbv1=yx+afn^$UgeRS110UQvS=5I4^DT2bbxoPzO4|Z%I z_G^4Z0KJCDMv{Q0cvR;|R-b~B-Z9oX8k-MCV^^fL+4SH%`;fOzwDpv3mmbU0a-g=-d(RA;B;^sZx$zgZR0004m zX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ>9WW4ptBm$xxjvh>AFB6^c+H)C#RS zm|XfHG-*guTpR`0f`cE6RRN)x5=kfJi*U z4AUlFC!X504bJ<-QC5;w;&b9rlP*a7$aTfzH_kLk-WaV#C4j3NMZqtkRU=q6&onSMx0ii6botEPx$x; zT)#vvg#t9I72Cnp$ zzfuRLKS{5(wAc~QvkhEaw=`uBxZDBypA6ZQT`5RYC=`JAGy0|+(0dDnSH0ev`#607 zGSpS-1~@nbMv9cZ=JW2Z_TK(I)9mjDaD;NEpyXtn00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3labT3lag+-G2N4000McNliruUn$e82JGJORG%#wAtZ?|hfX&OC*4H>h1$FCTNt$<;+-vmHfB^#r z3>YwAz<_<5ld#y6S}$kGWSM$Pk~V&RV8DO@0|pEjFkmls1K{5eJTJLd6951J07*qo IM6N<$f@$Ec0ssI2 literal 0 HcmV?d00001 diff --git a/res/images/3.0x/windows-logo.png b/res/images/3.0x/windows-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e84ddaec4ff313584d09163c271fa2bb3ce9b08 GIT binary patch literal 3099 zcmV+$4CM2PP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1hxmgFc5{MRYw2#B5Iu<5ZKrdGMU&H! z+s{<@@fGdi^1^8jZny1}_a2*fL3_tZpwpQx9>%qjXt!HC`(03(+e0ilU8~yccJKSZ zrON)vW$B{Awl4gp>js}-r4cZZvvxXmW_{;vjMERhs_pnTE@2#c@$4OJRGo7tO<<6l z<(=-vTpQ@d$fqZ|xBmI*&iJ}|*FMjn>4e?&$W zncM2BkFaRm5oPFP9eoD_8%*xjYY|t%C*V1)tKiC}nhuu_(@n$Gxv+)xh1m1p%EEKq zJ9nt)?X>WTwYI}i+Lqy?V!Km6dA(R{a>WgJ&AM(Usn47}>%wc^vgYfYG4o&ywG3g5 zSDs$wmkxdW782M?IYE^uU%tWC_YV}^q&G`G&%1`luuc0ft% zor{)|%~t2eJBim=8*H@N3~quWf{QM}H^o&r%liQQB%gty8eH%pgcwrD6iTSkMIS?q zF-0Z0nq2ZJq?l65sic}+_BrI3Q_i{MT5NIPz))gIC6`iawNx=tg{+G46)nv+*L({t zw$ySft#-ht`yP7ispnpL9d@_@niz4Ukw+PIGEFeW^fSyj)6BEXD!`gJ@e(9Tk}O5) z*=xI3AFeOF#=F<-@|2ECXRo1^QaXuXrIVmOgU76Acs!{G0BEZ|Gnu`&>N)k9DHcHy zER+oD8yc)0gA4s+8-&lkyLj#+zfs5^`OUub9I5O6!gB=IJ^JmyYeVn?^TtS4a(t5&tK^^8f=tKKft8hpGPh9JGRR<{MWnR3tH zF0!YEBTPG?RsJQA$en<652F)^-a}|1i0(mxnO=hEs{a~B*lGU;MjC6sgpq;>7$Vsr zgl+95h;&KEFan5xAqs2VC!lC}9s%jah#gF{(DVmjqJ^eE026Jr^m|sKD@^^0m1xJ) zui->Ho_-A{+Gy$btVA0v{hpO*{t=MK{1K37-U8{ztVG8U`ks~Ok6`3TVT5H0s-nRS z%Cn1DQZ~KFWS<1ZO&%M~lx8%)k6y_`8sjC55+wd}(2B3fH2^PNOsflG(v0(QTY?{0 z(nKAK%p@=>Ev^o0G&Xj(b~P?A6WM&0yEZ%IQY8t}I#fL0=t@`0LJys`cNp)vl225m zi;hdfvx2MkhTGpMs5PRhNLM=U*3`sosc1e`QY}fJnex3Q>1($?QIgtSE_h42k1B2o zf=CjBRk(KCEh=t8^we5&M>*gYQB^So$#^iu#WChgsD8?f$@J(^Dd!$Xv^BQ1a1;!~ zugR(UZFWCWLA00)_5A*xKo~qjk&?5^{EdW^NRxYlE%AT-*At z&aMo^FLi*WKrGKY5tUU&keNJBcr#s8+!ev-T@!Hjy_T2Gt3JifQq-tV1W0IQdiEi$ zHi_gESqm*g9nk>W9Y;@lYQyTK44B`h(Usn8qp=1zxT$GC#qx(&IpzcBVxrEZ&1M#^=Y>P=)(*bH2bxyGXWTT{^k5C{I9feSbr1gzUawdk-M zJa!T5r=Hb9Nb|M>u-JIU##9@TV8NQ=U>}Ky&)GEb1Rq%!I)~JAj8c#h!h&FU#~z7} z)YNTc44HPc6dRAJqGAr<7z9+%KvxnVM2mYqb20(kRS@CLhqb2`iET1cw|@l ziD8fIN5F5ZQ}fDM5e?r4dL13xg#&X~}B?-c#>_qo7mCA7Ozm4ZJ|7pc=MA z?_HYy@8Ab_(ubFPtw{om`P7!Jbm`0_!NL7GVV^)==8=MF-t4(42ZkQD15409s_^l= zPY9sVyvJd)LM*{K04wZod>j5$nnEA<_DJKQI0a}ID5WCb?(9FV`>#$pwg6j)9O>YY zqr9>uRn7PdoDL`@0KhDwWeps}$~>!YjA3E+UpG=H0UOA!>d%}t~Kf3RZ% zv0vjO0_ZhFHj)H1#iKe$vicO1^p3IC(b#-A8oMH`&87$E*@wJ!qOGT-Me?4rKB6r8 zjJw`b7Ja~32Vr(PX1tIVJu~J5b6peHPE4ADLFytVI`h^+=b5!WAT9cGCwod-^f7y# z0_`r$_Ty+gyR`}v<6crE0d&4N&c`qi+65Xl$N4^XoW=l354hX``kxHhlwB!EQz#UG_cQvY9MF3Ugjc=Zn)^6? z05a57>IOJC1V)OKz2@`ouJ+#kJ=5&(2XKUPrl90xoB#j-24YJ`L;(K){{a7>y{D4^ z000SaNLh0L01FZT01FZU(%pXi00007bV*G`2jvO}6(}RP?Y_zY004tYL_t(&-tF0; z4TL}tK+zq7CAk`?2v0LKgT^1VTn~f>1_d6ogxvdT-Q;D*P3%LTrBdDUi}O9LQEhHh z{vb$5NJvOXNJvOXNJvOXNJvOXNJvP?+eK#jNywMf#=KSA*Bn3BRjYhmwICrOAt50l pAt50lAt50lAt50lAt523?En&n4`MA*P) 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 e0|pG($2tLLQV)n8-a>W&0000X^ZA|XjN-KpH zY9J&)LS1zh#>0mXzdOS)YUdag&d<-AWDTQ69zA;GeldX>MjFhx3?mU{T!xVd zGcLnOgc+A%B*Ki#FcM+LWf+Mt<1&mym~k0KB985++P}xomzMc`^{ZQW+bAu!@Q1y9 zW&A&}$YmIbFyk_eMC>aqJWPD~@+Irdi4!N>*|TT;=XdYkxs8ntH!(4hw709PtG?YU zSFUtLDpkfsnfLGCyNeeux=WWXRjPMuYs(*i3>j0qGJ}JImHTrTpr4;Uee(Ukb?a89 zCn@P!<6=UeK7E=^wzzZWj-U7!FJAaF7cN}L6rpZt`}OPBzSeFTS8QC8!N9;k_8q6w z$+%HIjpf?4Ytiv6EiGkjy?pu7|6N&Gal5;_N#%S{K7Ra|$qgCp?Cki@dAZe1PZ}4( zdGO$YpHwE413@7~F*7sc&!wDjCIv-|dHGc2$3^7CD6U?;>c+>%YiV_DZS5!H!dUZ; z42S}$<$O?x;xIBY;$~-O{pUAt-ndtpB3q22{z!gBzd}q<ycB#m1@g;aurlN_u+D)h_)Zh2fgg7lf~92dqap$Dvg6`t|GCHF-Nlry?cNJ!*&V zQVb~z-(z_`6FfCF^~3%0sG*mgoSgLircBtL#t1|&j?me##!#x~T1ppQkHI(@JH{lr z(ofFOe~qa~&Xgrx57)wKS7n>crjL#~ujm`XHO7yj<>$@?>3?i_fP3`T~`k*X={vjv&wz#;Ml~JVUe(KbEk#U8aKt*z^ zi+x3|#>!u%hi9!(ejEUV^7!#%KQXT55yMRlp(qe4D4wq<4d`@TlLzIHVwJ78)D{!1 zek#)NUB)&vG}LiF!tr&o?$g?Y=q1IZpJf|2as=V{V}$aJjZdHD5H-JK5EzcK06D$< zeChjsoMN5y{6l0W93xZ8qO>Ys#zllJWhg3tkUmwdONyw-f)_@)l^SuBDQn%(mew;$ z%{qD1P!=6Squ02$x3{x%`FSGZka1{^Nh8TvL_XEk{oUNfjnR|Fr8P|Wyh275Q$l${ z?vtnF{&0c(Um|5AQpoGlXChbCZSJ~vzgU+@W*B#s$R|0|XOy2loV4P z9Mq$1LmML6*=3Cu!ufU%0mDOokTL7(6uX7LHk-|bv9Ym^Zo2p9Kc!_BhJSPJ>%H>I z&M$P-wrhp^zP>*HS!@&r-r?%liILq320yeoY$jt;C5d;Z1Us_>vOeB(mTZmPc6Y8ahzWQEVY2u zL(aqgHn-8c92w)nh&b}^v>8S!_GMgtJynG+t*1Jno6n1kqmBJ1vSB2`jLR?*Va8<` zi7?|bj6|4m8Ac+^xC|o^W?Y7m2s19jNQ4=eVI;!8p`qWEFbtz6oOAyIZxSYMYej>B P00000NkvXXu0mjfQ{=aT literal 0 HcmV?d00001 diff --git a/res/images/windows-logo.png b/res/images/windows-logo.png index a9ceb803a13b75fc94f78632e9d0c0c0e4fce31d..bba7597c07744d21cc835bed31284c614303a047 100644 GIT binary patch delta 3001 zcmV;q3r6(iB-R&yiBL{Q4GJ0x0000DNk~Le0000J0000J2nGNE0CG?^%m4rhh4pXZ$JFrXK&l- z+~Lrq&--t#`}m6XczNM8hi$j*l=mK&cR_o{Nubx69UjKDl4y5ZyA8XbGPj3RGGD9O z+;;E#z@^Im$z|!H!nQ8_rt5~lu+oT_$U8SZR=vLSHpc76`l{{tHl8sKy?FM%5N^(= zT@x7OW_hQ7yD`@Wx-s(UiSDg`e!4Tht9!e@vt`EILRT!*8yEyG8}b+3L3dRcLQ?28}pn)BUFg6o2JXI<=?x2*ZP z&6s&u40RU5EM9qf(W}mHE)wZ#B5U&5R?y2SM4^UyPQNh<4zaTPEiMC}uHF6S3O|4< zJQ$amGZt7)+eEZzFWBWi72UTe9 zd~gka900s z##gj7*L({tw$!-gR$A?VPY*rz)Vb$gdL3?m_yL+2Y4FISj5;k%FvScr&NO-ES!NYr zO}qq&l7uBok$U#p?$w9u3$NMTYi@Z;$MM-~XeH*82&;4w)o1XS3l<({^#B0v)MqB! z5S)5WeP)V7P(%kMqxy!1Rgb}iVOkf(o_%-m+(&++m_PEHd*?Y)*Zqa(2(Ekd+kw}A zhVFBHd2EY9wW;xlzKq#jrYgnbt#0rG|IFui;V>X+hS-PqB(n_%K3Y2u|S+z2Mn<(@7y^Z06(S>8#og_U}!6*1( z2-0h7bz5+ooO}Luk)0QgFztj^`IkTP~7CP(M)MZ^ZOK(JfvB?gi(UTe-2vlm28c` zOBd7Xf|xYpL)w-Q29`8YhaxkH7L}H*9&0o%b-#8sTVN(~`7C#BcF3g)3(`7NJm2U_ zSIR;Uowj!v@41psRHTcJOT)8*tM-Q5-zlgyqN+$&I_}og#B8Z(K2=hGElHo5^1UVL zYqvj9lGga=Qn42MUDDIfP_|Nup#nllSE#Twa_xu5e=~2arCsOHmqLCfcYJNkFNCQ8jUr$!A(sA zGL02y128`a$%{U$8)Ey+p6=}V#JSPF=vjuOBTK$__I99DD5>j9x;8bZMU}(lv zqYc;ypow+GAi0QtAjIB_I(iwlZlvbTmm=vR^LHZYNX?&!q}MC|TqJ#J%y%N`d;c7Z zq|g0>^lXMul8?oCM$R%o<1t0AXN16!GlM%YjzFo~W|Wa~-KKgISrj${pHr@>DF0S2 zdH~|Vzcbnb&ISSNwon~9oQ(myhznECY9XWr*8x~;JY!>js*OmnU`=tbk0iwBY?^q2 zkDQO)M(#N!DaZ(6K`^|x0f~-O?k-sjnQk;r&5o&}QjXvl1XR>OR}vsZi+?^dn+WbI zi0~HT+Ea_9HYG9iO$i$awiuO-?dVFha?M!L{~&#ny-PmJ-KD~_MKiVut8tT2ZGsd` zl2(+n@?b}Q$j@P#+qCJ8l`BDJa~Wh2=CII$CJ!WEngCpDdSr#yMxa|=&o)qPAC%Se zqOwNGy}E@qZ2`g~eUH^mM|P#381~4n^b^BAD%vff9~+1?wxTJC{tD*vJ7b?jq9l$S zimBTY0b$(`yuq%Tp0xtIE$Q84FDCE^Qr)xz)e-7{{((ir?KlZL;LuoAi6OP@>J)z3 zC%uaDNQOL+4Izb^sO%DV>mYHjvm!L=Ulm$}hiU3ogiMf)nD~=Y3tP5PW#f1#wbI3q z2X>5o@-$$FBFH^GLZqX}tk&G@AE#Y*vURI0s;b{Y_{ioJv#ZJQSw@ z?EXxu%A(J>>pf-B2b^^fW~XDu3u)0aV?Hp~HF534q$wCo zq%LBjGjAPqo>}Vy(xNYSvZtg)AG6mf(C)%)Kb|(!-HotHj& zOI!3IZ#~eKXu9`5!j?Vd71+300004mlPnM!e;mbMQ>9WW4ptBm$xxjvh>AFB6^c+H z)C#RSm|XfHG-*guTpR`0f`cE6RRN)x5=k ze}G6l!wl0VUMHT~v<=St#8Fm~RpN8vQIjr6{K$31<2TMlmj#{~H8bfs;wZ6LY-6R3 zS;^FhCy8UKrc=I<^;qS+#aSy?S@WL!g^|3zyu@{ygGgcli;y5fK@}S)!$zD|ofHdc z+E4iS2VB2IE`?khVC0xb1sY`65B>+gf4j8`6XRY|Bms23IL^l~5ZVPAHOKircAUlu z5PSx%^p?L;2c|zsueG$;5zw;@TwJ#_We>RA0s5Z|*_2%=NK+^jfcG={rX0|F3xrp_ z-kSS3eE>4lRq6&fI0QzDl)dKj?ymOU{yo#|?+0*%a;BiiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqV*mgT`+8JZ zbW&k=AaHVTW@&6?Aar?fWgumEX=VTbc-pO+S(3xL4MqRCiY!5#$>ngY$_}#p9FUUR zV-GKBS6jA3ksyY90my3n=igKPi$5Q&Q_jZ}atH^1F1u`h3Lnz3|MGg*hgK)hOUq2RXVSjbWU_$xF)o+vf)F&7n1X4pV#i3D3ARi zv$aZ3VKlT^+`Qz|Muxg`KFxb?UOFUsUtqTy`cSjl5@#MlTEXKVkajrJx#=7-6o9H%uv>H+T3K( zYu&uoYdW!V*9p2ycUp*oK(GSk8I;C%S|W z6>q)s-UlCjQa<|o5JFWWi`h(ToGUv=N&fNjqo6a$>V1gJ#wng!Ez?)wNg*6S|>|pZaFIFU$SPZpx=$+0Fc9IVGll z`+rzYVY*kly|G#so@>iuI|@aohb8(LQ%q9)9|v#$>+ye|D70*h^Ga9v-WCuz9TkJ> zhId$W$#>nI4{;)Xm?QN$oeuSo@9oG=j=I=c<8)!FiPQNMfpk|;NO!Ti6r&4uG*e`- zsk5fe>ebHkF3vvPrWF`Fi;c4%zBDU;Lk{EZY$45%k1>+%$@@8coDpB#BAx;Y@+=V% zP$A)$d~a47-RRzrSdUU?D{~CsD3vB-N1t6+CN(`MP&8?iC)eY$BKFip>CH1wZYe)C%+%L0rr?=`J6h}}qk?iPcKfd78mH(bv%ec2b+Ju#V@ODQ? zro)b$_4L|xH_UXd5hC8^=KXM)FeO;b3W>q6+rnse-bL%)b4cH9p6EY5XBeO;=d_}N+=^Qgs)u00c|fPv5)0rXDZ$Dtifj#^k#OVbdc z!v3bTLf%9CG;a&k06`Kyk}KbiA+psKtY(0jOWKjm3JKD$>O>=cjmR2*XRuoY<(2^t z7R6`>5Xn$GQ^nuh+8^`#X_|oNTFXn4{(4mFgC8t?V7=jdt7)%M!`2H%X`py_b7)~o zJT_|azR<-X4ID8%R%=9|2DKv*HPY;)AhE^et&m-^7*#MtK&?z7mxv%w#ADJij=dyN zJe90TY_&01x1sY+&=$jgHcNqIxAZX!cRp+L;Yh+hHnOq8T<{5J;GWynK#fpx5Ntub zz7#uZ$B94<{Js~ELPj5CBO|2&hwYhtNo^r}5sbAv4(DYa_H}wQ)+vHV3yei?5Tv+d zESHaJ;m8SLIT<>ePqP%sf7k3Y2d>07bfTV4OcuriPCxQZBC&&i!?;lP19typUv(O| z#_e)|WFkSb3zOmhQBt)-zUG4*WCxR}7rMvX*^P;5D$FaHj;su{FM#zUMpoyY$O&kZ z1k3w4%oe;hvd)_xucLZ8fp!;QGx-jW4pv8Tyi{rh4>s2z-pF%@PhWB>L@;G^B0z3{ z8gRJiOHX_1?!qm95VnzoXL0Vb8Dv`t8>s>nG{H8}5DM(>^cAu$eC2?(9ZWKdX5<_M z9lpPyPaL%olLa)#A-{1}j**3%WlB7W>_@@{8Y9RZxlg;dv3fOfuiNP~n!+5JxT?4^ zIbOaGvK?Z#_#%h2--akT*IF@F)R<;6Ft)A1R1&F zeT1s#5UtZOViItI0i}nwrw&y5H~-((xoop6qxKp{Cn@*=WZ|dS4z$A9ICZdi{URK3 z(m{HR2eubSeLmg*a(hucgC+DGEJze{_|C|qH$JW4qy~fkyQ=lSF|MkTFuuf1kkGzEiq0$RsFNkew0cr55=dqS%eWuuud6 zdZ^(HfB5i;2F3iBiMD|rIPeq5zN0|(2M&Bsfg2#Zdgi}R=3Oi(S3l68nhzni^4WJh z_!Od>0@3M>1l6Bd@R2bN^%sZ^>Ov^2s+t81W z_6THIWAL0kh7n{(vu8ww>F^bzt{G}vY8!~stpJs&@K14SMftfVg2IN`5Gy(Bb$wr! zXxx{7*ToR=BXc~=t!|Tld+X!Hmt~n*y-fW^?B7VOek1m8q*lKX`_0TRA*UYGPR@Yc zbvf^BeXZIt;ac5DKf&2fWLb!k(fc-B3HlLS72Fo2=C2#R-dPA-bQWSsPKT^01E+ z8hXm9j#W<1;2~MmyWsboG$M>TrMY(UPVqx}S#y<@Xf^8^-;^BcuI4b(3X_hQOQ8>I znwQ3q^QLzP*J=Qd=}Atd2L{kC+B{Bw+Ef&kcX_KoYAb{ikQ%)?0=HWrH8oAt9!GE> zD&=<(a2_W(M*(N`fX0tw!_Z!k>MBKg|E<~4qAq*g| zg6rdL4TUGp8l#rfr?)7T`j6Xqw+nT@4csUD6b91I<8=q$N+=zz>-xJbKJVb;2Gl22 zyYII6W&`TI4L-;xJ-A$8Z!QJ#G;#)0T*yW%ATN_`fO^CT0V2;xkbOM8aQ6D8!n~~{9z&(#eC7r~_lRgta#7UK|JK){`nSOS+ zhK2$b*r-f`g&yKglcia+sVE2OP9Jpvh&R z3G3xm+DQsOHljH}7e?5oij)j1L6puPJ4m2Y59GMZlE=fG-^{4ilig80%ks%nA_!9Fv*9NZqF!ZXYjD& zOdJ)E6GQr`Z_vlt>^TEYmbryok<>!H2~%P&tS4?k4xo|di@r1yM$ct zS;Xk1LlQw+q!8iMr9%1j4TyOIOrM_(e3zDJ@N|dtSdG_?LrVQYh@YKEAZPR+8+Wyz z4>rzlW0|H_#7V#{PW%w2I8I*=JE`iB#>G~p%iU*xIpMr&b$nvQhesSQtoUeUNKxIh zB6#yxUcAwwdNk6@Q>^eU?AE-Luu6#c%(xY)WrHuw_}P)`;Vtp&jSC`Y1Q|7 z`2Do%FY5hn+Rs)i_zJ98ea7Ey^)=!Wq{O}XV4OTrhpi7{rDS<*sp9_ePnBPY6&Q!% zE(KQ)dD@+*)~w6g=|(l^G=v74RJ+rCpzADuP|a?#h_4y~&g%k)MK~CY(xv2Qm|}D zs8M_jG6-q#Q^6(q1qx}jsjCWEgt6CL_uenORprSD@IdwaBAPIN zcHG@mVB|}>Reo;Kq)7jpaB7~iJqvcP(vQN)FUG*50$!?;bXvc@0yVEX>4Tx0C=2zkv&MmKp2MK zrfQ{B9IPVZkfAzR5EXIMDionYsTEp(buhW~51KS2DK3tJYr(;v#j1mgv#t)Vf*|+< z;^yY0=prS4mlRsWc*k)M?|tvf-FJXcFEiEb7zb3%GE(uFn8~h+fma04g#nuV5;OI= zWHJHI@pTU$-|wP4%e(H+(WB%{2KYqcS*9Bn@dokqrloV>N<2jzQB;lcg^bGz=Pk}^xyqXNf8NYQ!B!$0KsljM@gRRSZ&0xD1;Iezdz_}yDGKRMwh zg(i|qi@OreYZex&Fx$B9H$RJntGME0S*p<(E??!d%U~5y>I{4H2e1h zH!E_FI>g91lSK&-3%=sLs zOi%;w`nwDbyBP_pYjFKP41;Ubl2J=&2N>y5cA?~W#-$$!YWN>5z`(GJaE@ni8_n^f imW*05=yLq<2`&Kj#uq65-#~r<0000 Date: Thu, 7 Oct 2021 19:08:46 -0300 Subject: [PATCH 22/33] update windows logo --- lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart index df85011a..2572d127 100644 --- a/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart +++ b/lib/src/slices/data_screen/ui/data_screen_layout_accounts.dart @@ -36,7 +36,7 @@ class DecisionScreenLayoutAccounts extends StatelessWidget { child: LinkAccount( username: account?.email, type: 'Microsoft', - linkedIcon: "account-soon-outlook", + linkedIcon: "windows-logo", unlinkedIcon: "windows-logo", onLink: () => service.controller.linkAccount('microsoft'), onUnlink: () => From 2fdcfc9ecfbee34216c05715e470d4d2430faa77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Thu, 7 Oct 2021 20:02:05 -0300 Subject: [PATCH 23/33] add promptValues and microsoft "/" --- .../slices/api_microsoft/api_microsoft_service_email.dart | 6 +++--- lib/src/slices/api_oauth/api_oauth_service.dart | 4 +++- .../slices/api_oauth/model/api_oauth_model_provider.dart | 4 ++++ res/json/auth_providers_db.json | 5 ++++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index e1657cd8..d666eb7a 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -56,7 +56,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { page: pageNum, maxResults: maxResults!); Uri uri = Uri.parse( - _messagesEndpoint + "?\$select=id,toRecipients&\$filter=$query"); + _messagesEndpoint + "?\$select=id,toRecipients&\$search=$query"); Response rsp = await this .apiOAuthService .proxy( @@ -160,8 +160,6 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { String _buildQuery( {int? afterEpoch, String? from, int page = 0, int maxResults = 10}) { StringBuffer queryBuffer = new StringBuffer(); - int skip = page * maxResults; - queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); if (afterEpoch != null) { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(afterEpoch); _appendQuery( @@ -169,6 +167,8 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { } if (from != null) _appendQuery(queryBuffer, "from/emailAddress/address eq $from"); + int skip = page * maxResults; + queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); return queryBuffer.toString(); } diff --git a/lib/src/slices/api_oauth/api_oauth_service.dart b/lib/src/slices/api_oauth/api_oauth_service.dart index 9832b396..3bb89462 100644 --- a/lib/src/slices/api_oauth/api_oauth_service.dart +++ b/lib/src/slices/api_oauth/api_oauth_service.dart @@ -127,7 +127,9 @@ class ApiOAuthService { List providerScopes = provider.scopes; return await _appAuth.authorizeAndExchangeCode( AuthorizationTokenRequest(provider.clientId, provider.redirectUri, - serviceConfiguration: authConfig, scopes: providerScopes), + promptValues: provider.promptValues, + serviceConfiguration: authConfig, + scopes: providerScopes), ); } diff --git a/lib/src/slices/api_oauth/model/api_oauth_model_provider.dart b/lib/src/slices/api_oauth/model/api_oauth_model_provider.dart index d1e32c9b..dfae6128 100644 --- a/lib/src/slices/api_oauth/model/api_oauth_model_provider.dart +++ b/lib/src/slices/api_oauth/model/api_oauth_model_provider.dart @@ -13,6 +13,7 @@ class ApiOAuthModelProvider { late String discoveryUrl; late String redirectUri; late String userInfoEndpoint; + late List? promptValues; late List scopes; ApiOAuthModelProvider.fromMap(map) { @@ -22,6 +23,9 @@ class ApiOAuthModelProvider { redirectUri = map['redirectUrl'] ?? _defaultRedirectUri; discoveryUrl = map['discoveryUrl']; userInfoEndpoint = map['userinfo_endpoint']; + promptValues = map['promptValues'] != null + ? (map['promptValues'] as List).map((item) => item as String).toList() + : null; scopes = map['scopes'] != null ? (map['scopes'] as List).map((item) => item as String).toList() : List.empty(); diff --git a/res/json/auth_providers_db.json b/res/json/auth_providers_db.json index 4cad985f..7a960cb6 100644 --- a/res/json/auth_providers_db.json +++ b/res/json/auth_providers_db.json @@ -1,12 +1,15 @@ { "microsoft": { - "redirectUrl": "com.mytiki.app://oauth", + "redirectUrl": "com.mytiki.app://oauth/", "iosClientId": "6e52a878-7251-4669-8e42-70655255a263", "androidClientId": "6e52a878-7251-4669-8e42-70655255a263", "authorizationEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "tokenEndpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", "discoveryUrl": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", + "promptValues": [ + "select_account" + ], "scopes": [ "openid", "email", From f3fb726a384c9b9845a4b7abab4e8ae415b74559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Thu, 7 Oct 2021 21:05:02 -0300 Subject: [PATCH 24/33] change for inbox --- lib/src/slices/api_microsoft/api_microsoft_service_email.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index d666eb7a..aa0bdf34 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -119,7 +119,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { category: message['categories'] != null && message['categories'].isNotEmpty ? message['categories'][0] - : null, + : "Inbox", unsubscribeMailTo: unsubscribeMailTo, email: message['sender']['emailAddress']['address'], name: message['sender']['emailAddress']['name'])); From 151547317232e187facaa09988347535d2e7d24b Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 7 Oct 2021 20:05:50 -0400 Subject: [PATCH 25/33] fixed bug with sender/from and query builder --- .../api_microsoft/api_microsoft_service_email.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index e1657cd8..21fd5f7f 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -86,7 +86,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { Future getMessage( ApiOAuthModelAccount account, String messageId) async { String urlStr = _messagesEndpoint + - '/$messageId?\$select=internetMessageHeaders,sender,receivedDateTime'; + '/$messageId?\$select=internetMessageHeaders,from,receivedDateTime'; Uri uri = Uri.parse(urlStr); Response rsp = await this .apiOAuthService @@ -121,8 +121,8 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { ? message['categories'][0] : null, unsubscribeMailTo: unsubscribeMailTo, - email: message['sender']['emailAddress']['address'], - name: message['sender']['emailAddress']['name'])); + email: message['from']['emailAddress']['address'], + name: message['from']['emailAddress']['name'])); } @override @@ -160,15 +160,15 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { String _buildQuery( {int? afterEpoch, String? from, int page = 0, int maxResults = 10}) { StringBuffer queryBuffer = new StringBuffer(); - int skip = page * maxResults; - queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); if (afterEpoch != null) { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(afterEpoch); _appendQuery( queryBuffer, "receivedDateTime ge ${dateTime.toIso8601String()}"); } if (from != null) - _appendQuery(queryBuffer, "from/emailAddress/address eq $from"); + _appendQuery(queryBuffer, "from/emailAddress/address eq '$from'"); + int skip = page * maxResults; + queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); return queryBuffer.toString(); } From 38c257bf960d50fa3baa0c6fa1c1bc0761f8cc96 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 7 Oct 2021 22:04:13 -0400 Subject: [PATCH 26/33] fix upsert issues --- lib/src/slices/api_email_msg/api_email_msg_service.dart | 1 + lib/src/slices/api_email_sender/api_email_sender_service.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/src/slices/api_email_msg/api_email_msg_service.dart b/lib/src/slices/api_email_msg/api_email_msg_service.dart index fcdae2f3..b84fca8b 100644 --- a/lib/src/slices/api_email_msg/api_email_msg_service.dart +++ b/lib/src/slices/api_email_msg/api_email_msg_service.dart @@ -19,6 +19,7 @@ class ApiEmailMsgService { ApiEmailMsgModel? dbModel = await _repository.getByExtMessageIdAndAccount( message.extMessageId!, message.account!); message.messageId = dbModel?.messageId; + message.created = dbModel?.created; return dbModel == null ? _repository.insert(message) : _repository.update(message); diff --git a/lib/src/slices/api_email_sender/api_email_sender_service.dart b/lib/src/slices/api_email_sender/api_email_sender_service.dart index 60ecc414..a73757ad 100644 --- a/lib/src/slices/api_email_sender/api_email_sender_service.dart +++ b/lib/src/slices/api_email_sender/api_email_sender_service.dart @@ -18,6 +18,7 @@ class ApiEmailSenderService { ApiEmailSenderModel? dbSender = await _repository.getByEmail(sender.email!); if (dbSender != null) { sender.senderId = dbSender.senderId; + sender.created = dbSender.created; if (sender.emailSince != null) { sender.emailSince = dbSender.emailSince!.isBefore(sender.emailSince!) ? dbSender.emailSince From 6607b0f7e83890eeea324f5f2c584aeb09e000d1 Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 7 Oct 2021 22:05:07 -0400 Subject: [PATCH 27/33] reapply sender/from fix --- .../slices/api_microsoft/api_microsoft_service_email.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index aa0bdf34..64cefcd6 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -86,7 +86,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { Future getMessage( ApiOAuthModelAccount account, String messageId) async { String urlStr = _messagesEndpoint + - '/$messageId?\$select=internetMessageHeaders,sender,receivedDateTime'; + '/$messageId?\$select=internetMessageHeaders,from,receivedDateTime'; Uri uri = Uri.parse(urlStr); Response rsp = await this .apiOAuthService @@ -121,8 +121,8 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { ? message['categories'][0] : "Inbox", unsubscribeMailTo: unsubscribeMailTo, - email: message['sender']['emailAddress']['address'], - name: message['sender']['emailAddress']['name'])); + email: message['from']['emailAddress']['address'], + name: message['from']['emailAddress']['name'])); } @override From e643aea22dd61014d6fc5871d516086bfd91583f Mon Sep 17 00:00:00 2001 From: Mike Audi Date: Thu, 7 Oct 2021 23:41:29 -0400 Subject: [PATCH 28/33] bug fixes for toRecipients --- .../api_microsoft/api_microsoft_service_email.dart | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart index 64cefcd6..1b6070d2 100644 --- a/lib/src/slices/api_microsoft/api_microsoft_service_email.dart +++ b/lib/src/slices/api_microsoft/api_microsoft_service_email.dart @@ -55,8 +55,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { from: from, page: pageNum, maxResults: maxResults!); - Uri uri = Uri.parse( - _messagesEndpoint + "?\$select=id,toRecipients&\$search=$query"); + Uri uri = Uri.parse(_messagesEndpoint + "?\$select=id&\$filter=$query"); Response rsp = await this .apiOAuthService .proxy( @@ -71,9 +70,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { List messageList = msgBody['value']; _log.finest('Got ' + (messageList.length.toString()) + ' messages'); messages = messageList - .where((message) => - message['id'] != null && - _findRecipient(message['toRecipients'], account.email!)) + .where((message) => message['id'] != null) .map((message) => message['id'] as String) .toList(); page = @@ -86,7 +83,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { Future getMessage( ApiOAuthModelAccount account, String messageId) async { String urlStr = _messagesEndpoint + - '/$messageId?\$select=internetMessageHeaders,from,receivedDateTime'; + '/$messageId?\$select=internetMessageHeaders,from,receivedDateTime,toRecipients'; Uri uri = Uri.parse(urlStr); Response rsp = await this .apiOAuthService @@ -100,6 +97,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { Map message = json.decode(rsp.body); String? unsubscribeMailTo; _log.finest('Fetched message ids: ' + (message['id'] ?? '')); + if (!_isRecipient(message['toRecipients'], account.email!)) return null; if (message['internetMessageHeaders'] != null) { message['internetMessageHeaders'].forEach((header) { switch (header['name']?.trim()) { @@ -166,7 +164,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { queryBuffer, "receivedDateTime ge ${dateTime.toIso8601String()}"); } if (from != null) - _appendQuery(queryBuffer, "from/emailAddress/address eq $from"); + _appendQuery(queryBuffer, "from/emailAddress/address eq '$from'"); int skip = page * maxResults; queryBuffer.write("&\$skip=$skip&\$top=$maxResults"); return queryBuffer.toString(); @@ -186,7 +184,7 @@ class ApiMicrosoftServiceEmail implements DataFetchInterfaceEmail { if (splitMailTo.length > 1) return splitMailTo[1].split(',')[0]; } - bool _findRecipient(List recipients, String email) { + bool _isRecipient(List recipients, String email) { bool found = false; recipients.forEach((recipient) { if (recipient['emailAddress']["address"] == email) found = true; From 19576488fc6dba620233baee5a98f6dd455ff08d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Fri, 8 Oct 2021 01:58:07 -0300 Subject: [PATCH 29/33] 0.2.6 --- .../ui/decision_card_spam_view_header.dart | 7 ++++--- .../{gmail-round-logo.png => google-round-logo.png} | Bin res/json/google_info_gmail_db.json | 6 +++--- res/json/microsoft_info_outlook_db.json | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) rename res/images/{gmail-round-logo.png => google-round-logo.png} (100%) diff --git a/lib/src/slices/decision_card_spam/ui/decision_card_spam_view_header.dart b/lib/src/slices/decision_card_spam/ui/decision_card_spam_view_header.dart index 90ccfb18..fa44a4eb 100644 --- a/lib/src/slices/decision_card_spam/ui/decision_card_spam_view_header.dart +++ b/lib/src/slices/decision_card_spam/ui/decision_card_spam_view_header.dart @@ -15,15 +15,16 @@ class DecisionCardSpamViewHeader extends StatelessWidget { @override Widget build(BuildContext context) { + String provider = service.account?.provider; return Container( padding: EdgeInsets.only(left: 3.w, right: 3.w, top: 1.h), child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( child: Row(children: [ - HelperImage("gmail-round-logo", width: 5.5.w), + HelperImage("$provider-round-logo", width: 5.5.w), Padding(padding: EdgeInsets.only(right: 2.w)), Text( - "Your Gmail account", + "Your $provider account", style: TextStyle( fontFamily: ConfigFont.familyNunitoSans, fontSize: 12.sp, @@ -37,7 +38,7 @@ class DecisionCardSpamViewHeader extends StatelessWidget { onTap: () => service.controller .shareCard(context, shareKey, shareMessage), child: - Icon(Icons.share, color: ConfigColor.orange, size: 8.w))) + Icon(Icons.share, color: ConfigColor.orange, size: 8.w))) ])); } } diff --git a/res/images/gmail-round-logo.png b/res/images/google-round-logo.png similarity index 100% rename from res/images/gmail-round-logo.png rename to res/images/google-round-logo.png diff --git a/res/json/google_info_gmail_db.json b/res/json/google_info_gmail_db.json index ab49dcbd..bc72a315 100644 --- a/res/json/google_info_gmail_db.json +++ b/res/json/google_info_gmail_db.json @@ -2,7 +2,7 @@ { "cover": { "header": { - "image": "gmail-round-logo", + "image": "google-round-logo", "title": "Your Gmail account", "share": { "message": "Gmail knows where you are when you read your emails. It's your data, start taking it back on https://www.mytiki.com", @@ -87,7 +87,7 @@ { "cover": { "header": { - "image": "gmail-round-logo", + "image": "google-round-logo", "title": "Your Gmail account", "share": { "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", @@ -160,7 +160,7 @@ { "cover": { "header": { - "image": "gmail-round-logo", + "image": "google-round-logo", "title": "Your Gmail account", "share": { "message": "Gmail knows what you've written to your friends. Find out more on https://www.mytiki.com", diff --git a/res/json/microsoft_info_outlook_db.json b/res/json/microsoft_info_outlook_db.json index f926d2bc..cce21152 100644 --- a/res/json/microsoft_info_outlook_db.json +++ b/res/json/microsoft_info_outlook_db.json @@ -6,8 +6,8 @@ "title": "Your Outlook account", "share": null }, - "image": "where-you-are", - "subtitle": "Coming soon...", + "image": "coming-soon-graphic", + "subtitle": "", "bigTextLight": "", "bigTextDark": "", "text": "" From 1c05402fe0ad46b8d3ee451f0d6bb4797e60438d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Fri, 8 Oct 2021 02:10:42 -0300 Subject: [PATCH 30/33] microsoft ui --- .github/workflows/artifacts.yml | 2 +- .../decision_card_spam_service.dart | 6 +++++- pubspec.yaml | 4 ++-- res/images/0.5x/coming-soon-graphic.png | Bin 0 -> 6420 bytes res/images/0.5x/microsoft-round-icon.png | Bin 0 -> 364 bytes res/images/0.75x/coming-soon-graphic.png | Bin 0 -> 11742 bytes res/images/0.75x/microsoft-round-icon.png | Bin 0 -> 411 bytes res/images/1.5x/coming-soon-graphic.png | Bin 0 -> 31777 bytes res/images/2.0x/coming-soon-graphic.png | Bin 0 -> 44025 bytes res/images/2.0x/microsoft-round-icon.png | Bin 0 -> 832 bytes res/images/3.0x/microsoft-round-logo.png | Bin 0 -> 992 bytes res/images/4.0x/coming-soon-graphic4x.png | Bin 0 -> 112299 bytes res/images/coming-soon-graphic.png | Bin 0 -> 17617 bytes res/images/microsoft-round-logo.png | Bin 0 -> 1275 bytes 14 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 res/images/0.5x/coming-soon-graphic.png create mode 100644 res/images/0.5x/microsoft-round-icon.png create mode 100644 res/images/0.75x/coming-soon-graphic.png create mode 100644 res/images/0.75x/microsoft-round-icon.png create mode 100644 res/images/1.5x/coming-soon-graphic.png create mode 100644 res/images/2.0x/coming-soon-graphic.png create mode 100644 res/images/2.0x/microsoft-round-icon.png create mode 100644 res/images/3.0x/microsoft-round-logo.png create mode 100644 res/images/4.0x/coming-soon-graphic4x.png create mode 100644 res/images/coming-soon-graphic.png create mode 100644 res/images/microsoft-round-logo.png diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 66de885f..f207885d 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -21,7 +21,7 @@ jobs: - name: Install Flutter uses: subosito/flutter-action@v1 with: - flutter-version: '2.2.3' + flutter-version: '2.5.0' - name: Android Config env: diff --git a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart index 06cbff98..7f046fba 100644 --- a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart +++ b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart @@ -30,6 +30,10 @@ class DecisionCardSpamService extends ChangeNotifier { final DataFetchService _dataFetchService; + ApiOAuthModelAccount? _account; + + get account => _account; + DecisionCardSpamService( {required ApiEmailSenderService apiEmailSenderService, required ApiEmailMsgService apiEmailMsgService, @@ -48,7 +52,7 @@ class DecisionCardSpamService extends ChangeNotifier { Future?> getCards() async { List senders = await _apiEmailSenderService.getUnsubscribed(); - + ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); List senderIds = List.empty(growable: true); for (ApiEmailSenderModel sender in senders) { if (sender.senderId != null) senderIds.add(sender.senderId!); diff --git a/pubspec.yaml b/pubspec.yaml index 571b71d9..9f0f2ee4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,8 +4,8 @@ version: 0.2.6+1 publish_to: 'none' environment: - sdk: '>=2.12.0 <3.0.0' - flutter: '>=2.2.3' + sdk: '>=2.14.0 <3.0.0' + flutter: '>=2.5.0' dependencies: flutter: diff --git a/res/images/0.5x/coming-soon-graphic.png b/res/images/0.5x/coming-soon-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..ae480bd105e8d4f75674c34a124810ff657b2957 GIT binary patch literal 6420 zcmV+v8SCbWP)AP*oR?@Th8_sqTf|9>|(nS>Amd2A+gf9Fi* zaqoQh-tYH+|GzttFhNjXal7fM2C7_5?^Zy93zFo5O3wza0%`;OX@Dvnrg^LdVtb|4 z4Gow8NEipy7u_zT$eZZZ1{%r@1CtFB0=xuC**+ctxGK^~t83`157DCr2L7KQJxSWX z?P|!sBGQEkmrM^sRoB75G{KdVFOPLcbyvkENb(_r@aYD2t@0lAmC6lc{l=Iyod_rG z#%36p-jJ|ey1j18<#!teB2cr+d&wRwhJnO@s@5W;u9WU<@LXz_OOkF7p1`;a@t5}L z2H}YdNveiT+H8-2t&}RW zS#ZO^%zy+BRAotg9zV>yOIu+OKC{5R4@n+k<_9#rU(4%ZV1`0jN!q@bU&U#<&~gJa z7Thc8f5m?cEl&~zl}ygvHBDD#qr{pFNYQxKNSCk{29g2y@gK=B?a2nEoHX53g9$`K zhgm$P0uAjZEO{^=+g`|kfw96=W2WMK_4pP|Y1nzdj*Y*}g2z9Y5Y$wK@X%d7;(0Q_ zWY;!Y#DkAB88}R1Z+<2ddq1*?_tm9gRF_5Y@I4;5oC>A_kL*gr_FbuPITRfFX)DGB z;#(#IKkgd)winWI=k}Z-gfn=ep8Bg3lZ8#I`-DI}d`~wf3+w2*bix_6XRUbht;xHl zk&xkt3G3+zjCsw=r6FSl+hI4x0XDH)`^~F6H-^o(c~O=d74M&-$$99m-hq92@?Ii~ zz+i2;?JRjPZ1&y_z_t(eZ z{dGJ^+xgu1+<83Sw&`~7MHZ={-7FrA4a z*5$5U-_B#`*RETWOs9$o16AnE<6Xu2RGifB`F-*@0GqLfX z)ty!LFrw;T8Mla+aYu^=>FYovQh#B<}Y3?cqJHs9Vm;8yer_xL0tXV8-9R*5He zXFrJz9VS!{3(nZYiu2kvD4hJ*PM@=N(S>z8xg6bO>sIScv2V(#*S><>)8MhX1>xct zG=?~Dc2T*J{%f2VGe2%kAJjHk__mS2CNO?q21~W}z00Q#m$D$b6&OAl@%~%i7Vjc1 zWtE1z5gklCyOYf%och?T$@+CM%Hqb;U4%$quj1O>Ik6${b%7p>f{g{^CSAV(M!bJ# z0njzb)gOq&=kNOKtCe0h#rh=ZlQ%Hgab&n0vHoWTWjR9ylpimB;28Bdx*#)YO#b%% zOo7Mfi4&5ZIDyx%jnC(D*FK!!OM&B!C+_dWL}1+JeJ%MZCcakWvo7*s4lyD6g>fLV zZmFNPXJ|s8W(kwVfeeH5-b+a^6Xx-ce2OEbFJgi_F!KI%PAlRf>Lovzr4jERUGBHg zHL)4i{j9z}YdnuPaP9x?($Xs0uA6-Qc%xl=yamu)*2Ogq9&cs8xgQ>EUJWLsboS!r z4w0veprk+LU}%xAEK;4Fq*1(`eXQg-zy?mJxUfB$?A>p*?<;t|gDUh}eLOI>V#wk&d&M(lh;BnfQ2!xP$h6aZ86FgvVo{*CA5C1tD?F%U%0L#~=1t zyyfE8<0YMH?-di41oFfj?vFMX)5X@z4-Ls@#r6g*e_mV`CJPW8*e+5t3btyh2Bm+n z3KkjIk1Yv<_tW;VqLC(?Cy+CV+D0>$ltsn(4E~ITiOp#IxSVe@GDvW?Jgt$n=Lc;U z<=4VZ^Chx<7w_?G?dHPjfdx>`KoCUBf4A1Yc1`|s9;Ha3k zU`=5^zL-oa6ToqZ9(#2EvT4dnt7FE*vokT~JyF0~tDEBCU~@d}2%jWOKruIgAZbmY z;VIoi>wBm^;6bt=>CC$hJr$ew+HIKki9@oO@{y2S=G}mRL3$FxAUz3Tke-AvNKZl- zq$eQ^(vuJd=}8EK^f4e3Nq`dL6~G{U6a<4ZcKtCI|MI=L=wWdF?bI@_S6UuB8oX#|q zc=OTu!;|o(29R=n7HoAuZ)-QQK3jse87psWNyVoW15m~Hmf2MU*h)QqbKd~nXQPVM9`Me1;>rqFz*h*TM~wHhaFD0 z3(ZSBP?{q!9g9J3R}fiaL-CSN;?VC@q^I4zAZ$hjytwO`?|KW$4B13hNMg%Rem?_e?MBraJ(?8WCGiw5W z9bz<0f~F^3apwHl6#Vv?5}a9+B}{g4W(jiMwxjXI;|PHw@^lGS*#?yYJ!f?`Osxw1 z+neB7uRxt+!Ga5wi0p1hRmvf(S=$PmeUg__8>CMRxK;Y|f2+i)RYd$UGi;6&Dwr7N;Q)@IfZiE_nd!Ye7UlX+?B}8LGG$R)WLqK-q-?NWVIYZ*2H*pk_ZQFi4*` z96OSRM_;a>e4K(i6HP$?P-anKriz&DPr+ppj;!BPK_*Rx&qO`8q4TgPEbnIw%jNFN9IoajnB+pO3{4V9Rq3{}% zX3U9FRqv5Q_{Rr7q8>Y&bx9O`5=qmOq6{1Go3Qf_Whh)+h5I+2gcLr9ScqDr3gzb^ z^3r79ZLTPyei=pORDvb`(zDv|>i@=2cU=ZR#9Q`;kzVgbN#*Of<}2R*?wTgulScR? zVaE5<{XP?Z{n%VATfY=Ht$a@qu28cj;x!{e+bq;{u@Hfhq{2j+9`%_~qYSH`Plb|SyM;)Bw&V;E}_Sx{os)jRdMb#zjC53 z&4G8{F~Qf}M}$VnKZlS{4VL2kD9RT2F^kN)EEDk-6=AB?XU~el=e1(aq5$eXvg7XC zn(*weqxiTj9jeOzjRL)GGdD8{J7aP%=PqKXJJajj=3m=-}&d2Hf$HnKaoG9FLf+(9Cz`=d# z`0n@4z+#=kXx;GXmq%AS1z+kyEL~+nOH(@9PM^n#ruP1=5^lV$2X}p~4L|(*3i$fS zcjsjyyL1*>Po2ly8_61&OgQwXePZu9p9rA-L<(x(O%)Hukwa-%`svB}FA`IQ8Atk_ z*K%;nhDta?FW|9lndoX7`~}O*>wEMxMeBSn2O!Mcwxv`YwzuVLIoTPMgMab1~9wYN0m1TyMC7~ z*1k`viJxH1DAMarIkD)LN}z8)<>Mw1UFQ@;@b2?2ysRx>A?rv06 z1@O-9zoPXVOM*5PPTFVH7kW@x9ue-;?1&XeuzH zNPqtw7e2eiiKwR)CelPMuPUVd2ll3m?SAs%ukLi={e7uI7y{H}=_B)t$jj?P?7T)egL7_+jma~?NyLSy z^4!&777rcW^t!j*jH=svV76;FFQ{q^(V$7Zm#Ic0o2f(_FvICo(B5i8B4ftX-g)6; zNXdc}Z4?B>!dgnkW`6a05ArNA+>obW!?p@6&kSRZedt}NB@6wC1qY{t$&S%?xkj(h z=Q7EN$r^)`G(8wh>}i`Zq<6I0kn45<;Vvqrl35QEVSSo5Uw4}arJwP``9(KMi_f7+ zGNU?GTPcx3CjHKh?I@iar2L&KcqA-bdk=F(kE{jf^qTf_rA`qO#@iDaGse6JsF6}M zhuWY@A39sCNF_3v8t$MS-k*xoALZk78+-BUuPi9EMUnD%UVJ;!>A5JxSlT~ZRFf8=m-(!LrB?}OhDHt@t;Y{ow zD3~#%D=}_>5HaC=NTD9A{jvphE!X4eN2`!sE#Wmq#he>WxNDP)+zqKXUzehlIC*(o zyA@W_Zfkmko?{|l6QFJE=R-cT=&o?Az!^YsX%LBw8AH06qV%4Q0GiHaK@|U^KCJ($ zL?+uw8X7|3+7zUwNoa0VVWS?)2m8|S{9|q$I=KcWdx}WO1n8^0m?G3|rB0hgv|6LG zB9>G!TAMA%FG_6EXN*thWylTnK2%op;I}`g?wBbZ1!V!K;V>30rb^ufJL-;7PdpOC z`)>iu?^=wS&)Z>_TgfG)P+sm6zMU6Q#HivXQxIp(h`{SH3sbMEnqLoi<%GUtl`&&T z=VeT-yIWAWAst`(`WdvgwBfnObCH+jL-R2&3X1|Ltx`~5@5HCq+=|ufddVkr3KK3_ zQlWUe5ei#icE-f28cy}t*LQbn3n?Ue>Y++pNofFyjs$P54*hkB-|r~K@^9RNT;%PI)No)r=Kc(|8Jul@gijkUbB(N2Uz`1QVC3V%pq zrj+nWLP7^}&-|twO5sYp_(B=pqq@7FYUyY8pT_Zzm%@@RYyO!#Wn{A1Y;)m-HHXu$ zRBEs07Ke!NuppelwRYY=)McS|tA)CAswly-Pv5u8g)e@k1v3GO9lhK0u(bMZe09@# z?BAb-lN~Fu;l~Bo{rEwgZ(Ann?k3A%3zUm5Au88$K5omT^eiJfke+cfg#);7FGcK* z7@Av{ZB^9p5ARRIvTLc7J1cRUEb&M{($#_I-j)tT0)67n(e+>Jz}&KTP?q;DzWLAf zc=l&4ICT6Piq>rdU+bi%$}fIWh-dyQSNLq!@Xj_fy2GDA)O;N ztZ?w{G$?@>mMrrmeEC&J!u|Y6l&WGK)a5#V)-L>PL@}eVEQEAd3@ucB;{^`wEf(Y! z1o6jT%V<1Xh`fA1QpuM;OVRvI_b!7gy&3QCv7xys2dQ&EkHUfrFog~v5&_PhwjmTC zjVIC%{52g?M8VQ)d#Isfq58g6#1XQbcz3nLBcTGhZt}IQO*SH4ld46Fy?AA39}InRkMc zakNp18!KGDXW}On$(*u@GWiG-z-IQ-H*{b2`+h36q-W9qibj%q zz7Ho4QvpUb3xV4IMg|3S3TkRPkTTX^mq<_xpD=-(EroOB&{elJU9Jckk948CLksN6 zDucrRAEH3*FE6+-uhNT~S9Ok=@YM7uiW0Q(l5iC{{&~-CDu?z`O`KP!Udh3DLF1u= zF60zZzns#!#*;S8p52Gp^L%5vMTy-9FRsj{LJ*TaCAT#hKT0qNHuW4y2mCVnyk^l) zkAyMM7#Zz*9EEcP&cxYlm)2~)ZHZ$8{@pn{I(PG?6b9*|gMUmQNWPnYEKocs z5|2b=@f?fwSK}b{Poyd|m2X(&)vgwD8|*qn{hi3>m9f)eZM#u>A04c{4rk*16!%oa z_{Tj-2!r$_gh6@|LZ-OJ0|Q9~nQ|C|^yESVkuDjeCl%BN_UUiJK=MG94wFw;YGELG zAW5~X>3d-yi4fZ>ORF0i*v`X1GN6I^?$6Vur(j^_L&Zz{q>&y}w!^^8hotc=NSE$x zptMch3j;G4(vzAiA5w-@w_&1?*!S#DA57>x#s>HuAf2ROFO_6>VxpiLk8wXH41-$E z7}{`Al`Tdse#W68UdtInNEgzeVB*ZYfoT9~TfCMtE^4hxYwEU>X?X+&5+B5)wEE1G z!#}>{YBu%H<%g(bR}BM+2}M0D-BCXxf0tfF5mHxD+tsMcCnAV&gw>i$Z60;qs`{ea z1)H?T(D(#GKjB*KWn_$Lv9kK-itV)LCK#CBU?0AwZu8}K8`By&Z6IZ%(U_U0;51vs zma!17?S2JNUvazXD_iMt9}G+nNYYNIu`R>XvQfW+tAIiNbO85C)NP`YdW9I*4M>7~ zRo)CqT}wl`VPKNM?v>i$)D;~qP`ex^?5;CS`%yzeP)$Oxm|nXLLAXi?AFZ;VCSs*G i`f4aTa()7Beugc7iZtZpPeSKtaah zAa^H*b?0PW0y!+{j=qiz3>*8o|0J>k~spCfPLQKTy8Go+PIbt57>H;r0~GAolwQUWW*XdOPOve-UuJF1d3ub7?}`+`IYd z|LYr77HMQk{D?^&eXAePG}C>&PenrNK{sww-+%xogkdzopr0K8F_{r~^~ literal 0 HcmV?d00001 diff --git a/res/images/0.75x/coming-soon-graphic.png b/res/images/0.75x/coming-soon-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a32b6cf46205c4b73d11f021190d155c1cd750 GIT binary patch literal 11742 zcma(%V|yh$)3t4E-EM8$J+-^FZQHiDwz=ij-P*Qo_tb8m-tRAXKP0&_NoF#0B^hKQ z73BelaCmSaARvfRl48o=ZRdXl2I{-+lNzY{ZeSfGHJw2~VC4TRpfSuK7vDfoXJvp0 zNX^ub)9((1xv-ot2uOWA{JS9}2nfBil$fxp2k2!EbhhfU=VKo4Kbu+`Q!JFag%UVe z5}{whk_|%2XxQ8$FPgu)$eTmD-}eTluzMM=rpy(McvEF!Y&07VB}J4#)r1BmC2Ac-Q6 z+M!RT>0O+KNO3vF7>GN4*+K*hgO(qs3<~U%XLVRuVmg5UF<@VNd3(<91iCOWmRp-( z1z!*Hqzwgf4@3Rx_He2~L6}Gr7e^5_PXD=s$0SH1YWlNB;a8W@l?J)Cmv=WE(ll}p z+vy4Kd<)(Z^|TmxIJf?)EpKWp^ObK(6CN-Z734`bgHjX|5B+i$;S?U!Zle(W+&Z(! znn2}?B-kitu0o=uosty_^dHBH;)3NnP1xpkg%A(8lH};Pa=dWe&3<)azc_bTTJOu} z{U9Sv3j6n)S`{o%T!K406;cT)lA+E(7WJ~34Ja*?d#%0AF9I%9lVmwuJj&mEqRAO4 zg}hglNW$SIe^T@%Qc2l*?7TB(EpUvB-W!A;DFN_p#E07J%p80YaHD-7KcZBXxbN!KH08;{MXz zg2_u9dkq{Pmmdht5$HK9zItI-&nF4F`1NM|eKN#Jb8GUf#*3ve^|Lmc(&KoL%Znn^{ z9l-B8u48?`i|>tc&2O0g?+*oK&_R2^Cx0*jEEn9hpq)quAbxP3tl63PnU}DnNOsyy z+@xdpt69K5UJZP)KxFpuw_4H;0S<*nnVDZj`LuKPyCWJ7vOT#S1b-eu&t0RChxxEw z>&csYxBY2jukr4oz1EdXtE?I2iwhQA;{pDB$VfW0{n0vyBW3|@%QLkl6vo{Cx&%fe;rzmE5@)abiZv2#55=-lmb za&(*bC!kvdA*hip!dDHmu<%eh=O6e!G zD6$NT@T?$fU&!&vPo?K_IdPR&*JUD!?l{NYaYwf zZof``<2b0%xSG-C7Yo+2p!j%+`YtZq8zmR7jiE?v`$7q}^jO@eNvXdzH`9Y0AbPc8 zkK_ViaRXCF@=O9O{OS3m1Ke=y4bPW2-J1jL12)iGaglhQ4Wp zkln3+Yj@m={Ke;PRpLW!u9iqP}XuQ%3KC+6Q>csT5$^O+ht;R`42txm}Vg*O}ONnvRC@xlF zL%6s0Mj{3-5M3j#XTy@b5{7wv?}SCee53@8cERERuezVM8B`2XWj7z@%k0{_HD=f- z(&J)x@CV^`e_nhX|K5XCS@DxbN}EEzql-J;pdFwF<7PjwnM{y~-u<@SQ2^!gI)bPh zot{u9O8k73z1?4sa=xgE$QT#B*ZJPFxr35jx&aC9ir|oF3KsKPBa9PHow(UWFpffV z(u*m{b!K1=0F)wCAFz8dPF=@mF5*pIcBE8eD@@EtOR@0;PoWx21ZGGsn$~@WcrSSj z@KZi#b-W>lH4wDuoEKc5&~rQa@+-yW;PD31S5iHPRrq?0Dqi zB467i=Ff4gHZ0Nes6rXdJJ}asl!(1sc8jS-whivyo9f&uR*%$RTlfl!s6TA$a^UNg1JSCsxTz+$sRExgTQCRcXs#9H{8>;xv9Fi;bX^ah5=t#*IF5|xTFr;T%wI)v=xjO<0mMMw6z z8v5mIV}J259?x=mp&x}`T}VD_hK<{IGVt#^Qq>#R;uG|>e^hL(Jzj2}qaF4*veI;1 zBEttSv%}S5f4N1eT3P^q7pjn3^^LjSC=3$4b{qpX9Do-iMY!k3cj`2DacE|!G2w#RK@ zc&Z4(c*p6%3iIWr48Ji2_)VCulWo^1Wb#Q%AX!=tMXb=M{w3`fCH=W)gP6vu4BYQ= z7(SNyZ;V_8j@o1Nw+NgbOG!ddnk;qk4#oc)^eh#gdZ5RGQM^M*0Ec%z>2Wxy^Or4) z7?;qA@4Yyns5NK`30!Y8Ik@G~l~xU+Lv4-)_`Li7=-`JbTo z=6))Mo5xNDT)ert7<6{*Ne^3lBzeDVux|UEO+^*kp?H5TcIF|bNeHy z0;u#gnIsh4-CX%KGan-Nh^$Ru`ttZ=G2YR!V7dQYfbF=B65elD@Sn;g! z*!^nBEZZ{Ce|pFc%y#PaAdg^QzDaq*xc@UVVl}Clfa>>yn&xJg@wy`*@ALee$)^RT z(Z3U6Z2a(fRbi`7-{+AO%n#Bv(8q(rg+%8xd=>QCjfB{{Tl=sYP(j@x6 zF1?@1@p&ixRM_lspd0PUgBVh9imv>mue~Y@xYkYU@kFFEqLmW7DsFu<;Qk5IG#=ig zuf6lwT2Pi>!xoa5w+|4_!DZx2j^7_;u4Fb^F>g znECj@{_-0S{OJq7_Q3$5MkMRS?0^ ztq$WyQ2&Pw3WACzk1r!=4Ib-n2Lh>d)*rmv+mBWwyEI9ITCMr0X8jAhVi6Uf3I zNTvOa&~o*|LD3l={B2h|2=voM_#Q&vMFF$YJ)W>IjBy!a9~(WjL*JBDVDR0PI5 z)!otgs>dxSB-8Nn{m*EO&b(a=L% zxOKx+(?ZNWxyU+x?&X%65{%y-Ot{E^9Xn-9&-MI^g$hB;~7KCiV=$ z*9P!w*@O^j_=a2O0C_70r!QwDt9d+!F>UBg&@;=XP*euyzQ60?h}QUZ4zT)CqG3-a zBeVfAsPvN(@6$x3yTDO|XFH18t_c`+1=Mc+vJ)m=TaK9Shn>D;B9e<4GPdc6ByIEl zyGt4#JQrf$UmSm-Srn@{gkWdQX-=tt){G0vJYb3<)?Q?ifCwZL6X=9YydgDfT}hd& zfJDFST9CqRH}@ls7)li}AV*eI)ZwLMONioKCn{){WL=`2+wG1-{_1wjj0k_!MCi%J zHjHa3A^kj0qI(tiBNlw70J>OJMGl%O4^MW9b`#uwFELmaJq$g&(Nsz_ihNd}F{9Uv zRxS3wX0zz*46Zov?>B)aQ7KLdV~o63b31DFQ1|)iI;CI~8sek)k(6M;2lCJ7uMj(U zva&7=_Ed?=&T_7-Yq2BW4B+#}?~jHRHL82={$Uf}F+`ZjG8p?}B$^V~S4v*ThZNV} z$ZRAOYEz2YFx1aVq&v$6RpTJ;X?h4q`!~$Lym2f|IGygmpU0N7J)S#M0WB-2L5Vg| zK}@jSWHU$)dR|wZ!oTs_9=FVFg3*ZaoinB5L9K*@F~iVFo;kDf1<^|_h{BG$8KaP@ z6;$N5ZFXgZq>1vrNueIyJM!vz2_Qc-{cQC$OK()kZ^X+FWe=%fDS9qfq3REQf#<1z zVSRXhn3mZYT~={T#DmmCk=N)@<#eflb9uPG5a*F!VL!<+QE0DqFFl8FWx-9nZP!%w z!N>vg&&0OxN<~z!LVfaWgG(CtK88#cxFi@U9;o?}7genN$_a4&u9k|a>jsVM22Was z`GjBSwd#i3_EWtk_arXFAlrGG<$#p-#PWgiSv{prJi7RK>-o`R{0UN}P<3=d0ohN1 zWAnqhvQkpXVQ5`j9Nq46;kY)~mQ4!YY$%ammJ*3eSY%T<&HKTEC3{7gF0E-9s2cVm z^*uqB%_6@~;84B(5F8VJp@g)bJLiouhOj@XM}ZQwAD~sRYAL^XJ6(m$B}?(W(8a zVT+K=wVoVQenV5edAoX_js)UOURK7#0A$*=A=9_!iH9y3b>sp#`~ zOhB|^NWqv?&8fF4zp4xb-1Mu6DXk*7OguyrYL+Nr7E!pm-nWGFq$5F5MXI5!SOjTR zpRfAyWj6571mYPJuqH(B;y)^G!R7;D)cEYFxLmE#SO?kM+ zr~2ASF->u!Z#wcUMkaWI_mn*mH6*k$nSbJ_0w230XeJr{qTV)G-{DpAfPzYM!(A!!&IFv|~jo5$L<;LeFU6 zH>=B^Gz{s=#uC_R$%l;+%>|o;|h=^NdU~BcR*h5i~rN>#M$iXyq z-;g&Q75!^KwWM+P6BJK5gry?tEv<#kTv5eV1Tu2T&VUrJPBcA?y5ee5;ol*$u!WHKiEe`F6iZ&*_6<-(bI9(y|N)0`QNGLw#<4|;<5AF z>tUXJ%(2F#x4<{#LwFx%vdFFrz!3Tb_(k+?FU{n{ykxvkN=`{|W0XN4tmNWmx|8|r*&+G6Ypw?C&jTM-+kZtI9JwuAYDL~?-D;uS$yOIU($b5P#hfa~vwxF7UcBsZNj7d@ z%=o@MI5Mf*-)eVLg&v+LJ4xH<>5aa&!fwTNN5+wbYSUEQ$VI1QSmD^%GlBC2NY$Oz z%vZ010>vSE#FG-GO9s*Cr7%BE^2?`GtPdazrDG#8Y~mV^~fEf$@0d8Rk71s+L|&5g8RW4uaTI7tG9{(JD~lvArkX);xo*VWncGqo!@TV^dTMkU3UK(u z@g!(%hi!>;b@T_+rFFuHJHo^2n#YJ4s%XJ4wjiK|Dw`MU(IYKYm<^6Jk zv?~837)-Sj8ATwHHg8rTgCR~Mb#XI9sdxcpM#!HolX|1`qNPZE=k)eYK~w+7PKOs( zo1%Xg?f5XIa+EvG|1i$Slc^{wy&PQtlRC*w^&-miD_w8!HA{=hFi|aYRQ9R!^3s>H zsEj{A1>oW`juGEhZls`;2uN%n*`?H%k2OpsYFjw8FC+`-B@8R;rSs`byoiY;^;?+7 zmwdiBRw;KfE;99KCuMNC{KLR^r_bGb-6-Gr>4Y@ZCCXptpBk!CTP$nS8~^Q&t2k9X2|PYIKgpx^GYQsCWAj+IOagmidbjs8?X|C{ytxO8jT;DnPtAOAGby z4s_8iC&sfs*@zwPs&ILocyv#*=w5nd@2*Rs-BwlXamO8mx{y=RAsR@urNu!A7iYQF z9Ya=#6ruN{yOc7~)LiwT3ucB@O4HVSsM0Q8s9k)1u!UIo#wY_}6A3@jZ#PstJx<&B z2ITc^*|O?iuka22raSI*>k0LoN56=@vn~79m#!N&WX|esuN`|fi?JR*GZ_a$ul|O| zkxMlF;m3+7+!Dq3xha0rnmm?MVQDCGv`L_kP{%euXM82`$&lZ`N(D*X_;D$B! zZVu&B!DC3{^xNwA-RQfhj*R?`j$!h&obW3D+4q!@guCgCG+;*?D zOxbkTr9tR7{O^hT-IrmfnI$6(6%z%EdIb=ZkZu#UPT)P;U+VEuX&i^0QR$6O1^u43 zC;7c1b>v9B1&xW{*`NDU@T4qXKx+yM+p}2qQ_qZ6qX&^}{%2;L2l@pAn)0}As9OF8 z{D(5KMD5|SW;}Lgd=a1YgRsAjD&Tfq|6tJxad#;xd-IX5J5xd#uQS2*FNqv?o@jF4 zK8<0Z(E%&?S2p5y!o>o5eEp0NwFyz<%WA|2$h#k#_C2||LF-*^oIIIpz~`@z#B^M) zu|-ZdgZ{jhoo7Q{J@23Bh)w@QDch3IKHOP;hVKmHQa{TajCh|?Y3jsuieNo6Z#<}5 zdYo3!xwPJYY-ub07M!7*hH;3+1Z+QcxXoG46e!tpkQ(u6&IjEBT)p5!E}p z==*!qvNVX2zq?@^ged7+_pHYM;qqS#YBnosl@t-pfqa1!kW36g^;I_6E$FiqG-)CWHU%q2B+DVfr?#P)@`nQZTWKDhrS&67@=O-ymCoY%&S(dg;|r>(IryJp?XQJ=rr zO~jyn7ETBv;=rq{vT<-VGx|KUp^45$ovt)-WTU}8O191D>WQsv#Nzu}w`mX%f{%1Q zO|d(v03S{069wn@*4gco%`GZG$?ac>J99Em3zYzb>(%gSts9Qo^XiSqc z_S?%`BW9FYLu6zOwvTx|+S%Nul`ttVA*dT7jzE4eJH@jO2Y+P3o%CQ)6!FAh3Qjpv zQGt|W_jsF{xC(W((_G;1?q%9MFoXUN6~kgA_0#9)+hVy}rsKTcVTndG3LC@hwzbmZvyAC$)i z)XGHzTLuF4vtgezCkMx>QZp5LK{FIH($6k@!D<=4pE=Xk|2($n>`=XU3-oG6d;Y$o zVEu84{%0f)A36Vl^BD)iPUk!kV+563(o@~HZ5NOmj%L9pOA<2V)!1rNLeBghK4IF` z1a*?0OUx`Nid9$G;@=XmNN29)bUeWG%#}Knf~I1jWjcTD;!K5C`#DQBVWW@0yl*+u z1+4H-ypHk-Q$X4s<||~8RMIUnEi(<9S*-{s=T-*x4`^D7N_j%LXwlwF#G{ZRFP(*k zn5!#wjljc;zjo7}49Lo$iV1GPUiZ$fWJ)LJo~5zD2Q&^)*_<+MLQb-ZI5d6xbij= z<=>flNZxU>bd2idtSb>@%u+s=Zh|wY+S(InBB5V8TLPfVP67^vi^x;Nus3wqo`knh zoRoQ*(YP?}SM_yYy-|TH}&OJs2DLuLF;hJR=-Fyqv8v4a-l+L93Es3bosVlbHu=)X;aJhUpz&Im6%C>35{6<1tYgjc*fqU=N4fM-l zHv^IKhLh8NKThfQAQls(n@i>;qvs>b2@A<0D3+0B+!V=cebM(u%su$~ejHM(??9oI z#!(Y29`e6ydLDLxew$G^FgHps@oe!Ro{mMHcsuq(ecS|fzWaE5x5(GTwBxb3RYyff z|D0FW%?6daVYO400LleOZG&b%ytT;~x2+9h7Ay}cnnaEx?-$M{{{^vYs4=UBGndpJ z!Y1u}T>exlVAd!yw#Q(e*ZkF-ZE8bo5<&#E(K~QlZgn7xaD*ndA6f{-)ObSIY@;99 zZpFH^ankF%%|`sxh2e7wz(VsTmsaQ&30K&x0ECYtD3r;|ZYzB#!Rh2At_~XwPT@$N z@IexBvN0?`jEs5U%K@Q1@Zy>7e=>}UT_DBJEvS%APzHYM1hRJ~Cgr|z3t>k$m0?`S z5+uZCRSHsW`j{7I{JOnV?&sY!1*2YRg0Zx-86BC$ba@tG46RO+x2$tEFPk35F6{^g z1%_X?H9cz9+9);NQXZZZKOr2!_g{XtVT>BPdc@($8)Q|K{jx72S3@9-ULe7@mZdu6 z=^`DTLkPimXR1pYxo{JN<%oEv?R@_5Unpv04n8}Vz(~QZ*e}Dqj5X6~((8S4|pGO0Q)3jp9E2TBU?`cFiQ= zrGDza&Za*t3E>VnXs@kYqP-YP#-h`^KqI3m*-HKn4a!PO`#Sh7M6J3X8jUZJarutK zx+ARt&seFMk|{E{tKi3%7KwGaqxxuNXO3=tSUWS=`5vn*HN5skHXfGSBxjWfw(*;Y z;1D?AgD!<ZMS=^W_(~U8lD|3KFIgAg_KVI8?p;rVm|nPdUY&aHJ?~SKKU>=ohW~hst1R zh^FUKK=(%$Tk#IUBI+B1y2`xNOe}CABVaFd> zDxN&s%U2^JS)u3i@QXJnly-v33CBQAY2eOEQq(LA7V`Io({Kti{gqR4HXZ&*ql$~Y zee7=_I}uePL4qRrO<;m6KD?ng(DDq^sIbAD59hWMn);vhCayVUF^R@E{iC>WvDq zNAU?fn{!^OAt9x%`lL$UKPJhNr+kokTls~7Ns9~(LNdQxgjl$~$c!_?Ph|`Gx5#Upc9Ly?+j-YZ0xWsh7P?3{!um^$; z?Gp2Ead1Bop2{UI;gKnTEg7#cx#${%zn2_l>7>(mj1Rn@dAHWnqO5DJQ4y6`xEhf1 zAOtqA1l_rInyY)-h6bO%wsQmFQ-0mxae@rrBk_G1-|lHHM=O)MBi*bj{3vMSWSi40 zP9#E(^76(|QYahddzP6knjS0mLG4=Ug_cT{T~G$$(`}>UD>->?fmmG{!tPoyu@P(P4Y6+Agp$>gjQ7EUkR~U_O`#v?hw(bpUDprmhD{JgiB8F2&}uTe4(fO z#H6fP*}*DHP0YabUw&b`y(fdItKeRBra`PTq2Co1#dL(!Cn^P5+2E)umVf@zW;d!G43!S2v_79JCg4|aMIw0h~{llO~y zJwpJ?`td=XtZBha(*odCZD*K6mi_@Zs0(y!z>V_bTJ*fGYrQz01yIqIj%kSXsv)taa74 zj}-zYo%gWzajt`beno`ka zAnr_-hW@Y@a#ksgk98{xwh6@K#iLSgVZ)o%F(;or8;B&)Vdj3I+}YV;Iy<{fNZiH5 zhQ2CpIH+~U*s1+8#;no%02G%r@1%T96+@Nmq#Pd`_NUnkDOvLW9xBU!&Q|OrbZJM} z>w|vJwGh$v9E-vxoEFaLk6pCZ|VZ%|cX z+|HUU!YWR_wyn;&9<9EPR*0sbcrtXJ)=gx_a%vLs|RO9Uw zoXv($x~ylc$7PG))UcX6-9XHq`(QYt_0h3}g~MD{#%Nj~G>g zAF1;H+`?N?2@}KwCHk|HiJ3Ass%HFc$iRf-G{azy^CbDW?IaBDo7>Q7(1)BTLJr#y ziQC~vc0MVmWs9ojFz?Rw{`McG+!rl_T40 zd!Y#!EYX`?A@@yO_Bac(KGRv-kA{Z;Bh#K2c(;R+&uK6owcR!+~;6I9udNltoYZe=)Y*<_ZZO|ka^xA>J_mhs! z@2dA+krE?b|Hkv7@D;V~!bGQ!r}9`HP;)Zbm1`TdNQj25R=3(`6!TGhW|Cw&8W~*& zi^2Xfl$K)n{F{eR11mpk8`}~@ht>RRI#D}2wpao$x)iZS3^Fmp{{=aBHK2$;O#o39 zz=_9wsz%1i8qJHgc&H}8K=AF`6)vk3H{C8Q+!O!v_sxbR!g3~~Hp<7|rmVh;9)%>G z)kOWW5CQrKdJLo*b*mQd0B}$X-tHri4sjT&sEtE^7*S>@f9DmJVkiTXs6#P2O{7U6 z88egWTAHjf8(%h6JF8S#-P|MBl9Knz_i~m3 zMO>%;w#iXFd9Nt_;wLpN{L$h*So%)ad`<)&seNk`oH_^vkiKJJB;Xg4@pV-vc}+mp1l45+r{jt*2y7+vA^Q zg|pALV*E1+Vy3HS?az#$R$eFfp7#~07GtriGbbut$&l rCyrlXHLiEx#Cgd7*zT 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 CD7*Fm literal 0 HcmV?d00001 diff --git a/res/images/2.0x/coming-soon-graphic.png b/res/images/2.0x/coming-soon-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..df5daa6c4b4f24d58e5ea6f31586162a0a5f2ab0 GIT binary patch literal 44025 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%0Dp|8>J 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 literal 0 HcmV?d00001 diff --git a/res/images/2.0x/microsoft-round-icon.png b/res/images/2.0x/microsoft-round-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0a510f999cae4b0a878bd7174c765a3ac7612d65 GIT binary patch literal 832 zcmV-G1Hb%2AYf8cxpsVHc&&>+!Z8lXX0 zBpQm~wIv$?Va>hH*zs%j;UxAPX*9b#cW2MuJGw6mBcM{LI5ZV3%Ua=?hOGv}r{VEv zHk)r~cJujs83|#<6(lmY5aJPiY=dqkl7UHX;gF;k=Y?3rs@3WyZTuKVS{W4{X}Ofk z<+h>(Ly3`=BuzWC*-e}*Sc9u!+7r5kTCKKDgg%@CDTd^|>BrY}0+x0_~b_q!C zpH315vRJWw(=w$pA!|$O-uiP;$Ir%B-7=<98Q8yP5bXcZ%A~GbgLO885U@!X$fSN+ zJ#Y}AEhhEq%Tw+8((GN_eiz{H``22T%)@6$FWx{1_!zMxFSblc+S-I6ATH}X3o;`I zVF_~}IZ0rRIWP|eQ;9i(Y&s9a!10+iCSe|Ib{DZc{mk@5ERsvm;ZpWG(o4;-Euwtb z0I^s&A2e`B=*0so1^4m_K2NP`W$x!wm_t19mpDg{*4n>1to>c>GM|Z0m1VsB9%yBj zuL{hai0!o}k$D5r%;{ePfNeFb^&hOI-7f0j{7F!^L5NY6?6qkXzXW*>oF* zKo!QFM3Gb5J%qUpb{CC3{f^TY;Qg9K{Xj1=pS6%V6Y4HH^=3zk)7nYrWvneCRpjd) z`o8aTg;c;~;Muml(7x%Zl8Es=Ovd4IuHO^OdWf-YN#F^_4EpAS{yxS)?}7wMEQs-v z+Ub8jw5g)VowiwhMXEGxF|rL6Rd0?06`$9_+EB4_5amj^tdck$SW7S3E+Gs_TAh+6 zNBKI5WbjmUdCpaKoEKsf>xQaD9n~C`YIHY;d6ZRixUAxFBK!wgx(=Phv<8p>0000< KMNUMnLSTaRA9At) literal 0 HcmV?d00001 diff --git a/res/images/3.0x/microsoft-round-logo.png b/res/images/3.0x/microsoft-round-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0dd43a56a7ad2aaa837c70794829375a7749e4a GIT binary patch literal 992 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

C0 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 literal 0 HcmV?d00001 diff --git a/res/images/coming-soon-graphic.png b/res/images/coming-soon-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..8ceff44d5e6727a85e6284178db75f69b9ee5786 GIT binary patch literal 17617 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 Date: Fri, 8 Oct 2021 02:11:13 -0300 Subject: [PATCH 31/33] release flutter version --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ae091c54..1a0e2b77 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: - name: Install Flutter uses: subosito/flutter-action@v1 with: - flutter-version: '2.2.3' + flutter-version: '2.5.0' - name: Android Config env: From 8e548d870c1dbeaad11985b7111dbd908eea406b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Fri, 8 Oct 2021 02:17:04 -0400 Subject: [PATCH 32/33] podfile --- ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile.lock | 226 ----------------------------- 2 files changed, 1 insertion(+), 227 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9367d483..8d4492f9 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 9.0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index e404c3cd..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,226 +0,0 @@ -PODS: - - Amplitude (7.2.0) - - amplitude_flutter (0.0.1): - - Amplitude (= 7.2.0) - - Flutter - - AppAuth (1.3.1): - - AppAuth/Core (= 1.3.1) - - AppAuth/ExternalUserAgent (= 1.3.1) - - AppAuth/Core (1.3.1) - - AppAuth/ExternalUserAgent (1.3.1) - - barcode_scan2 (0.0.1): - - Flutter - - MTBBarcodeScanner - - SwiftProtobuf - - Firebase/CoreOnly (8.5.0): - - FirebaseCore (= 8.5.0) - - Firebase/DynamicLinks (8.5.0): - - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 8.5.0) - - firebase_core (1.5.0): - - Firebase/CoreOnly (= 8.5.0) - - Flutter - - firebase_dynamic_links (2.0.8): - - Firebase/DynamicLinks (= 8.5.0) - - firebase_core - - Flutter - - FirebaseCore (8.5.0): - - FirebaseCoreDiagnostics (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - FirebaseCoreDiagnostics (8.7.0): - - GoogleDataTransport (~> 9.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - nanopb (~> 2.30908.0) - - FirebaseDynamicLinks (8.5.0): - - FirebaseCore (~> 8.0) - - Flutter (1.0.0) - - flutter_appauth (0.0.1): - - AppAuth (= 1.3.1) - - Flutter - - flutter_secure_storage (3.3.1): - - Flutter - - FMDB/SQLCipher (2.7.5): - - SQLCipher - - google_sign_in (0.0.1): - - Flutter - - GoogleSignIn (~> 5.0) - - GoogleDataTransport (9.1.0): - - GoogleUtilities/Environment (~> 7.2) - - nanopb (~> 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleSignIn (5.0.2): - - AppAuth (~> 1.2) - - GTMAppAuth (~> 1.0) - - GTMSessionFetcher/Core (~> 1.1) - - GoogleUtilities/Environment (7.5.2): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.5.2): - - GoogleUtilities/Environment - - GTMAppAuth (1.0.0): - - AppAuth/Core (~> 1.0) - - GTMSessionFetcher (~> 1.1) - - GTMSessionFetcher (1.7.0): - - GTMSessionFetcher/Full (= 1.7.0) - - GTMSessionFetcher/Core (1.7.0) - - GTMSessionFetcher/Full (1.7.0): - - GTMSessionFetcher/Core (= 1.7.0) - - MTBBarcodeScanner (5.0.11) - - nanopb (2.30908.0): - - nanopb/decode (= 2.30908.0) - - nanopb/encode (= 2.30908.0) - - nanopb/decode (2.30908.0) - - nanopb/encode (2.30908.0) - - package_info (0.0.1): - - Flutter - - package_info_plus (0.4.5): - - Flutter - - path_provider (0.0.1): - - Flutter - - "permission_handler (5.1.0+2)": - - Flutter - - PromisesObjC (2.0.0) - - Sentry (7.1.4): - - Sentry/Core (= 7.1.4) - - Sentry/Core (7.1.4) - - sentry_flutter (0.0.1): - - Flutter - - FlutterMacOS - - Sentry (~> 7.1.3) - - share_plus (0.0.1): - - Flutter - - sqflite (0.0.2): - - Flutter - - FMDB/SQLCipher (>= 2.7.5) - - SQLCipher (~> 4.4.0) - - sqflite_sqlcipher (0.0.1): - - Flutter - - FMDB/SQLCipher (~> 2.7.5) - - SQLCipher (= 4.4.2) - - SQLCipher (4.4.2): - - SQLCipher/standard (= 4.4.2) - - SQLCipher/common (4.4.2) - - SQLCipher/standard (4.4.2): - - SQLCipher/common - - SwiftProtobuf (1.17.0) - - url_launcher (0.0.1): - - Flutter - -DEPENDENCIES: - - amplitude_flutter (from `.symlinks/plugins/amplitude_flutter/ios`) - - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) - - Flutter (from `Flutter`) - - flutter_appauth (from `.symlinks/plugins/flutter_appauth/ios`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - permission_handler (from `.symlinks/plugins/permission_handler/ios`) - - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - sqflite (from `.symlinks/plugins/sqflite/ios`) - - sqflite_sqlcipher (from `.symlinks/plugins/sqflite_sqlcipher/ios`) - - SQLCipher (~> 4.4.2) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - -SPEC REPOS: - trunk: - - Amplitude - - AppAuth - - Firebase - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseDynamicLinks - - FMDB - - GoogleDataTransport - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - - MTBBarcodeScanner - - nanopb - - PromisesObjC - - Sentry - - SQLCipher - - SwiftProtobuf - -EXTERNAL SOURCES: - amplitude_flutter: - :path: ".symlinks/plugins/amplitude_flutter/ios" - barcode_scan2: - :path: ".symlinks/plugins/barcode_scan2/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_dynamic_links: - :path: ".symlinks/plugins/firebase_dynamic_links/ios" - Flutter: - :path: Flutter - flutter_appauth: - :path: ".symlinks/plugins/flutter_appauth/ios" - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - google_sign_in: - :path: ".symlinks/plugins/google_sign_in/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - permission_handler: - :path: ".symlinks/plugins/permission_handler/ios" - sentry_flutter: - :path: ".symlinks/plugins/sentry_flutter/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - sqflite: - :path: ".symlinks/plugins/sqflite/ios" - sqflite_sqlcipher: - :path: ".symlinks/plugins/sqflite_sqlcipher/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - -SPEC CHECKSUMS: - Amplitude: c948c6f99c7f798c196523b2a5584367401d910f - amplitude_flutter: 5c934cf8331619b62bbd5a69f3cfea9090b3ca94 - AppAuth: 8803ba1aec6d00d9afd30093f82e600307eaa6ea - barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 - Firebase: ff8c73105b90e33e1dc6c8e5445d7adc2ccdc7c1 - firebase_core: 82d486a6231b636aea229bd471bceca82cbe00a6 - firebase_dynamic_links: 0768a32e69be5b6f9af258f8e072537dff6b8969 - FirebaseCore: 1c1ca72483b59b17050f5b4cec4fb748425a3901 - FirebaseCoreDiagnostics: b63732f581a1c6a453ec7241f9ab60b3a5bd3450 - FirebaseDynamicLinks: 6e406b3bb669f8c8a63e7254bb63251fa3f88a43 - Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c - flutter_appauth: a6bf9fa3192a14a981475c4cbe3bcebd3b563144 - flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - google_sign_in: de494e5e993986afae63e22a32441e30c35c9823 - GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 - GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 - GoogleUtilities: 8de2a97a17e15b6b98e38e8770e2d129a57c0040 - GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e - GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91 - MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb - nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 - PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 - Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf - sentry_flutter: f20d4f199442900fbdab2b8496f1d2091d8b94d9 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - sqflite: c0667567fd3e682beb9509976c08bc2325429aab - sqflite_sqlcipher: 70eb7fd8d4f0b0352d0bde5cf345b810737f54bb - SQLCipher: 1ab0b9486a77d141e72e92ff30681926ed79c07a - SwiftProtobuf: 9c85136c6ba74b0a1b84279dbf0f6db8efb714e0 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - -PODFILE CHECKSUM: 251120a7d028de06355c1f58e709b65e515468e6 - -COCOAPODS: 1.10.1 From 4c9a48cefdad9e6d7c44ff853be1e9876330de9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gon=C3=A7alves?= Date: Fri, 8 Oct 2021 11:23:06 -0400 Subject: [PATCH 33/33] fix null account in card --- .../slices/decision_card_spam/decision_card_spam_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart index 7f046fba..3c6d46d3 100644 --- a/lib/src/slices/decision_card_spam/decision_card_spam_service.dart +++ b/lib/src/slices/decision_card_spam/decision_card_spam_service.dart @@ -52,7 +52,7 @@ class DecisionCardSpamService extends ChangeNotifier { Future?> getCards() async { List senders = await _apiEmailSenderService.getUnsubscribed(); - ApiOAuthModelAccount? account = await _apiAuthService.getAccount(); + _account = await _apiAuthService.getAccount(); List senderIds = List.empty(growable: true); for (ApiEmailSenderModel sender in senders) { if (sender.senderId != null) senderIds.add(sender.senderId!);