Add an option to configure the folders whose photos should be backed up
This commit is contained in:
parent
7e37df2947
commit
8553a9f25b
3 changed files with 103 additions and 3 deletions
|
@ -18,6 +18,7 @@ class Configuration {
|
|||
static const emailKey = "email";
|
||||
static const tokenKey = "token";
|
||||
static const hasOptedForE2EKey = "has_opted_for_e2e_encryption";
|
||||
static const foldersToBackUpKey = "folders_to_back_up";
|
||||
static const keyKey = "key";
|
||||
static const keyEncryptedKey = "encrypted_key";
|
||||
static const keyKekSalt = "kek_salt";
|
||||
|
@ -119,6 +120,24 @@ class Configuration {
|
|||
// return _preferences.getBool(hasOptedForE2EKey);
|
||||
}
|
||||
|
||||
Set<String> getFoldersToBackUp() {
|
||||
if (_preferences.containsKey(foldersToBackUpKey)) {
|
||||
return _preferences.getStringList(foldersToBackUpKey).toSet();
|
||||
} else {
|
||||
final foldersToBackUp = Set<String>();
|
||||
foldersToBackUp.add("Camera");
|
||||
foldersToBackUp.add("Recents");
|
||||
foldersToBackUp.add("DCIM");
|
||||
foldersToBackUp.add("Download");
|
||||
foldersToBackUp.add("Screenshot");
|
||||
return foldersToBackUp;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setFoldersToBackUp(Set<String> folders) async {
|
||||
await _preferences.setStringList(foldersToBackUpKey, folders.toList());
|
||||
}
|
||||
|
||||
Future<void> setKeyAttributes(KeyAttributes attributes) async {
|
||||
await _preferences.setString(
|
||||
keyKekSalt, attributes == null ? null : attributes.kekSalt);
|
||||
|
|
|
@ -10,7 +10,6 @@ import 'package:photos/file_downloader.dart';
|
|||
import 'package:photos/file_repository.dart';
|
||||
import 'package:photo_manager/photo_manager.dart';
|
||||
import 'package:photos/file_uploader.dart';
|
||||
import 'package:photos/models/file_type.dart';
|
||||
import 'package:photos/utils/file_name_util.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
@ -196,11 +195,12 @@ class PhotoSyncManager {
|
|||
|
||||
Future<void> _uploadDiff() async {
|
||||
List<File> photosToBeUploaded = await _db.getFilesToBeUploaded();
|
||||
final foldersToBackUp = Configuration.instance.getFoldersToBackUp();
|
||||
for (int i = 0; i < photosToBeUploaded.length; i++) {
|
||||
File file = photosToBeUploaded[i];
|
||||
_logger.info("Uploading " + file.toString());
|
||||
try {
|
||||
if (file.fileType == FileType.video) {
|
||||
if (!foldersToBackUp.contains(file.deviceFolder)) {
|
||||
continue;
|
||||
}
|
||||
var uploadedFile;
|
||||
|
|
|
@ -6,6 +6,7 @@ import 'package:flutter/widgets.dart';
|
|||
import 'package:flutter_email_sender/flutter_email_sender.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/db/files_db.dart';
|
||||
import 'package:photos/ui/loading_widget.dart';
|
||||
import 'package:photos/utils/date_time_util.dart';
|
||||
|
||||
|
@ -61,7 +62,16 @@ class UsageWidgetState extends State<UsageWidget> {
|
|||
return Container(
|
||||
child: Column(
|
||||
children: [
|
||||
SettingsSectionTitle("BILLING"),
|
||||
SettingsSectionTitle("BACKUP"),
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
_showFoldersDialog(context);
|
||||
},
|
||||
child: SettingsTextItem(
|
||||
text: "Backed up Folders", icon: Icons.navigate_next),
|
||||
),
|
||||
Divider(height: 4),
|
||||
Padding(padding: EdgeInsets.all(4)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
|
@ -89,6 +99,28 @@ class UsageWidgetState extends State<UsageWidget> {
|
|||
);
|
||||
}
|
||||
|
||||
void _showFoldersDialog(BuildContext context) async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
title: Text("Select folders to back up"),
|
||||
content: BackedUpFoldersWidget(),
|
||||
actions: [
|
||||
FlatButton(
|
||||
child: Text("OK"),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return alert;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Text _getCost(double usageInGBs) {
|
||||
return Text("\$" + (usageInGBs * 0.1).toStringAsFixed(2));
|
||||
}
|
||||
|
@ -117,6 +149,55 @@ class UsageWidgetState extends State<UsageWidget> {
|
|||
}
|
||||
}
|
||||
|
||||
class BackedUpFoldersWidget extends StatefulWidget {
|
||||
const BackedUpFoldersWidget({
|
||||
Key key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_BackedUpFoldersWidgetState createState() => _BackedUpFoldersWidgetState();
|
||||
}
|
||||
|
||||
class _BackedUpFoldersWidgetState extends State<BackedUpFoldersWidget> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilder<List<String>>(
|
||||
future: FilesDB.instance.getLocalPaths(),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
snapshot.data.sort((first, second) {
|
||||
return first.toLowerCase().compareTo(second.toLowerCase());
|
||||
});
|
||||
final backedUpFolders = Configuration.instance.getFoldersToBackUp();
|
||||
final foldersWidget = List<Row>();
|
||||
for (final folder in snapshot.data) {
|
||||
foldersWidget.add(Row(children: [
|
||||
Checkbox(
|
||||
value: backedUpFolders.contains(folder),
|
||||
onChanged: (value) async {
|
||||
if (value) {
|
||||
backedUpFolders.add(folder);
|
||||
} else {
|
||||
backedUpFolders.remove(folder);
|
||||
}
|
||||
await Configuration.instance
|
||||
.setFoldersToBackUp(backedUpFolders);
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
Text(folder)
|
||||
]));
|
||||
}
|
||||
return SingleChildScrollView(
|
||||
child: Column(children: foldersWidget),
|
||||
);
|
||||
}
|
||||
return loadWidget;
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class SettingsSectionTitle extends StatelessWidget {
|
||||
final String title;
|
||||
const SettingsSectionTitle(this.title, {Key key}) : super(key: key);
|
||||
|
|
Loading…
Add table
Reference in a new issue