Browse Source

Synced folder dialog: use display name instead of full path for local folder

Signed-off-by: Alice Gaudon <alice@gaudon.pro>
Alice Gaudon 5 năm trước cách đây
mục cha
commit
e5f56152b0

+ 9 - 31
src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java

@@ -23,7 +23,6 @@ package com.owncloud.android.ui.dialog;
 import android.annotation.SuppressLint;
 import android.app.Dialog;
 import android.content.DialogInterface;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.view.LayoutInflater;
@@ -139,48 +138,27 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
     private List<StoragePathItem> getPathList() {
         List<StoragePathItem> storagePathItems = new ArrayList<>();
 
-        addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_image_grey600,
-                                                          getString(R.string.storage_pictures),
-                                                          Environment.getExternalStoragePublicDirectory(
-                                                              Environment.DIRECTORY_PICTURES).getAbsolutePath()));
-        addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_camera, getString(R.string.storage_camera),
-                                                          Environment.getExternalStoragePublicDirectory(
-                                                              Environment.DIRECTORY_DCIM).getAbsolutePath()));
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_document_grey600,
-                                                              getString(R.string.storage_documents),
-                                                              Environment.getExternalStoragePublicDirectory(
-                                                                  Environment.DIRECTORY_DOCUMENTS).getAbsolutePath()));
+        for (FileStorageUtils.StandardDirectory standardDirectory : FileStorageUtils.StandardDirectory.getStandardDirectories()) {
+            addIfExists(storagePathItems, standardDirectory.getIcon(), getString(standardDirectory.getDisplayName()),
+                Environment.getExternalStoragePublicDirectory(standardDirectory.getName()).getAbsolutePath());
         }
-        addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_download_grey600,
-                                                          getString(R.string.storage_downloads),
-                                                          Environment.getExternalStoragePublicDirectory(
-                                                              Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()));
-        addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_movie_grey600,
-                                                          getString(R.string.storage_movies),
-                                                          Environment.getExternalStoragePublicDirectory(
-                                                              Environment.DIRECTORY_MOVIES).getAbsolutePath()));
-        addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_music_grey600,
-                                                          getString(R.string.storage_music),
-                                                          Environment.getExternalStoragePublicDirectory(
-                                                              Environment.DIRECTORY_MUSIC).getAbsolutePath()));
 
         String sdCard = getString(R.string.storage_internal_storage);
         for (String dir : FileStorageUtils.getStorageDirectories(requireActivity())) {
             if (internalStoragePaths.contains(dir)) {
-                addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_sd_grey600, sdCard, dir));
+                addIfExists(storagePathItems, R.drawable.ic_sd_grey600, sdCard, dir);
             } else {
-                addIfExists(storagePathItems, new StoragePathItem(R.drawable.ic_sd_grey600, new File(dir).getName(), dir));
+                addIfExists(storagePathItems, R.drawable.ic_sd_grey600, new File(dir).getName(), dir);
             }
         }
 
         return storagePathItems;
     }
 
-    private void addIfExists(List<StoragePathItem> storagePathItems, StoragePathItem item) {
-        File path = new File(item.getPath());
-        if (path.exists() && path.canRead()) {
-            storagePathItems.add(item);
+    private void addIfExists(List<StoragePathItem> storagePathItems, int icon, String name, String path) {
+        File file = new File(path);
+        if (file.exists() && file.canRead()) {
+            storagePathItems.add(new StoragePathItem(icon, name, path));
         }
     }
 

+ 7 - 3
src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java

@@ -46,6 +46,7 @@ import com.owncloud.android.ui.activity.FolderPickerActivity;
 import com.owncloud.android.ui.activity.UploadFilesActivity;
 import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 import java.io.File;
@@ -218,7 +219,10 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
                                     mSyncedFolder.getLocalPath()),
                             mSyncedFolder.getFolderName(),
                             new StyleSpan(Typeface.BOLD)));
-            mLocalFolderSummary.setText(mSyncedFolder.getLocalPath());
+            mLocalFolderSummary.setText(FileStorageUtils.pathToUserFriendlyDisplay(
+                mSyncedFolder.getLocalPath(),
+                getActivity(),
+                getResources()));
         } else {
             mLocalFolderSummary.setText(R.string.choose_local_folder);
         }
@@ -272,11 +276,11 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
      * to the underlying activity since the picker is an activity and the result can't get passed to the dialog
      * fragment directly.
      *
