Add an option to configure the folders whose photos should be backed up

This commit is contained in:
Vishnu Mohandas 2020-09-17 17:23:17 +05:30
parent 7e37df2947
commit 8553a9f25b
3 changed files with 103 additions and 3 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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);