From b8e9e60666664516581f0ab27c8b1a9f7491f761 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Tue, 4 Jun 2019 16:00:30 -0300 Subject: [PATCH] Add a button to change the backup storage location --- .../backup/activity/MainActivity.java | 34 +++++++++++++-- .../activity/MainActivityController.java | 41 ++++++++++++------- app/src/main/res/layout/activity_main.xml | 30 +++++++++----- app/src/main/res/values/strings.xml | 1 + 4 files changed, 78 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/stevesoltys/backup/activity/MainActivity.java b/app/src/main/java/com/stevesoltys/backup/activity/MainActivity.java index a14f8830..64b06014 100644 --- a/app/src/main/java/com/stevesoltys/backup/activity/MainActivity.java +++ b/app/src/main/java/com/stevesoltys/backup/activity/MainActivity.java @@ -5,26 +5,46 @@ import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; +import android.widget.Button; import com.stevesoltys.backup.R; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + public class MainActivity extends Activity implements View.OnClickListener { public static final int OPEN_DOCUMENT_TREE_REQUEST_CODE = 1; - public static final int LOAD_DOCUMENT_REQUEST_CODE = 2; + public static final int OPEN_DOCUMENT_TREE_BACKUP_REQUEST_CODE = 2; + + public static final int LOAD_DOCUMENT_REQUEST_CODE = 3; private MainActivityController controller; + private Button changeLocationButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + controller = new MainActivityController(); + findViewById(R.id.create_backup_button).setOnClickListener(this); findViewById(R.id.restore_backup_button).setOnClickListener(this); - controller = new MainActivityController(); + changeLocationButton = findViewById(R.id.change_backup_location_button); + changeLocationButton.setOnClickListener(this); + } + + @Override + protected void onStart() { + super.onStart(); + if (controller.isChangeBackupLocationButtonVisible(this)) { + changeLocationButton.setVisibility(VISIBLE); + } else { + changeLocationButton.setVisibility(GONE); + } } @Override @@ -40,6 +60,10 @@ public class MainActivity extends Activity implements View.OnClickListener { case R.id.restore_backup_button: controller.showLoadDocumentActivity(this); break; + + case R.id.change_backup_location_button: + controller.onChangeBackupLocationButtonClicked(this); + break; } } @@ -54,7 +78,11 @@ public class MainActivity extends Activity implements View.OnClickListener { switch (requestCode) { case OPEN_DOCUMENT_TREE_REQUEST_CODE: - controller.handleChooseFolderResult(result, this); + controller.handleChooseFolderResult(result, this, false); + break; + + case OPEN_DOCUMENT_TREE_BACKUP_REQUEST_CODE: + controller.handleChooseFolderResult(result, this, true); break; case LOAD_DOCUMENT_REQUEST_CODE: diff --git a/app/src/main/java/com/stevesoltys/backup/activity/MainActivityController.java b/app/src/main/java/com/stevesoltys/backup/activity/MainActivityController.java index 7eb084aa..55f67624 100644 --- a/app/src/main/java/com/stevesoltys/backup/activity/MainActivityController.java +++ b/app/src/main/java/com/stevesoltys/backup/activity/MainActivityController.java @@ -24,6 +24,7 @@ import static android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION; import static android.provider.DocumentsContract.buildDocumentUriUsingTree; import static android.provider.DocumentsContract.createDocument; import static android.provider.DocumentsContract.getTreeDocumentId; +import static com.stevesoltys.backup.activity.MainActivity.OPEN_DOCUMENT_TREE_BACKUP_REQUEST_CODE; import static com.stevesoltys.backup.activity.MainActivity.OPEN_DOCUMENT_TREE_REQUEST_CODE; import static com.stevesoltys.backup.settings.SettingsManager.getBackupFolderUri; import static com.stevesoltys.backup.settings.SettingsManager.setBackupFolderUri; @@ -40,26 +41,32 @@ class MainActivityController { void onBackupButtonClicked(Activity parent) { Uri folderUri = getBackupFolderUri(parent); if (folderUri == null) { - showChooseFolderActivity(parent); + showChooseFolderActivity(parent, true); } else { try { Uri fileUri = createBackupFile(parent.getContentResolver(), folderUri); showCreateBackupActivity(parent, fileUri); + } catch (IOException e) { e.printStackTrace(); - showChooseFolderActivity(parent); + showChooseFolderActivity(parent, true); } } } - private void showChooseFolderActivity(Activity parent) { - Intent createDocumentIntent = new Intent(ACTION_OPEN_DOCUMENT_TREE); - createDocumentIntent.addFlags(FLAG_GRANT_PERSISTABLE_URI_PERMISSION | + boolean isChangeBackupLocationButtonVisible(Activity parent) { + return getBackupFolderUri(parent) != null; + } + + private void showChooseFolderActivity(Activity parent, boolean continueToBackup) { + Intent openTreeIntent = new Intent(ACTION_OPEN_DOCUMENT_TREE); + openTreeIntent.addFlags(FLAG_GRANT_PERSISTABLE_URI_PERMISSION | FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); try { - Intent documentChooser = Intent.createChooser(createDocumentIntent, "Select the backup location"); - parent.startActivityForResult(documentChooser, OPEN_DOCUMENT_TREE_REQUEST_CODE); + Intent documentChooser = Intent.createChooser(openTreeIntent, "Select the backup location"); + int requestCode = continueToBackup ? OPEN_DOCUMENT_TREE_BACKUP_REQUEST_CODE : OPEN_DOCUMENT_TREE_REQUEST_CODE; + parent.startActivityForResult(documentChooser, requestCode); } catch (ActivityNotFoundException ex) { Toast.makeText(parent, "Please install a file manager.", Toast.LENGTH_SHORT).show(); @@ -80,7 +87,11 @@ class MainActivityController { } } - void handleChooseFolderResult(Intent result, Activity parent) { + void onChangeBackupLocationButtonClicked(Activity parent) { + showChooseFolderActivity(parent, false); + } + + void handleChooseFolderResult(Intent result, Activity parent, boolean continueToBackup) { if (result == null || result.getData() == null) { return; @@ -97,18 +108,19 @@ class MainActivityController { // store backup folder location in settings setBackupFolderUri(parent, folderUri); - // create a new backup file in folder - Uri fileUri; + if (!continueToBackup) return; + try { - fileUri = createBackupFile(contentResolver, folderUri); + // create a new backup file in folder + Uri fileUri = createBackupFile(contentResolver, folderUri); + + showCreateBackupActivity(parent, fileUri); + } catch (IOException e) { // TODO show better error message once more infrastructure is in place Toast.makeText(parent, "Error creating backup file", Toast.LENGTH_SHORT).show(); e.printStackTrace(); - return; } - - showCreateBackupActivity(parent, fileUri); } private void showCreateBackupActivity(Activity parent, Uri fileUri) { @@ -134,6 +146,7 @@ class MainActivityController { Uri fileUri = createDocument(contentResolver, documentUri, DOCUMENT_MIME_TYPE, getBackupFileName()); if (fileUri == null) throw new IOException(); return fileUri; + } catch (SecurityException e) { // happens when folder was deleted and thus Uri permission don't exist anymore throw new IOException(e); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5a3421ab..705c21a7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,29 +1,37 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/activity_main" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:weightSum="1" - tools:context="com.stevesoltys.backup.activity.MainActivity"> + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/activity_main" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="com.stevesoltys.backup.activity.MainActivity"> <Button android:id="@+id/create_backup_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/button_horizontal_margin" - android:layout_marginRight="@dimen/button_horizontal_margin" android:layout_marginTop="@dimen/button_vertical_margin" - android:text="@string/create_backup_button"/> + android:layout_marginRight="@dimen/button_horizontal_margin" + android:text="@string/create_backup_button" /> <Button android:id="@+id/restore_backup_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/button_horizontal_margin" - android:layout_marginRight="@dimen/button_horizontal_margin" android:layout_marginTop="@dimen/button_vertical_margin" - android:text="@string/restore_backup_button"/> + android:layout_marginRight="@dimen/button_horizontal_margin" + android:text="@string/restore_backup_button" /> + + <Button + android:id="@+id/change_backup_location_button" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/button_horizontal_margin" + android:layout_marginTop="72dp" + android:layout_marginRight="@dimen/button_horizontal_margin" + android:text="@string/change_backup_location_button" /> </LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 309dfc3e..4bd56585 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ <string name="create_backup_button">Create backup</string> <string name="restore_backup_button">Restore backup</string> + <string name="change_backup_location_button">Change backup location</string> <string name="backup_success">Backup success</string> <string name="backup_failure">Backup failure</string>