-     * @param path the remote path to be set
+     * @param path the local path to be set
      */
     public void setLocalFolderSummary(String path) {
         mSyncedFolder.setLocalPath(path);
-        mLocalFolderSummary.setText(path);
+        mLocalFolderSummary.setText(FileStorageUtils.pathToUserFriendlyDisplay(path, getActivity(), getResources()));
         mLocalFolderPath.setText(
                 DisplayUtils.createTextWithSpan(
                         String.format(

+ 138 - 0
src/main/java/com/owncloud/android/utils/FileStorageUtils.java

@@ -25,6 +25,7 @@ import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Environment;
@@ -33,6 +34,7 @@ import android.util.Log;
 import android.webkit.MimeTypeMap;
 
 import com.owncloud.android.MainApp;
+import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.utils.Log_OC;
@@ -48,12 +50,16 @@ import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import javax.annotation.Nullable;
+
 import androidx.core.app.ActivityCompat;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -535,6 +541,47 @@ public final class FileStorageUtils {
         return rv;
     }
 
+    /**
+     * Update the local path summary display. If a special directory is recognized, it is replaced by its name.
+     *
+     * Example: /storage/emulated/0/Movies -> Internal Storage / Movies
+     * Example: /storage/ABC/non/standard/directory -> ABC /non/standard/directory
+     *
+     * @param path the path to display
+     * @return a user friendly path as defined in examples, or {@param path} if the storage device isn't recognized.
+     */
+    public static String pathToUserFriendlyDisplay(String path, Activity activity, Resources resources) {
+        // Determine storage device (external, sdcard...)
+        String storageDevice = null;
+        for (String storageDirectory : FileStorageUtils.getStorageDirectories(activity)) {
+            if (path.startsWith(storageDirectory)) {
+                storageDevice = storageDirectory;
+                break;
+            }
+        }
+
+        // If storage device was not found, display full path
+        if (storageDevice == null) {
+            return path;
+        }
+
+        // Default to full path without storage device path
+        String storageFolder = path.substring(storageDevice.length() + 1);
+        FileStorageUtils.StandardDirectory standardDirectory = FileStorageUtils.StandardDirectory.fromPath(storageFolder);
+        if (standardDirectory != null) { // Friendly name of standard directory
+            storageFolder = " " + resources.getString(standardDirectory.getDisplayName());
+        }
+
+        // Shorten the storage device to a friendlier display name
+        if (storageDevice.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) {
+            storageDevice = resources.getString(R.string.storage_internal_storage);
+        } else {
+            storageDevice = new File(storageDevice).getName();
+        }
+
+        return resources.getString(R.string.local_folder_friendly_path, storageDevice, storageFolder);
+    }
+
     /**
      * Taken from https://github.com/TeamAmaze/AmazeFileManager/blob/d11e0d2874c6067910e58e059859431a31ad6aee/app/src
      * /main/java/com/amaze/filemanager/activities/superclasses/PermissionsActivity.java#L47 on
@@ -582,4 +629,95 @@ public final class FileStorageUtils {
     private static boolean canListFiles(File f) {
         return f.canRead() && f.isDirectory();
     }
+
+    /**
+     * Should be converted to an enum when we only support min SDK version for Environment.DIRECTORY_DOCUMENTS
+     */
+    public static class StandardDirectory {
+        public static final StandardDirectory PICTURES = new StandardDirectory(
+            Environment.DIRECTORY_PICTURES,
+            R.string.storage_pictures,
+            R.drawable.ic_image_grey600
+        );
+        public static final StandardDirectory CAMERA = new StandardDirectory(
+            Environment.DIRECTORY_DCIM,
+            R.string.storage_camera,
+            R.drawable.ic_camera
+        );
+
+        public static final StandardDirectory DOCUMENTS;
+
+        static {
+            if (SDK_INT > Build.VERSION_CODES.KITKAT) {
+                DOCUMENTS = new StandardDirectory(
+                    Environment.DIRECTORY_DOCUMENTS,
+                    R.string.storage_documents,
+                    R.drawable.ic_document_grey600
+                );
+            } else {
+                DOCUMENTS = null;
+            }
+        }
+
+        public static final StandardDirectory DOWNLOADS = new StandardDirectory(
+            Environment.DIRECTORY_DOWNLOADS,
+            R.string.storage_downloads,
+            R.drawable.ic_download_grey600
+        );
+        public static final StandardDirectory MOVIES = new StandardDirectory(
+            Environment.DIRECTORY_MOVIES,
+            R.string.storage_movies,
+            R.drawable.ic_movie_grey600
+        );
+        public static final StandardDirectory MUSIC = new StandardDirectory(
+            Environment.DIRECTORY_MUSIC,
+            R.string.storage_music,
+            R.drawable.ic_music_grey600
+        );
+
+        private final String name;
+        private final int displayNameResource;
+        private final int iconResource;
+
+        private StandardDirectory(String name, int displayNameResource, int iconResource) {
+            this.name = name;
+            this.displayNameResource = displayNameResource;
+            this.iconResource = iconResource;
+        }
+
+        public String getName() {
+            return this.name;
+        }
+
+        public int getDisplayName() {
+            return this.displayNameResource;
+        }
+
+        public int getIcon() {
+            return this.iconResource;
+        }
+
+        public static Collection<StandardDirectory> getStandardDirectories() {
+            Collection<StandardDirectory> standardDirectories = new HashSet<>();
+            standardDirectories.add(PICTURES);
+            standardDirectories.add(CAMERA);
+            if (DOCUMENTS != null) {
+                standardDirectories.add(DOCUMENTS);
+            }
+            standardDirectories.add(DOWNLOADS);
+            standardDirectories.add(MOVIES);
+            standardDirectories.add(MUSIC);
+            return standardDirectories;
+        }
+
+        @Nullable
+        public static StandardDirectory fromPath(String path) {
+            for (StandardDirectory directory : getStandardDirectories()) {
+                if (directory.getName().equals(path)) {
+                    return directory;
+                }
+            }
+            return null;
+        }
+    }
 }

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

@@ -541,6 +541,7 @@
     <string name="copy_to">Copy to…</string>
     <string name="choose_remote_folder">Choose remote folder…</string>
     <string name="choose_local_folder">Choose local folder…</string>
+    <string name="local_folder_friendly_path">%1$s /%2$s</string>
     <string name="synced_folders_loading_folders">Loading folders…</string>
     <string name="synced_folders_no_results">No media folders found</string>
     <plurals name="synced_folders_show_hidden_folders">