From c91a5950f6647f4591bf1b8acfd7b5c32e098358 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sun, 27 Dec 2020 10:20:09 +0100 Subject: [PATCH] Android Store External: Let the user to pick a directory --- lib/screens/settings_screen.dart | 90 ++++++++++++++++---------------- lib/ssh/keygen.dart | 4 +- lib/widgets/note_viewer.dart | 2 +- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index f636252f..e9e98446 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -6,12 +6,13 @@ import 'package:dynamic_theme/dynamic_theme.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:email_validator/email_validator.dart'; import 'package:ext_storage/ext_storage.dart'; +import 'package:file_picker/file_picker.dart'; import 'package:icloud_documents_path/icloud_documents_path.dart'; import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:gitjournal/app_settings.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; @@ -294,69 +295,40 @@ class SettingsListState extends State { title: Text(tr('settings.storage.external')), value: !settings.storeInternally, onChanged: (bool newVal) async { - if (newVal == false) { + Future moveBackToInternal(bool showError) async { settings.storeInternally = true; settings.storageLocation = ""; settings.save(); setState(() {}); await repo.moveRepoToPath(); + + showSnackbar(context, "Unable to get External Storage Directory"); + } + + if (newVal == false) { + await moveBackToInternal(false); } else { - var req = await Permission.storage.request(); - if (req.isDenied) { - settings.storeInternally = false; - settings.storageLocation = ""; - - settings.save(); - setState(() {}); - await repo.moveRepoToPath(); - return; - } - settings.storeInternally = true; - - var path = await ExtStorage.getExternalStorageDirectory(); - Log.i("Got ExternalStorageDirectory: $path"); - - var extDir = await getExternalStorageDirectory(); - Log.i("Ext Dir: $extDir"); - - if (await _isDirWritable(path) == false) { - path = extDir.path; - } - - if (path == null || path.isEmpty) { - settings.storeInternally = true; - settings.storageLocation = ""; - - settings.save(); - setState(() {}); - await repo.moveRepoToPath(); - - showSnackbar( - context, "Unable to get External Storage Directory"); + var path = await _getExternalDir(); + if (path.isEmpty) { + await moveBackToInternal(true); return; } - settings.storageLocation = p.join(path, "GitJournal"); + Log.i("Moving repo to $path"); + settings.storeInternally = false; + settings.storageLocation = p.join(path, "GitJournal"); settings.save(); setState(() {}); + try { await repo.moveRepoToPath(); } catch (ex, st) { Log.e("Moving Repo to External Storage", ex: ex, stacktrace: st); - - settings.storeInternally = true; - settings.storageLocation = ""; - - settings.save(); - setState(() {}); - await repo.moveRepoToPath(); - - showSnackbar( - context, "Unable to save in External Storage Directory"); + await moveBackToInternal(true); return; } return; @@ -537,3 +509,31 @@ Future _isDirWritable(String path) async { return true; } + +Future _getExternalDir() async { + var dir = await FilePicker.platform.getDirectoryPath(); + if (dir != null && dir.isNotEmpty) { + if (await _isDirWritable(dir)) { + return dir; + } + } + + var req = await Permission.storage.request(); + if (req.isDenied) { + return ""; + } + + var path = await ExtStorage.getExternalStorageDirectory(); + if (await _isDirWritable(path)) { + return path; + } + + var extDir = await getExternalStorageDirectory(); + path = extDir.path; + + if (await _isDirWritable(path)) { + return path; + } + + return ""; +} diff --git a/lib/ssh/keygen.dart b/lib/ssh/keygen.dart index a18a504e..9a002e40 100644 --- a/lib/ssh/keygen.dart +++ b/lib/ssh/keygen.dart @@ -1,11 +1,11 @@ import 'dart:io'; +import 'package:git_bindings/git_bindings.dart' as gb; import 'package:meta/meta.dart'; +import 'package:path/path.dart' as p; import 'package:gitjournal/ssh/rsa_key_pair.dart'; import 'package:gitjournal/utils/logger.dart'; -import 'package:git_bindings/git_bindings.dart' as gb; -import 'package:path/path.dart' as p; class SshKey { final String publicKey; diff --git a/lib/widgets/note_viewer.dart b/lib/widgets/note_viewer.dart index e3073645..243f10bd 100644 --- a/lib/widgets/note_viewer.dart +++ b/lib/widgets/note_viewer.dart @@ -2,7 +2,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:gitjournal/widgets/markdown_renderer.dart'; import 'package:markdown/markdown.dart' as md; import 'package:provider/provider.dart'; @@ -12,6 +11,7 @@ import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/folder_views/common.dart'; import 'package:gitjournal/widgets/editor_scroll_view.dart'; +import 'package:gitjournal/widgets/markdown_renderer.dart'; import 'package:gitjournal/widgets/notes_backlinks.dart'; class NoteViewer extends StatelessWidget {