Browse Source

Fix edge case when app is restored during backup and storage path does not exist
Fix #4151

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>

tobiasKaminsky 4 years ago
parent
commit
975841735b

+ 5 - 0
src/main/java/com/nextcloud/client/preferences/AppPreferences.java

@@ -329,9 +329,14 @@ public interface AppPreferences {
 
 
     void setStoragePath(String path);
     void setStoragePath(String path);
 
 
+    void setStoragePathValid();
+
+    boolean isStoragePathValid();
+
     void removeKeysMigrationPreference();
     void removeKeysMigrationPreference();
 
 
     String getCurrentAccountName();
     String getCurrentAccountName();
+
     void setCurrentAccountName(String accountName);
     void setCurrentAccountName(String accountName);
 
 
     /**
     /**

+ 12 - 0
src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

@@ -56,6 +56,7 @@ public final class AppPreferencesImpl implements AppPreferences {
      */
      */
     public static final String AUTO_PREF__LAST_SEEN_VERSION_CODE = "lastSeenVersionCode";
     public static final String AUTO_PREF__LAST_SEEN_VERSION_CODE = "lastSeenVersionCode";
     public static final String STORAGE_PATH = "storage_path";
     public static final String STORAGE_PATH = "storage_path";
+    public static final String STORAGE_PATH_VALID = "storage_path_valid";
     public static final String PREF__DARK_THEME = "dark_theme_mode";
     public static final String PREF__DARK_THEME = "dark_theme_mode";
     public static final float DEFAULT_GRID_COLUMN = 3f;
     public static final float DEFAULT_GRID_COLUMN = 3f;
 
 
@@ -526,6 +527,17 @@ public final class AppPreferencesImpl implements AppPreferences {
         preferences.edit().putString(STORAGE_PATH, path).commit();  // commit synchronously
         preferences.edit().putString(STORAGE_PATH, path).commit();  // commit synchronously
     }
     }
 
 
+    @SuppressLint("ApplySharedPref")
+    @Override
+    public void setStoragePathValid() {
+        preferences.edit().putBoolean(STORAGE_PATH_VALID, true).commit();
+    }
+
+    @Override
+    public boolean isStoragePathValid() {
+        return preferences.getBoolean(STORAGE_PATH_VALID, false);
+    }
+
     /**
     /**
      * Removes keys migration key from shared preferences.
      * Removes keys migration key from shared preferences.
      */
      */

+ 28 - 2
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -40,6 +40,7 @@ import android.content.pm.PackageManager;
 import android.content.res.Resources.NotFoundException;
 import android.content.res.Resources.NotFoundException;
 import android.net.Uri;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.IBinder;
 import android.os.IBinder;
 import android.os.Parcelable;
 import android.os.Parcelable;
 import android.text.TextUtils;
 import android.text.TextUtils;
@@ -48,6 +49,7 @@ import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View;
 import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver;
+import android.view.WindowManager;
 
 
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.snackbar.Snackbar;
 import com.google.android.material.snackbar.Snackbar;
@@ -272,7 +274,7 @@ public class FileDisplayActivity extends FileActivity
         if (taskRetainerFragment == null) {
         if (taskRetainerFragment == null) {
             taskRetainerFragment = new TaskRetainerFragment();
             taskRetainerFragment = new TaskRetainerFragment();
             fm.beginTransaction()
             fm.beginTransaction()
-                    .add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit();
+                .add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit();
         }   // else, Fragment already created and retained across configuration change
         }   // else, Fragment already created and retained across configuration change
 
 
         if (Intent.ACTION_VIEW.equals(getIntent().getAction())) {
         if (Intent.ACTION_VIEW.equals(getIntent().getAction())) {
@@ -280,6 +282,30 @@ public class FileDisplayActivity extends FileActivity
         }
         }
 
 
         mPlayerConnection = new PlayerServiceConnection(this);
         mPlayerConnection = new PlayerServiceConnection(this);
+
+        checkStoragePath();
+    }
+
+    private void checkStoragePath() {
+        String newStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
+        String storagePath = preferences.getStoragePath(newStorage);
+        if (!preferences.isStoragePathValid() && !new File(storagePath).exists()) {
+            // falling back to default
+            preferences.setStoragePath(newStorage);
+            preferences.setStoragePathValid();
+            MainApp.setStoragePath(newStorage);
+
+            try {
+                new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog)
+                    .setTitle(R.string.wrong_storage_path)
+                    .setMessage(R.string.wrong_storage_path_desc)
+                    .setNegativeButton(R.string.dialog_close, (dialog, which) -> dialog.dismiss())
+                    .setIcon(R.drawable.ic_settings)
+                    .show();
+            } catch (WindowManager.BadTokenException e) {
+                Log_OC.e(TAG, "Error showing wrong storage info, so skipping it: " + e.getMessage());
+            }
+        }
     }
     }
 
 
     @Override
     @Override
@@ -290,7 +316,7 @@ public class FileDisplayActivity extends FileActivity
         if (!PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
         if (!PermissionUtil.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
             // Check if we should show an explanation
             // Check if we should show an explanation
             if (PermissionUtil.shouldShowRequestPermissionRationale(this,
             if (PermissionUtil.shouldShowRequestPermissionRationale(this,
-                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+                                                                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                 // Show explanation to the user and then request permission
                 // Show explanation to the user and then request permission
                 Snackbar snackbar = Snackbar.make(binding.rootLayout,
                 Snackbar snackbar = Snackbar.make(binding.rootLayout,
                                                   R.string.permission_storage_access,
                                                   R.string.permission_storage_access,

+ 4 - 0
src/main/res/values/strings.xml

@@ -948,4 +948,8 @@
     <string name="player_toggle">toggle</string>
     <string name="player_toggle">toggle</string>
     <string name="in_folder">in folder %1$s</string>
     <string name="in_folder">in folder %1$s</string>
     <string name="choose_which_file">Choose which file to keep!</string>
     <string name="choose_which_file">Choose which file to keep!</string>
+    <string name="wrong_storage_path">Storage path does not exist!</string>
+    <string name="wrong_storage_path_desc">This might be due to a backup restore on another device. Falling back to
+        default. Please check settings to adjust storage path.</string>
+    <string name="dialog_close">Close</string>
 </resources>
 </resources>