1+ import 'dart:io' ;
2+
3+ import 'package:device_info_plus/device_info_plus.dart' ;
4+ import 'package:file_picker/file_picker.dart' ;
5+ import 'package:flutter/foundation.dart' ;
16import 'package:flutter/material.dart' ;
27import 'package:flutter_bloc/flutter_bloc.dart' ;
8+ import 'package:permission_handler/permission_handler.dart' ;
9+ import 'package:text_to_image_gen/bloc/app_directory_cubit.dart' ;
310
411import '../bloc/app_mode_cubit.dart' ;
512import '../bloc/app_theme_cubit.dart' ;
@@ -17,14 +24,92 @@ class _SettingsPageState extends State<SettingsPage> {
1724 late AppModeCubit _appModeCubit;
1825 late AppThemeCubit _appThemeCubit;
1926 final List <AppTheme > _themes = appThemes.keys.toList ();
27+ late AppDirectoryCubit _appDirectoryCubit;
28+ final FilePicker filePicker = FilePicker .platform;
2029
2130 @override
2231 void initState () {
2332 super .initState ();
33+ _appDirectoryCubit = context.read <AppDirectoryCubit >()..loadPath ();
2434 _appModeCubit = context.read <AppModeCubit >()..loadMode ();
2535 _appThemeCubit = context.read <AppThemeCubit >()..loadTheme ();
2636 }
2737
38+ Future <void > _pickDirectory () async {
39+ String ? directoryPath;
40+ if (Platform .isAndroid) {
41+ AndroidDeviceInfo androidInfo = await DeviceInfoPlugin ().androidInfo;
42+ int versionNumber = int .parse (androidInfo.version.release.split ('.' )[0 ]);
43+ try {
44+ if (versionNumber < 10 ) {
45+ if (await Permission .storage.isDenied) {
46+ await Permission .storage.request ();
47+ } else if (await Permission .storage.isGranted) {
48+ directoryPath = await filePicker.getDirectoryPath ();
49+ if (directoryPath != null ) {
50+ _appDirectoryCubit.changePath (directoryPath);
51+ } else {
52+ message ();
53+ }
54+ } else {
55+ await Permission .storage.request ();
56+ }
57+ } else {
58+ if (await Permission .manageExternalStorage.isDenied) {
59+ await Permission .manageExternalStorage.request ();
60+ } else if (await Permission .manageExternalStorage.isGranted) {
61+ directoryPath = await filePicker.getDirectoryPath ();
62+ if (directoryPath != null ) {
63+ _appDirectoryCubit.changePath (directoryPath);
64+ } else {
65+ message ();
66+ }
67+ } else {
68+ await Permission .manageExternalStorage.request ();
69+ }
70+ }
71+ } catch (e) {
72+ message ();
73+ if (kDebugMode) {
74+ print ('Error picking directory in android: $e ' );
75+ }
76+ }
77+ } else {
78+ try {
79+ directoryPath = await filePicker.getDirectoryPath ();
80+ if (directoryPath != null ) {
81+ _appDirectoryCubit.changePath (directoryPath);
82+ } else {
83+ message ();
84+ }
85+ } catch (e) {
86+ message ();
87+ if (kDebugMode) {
88+ print ('Error picking directory: $e ' );
89+ }
90+ }
91+ }
92+ }
93+
94+ void message () {
95+ showDialog (
96+ context: context,
97+ builder: (BuildContext context) {
98+ return AlertDialog (
99+ title: const Text ('Error' ),
100+ content:
101+ const Text ('There is error . Try Again later or restart the app' ),
102+ actions: < Widget > [
103+ TextButton (
104+ onPressed: () => Navigator .of (context).pop (),
105+ child: const Text ('ok' ),
106+ ),
107+ ],
108+ );
109+ },
110+ );
111+ }
112+
28113 @override
29114 Widget build (BuildContext context) {
30115 return Scaffold (
@@ -37,6 +122,21 @@ class _SettingsPageState extends State<SettingsPage> {
37122 crossAxisAlignment: CrossAxisAlignment .center,
38123 mainAxisAlignment: MainAxisAlignment .center,
39124 children: [
125+ BlocBuilder <AppDirectoryCubit , AppDirectoryState >(
126+ builder: (context, state) {
127+ return Padding (
128+ padding: const EdgeInsets .all (8.0 ),
129+ child: ListTile (
130+ leading: const Icon (Icons .folder),
131+ title: const Text ('Main Directory' ),
132+ subtitle: Text (state.path),
133+ trailing: ElevatedButton (
134+ onPressed: _pickDirectory,
135+ child: const Text ('Change' ),
136+ ),
137+ ),
138+ );
139+ }),
40140 BlocBuilder <AppModeCubit , AppModeState >(
41141 builder: (context, state) {
42142 return Padding (
0 commit comments