do password empty check in dialog not in restore backup service

Daniel Gultsch created

Change summary

src/conversations/java/eu/siacs/conversations/services/ImportBackupService.java | 10 
src/conversations/java/eu/siacs/conversations/ui/ImportBackupActivity.java      | 42 
src/main/res/values/strings.xml                                                 |  1 
3 files changed, 28 insertions(+), 25 deletions(-)

Detailed changes

src/conversations/java/eu/siacs/conversations/services/ImportBackupService.java 🔗

@@ -93,7 +93,7 @@ public class ImportBackupService extends Service {
             uri = data;
         }
 
-        if (password == null || uri == null) {
+        if (password == null || password.isEmpty() || uri == null) {
             return START_NOT_STICKY;
         }
         if (running.compareAndSet(false, true)) {
@@ -158,14 +158,6 @@ public class ImportBackupService extends Service {
 
     private boolean importBackup(Uri uri, String password) {
         Log.d(Config.LOGTAG, "importing backup from " + uri);
-        if (password == null || password.isEmpty()) {
-            synchronized (mOnBackupProcessedListeners) {
-                for (OnBackupProcessed l : mOnBackupProcessedListeners) {
-                    l.onBackupDecryptionFailed();
-                }
-            }
-            return false;
-        }
         try {
             SQLiteDatabase db = mDatabaseBackend.getWritableDatabase();
             final InputStream inputStream;

src/conversations/java/eu/siacs/conversations/ui/ImportBackupActivity.java 🔗

@@ -2,6 +2,7 @@ package eu.siacs.conversations.ui;
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.ServiceConnection;
 import android.databinding.DataBindingUtil;
@@ -140,23 +141,32 @@ public class ImportBackupActivity extends ActionBarActivity implements ServiceCo
                 finish();
             }
         });
-        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);
-            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);
-        });
+        builder.setPositiveButton(R.string.restore, null);
         builder.setCancelable(false);
-        builder.create().show();
+        final AlertDialog dialog = builder.create();
+        dialog.setOnShowListener((d) -> {
+            dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(v -> {
+                final String password = enterPasswordBinding.accountPassword.getEditableText().toString();
+                if (password.isEmpty()) {
+                    enterPasswordBinding.accountPasswordLayout.setError(getString(R.string.please_enter_password));
+                    return;
+                }
+                final Uri uri = backupFile.getUri();
+                Intent intent = new Intent(this, ImportBackupService.class);
+                intent.setAction(Intent.ACTION_SEND);
+                intent.putExtra("password", password);
+                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);
+                d.dismiss();
+            });
+        });
+        dialog.show();
     }
 
     private void setLoadingState(final boolean loadingState) {

src/main/res/values/strings.xml 🔗

@@ -874,4 +874,5 @@
     <string name="open_backup">Open backup</string>
     <string name="not_a_backup_file">The file you selected is not a Conversations backup file</string>
     <string name="account_already_setup">This account has already been setup</string>
+    <string name="please_enter_password">Please enter the password for this account</string>
 </resources>