Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
ichorid committed Jun 3, 2023
2 parents 929a661 + 1dd4b2f commit 8e370a6
Show file tree
Hide file tree
Showing 246 changed files with 8,022 additions and 7,796 deletions.
2 changes: 0 additions & 2 deletions android/app/src/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
2 changes: 0 additions & 2 deletions android/app/src/profile/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
6 changes: 3 additions & 3 deletions android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
buildscript {
ext.kotlin_version = '1.6.10'
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}

dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath 'com.android.tools.build:gradle:7.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Expand All @@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
2 changes: 1 addition & 1 deletion android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
Binary file added assets/images/frame.svg.vec
Binary file not shown.
Binary file added assets/images/logo.svg.vec
Binary file not shown.
2 changes: 1 addition & 1 deletion ios/Flutter/AppFrameworkInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
<string>13.0</string>
</dict>
</plist>
44 changes: 44 additions & 0 deletions ios/Podfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Uncomment this line to define a global platform for your project
platform :ios, '11.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}

def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end

File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
use_frameworks!
use_modular_headers!

flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
# target 'RunnerTests' do
# inherit! :search_paths
# end
end

post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
4 changes: 1 addition & 3 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@
<string>To increase security and facilitate off-the-grid workflows Keyper establishes direct connections with other Keyper instances in the same local network.</string>
<key>NSBonjourServices</key>
<array>
<string>_dartshare._udp</string>
<string>_guardianKeyper._udp</string>
</array>
<!-- <key>NSPhotoLibraryUsageDescription</key>
<string>This app stores and loads QR codes</string> -->
<key>NSCameraUsageDescription</key>
<string>Keyper uses QR codes to link guardian devices to the main device</string>
<key>NSLocationWhenInUseUsageDescription</key>
Expand Down
79 changes: 79 additions & 0 deletions lib/app/app.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:get_it/get_it.dart';

import 'package:guardian_keyper/ui/theme/theme.dart';
import 'package:guardian_keyper/ui/screens/splash_screen.dart';
import 'package:guardian_keyper/feature/home/ui/home_screen.dart';

import 'package:guardian_keyper/data/network_manager.dart';
import 'package:guardian_keyper/feature/vault/domain/use_case/vault_interactor.dart';
import 'package:guardian_keyper/feature/message/domain/use_case/message_interactor.dart';

import 'di.dart';
import 'theme.dart';
import 'routes.dart';

class App extends StatefulWidget {
static Future<void> init() async {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setSystemUIOverlayStyle(systemStyleDark);
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
}

const App({
super.key,
this.di = const DI(),
});

final DI di;

@override
State<App> createState() => _AppState();
}

class _AppState extends State<App> with WidgetsBindingObserver {
late final _networkManager = GetIt.I<NetworkManager>();
late final _vaultInteractor = GetIt.I<VaultInteractor>();
late final _messagesInteractor = GetIt.I<MessageInteractor>();

@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
widget.di.init().then((_) => setState(() {}));
}

@override
void didChangeAppLifecycleState(state) {
super.didChangeAppLifecycleState(state);
if (kDebugMode) print(state);
if (widget.di.isNotInited) return;

switch (state) {
case AppLifecycleState.resumed:
_networkManager.start();
break;
case AppLifecycleState.paused:
_messagesInteractor.flush();
_vaultInteractor.flush();
_networkManager.stop();
break;
default:
}
}

@override
Widget build(BuildContext context) => MaterialApp(
title: 'Guardian Keyper',
color: clIndigo900,
theme: themeLight,
darkTheme: themeDark,
themeMode: ThemeMode.dark,
onGenerateRoute: onGenerateRoute,
navigatorObservers: [SentryNavigatorObserver()],
home: widget.di.isInited ? const HomeScreen() : const SplashScreen(),
);
}
66 changes: 66 additions & 0 deletions lib/app/di.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import 'dart:typed_data';
import 'package:get_it/get_it.dart';
import 'package:hive_flutter/hive_flutter.dart';

