Skip to content

Commit 08ddc16

Browse files
committed
Merge remote-tracking branch 'origin/efael/app/lang_picker' into efael/app/element-call
2 parents b09bd9e + 6104305 commit 08ddc16

6 files changed

Lines changed: 157 additions & 29 deletions

File tree

lib/config/locale_provide.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:collection/collection.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:language_picker/languages.dart';
4+
import 'package:shared_preferences/shared_preferences.dart';
5+
6+
class LocaleProvider extends ChangeNotifier {
7+
LocaleProvider() {
8+
SharedPreferences.getInstance().then((preferences) {
9+
final locale = preferences.getString("locale") ?? "uz";
10+
_locale = Locale(locale);
11+
notifyListeners();
12+
});
13+
}
14+
15+
Locale _locale = const Locale('uz');
16+
17+
List<Language> get languages {
18+
return [Languages.uzbek, Languages.russian, Languages.english];
19+
}
20+
21+
Locale get locale => _locale;
22+
Language? get language => languages.firstWhereOrNull(
23+
(lang) => lang.isoCode == locale.languageCode,
24+
);
25+
26+
void setLanguage(Language language) {
27+
setLocale(Locale(language.isoCode));
28+
}
29+
30+
void setLocale(Locale locale) {
31+
if (_locale == locale) return;
32+
_locale = locale;
33+
notifyListeners();
34+
SharedPreferences.getInstance().then((preferences) {
35+
preferences.setString("locale", locale.languageCode);
36+
});
37+
}
38+
}

lib/pages/homeserver_picker/homeserver_picker_view.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import 'package:fluffychat/config/locale_provide.dart';
12
import 'package:flutter/material.dart';
23

34
import 'package:flutter_linkify/flutter_linkify.dart';
5+
import 'package:provider/provider.dart';
46
import 'package:url_launcher/url_launcher.dart';
57
import 'package:url_launcher/url_launcher_string.dart';
68

@@ -11,6 +13,7 @@ import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'
1113
import 'package:fluffychat/widgets/layouts/login_scaffold.dart';
1214
import 'package:fluffychat/widgets/matrix.dart';
1315
import 'homeserver_picker.dart';
16+
import 'package:language_picker/languages.dart';
1417

