Skip to content

Commit ac6eac3

Browse files
committed
improved user exp. and fixed some bugs
1 parent 2f9ddec commit ac6eac3

33 files changed

Lines changed: 3802 additions & 2277 deletions

android/app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ android {
1717
ndkVersion = "27.0.12077973"
1818

1919
compileOptions {
20+
coreLibraryDesugaringEnabled true
2021
sourceCompatibility = JavaVersion.VERSION_17
2122
targetCompatibility = JavaVersion.VERSION_17
2223
}
@@ -65,4 +66,5 @@ flutter {
6566
dependencies {
6667
implementation 'com.google.android.gms:play-services-nearby:19.3.0'
6768
implementation 'androidx.appcompat:appcompat:1.7.1'
69+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
6870
}

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
1919
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2020
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
21+
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
2122

2223
<application
2324
android:icon="@mipmap/launcher_icon"
3.12 KB
Loading
1.85 KB
Loading
4.54 KB
Loading
8.18 KB
Loading
12.9 KB
Loading

lib/main.dart

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
import 'dart:io';
2+
13
import 'package:airchat/services/connection_service.dart';
4+
import 'package:airchat/services/overlay_service.dart';
5+
import 'package:airchat/utility/notification_util.dart';
26
import 'package:airchat/widgets/call_overlay_widget.dart';
37
import 'package:flutter/material.dart';
48
import 'package:hive_flutter/hive_flutter.dart';
59
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
610
import 'package:media_kit/media_kit.dart';
11+
import 'package:path_provider/path_provider.dart';
712
import 'models/chat_user.dart';
813
import 'models/chat_message.dart';
914
import 'theme.dart';
@@ -14,6 +19,7 @@ import 'package:provider/provider.dart';
1419
import 'providers/connection_state_provider.dart';
1520
import 'providers/call_state_provider.dart';
1621
import 'services/global_banner_controller.dart';
22+
import 'providers/theme_provider.dart';
1723

1824
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
1925

@@ -22,6 +28,12 @@ void main() async {
2228
MediaKit.ensureInitialized();
2329
JustAudioMediaKit.ensureInitialized();
2430
await Hive.initFlutter();
31+
if (Platform.isAndroid || Platform.isIOS) {
32+
} else if (Platform.isWindows) {
33+
final localAppData = Platform.environment['LOCALAPPDATA'] ??
34+
await getApplicationDocumentsDirectory().then((value) => value.path);
35+
Hive.init('$localAppData\\AirChat');
36+
}
2537
Hive.registerAdapter(ChatUserAdapter());
2638
Hive.registerAdapter(ChatMessageAdapter());
2739
// await Hive.deleteBoxFromDisk('chat_users');
@@ -30,12 +42,15 @@ void main() async {
3042
if (settingsBox.get('userId') == null) {
3143
settingsBox.put('userId', const Uuid().v4());
3244
}
45+
await NotificationUtil.initialize();
46+
DraggableOverlayService.initialize(navigatorKey);
3347
runApp(
3448
MultiProvider(
3549
providers: [
3650
ChangeNotifierProvider(create: (_) => ConnectionStateProvider()),
3751
ChangeNotifierProvider(create: (_) => CallStateProvider()),
3852
ChangeNotifierProvider(create: (_) => GlobalBannerController()),
53+
ChangeNotifierProvider(create: (_) => ThemeProvider()),
3954
],
4055
child: const AirChatApp(),
4156
),
@@ -56,7 +71,7 @@ void main() async {
5671
callProvider.receiveIncomingCall(from, id);
5772
} else if (type == 'call_accept') {
5873
callProvider.acceptCall();
59-
} else if (type == 'call_reject' || type == 'call_end') {
74+
} else if (type == 'call_reject' || type == 'call_end') {
6075
await ConnectionService.updateCallDuration(
6176
callProvider.currentCallUserId!,
6277
callProvider.callId!,
@@ -76,30 +91,36 @@ class AirChatApp extends StatelessWidget {
7691

7792
@override
7893
Widget build(BuildContext context) {
79-
return MaterialApp(
80-
title: 'AirChat',
81-
color: Colors.white,
82-
theme: AirChatTheme.lightTheme,
83-
debugShowCheckedModeBanner: false,
84-
navigatorKey: navigatorKey,
85-
initialRoute: '/',
86-
routes: {
87-
'/': (context) => const HomeScreen(),
88-
'/home': (context) => const HomeScreen(),
89-
'/settings': (context) => const SettingsScreen(),
90-
},
91-
builder: (context, child) {
92-
return Consumer2<GlobalBannerController, CallStateProvider>(
93-
builder: (context, bannerController, callProvider, _) {
94-
return Column(
95-
mainAxisSize: MainAxisSize.max,
96-
children: [
97-
if (!callProvider.isCallingScreenOpen &&
98-
callProvider.callState != CallState.idle &&
99-
callProvider.callState != CallState.ended)
100-
CallOverlayWidget(navigatorKey: navigatorKey),
101-
Expanded(child: child ?? SizedBox.shrink()),
102-
],
94+
return Consumer<ThemeProvider>(
95+
builder: (context, themeProvider, _) {
96+
return MaterialApp(
97+
title: 'AirChat',
98+
color: Colors.white,
99+
theme: AirChatTheme.lightTheme,
100+
darkTheme: AirChatTheme.darkTheme,
101+
themeMode: themeProvider.themeMode,
102+
debugShowCheckedModeBanner: false,
103+
navigatorKey: navigatorKey,
104+
initialRoute: '/',
105+
routes: {
106+
'/': (context) => const HomeScreen(),
107+
'/home': (context) => const HomeScreen(),
108+
'/settings': (context) => const SettingsScreen(),
109+
},
110+
builder: (context, child) {
111+
return Consumer2<GlobalBannerController, CallStateProvider>(
112+
builder: (context, bannerController, callProvider, _) {
113+
return Column(
114+
mainAxisSize: MainAxisSize.max,
115+
children: [
116+
if (!callProvider.isCallingScreenOpen &&
117+
callProvider.callState != CallState.idle &&
118+
callProvider.callState != CallState.ended)
119+
CallOverlayWidget(navigatorKey: navigatorKey),
120+
Expanded(child: child ?? SizedBox.shrink()),
121+
],
122+
);
123+
},
103124
);
104125
},
105126
);

lib/providers/theme_provider.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:hive/hive.dart';
3+
4+
class ThemeProvider extends ChangeNotifier {
5+
ThemeMode _themeMode = ThemeMode.system;
6+
7+
ThemeProvider() {
8+
_loadThemeMode();
9+
}
10+
11+
ThemeMode get themeMode => _themeMode;
12+
13+
Future<void> _loadThemeMode() async {
14+
final box = await Hive.openBox('settings');
15+
final mode = box.get('themeMode');
16+
if (mode == 'light') {
17+
_themeMode = ThemeMode.light;
18+
} else if (mode == 'dark') {
19+
_themeMode = ThemeMode.dark;
20+
} else {
21+
_themeMode = ThemeMode.system;
22+
}
23+
notifyListeners();
24+
}
25+
26+
Future<void> setThemeMode(ThemeMode mode) async {
27+
_themeMode = mode;
28+
final box = await Hive.openBox('settings');
29+
if (mode == ThemeMode.light) {
30+
await box.put('themeMode', 'light');
31+
} else if (mode == ThemeMode.dark) {
32+
await box.put('themeMode', 'dark');
33+
} else {
34+
await box.put('themeMode', 'system');
35+
}
36+
notifyListeners();
37+
}
38+
}

lib/services/calling_service.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class LanCallService {
160160
_liveSource!,
161161
preload: false,
162162
);
163+
await setSpeakerMode(false);
163164
await _player.play();
164165
} catch (e) {
165166
log('Error: $e');

0 commit comments

Comments
 (0)