import 'package:guardian_keyper/feature/auth/domain/auth_interactor.dart';

import 'package:guardian_keyper/feature/vault/data/vault_repository.dart';
import 'package:guardian_keyper/feature/vault/domain/use_case/vault_interactor.dart';

import 'package:guardian_keyper/feature/message/data/message_repository.dart';
import 'package:guardian_keyper/feature/message/domain/use_case/message_interactor.dart';

import 'package:guardian_keyper/feature/settings/data/settings_manager.dart';
import 'package:guardian_keyper/feature/settings/domain/settings_interactor.dart';

import '../data/network_manager.dart';
import '../data/services/platform_service.dart';
import '../data/services/analytics_service.dart';
import '../data/services/preferences_service.dart';

class DI {
static bool _isInited = false;

const DI();

bool get isInited => _isInited;

bool get isNotInited => !_isInited;

Future<void> init() async {
if (_isInited) return;

// Services
GetIt.I.registerSingleton<PlatformService>(PlatformService());
final preferencesService = await PreferencesService.init();
GetIt.I.registerSingleton<PreferencesService>(preferencesService);
GetIt.I.registerSingleton<AnalyticsService>(await AnalyticsService.init());

// Managers
GetIt.I.registerSingleton<NetworkManager>(
await NetworkManager().init(),
);
GetIt.I.registerSingleton<SettingsManager>(
await SettingsManager().init(),
);

// Repositories
await Hive.initFlutter('data_v1');
final seed = await preferencesService.get<Uint8List>(keySeed);
final cipher = HiveAesCipher(seed!);
GetIt.I.registerSingleton<MessageRepository>(
await getMessageRepository(cipher),
);
GetIt.I.registerSingleton<VaultRepository>(
await getVaultRepository(cipher),
);

// Interactors
GetIt.I.registerSingleton<SettingsInteractor>(SettingsInteractor());
GetIt.I.registerSingleton<MessageInteractor>(MessageInteractor());
GetIt.I.registerSingleton<VaultInteractor>(VaultInteractor());
GetIt.I.registerSingleton<AuthInteractor>(AuthInteractor());

_isInited = true;
}
}
38 changes: 38 additions & 0 deletions lib/app/routes.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';

import 'package:guardian_keyper/consts.dart';
import 'package:guardian_keyper/ui/screens/qr_code_show_screen.dart';
import 'package:guardian_keyper/ui/screens/qr_code_scan_screen.dart';
import 'package:guardian_keyper/feature/intro/ui/intro_screen.dart';
import 'package:guardian_keyper/feature/settings/ui/settings_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_vault_show/vault_show_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_shard_show/shard_show_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_vault_create/vault_create_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_secret_add/vault_secret_add_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_vault_restore/vault_restore_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_guardian_add/vault_guardian_add_screen.dart';
import 'package:guardian_keyper/feature/vault/ui/_secret_recovery/vault_secret_recovery_screen.dart';

Route? onGenerateRoute(RouteSettings settings) => MaterialPageRoute(
settings: settings,
fullscreenDialog: true,
builder: (_) => switch (settings.name) {
routeIntro => const IntroScreen(),
routeSettings => const SettingsScreen(),
// QRCode
routeQrCodeShow => const QRCodeShowScreen(),
routeQrCodeScan => const QRCodeScanScreen(),
// Shard
routeShardShow => const ShardShowScreen(),
// Vault
routeVaultShow => const VaultShowScreen(),
routeVaultCreate => const VaultCreateScreen(),
routeVaultRestore => const VaultRestoreScreen(),
routeVaultGuardianAdd => const VaultGuardianAddScreen(),
// Secret
routeVaultSecretAdd => const VaultSecretAddScreen(),
routeVaultSecretRecovery => const VaultSecretRecoveryScreen(),
// null
_ => throw Exception('Route not found!'),
},
);
Loading

0 comments on commit 8e370a6

Please sign in to comment.