1518
class HomeserverPickerView extends StatelessWidget {
1619
final HomeserverPickerController controller;
@@ -23,6 +26,7 @@ class HomeserverPickerView extends StatelessWidget {
2326
@override
2427
Widget build(BuildContext context) {
2528
final theme = Theme.of(context);
29+
final localeProvider = context.read<LocaleProvider>();
2630

2731
return LoginScaffold(
2832
enforceMobileMode:
@@ -111,6 +115,59 @@ class HomeserverPickerView extends StatelessWidget {
111115
),
112116
),
113117
const Spacer(),
118+
Padding(
119+
padding: const EdgeInsets.only(
120+
top: 32.0,
121+
left: 32.0,
122+
right: 32.0,
123+
),
124+
child: Theme(
125+
data: theme.copyWith(
126+
dropdownMenuTheme: DropdownMenuThemeData(
127+
inputDecorationTheme: InputDecorationTheme(
128+
filled: true,
129+
border: OutlineInputBorder(
130+
borderRadius: BorderRadius.circular(
131+
AppConfig.borderRadius,
132+
),
133+
),
134+
hintStyle: TextStyle(
135+
color: theme.colorScheme.surfaceTint,
136+
),
137+
errorMaxLines: 4,
138+
),
139+
),
140+
),
141+
child: DropdownButtonFormField<Language>(
142+
decoration: InputDecoration(
143+
prefixIcon: const Icon(Icons.language),
144+
filled: false,
145+
border: OutlineInputBorder(
146+
borderRadius: BorderRadius.circular(
147+
AppConfig.borderRadius,
148+
),
149+
),
150+
),
151+
isExpanded: true,
152+
onChanged: (value) {
153+
if (value != null) {
154+
localeProvider.setLanguage(value);
155+
}
156+
},
157+
items: localeProvider.languages
158+
.map(
159+
(language) => DropdownMenuItem<Language>(
160+
value: language,
161+
child: Text(
162+
"${language.name} (${language.isoCode})",
163+
),
164+
),
165+
)
166+
.toList(),
167+
value: localeProvider.language,
168+
),
169+
),
170+
),
114171
Padding(
115172
padding: const EdgeInsets.all(32.0),
116173
child: Column(

lib/pages/settings/settings_view.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import 'package:flutter/material.dart';
22

33
import 'package:go_router/go_router.dart';
4+
import 'package:language_picker/language_picker_dropdown.dart';
45
import 'package:matrix/matrix.dart';
56
import 'package:url_launcher/url_launcher.dart';
67
import 'package:url_launcher/url_launcher_string.dart';
78

9+
import 'package:provider/provider.dart';
10+
import 'package:fluffychat/config/locale_provide.dart';
11+
812
import 'package:fluffychat/config/app_config.dart';
913
import 'package:fluffychat/config/themes.dart';
1014
import 'package:fluffychat/l10n/l10n.dart';
@@ -33,6 +37,8 @@ class SettingsView extends StatelessWidget {
3337
?.additionalProperties
3438
.tryGetMap<String, Object?>('org.matrix.msc2965.authentication')
3539
?.tryGet<String>('account');
40+
final localeProvider = context.read<LocaleProvider>();
41+
3642
return Row(
3743
children: [
3844
if (FluffyThemes.isColumnMode(context)) ...[
@@ -202,6 +208,15 @@ class SettingsView extends StatelessWidget {
202208
: null,
203209
onTap: () => context.go('/rooms/settings/notifications'),
204210
),
211+
ListTile(
212+
leading: const Icon(Icons.language_outlined),
213+
title: LanguagePickerDropdown(
214+
languages: localeProvider.languages,
215+
initialValue: localeProvider.language,
216+
onValuePicked: localeProvider.setLanguage,
217+
),
218+
onTap: () {},
219+
),
205220
ListTile(
206221
leading: const Icon(Icons.devices_outlined),
207222
title: Text(L10n.of(context).devices),

lib/widgets/fluffy_chat_app.dart

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import 'package:flutter/material.dart';
22

33
import 'package:go_router/go_router.dart';
44
import 'package:matrix/matrix.dart';
5+
import 'package:provider/provider.dart';
56
import 'package:shared_preferences/shared_preferences.dart';
67

78
import 'package:fluffychat/config/routes.dart';
89
import 'package:fluffychat/config/setting_keys.dart';
910
import 'package:fluffychat/config/themes.dart';
1011
import 'package:fluffychat/l10n/l10n.dart';
12+
import 'package:fluffychat/config/locale_provide.dart';
1113
import 'package:fluffychat/widgets/app_lock.dart';
1214
import 'package:fluffychat/widgets/theme_builder.dart';
1315
import '../utils/custom_scroll_behaviour.dart';
@@ -27,43 +29,42 @@ class FluffyChatApp extends StatelessWidget {
2729
this.pincode,
2830
});
2931

30-
/// getInitialLink may rereturn the value multiple times if this view is
31-
/// opened multiple times for example if the user logs out after they logged
32-
/// in with qr code or magic link.
3332
static bool gotInitialLink = false;
3433

35-
// Router must be outside of build method so that hot reload does not reset
36-
// the current path.
3734
static final GoRouter router = GoRouter(
3835
routes: AppRoutes.routes,
3936
debugLogDiagnostics: true,
4037
);
4138

4239
@override
4340
Widget build(BuildContext context) {
44-
return ThemeBuilder(
45-
builder: (context, themeMode, primaryColor) => MaterialApp.router(
46-
title: AppSettings.applicationName.value,
47-
themeMode: themeMode,
48-
theme: FluffyThemes.buildTheme(context, Brightness.light, primaryColor),
49-
darkTheme:
50-
FluffyThemes.buildTheme(context, Brightness.dark, primaryColor),
51-
scrollBehavior: CustomScrollBehavior(),
52-
localizationsDelegates: L10n.localizationsDelegates,
53-
supportedLocales: L10n.supportedLocales,
54-
routerConfig: router,
55-
builder: (context, child) => AppLockWidget(
56-
pincode: pincode,
57-
clients: clients,
58-
// Need a navigator above the Matrix widget for
59-
// displaying dialogs
60-
child: Matrix(
61-
clients: clients,
62-
store: store,
63-
child: testWidget ?? child,
64-
),
65-
),
66-
),
67-
);
41+
return ChangeNotifierProvider<LocaleProvider>(
42+
create: (_) => LocaleProvider(),
43+
child: ThemeBuilder(
44+
builder: (context, themeMode, primaryColor) {
45+
return MaterialApp.router(
46+
title: AppSettings.applicationName.value,
47+
themeMode: themeMode,
48+
theme: FluffyThemes.buildTheme(
49+
context, Brightness.light, primaryColor),
50+
darkTheme: FluffyThemes.buildTheme(
51+
context, Brightness.dark, primaryColor),
52+
scrollBehavior: CustomScrollBehavior(),
53+
locale: context.watch<LocaleProvider>().locale,
54+
localizationsDelegates: L10n.localizationsDelegates,
55+
supportedLocales: L10n.supportedLocales,
56+
routerConfig: router,
57+
builder: (context, child) => AppLockWidget(
58+
pincode: pincode,
59+
clients: clients,
60+
child: Matrix(
61+
clients: clients,
62+
store: store,
63+
child: testWidget ?? child,
64+
),
65+
),
66+
);
67+
},
68+
));
6869
}
6970
}

pubspec.lock

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,14 @@ packages:
11081108
url: "https://pub.dev"
11091109
source: hosted
11101110
version: "0.4.16"
1111+
language_picker:
1112+
dependency: "direct main"
1113+
description:
1114+
name: language_picker
1115+
sha256: cace0eab53b712e26f5d2cd834a050b6dd6ab56b2ba31b3000dbe5f89f33f5fd
1116+
url: "https://pub.dev"
1117+
source: hosted
1118+
version: "0.4.5"
11111119
latlong2:
11121120
dependency: "direct main"
11131121
description:
@@ -1556,6 +1564,14 @@ packages:
15561564
url: "https://pub.dev"
15571565
source: hosted
15581566
version: "2.3.1"
1567+
recase:
1568+
dependency: transitive
1569+
description:
1570+
name: recase
1571+
sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
1572+
url: "https://pub.dev"
1573+
source: hosted
1574+
version: "4.1.0"
15591575
receive_sharing_intent:
15601576
dependency: "direct main"
15611577
description:

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ dependencies:
5555
image_picker: ^1.2.1
5656
intl: any
5757
just_audio: ^0.10.5
58+
language_picker: ^0.4.5
5859
latlong2: ^0.9.1
5960
linkify: ^5.0.0
6061
matrix: ^4.0.0

0 commit comments

Comments
 (0)