Merge branch 'select_folders'
This commit is contained in:
commit
b1f2b2a766
|
@ -2,7 +2,6 @@ import 'dart:convert';
|
|||
import 'dart:io' as io;
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:flutter_sodium/flutter_sodium.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
@ -22,9 +21,8 @@ import 'package:photos/services/collections_service.dart';
|
|||
import 'package:photos/services/favorites_service.dart';
|
||||
import 'package:photos/services/memories_service.dart';
|
||||
import 'package:photos/services/sync_service.dart';
|
||||
import 'package:photos/services/user_service.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:photos/utils/crypto_util.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class Configuration {
|
||||
Configuration._privateConstructor();
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:implicitly_animated_reorderable_list/implicitly_animated_reorderable_list.dart';
|
||||
import 'package:implicitly_animated_reorderable_list/transitions.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/db/files_db.dart';
|
||||
|
@ -9,7 +13,14 @@ import 'package:photos/ui/loading_widget.dart';
|
|||
import 'package:photos/ui/thumbnail_widget.dart';
|
||||
|
||||
class BackupFolderSelectionPage extends StatefulWidget {
|
||||
const BackupFolderSelectionPage({Key key}) : super(key: key);
|
||||
final bool shouldSelectAll;
|
||||
final String buttonText;
|
||||
|
||||
const BackupFolderSelectionPage({
|
||||
@required this.buttonText,
|
||||
this.shouldSelectAll = false,
|
||||
Key key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_BackupFolderSelectionPageState createState() =>
|
||||
|
@ -17,20 +28,29 @@ class BackupFolderSelectionPage extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||
Set<String> _backedupFolders = Set<String>();
|
||||
bool _shouldSelectAll = true;
|
||||
final Set<String> _allFolders = Set<String>();
|
||||
Set<String> _selectedFolders = Set<String>();
|
||||
List<File> _latestFiles;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_backedupFolders = Configuration.instance.getPathsToBackUp();
|
||||
_selectedFolders = Configuration.instance.getPathsToBackUp();
|
||||
FilesDB.instance.getLatestLocalFiles().then((files) {
|
||||
setState(() {
|
||||
_latestFiles = files;
|
||||
for (final file in _latestFiles) {
|
||||
_allFolders.add(file.deviceFolder);
|
||||
}
|
||||
if (widget.shouldSelectAll) {
|
||||
_selectedFolders.addAll(_allFolders);
|
||||
}
|
||||
});
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_backedupFolders.isNotEmpty) {
|
||||
_shouldSelectAll = false;
|
||||
}
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text("select folders to backup")),
|
||||
body: Column(
|
||||
|
@ -52,9 +72,43 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
|||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.all(12),
|
||||
padding: EdgeInsets.all(6),
|
||||
),
|
||||
Expanded(child: _getFolderList()),
|
||||
_latestFiles == null
|
||||
? Container()
|
||||
: GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(6, 6, 64, 6),
|
||||
child: Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
_selectedFolders.length == _allFolders.length
|
||||
? "unselect all"
|
||||
: "select all",
|
||||
textAlign: TextAlign.right,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
color: Colors.white.withOpacity(0.8),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
final hasSelectedAll =
|
||||
_selectedFolders.length == _allFolders.length;
|
||||
// Flip selection
|
||||
if (hasSelectedAll) {
|
||||
_selectedFolders.clear();
|
||||
} else {
|
||||
_selectedFolders.addAll(_allFolders);
|
||||
}
|
||||
_latestFiles.sort((first, second) {
|
||||
return first.deviceFolder.compareTo(second.deviceFolder);
|
||||
});
|
||||
setState(() {});
|
||||
}),
|
||||
Expanded(child: _getFolders()),
|
||||
Padding(
|
||||
padding: EdgeInsets.all(20),
|
||||
),
|
||||
|
@ -63,13 +117,13 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
|||
child: Container(
|
||||
padding: EdgeInsets.only(left: 60, right: 60, bottom: 32),
|
||||
child: button(
|
||||
"start backup",
|
||||
widget.buttonText,
|
||||
fontSize: 18,
|
||||
onPressed: _backedupFolders.length == 0
|
||||
onPressed: _selectedFolders.length == 0
|
||||
? null
|
||||
: () async {
|
||||
await Configuration.instance
|
||||
.setPathsToBackUp(_backedupFolders);
|
||||
.setPathsToBackUp(_selectedFolders);
|
||||
Bus.instance.fire(BackupFoldersUpdatedEvent());
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
|
@ -83,112 +137,162 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
|||
}
|
||||
|
||||
Widget _getFolderList() {
|
||||
return FutureBuilder<List<File>>(
|
||||
future: FilesDB.instance.getLatestLocalFiles(),
|
||||
builder: (context, snapshot) {
|
||||
Widget child;
|
||||
if (snapshot.hasData) {
|
||||
snapshot.data.sort((first, second) {
|
||||
return first.deviceFolder
|
||||
.toLowerCase()
|
||||
.compareTo(second.deviceFolder.toLowerCase());
|
||||
});
|
||||
final List<Widget> foldersWidget = [];
|
||||
for (final file in snapshot.data) {
|
||||
final isSelected = _shouldSelectAll ||
|
||||
_backedupFolders.contains(file.deviceFolder);
|
||||
foldersWidget.add(
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 1, right: 4),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.black,
|
||||
),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(10),
|
||||
),
|
||||
color: isSelected
|
||||
? Color.fromRGBO(16, 32, 32, 1)
|
||||
: Color.fromRGBO(8, 18, 18, 0.4),
|
||||
),
|
||||
padding: EdgeInsets.fromLTRB(20, 16, 20, 16),
|
||||
child: InkWell(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Container(
|
||||
child: Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
_getThumbnail(file),
|
||||
Padding(padding: EdgeInsets.all(10)),
|
||||
Expanded(
|
||||
child: Text(
|
||||
file.deviceFolder,
|
||||
style: TextStyle(fontSize: 16, height: 1.5),
|
||||
overflow: TextOverflow.clip,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Checkbox(
|
||||
value: isSelected,
|
||||
onChanged: (value) {
|
||||
if (value) {
|
||||
_backedupFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_backedupFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
onTap: () {
|
||||
final value =
|
||||
!_backedupFolders.contains(file.deviceFolder);
|
||||
if (value) {
|
||||
_backedupFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_backedupFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final scrollController = ScrollController();
|
||||
child = Scrollbar(
|
||||
isAlwaysShown: true,
|
||||
controller: scrollController,
|
||||
child: SingleChildScrollView(
|
||||
controller: scrollController,
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(right: 4),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: foldersWidget,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
child = loadWidget;
|
||||
}
|
||||
return Container(
|
||||
padding: EdgeInsets.only(left: 40, right: 40),
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
Widget child;
|
||||
if (_latestFiles != null) {
|
||||
final foldersWidget = _getFolders();
|
||||
final scrollController = ScrollController();
|
||||
child = Scrollbar(
|
||||
isAlwaysShown: true,
|
||||
controller: scrollController,
|
||||
child: SingleChildScrollView(
|
||||
controller: scrollController,
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(right: 4),
|
||||
child: foldersWidget,
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
child = loadWidget;
|
||||
}
|
||||
return Container(
|
||||
padding: EdgeInsets.only(left: 40, right: 40),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getFolders() {
|
||||
if (_latestFiles == null) {
|
||||
return loadWidget;
|
||||
}
|
||||
_sortFiles();
|
||||
final scrollController = ScrollController();
|
||||
return Container(
|
||||
padding: EdgeInsets.only(left: 40, right: 40),
|
||||
child: Scrollbar(
|
||||
controller: scrollController,
|
||||
isAlwaysShown: true,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 4),
|
||||
child: ImplicitlyAnimatedReorderableList<File>(
|
||||
controller: scrollController,
|
||||
items: _latestFiles,
|
||||
areItemsTheSame: (oldItem, newItem) =>
|
||||
oldItem.deviceFolder == newItem.deviceFolder,
|
||||
onReorderFinished: (item, from, to, newItems) {
|
||||
setState(() {
|
||||
_latestFiles
|
||||
..clear()
|
||||
..addAll(newItems);
|
||||
});
|
||||
},
|
||||
itemBuilder: (context, itemAnimation, file, index) {
|
||||
return Reorderable(
|
||||
key: ValueKey(file),
|
||||
builder: (context, dragAnimation, inDrag) {
|
||||
final t = dragAnimation.value;
|
||||
final elevation = lerpDouble(0, 8, t);
|
||||
final color = Color.lerp(
|
||||
Colors.white, Colors.white.withOpacity(0.8), t);
|
||||
return SizeFadeTransition(
|
||||
sizeFraction: 0.7,
|
||||
curve: Curves.easeInOut,
|
||||
animation: itemAnimation,
|
||||
child: Material(
|
||||
color: color,
|
||||
elevation: elevation,
|
||||
type: MaterialType.transparency,
|
||||
child: _getFileItem(file),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Padding _getFileItem(File file) {
|
||||
final isSelected = _selectedFolders.contains(file.deviceFolder);
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 1, right: 4),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.black,
|
||||
),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(10),
|
||||
),
|
||||
color: isSelected
|
||||
? Color.fromRGBO(16, 32, 32, 1)
|
||||
: Color.fromRGBO(8, 18, 18, 0.4),
|
||||
),
|
||||
padding: EdgeInsets.fromLTRB(20, 16, 20, 16),
|
||||
child: InkWell(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Container(
|
||||
child: Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
_getThumbnail(file),
|
||||
Padding(padding: EdgeInsets.all(10)),
|
||||
Expanded(
|
||||
child: Text(
|
||||
file.deviceFolder,
|
||||
style: TextStyle(fontSize: 16, height: 1.5),
|
||||
overflow: TextOverflow.clip,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Checkbox(
|
||||
value: isSelected,
|
||||
onChanged: (value) {
|
||||
if (value) {
|
||||
_selectedFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_selectedFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
onTap: () {
|
||||
final value = !_selectedFolders.contains(file.deviceFolder);
|
||||
if (value) {
|
||||
_selectedFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_selectedFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _sortFiles() {
|
||||
_latestFiles.sort((first, second) {
|
||||
if (_selectedFolders.contains(first) &&
|
||||
_selectedFolders.contains(second)) {
|
||||
return first.deviceFolder.compareTo(second.deviceFolder);
|
||||
} else if (_selectedFolders.contains(first.deviceFolder)) {
|
||||
return -1;
|
||||
} else if (_selectedFolders.contains(second.deviceFolder)) {
|
||||
return 1;
|
||||
}
|
||||
return first.deviceFolder.compareTo(second.deviceFolder);
|
||||
});
|
||||
}
|
||||
|
||||
Widget _getThumbnail(File file) {
|
||||
return ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4.0),
|
||||
|
|
|
@ -1,190 +0,0 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/db/files_db.dart';
|
||||
import 'package:photos/events/backup_folders_updated_event.dart';
|
||||
import 'package:photos/models/file.dart';
|
||||
import 'package:photos/ui/common_elements.dart';
|
||||
import 'package:photos/ui/loading_widget.dart';
|
||||
import 'package:photos/ui/thumbnail_widget.dart';
|
||||
|
||||
class BackupFolderSelectionWidget extends StatefulWidget {
|
||||
final String buttonText;
|
||||
|
||||
const BackupFolderSelectionWidget(this.buttonText, {Key key})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
_BackupFolderSelectionWidgetState createState() =>
|
||||
_BackupFolderSelectionWidgetState();
|
||||
}
|
||||
|
||||
class _BackupFolderSelectionWidgetState
|
||||
extends State<BackupFolderSelectionWidget> {
|
||||
Set<String> _backedupFolders = Set<String>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_backedupFolders = Configuration.instance.getPathsToBackUp();
|
||||
if (_backedupFolders.length == 0) {
|
||||
if (Platform.isAndroid) {
|
||||
_backedupFolders.add("Camera");
|
||||
} else {
|
||||
_backedupFolders.add("Recents");
|
||||
}
|
||||
}
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(4),
|
||||
),
|
||||
Text(
|
||||
"backed up folders",
|
||||
style: TextStyle(fontSize: 20),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.all(12),
|
||||
),
|
||||
_getFolderList(),
|
||||
Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: 64,
|
||||
padding: EdgeInsets.only(left: 20, right: 20),
|
||||
child: button(
|
||||
widget.buttonText,
|
||||
fontSize: 18,
|
||||
onPressed: _backedupFolders.length == 0
|
||||
? null
|
||||
: () async {
|
||||
await Configuration.instance
|
||||
.setPathsToBackUp(_backedupFolders);
|
||||
Bus.instance.fire(BackupFoldersUpdatedEvent());
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getFolderList() {
|
||||
return FutureBuilder<List<File>>(
|
||||
future: FilesDB.instance.getLatestLocalFiles(),
|
||||
builder: (context, snapshot) {
|
||||
Widget child;
|
||||
if (snapshot.hasData) {
|
||||
snapshot.data.sort((first, second) {
|
||||
return first.deviceFolder
|
||||
.toLowerCase()
|
||||
.compareTo(second.deviceFolder.toLowerCase());
|
||||
});
|
||||
final List<Widget> foldersWidget = [];
|
||||
for (final file in snapshot.data) {
|
||||
foldersWidget.add(
|
||||
InkWell(
|
||||
child: Container(
|
||||
color: _backedupFolders.contains(file.deviceFolder)
|
||||
? Color.fromRGBO(16, 32, 32, 1.0)
|
||||
: null,
|
||||
padding: EdgeInsets.fromLTRB(24, 20, 24, 20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Container(
|
||||
child: Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
_getThumbnail(file),
|
||||
Padding(padding: EdgeInsets.all(10)),
|
||||
Expanded(
|
||||
child: Text(
|
||||
file.deviceFolder,
|
||||
style: TextStyle(fontSize: 16, height: 1.5),
|
||||
overflow: TextOverflow.clip,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Checkbox(
|
||||
value: _backedupFolders.contains(file.deviceFolder),
|
||||
onChanged: (value) {
|
||||
if (value) {
|
||||
_backedupFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_backedupFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
final value = !_backedupFolders.contains(file.deviceFolder);
|
||||
if (value) {
|
||||
_backedupFolders.add(file.deviceFolder);
|
||||
} else {
|
||||
_backedupFolders.remove(file.deviceFolder);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final scrollController = ScrollController();
|
||||
child = Scrollbar(
|
||||
isAlwaysShown: true,
|
||||
controller: scrollController,
|
||||
child: SingleChildScrollView(
|
||||
controller: scrollController,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: foldersWidget,
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
child = loadWidget;
|
||||
}
|
||||
return Container(
|
||||
height: 400,
|
||||
width: 340,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getThumbnail(File file) {
|
||||
return ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4.0),
|
||||
child: Container(
|
||||
child: ThumbnailWidget(
|
||||
file,
|
||||
shouldShowSyncStatus: false,
|
||||
key: Key("backup_selection_widget" + file.tag()),
|
||||
),
|
||||
height: 50,
|
||||
width: 50,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -2,7 +2,8 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/widgets.dart';
|
||||
import 'package:photo_manager/photo_manager.dart';
|
||||
import 'package:photos/services/local_sync_service.dart';
|
||||
import 'package:photos/ui/backup_folder_selection_widget.dart';
|
||||
import 'package:photos/ui/backup_folder_selection_page.dart';
|
||||
import 'package:photos/utils/navigation_util.dart';
|
||||
|
||||
class GalleryFooterWidget extends StatelessWidget {
|
||||
const GalleryFooterWidget({Key key}) : super(key: key);
|
||||
|
@ -51,7 +52,12 @@ class GalleryFooterWidget extends StatelessWidget {
|
|||
if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
|
||||
await PhotoManager.presentLimited();
|
||||
} else {
|
||||
_showBackupFolderSelectionWidget(context);
|
||||
routeToPage(
|
||||
context,
|
||||
BackupFolderSelectionPage(
|
||||
buttonText: "preserve",
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
|
@ -59,19 +65,4 @@ class GalleryFooterWidget extends StatelessWidget {
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
void _showBackupFolderSelectionWidget(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
content: const BackupFolderSelectionWidget("preserve"),
|
||||
backgroundColor: Color.fromRGBO(8, 18, 18, 1),
|
||||
insetPadding: const EdgeInsets.all(24),
|
||||
contentPadding: const EdgeInsets.all(24),
|
||||
);
|
||||
},
|
||||
barrierColor: Colors.black.withOpacity(0.85),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -349,7 +349,13 @@ class _HomeWidgetState extends State<HomeWidget> {
|
|||
.hasGrantedLimitedPermissions()) {
|
||||
PhotoManager.presentLimited();
|
||||
} else {
|
||||
routeToPage(context, BackupFolderSelectionPage());
|
||||
routeToPage(
|
||||
context,
|
||||
BackupFolderSelectionPage(
|
||||
shouldSelectAll: true,
|
||||
buttonText: "start backup",
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
|
|
|
@ -42,7 +42,12 @@ class _LoadingPhotosWidgetState extends State<LoadingPhotosWidget> {
|
|||
if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
|
||||
// Do nothing, let HomeWidget refresh
|
||||
} else {
|
||||
routeToPage(context, BackupFolderSelectionPage());
|
||||
routeToPage(
|
||||
context,
|
||||
BackupFolderSelectionPage(
|
||||
shouldSelectAll: true,
|
||||
buttonText: "start backup",
|
||||
));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/models/backup_status.dart';
|
||||
import 'package:photos/services/sync_service.dart';
|
||||
import 'package:photos/ui/backup_folder_selection_widget.dart';
|
||||
import 'package:photos/ui/backup_folder_selection_page.dart';
|
||||
import 'package:photos/ui/free_space_page.dart';
|
||||
import 'package:photos/ui/settings/settings_section_title.dart';
|
||||
import 'package:photos/ui/settings/settings_text_item.dart';
|
||||
|
@ -34,17 +34,11 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
content: const BackupFolderSelectionWidget("backup"),
|
||||
backgroundColor: Color.fromRGBO(8, 18, 18, 1),
|
||||
insetPadding: const EdgeInsets.all(24),
|
||||
contentPadding: const EdgeInsets.all(24),
|
||||
);
|
||||
},
|
||||
barrierColor: Colors.black.withOpacity(0.85),
|
||||
routeToPage(
|
||||
context,
|
||||
BackupFolderSelectionPage(
|
||||
buttonText: "backup",
|
||||
),
|
||||
);
|
||||
},
|
||||
child: SettingsTextItem(
|
||||
|
|
|
@ -466,6 +466,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
implicitly_animated_reorderable_list:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: implicitly_animated_reorderable_list
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.0"
|
||||
in_app_purchase:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
|
@ -94,6 +94,7 @@ dependencies:
|
|||
device_info: ^2.0.2
|
||||
exif: ^3.0.0
|
||||
wallpaper_manager_flutter: ^0.0.2
|
||||
implicitly_animated_reorderable_list: ^0.4.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
Loading…
Reference in a new issue