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:io' as io;
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:flutter_sodium/flutter_sodium.dart';
|
import 'package:flutter_sodium/flutter_sodium.dart';
|
||||||
import 'package:logging/logging.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/favorites_service.dart';
|
||||||
import 'package:photos/services/memories_service.dart';
|
import 'package:photos/services/memories_service.dart';
|
||||||
import 'package:photos/services/sync_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:photos/utils/crypto_util.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
class Configuration {
|
class Configuration {
|
||||||
Configuration._privateConstructor();
|
Configuration._privateConstructor();
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
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/configuration.dart';
|
||||||
import 'package:photos/core/event_bus.dart';
|
import 'package:photos/core/event_bus.dart';
|
||||||
import 'package:photos/db/files_db.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';
|
import 'package:photos/ui/thumbnail_widget.dart';
|
||||||
|
|
||||||
class BackupFolderSelectionPage extends StatefulWidget {
|
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
|
@override
|
||||||
_BackupFolderSelectionPageState createState() =>
|
_BackupFolderSelectionPageState createState() =>
|
||||||
|
@ -17,20 +28,29 @@ class BackupFolderSelectionPage extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
Set<String> _backedupFolders = Set<String>();
|
final Set<String> _allFolders = Set<String>();
|
||||||
bool _shouldSelectAll = true;
|
Set<String> _selectedFolders = Set<String>();
|
||||||
|
List<File> _latestFiles;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
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();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (_backedupFolders.isNotEmpty) {
|
|
||||||
_shouldSelectAll = false;
|
|
||||||
}
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(title: Text("select folders to backup")),
|
appBar: AppBar(title: Text("select folders to backup")),
|
||||||
body: Column(
|
body: Column(
|
||||||
|
@ -52,9 +72,43 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
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(
|
||||||
padding: EdgeInsets.all(20),
|
padding: EdgeInsets.all(20),
|
||||||
),
|
),
|
||||||
|
@ -63,13 +117,13 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.only(left: 60, right: 60, bottom: 32),
|
padding: EdgeInsets.only(left: 60, right: 60, bottom: 32),
|
||||||
child: button(
|
child: button(
|
||||||
"start backup",
|
widget.buttonText,
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
onPressed: _backedupFolders.length == 0
|
onPressed: _selectedFolders.length == 0
|
||||||
? null
|
? null
|
||||||
: () async {
|
: () async {
|
||||||
await Configuration.instance
|
await Configuration.instance
|
||||||
.setPathsToBackUp(_backedupFolders);
|
.setPathsToBackUp(_selectedFolders);
|
||||||
Bus.instance.fire(BackupFoldersUpdatedEvent());
|
Bus.instance.fire(BackupFoldersUpdatedEvent());
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
|
@ -83,22 +137,86 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _getFolderList() {
|
Widget _getFolderList() {
|
||||||
return FutureBuilder<List<File>>(
|
|
||||||
future: FilesDB.instance.getLatestLocalFiles(),
|
|
||||||
builder: (context, snapshot) {
|
|
||||||
Widget child;
|
Widget child;
|
||||||
if (snapshot.hasData) {
|
if (_latestFiles != null) {
|
||||||
snapshot.data.sort((first, second) {
|
final foldersWidget = _getFolders();
|
||||||
return first.deviceFolder
|
final scrollController = ScrollController();
|
||||||
.toLowerCase()
|
child = Scrollbar(
|
||||||
.compareTo(second.deviceFolder.toLowerCase());
|
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);
|
||||||
});
|
});
|
||||||
final List<Widget> foldersWidget = [];
|
},
|
||||||
for (final file in snapshot.data) {
|
itemBuilder: (context, itemAnimation, file, index) {
|
||||||
final isSelected = _shouldSelectAll ||
|
return Reorderable(
|
||||||
_backedupFolders.contains(file.deviceFolder);
|
key: ValueKey(file),
|
||||||
foldersWidget.add(
|
builder: (context, dragAnimation, inDrag) {
|
||||||
Padding(
|
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),
|
padding: const EdgeInsets.only(bottom: 1, right: 4),
|
||||||
child: Container(
|
child: Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
@ -138,9 +256,9 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
value: isSelected,
|
value: isSelected,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
_backedupFolders.add(file.deviceFolder);
|
_selectedFolders.add(file.deviceFolder);
|
||||||
} else {
|
} else {
|
||||||
_backedupFolders.remove(file.deviceFolder);
|
_selectedFolders.remove(file.deviceFolder);
|
||||||
}
|
}
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
|
@ -148,45 +266,31 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
final value =
|
final value = !_selectedFolders.contains(file.deviceFolder);
|
||||||
!_backedupFolders.contains(file.deviceFolder);
|
|
||||||
if (value) {
|
if (value) {
|
||||||
_backedupFolders.add(file.deviceFolder);
|
_selectedFolders.add(file.deviceFolder);
|
||||||
} else {
|
} else {
|
||||||
_backedupFolders.remove(file.deviceFolder);
|
_selectedFolders.remove(file.deviceFolder);
|
||||||
}
|
}
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final scrollController = ScrollController();
|
void _sortFiles() {
|
||||||
child = Scrollbar(
|
_latestFiles.sort((first, second) {
|
||||||
isAlwaysShown: true,
|
if (_selectedFolders.contains(first) &&
|
||||||
controller: scrollController,
|
_selectedFolders.contains(second)) {
|
||||||
child: SingleChildScrollView(
|
return first.deviceFolder.compareTo(second.deviceFolder);
|
||||||
controller: scrollController,
|
} else if (_selectedFolders.contains(first.deviceFolder)) {
|
||||||
child: Container(
|
return -1;
|
||||||
padding: EdgeInsets.only(right: 4),
|
} else if (_selectedFolders.contains(second.deviceFolder)) {
|
||||||
child: Column(
|
return 1;
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
||||||
children: foldersWidget,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
child = loadWidget;
|
|
||||||
}
|
}
|
||||||
return Container(
|
return first.deviceFolder.compareTo(second.deviceFolder);
|
||||||
padding: EdgeInsets.only(left: 40, right: 40),
|
});
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _getThumbnail(File file) {
|
Widget _getThumbnail(File file) {
|
||||||
|
|
|
@ -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:flutter/widgets.dart';
|
||||||
import 'package:photo_manager/photo_manager.dart';
|
import 'package:photo_manager/photo_manager.dart';
|
||||||
import 'package:photos/services/local_sync_service.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 {
|
class GalleryFooterWidget extends StatelessWidget {
|
||||||
const GalleryFooterWidget({Key key}) : super(key: key);
|
const GalleryFooterWidget({Key key}) : super(key: key);
|
||||||
|
@ -51,7 +52,12 @@ class GalleryFooterWidget extends StatelessWidget {
|
||||||
if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
|
if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
|
||||||
await PhotoManager.presentLimited();
|
await PhotoManager.presentLimited();
|
||||||
} else {
|
} 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()) {
|
.hasGrantedLimitedPermissions()) {
|
||||||
PhotoManager.presentLimited();
|
PhotoManager.presentLimited();
|
||||||
} else {
|
} 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()) {
|
if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
|
||||||
// Do nothing, let HomeWidget refresh
|
// Do nothing, let HomeWidget refresh
|
||||||
} else {
|
} 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/core/configuration.dart';
|
||||||
import 'package:photos/models/backup_status.dart';
|
import 'package:photos/models/backup_status.dart';
|
||||||
import 'package:photos/services/sync_service.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/free_space_page.dart';
|
||||||
import 'package:photos/ui/settings/settings_section_title.dart';
|
import 'package:photos/ui/settings/settings_section_title.dart';
|
||||||
import 'package:photos/ui/settings/settings_text_item.dart';
|
import 'package:photos/ui/settings/settings_text_item.dart';
|
||||||
|
@ -34,17 +34,11 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
showDialog(
|
routeToPage(
|
||||||
context: context,
|
context,
|
||||||
builder: (context) {
|
BackupFolderSelectionPage(
|
||||||
return AlertDialog(
|
buttonText: "backup",
|
||||||
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),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: SettingsTextItem(
|
child: SettingsTextItem(
|
||||||
|
|
|
@ -466,6 +466,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
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:
|
in_app_purchase:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -94,6 +94,7 @@ dependencies:
|
||||||
device_info: ^2.0.2
|
device_info: ^2.0.2
|
||||||
exif: ^3.0.0
|
exif: ^3.0.0
|
||||||
wallpaper_manager_flutter: ^0.0.2
|
wallpaper_manager_flutter: ^0.0.2
|
||||||
|
implicitly_animated_reorderable_list: ^0.4.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
Loading…
Reference in a new issue