Resolve review comments about backup compontent refactoring

This commit is contained in:
Torsten Grote 2019-06-12 09:19:38 -03:00
parent 92ce6c1a5c
commit 7fcd9aa091
No known key found for this signature in database
GPG key ID: 3E5F77D92CF891FF
8 changed files with 31 additions and 19 deletions

View file

@ -14,10 +14,15 @@ AOSP.
## What makes this different? ## What makes this different?
This application is compiled with the operating system and does not require a rooted device for use. It uses the same This application is compiled with the operating system and does not require a rooted device for use. It uses the same
internal APIs as `adb backup` and only requires one permission: `android.permission.BACKUP`. internal APIs as `adb backup` and only requires the permission `android.permission.BACKUP` for this.
## Contributing ## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/stevesoltys/backup. Bug reports and pull requests are welcome on GitHub at https://github.com/stevesoltys/backup.
## Permissions
* `android.permission.BACKUP` to be allowed to back up apps
* `android.permission.RECEIVE_BOOT_COMPLETED` to schedule automatic backups after boot
## License ## License
This application is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). This application is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).

View file

@ -5,7 +5,6 @@ import android.app.job.JobInfo;
import android.app.job.JobScheduler; import android.app.job.JobScheduler;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.widget.Toast; import android.widget.Toast;
@ -89,6 +88,8 @@ public class MainActivityController {
Toast.makeText(parent, "Please make at least one manual backup first.", Toast.LENGTH_SHORT).show(); Toast.makeText(parent, "Please make at least one manual backup first.", Toast.LENGTH_SHORT).show();
return false; return false;
} }
// schedule backups
final ComponentName serviceName = new ComponentName(parent, BackupJobService.class); final ComponentName serviceName = new ComponentName(parent, BackupJobService.class);
JobInfo job = new JobInfo.Builder(JOB_ID_BACKGROUND_BACKUP, serviceName) JobInfo job = new JobInfo.Builder(JOB_ID_BACKGROUND_BACKUP, serviceName)
.setRequiredNetworkType(NETWORK_TYPE_UNMETERED) .setRequiredNetworkType(NETWORK_TYPE_UNMETERED)
@ -100,8 +101,13 @@ public class MainActivityController {
.build(); .build();
JobScheduler scheduler = requireNonNull(parent.getSystemService(JobScheduler.class)); JobScheduler scheduler = requireNonNull(parent.getSystemService(JobScheduler.class));
scheduler.schedule(job); scheduler.schedule(job);
// remember that backups were scheduled
setBackupsScheduled(parent); setBackupsScheduled(parent);
// show Toast informing the user
Toast.makeText(parent, "Backups will run automatically now", Toast.LENGTH_SHORT).show(); Toast.makeText(parent, "Backups will run automatically now", Toast.LENGTH_SHORT).show();
return true; return true;
} }
@ -116,12 +122,11 @@ public class MainActivityController {
} }
Uri folderUri = result.getData(); Uri folderUri = result.getData();
ContentResolver contentResolver = parent.getContentResolver();
// persist permission to access backup folder across reboots // persist permission to access backup folder across reboots
int takeFlags = result.getFlags() & int takeFlags = result.getFlags() &
(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
contentResolver.takePersistableUriPermission(folderUri, takeFlags); parent.getContentResolver().takePersistableUriPermission(folderUri, takeFlags);
// store backup folder location in settings // store backup folder location in settings
setBackupFolderUri(parent, folderUri); setBackupFolderUri(parent, folderUri);

View file

@ -29,7 +29,7 @@ import java.util.zip.ZipInputStream;
import libcore.io.IoUtils; import libcore.io.IoUtils;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_FULL_BACKUP_DIRECTORY; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_FULL_BACKUP_DIRECTORY;
/** /**
* @author Steve Soltys * @author Steve Soltys

View file

@ -30,6 +30,7 @@ public class BackupJobService extends JobService {
); );
private final IBackupManager backupManager; private final IBackupManager backupManager;
private final PackageService packageService = new PackageService();
public BackupJobService() { public BackupJobService() {
backupManager = IBackupManager.Stub.asInterface(getService("backup")); backupManager = IBackupManager.Stub.asInterface(getService("backup"));
@ -40,7 +41,7 @@ public class BackupJobService extends JobService {
Log.i(TAG, "Triggering full backup"); Log.i(TAG, "Triggering full backup");
startService(new Intent(this, ConfigurableBackupTransportService.class)); startService(new Intent(this, ConfigurableBackupTransportService.class));
try { try {
LinkedList<String> packages = new LinkedList<>(new PackageService().getEligiblePackages()); LinkedList<String> packages = new LinkedList<>(packageService.getEligiblePackages());
packages.removeAll(IGNORED_PACKAGES); packages.removeAll(IGNORED_PACKAGES);
// TODO use an observer to know when backups fail // TODO use an observer to know when backups fail
String[] packageArray = packages.toArray(new String[packages.size()]); String[] packageArray = packages.toArray(new String[packages.size()]);

View file

@ -21,12 +21,6 @@ public class ConfigurableBackupTransport extends BackupTransport {
private static final String TRANSPORT_DIRECTORY_NAME = private static final String TRANSPORT_DIRECTORY_NAME =
"com.stevesoltys.backup.transport.ConfigurableBackupTransport"; "com.stevesoltys.backup.transport.ConfigurableBackupTransport";
public static final String DEFAULT_FULL_BACKUP_DIRECTORY = "full/";
public static final String DEFAULT_INCREMENTAL_BACKUP_DIRECTORY = "incr/";
public static final long DEFAULT_BACKUP_QUOTA = Long.MAX_VALUE;
private final BackupComponent backupComponent; private final BackupComponent backupComponent;
private final RestoreComponent restoreComponent; private final RestoreComponent restoreComponent;

View file

@ -39,9 +39,9 @@ import static android.provider.DocumentsContract.buildDocumentUriUsingTree;
import static android.provider.DocumentsContract.createDocument; import static android.provider.DocumentsContract.createDocument;
import static android.provider.DocumentsContract.getTreeDocumentId; import static android.provider.DocumentsContract.getTreeDocumentId;
import static com.stevesoltys.backup.activity.MainActivityController.DOCUMENT_MIME_TYPE; import static com.stevesoltys.backup.activity.MainActivityController.DOCUMENT_MIME_TYPE;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_BACKUP_QUOTA; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_BACKUP_QUOTA;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_FULL_BACKUP_DIRECTORY; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_FULL_BACKUP_DIRECTORY;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_INCREMENTAL_BACKUP_DIRECTORY; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_INCREMENTAL_BACKUP_DIRECTORY;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
/** /**

View file

@ -3,7 +3,14 @@ package com.stevesoltys.backup.transport.component.provider;
/** /**
* @author Steve Soltys * @author Steve Soltys
*/ */
class ContentProviderBackupConstants { public interface ContentProviderBackupConstants {
String SALT_FILE_PATH = "salt";
String DEFAULT_FULL_BACKUP_DIRECTORY = "full/";
String DEFAULT_INCREMENTAL_BACKUP_DIRECTORY = "incr/";
long DEFAULT_BACKUP_QUOTA = Long.MAX_VALUE;
static final String SALT_FILE_PATH = "salt";
} }

View file

@ -41,8 +41,8 @@ import static android.app.backup.BackupTransport.TRANSPORT_OK;
import static android.app.backup.BackupTransport.TRANSPORT_PACKAGE_REJECTED; import static android.app.backup.BackupTransport.TRANSPORT_PACKAGE_REJECTED;
import static android.app.backup.RestoreDescription.TYPE_FULL_STREAM; import static android.app.backup.RestoreDescription.TYPE_FULL_STREAM;
import static android.app.backup.RestoreDescription.TYPE_KEY_VALUE; import static android.app.backup.RestoreDescription.TYPE_KEY_VALUE;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_FULL_BACKUP_DIRECTORY; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_FULL_BACKUP_DIRECTORY;
import static com.stevesoltys.backup.transport.ConfigurableBackupTransport.DEFAULT_INCREMENTAL_BACKUP_DIRECTORY; import static com.stevesoltys.backup.transport.component.provider.ContentProviderBackupConstants.DEFAULT_INCREMENTAL_BACKUP_DIRECTORY;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
/** /**