aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2019-08-31 14:45:36 +0200
committerChristian Schneppe <christian@pix-art.de>2019-08-31 14:45:36 +0200
commit47c29e584229f1fe98d5456d66a32bb9f081afa5 (patch)
treefaafd4a0bfac960d66697512d96e8622b7fdcecb /src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java
parentf7c293387b84f9fc416529ed6c08217a35b0474e (diff)
allow backup to be restored from selected file
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java')
-rw-r--r--src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java76
1 files changed, 73 insertions, 3 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java b/src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java
index 5414e6bbf..e0cdf1431 100644
--- a/src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ImportBackupActivity.java
@@ -5,6 +5,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.databinding.DataBindingUtil;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.support.design.widget.Snackbar;
@@ -13,8 +15,11 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
+import java.io.IOException;
import java.util.List;
import de.pixart.messenger.Config;
@@ -30,6 +35,8 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
private BackupFileAdapter backupFileAdapter;
private ImportBackupService service;
+ private boolean mLoadingState = false;
+
@Override
protected void onCreate(final Bundle savedInstanceState) {
@@ -43,6 +50,14 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
}
@Override
+ public boolean onCreateOptionsMenu(final Menu menu) {
+ getMenuInflater().inflate(R.menu.import_backup, menu);
+ final MenuItem openBackup = menu.findItem(R.id.action_open_backup_file);
+ openBackup.setVisible(!this.mLoadingState);
+ return true;
+ }
+
+ @Override
protected void refreshUiReal() {
}
@@ -94,9 +109,22 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
}
@Override
- public void onClick(ImportBackupService.BackupFile backupFile) {
+ public void onClick(final ImportBackupService.BackupFile backupFile) {
+ showEnterPasswordDialog(backupFile);
+ }
+
+ private void openBackupFileFromUri(final Uri uri) {
+ try {
+ final ImportBackupService.BackupFile backupFile = ImportBackupService.BackupFile.read(this, uri);
+ showEnterPasswordDialog(backupFile);
+ } catch (IOException e) {
+ Snackbar.make(binding.coordinator, R.string.not_a_backup_file, Snackbar.LENGTH_LONG).show();
+ }
+ }
+
+ private void showEnterPasswordDialog(final ImportBackupService.BackupFile backupFile) {
final DialogEnterPasswordBinding enterPasswordBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.dialog_enter_password, null, false);
- Log.d(Config.LOGTAG, "attempting to import " + backupFile.getFile().getAbsolutePath());
+ Log.d(Config.LOGTAG, "attempting to import " + backupFile.getUri());
enterPasswordBinding.explain.setText(getString(R.string.enter_password_to_restore, backupFile.getHeader().getJid().toString()));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(enterPasswordBinding.getRoot());
@@ -104,9 +132,16 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
builder.setNegativeButton(R.string.cancel, null);
builder.setPositiveButton(R.string.restore, (dialog, which) -> {
final String password = enterPasswordBinding.accountPassword.getEditableText().toString();
+ final Uri uri = backupFile.getUri();
Intent intent = new Intent(this, ImportBackupService.class);
+ intent.setAction(Intent.ACTION_SEND);
intent.putExtra("password", password);
- intent.putExtra("file", backupFile.getFile().getAbsolutePath());
+ if ("file".equals(uri.getScheme())) {
+ intent.putExtra("file", uri.getPath());
+ } else {
+ intent.setData(uri);
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ }
setLoadingState(true);
ContextCompat.startForegroundService(this, intent);
});
@@ -119,6 +154,25 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
binding.inProgress.setVisibility(loadingState ? View.VISIBLE : View.GONE);
setTitle(loadingState ? R.string.restoring_backup : R.string.restore_backup);
configureActionBar(getSupportActionBar(), !loadingState);
+ this.mLoadingState = loadingState;
+ invalidateOptionsMenu();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (resultCode == RESULT_OK) {
+ if (requestCode == 0xbac) {
+ openBackupFileFromUri(intent.getData());
+ }
+ }
+ }
+
+ @Override
+ public void onAccountAlreadySetup() {
+ runOnUiThread(() -> {
+ setLoadingState(false);
+ Snackbar.make(binding.coordinator, R.string.account_already_setup, Snackbar.LENGTH_LONG).show();
+ });
}
@Override
@@ -151,4 +205,20 @@ public class ImportBackupActivity extends XmppActivity implements ServiceConnect
Snackbar.make(binding.coordinator, R.string.unable_to_restore_backup, Snackbar.LENGTH_LONG).show();
});
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_open_backup_file:
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("*/*");
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+ intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
+ }
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ startActivityForResult(Intent.createChooser(intent, getString(R.string.open_backup)), 0xbac);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
} \ No newline at end of file