diff options
author | Richard MacGregor <rmacgregor@cyngn.com> | 2015-06-25 12:45:17 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-11-02 17:46:15 -0700 |
commit | 7eca05f3da4975683d93cd2c07d19021e2e60e93 (patch) | |
tree | 1ae3d618749d3ef750ef09173d2b2e068eb8e5c0 | |
parent | 2250ae7ee5e8ce66503359ccccd66ea7d1eb0013 (diff) | |
download | android_packages_apps_CMFileManager-7eca05f3da4975683d93cd2c07d19021e2e60e93.tar.gz android_packages_apps_CMFileManager-7eca05f3da4975683d93cd2c07d19021e2e60e93.tar.bz2 android_packages_apps_CMFileManager-7eca05f3da4975683d93cd2c07d19021e2e60e93.zip |
Fix drawer some drawer mount points
Add drawer mount points for:
Local Storage
Root (only in privilaged mode)
SDCard (if available)
USB (if available)
Still needs to be done:
Secure Storage mount point
Change-Id: Idec79d78ab7080897ccbb440aa2ed6bf1cae9bda
-rw-r--r-- | res/menu/navigation.xml | 27 | ||||
-rw-r--r-- | res/values/overlay.xml | 3 | ||||
-rw-r--r-- | res/values/strings.xml | 15 | ||||
-rwxr-xr-x | src/com/cyanogenmod/filemanager/activities/MainActivity.java | 72 | ||||
-rwxr-xr-x | src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java | 174 | ||||
-rw-r--r-- | src/com/cyanogenmod/filemanager/model/Bookmark.java | 7 | ||||
-rw-r--r-- | src/com/cyanogenmod/filemanager/util/StorageHelper.java | 10 |
7 files changed, 256 insertions, 52 deletions
diff --git a/res/menu/navigation.xml b/res/menu/navigation.xml index 27fdd2a2..1c4d6730 100644 --- a/res/menu/navigation.xml +++ b/res/menu/navigation.xml @@ -22,35 +22,26 @@ android:id="@+id/navigation_group_home"> <item android:id="@+id/navigation_item_home" android:icon="@drawable/ic_home" - android:title="Home" - android:checked="true" /> + android:title="@string/navigation_item_title_home" /> <item android:id="@+id/navigation_item_favorites" android:icon="@drawable/ic_favorite_on" - android:title="Favorites" + android:title="@string/navigation_item_title_favorites" android:visible="false" /> <!-- hidden until wired up --> </group> + <group android:checkableBehavior="none" android:id="@+id/navigation_group_roots"> - <!-- TODO: Replace with dynamically created roots --> <item android:id="@+id/navigation_item_internal" android:icon="@drawable/ic_source_internal" - android:title="Local storage" /> + android:title="@string/navigation_item_title_local" /> <item android:id="@+id/navigation_item_root_d" android:icon="@drawable/ic_source_root_d" - android:title="Root directory" - android:visible="false" /> <!-- hidden until wired up --> - <item android:id="@+id/navigation_item_sd_card" - android:icon="@drawable/ic_source_sd_card" - android:title="SD card" - android:visible="false" /> <!-- hidden until wired up --> - <item android:id="@+id/navigation_item_usb" - android:icon="@drawable/ic_source_usb" - android:title="USB storage" - android:visible="false" /> <!-- hidden until wired up --> + android:title="@string/navigation_item_title_root" + android:visible="false" /> <item android:id="@+id/navigation_item_protected" android:icon="@drawable/ic_source_protected" - android:title="Protected storage" + android:title="@string/navigation_item_title_protected" android:orderInCategory="@integer/navigation_item_order_after_roots" android:visible="false" /> <!-- hidden until wired up --> </group> @@ -60,12 +51,12 @@ android:id="@+id/navigation_group_settings"> <item android:id="@+id/navigation_item_manage" android:icon="@drawable/ic_storage_sources" - android:title="Manage storage sources" + android:title="@string/navigation_item_title_manage" android:orderInCategory="@integer/navigation_item_order_after_roots" android:visible="false" /> <!-- hidden until wired up --> <item android:id="@+id/navigation_item_settings" android:icon="@drawable/ic_settings" - android:title="Settings" + android:title="@string/navigation_item_title_settings" android:orderInCategory="@integer/navigation_item_order_after_roots" /> </group> </menu> diff --git a/res/values/overlay.xml b/res/values/overlay.xml index d5a4807c..fb545f14 100644 --- a/res/values/overlay.xml +++ b/res/values/overlay.xml @@ -29,6 +29,9 @@ <!-- The virtual storage directory (virtual filesystem are listed here) --> <string name="virtual_storage_dir" translatable="false">/storage</string> + <!-- The internal (local) storage directory --> + <string name="local_storage_path" translatable="false">/storage/emulated/0</string> + <!-- The shell commands used by this application. All of this commands should exist to allow the use of a shell console (and access to root). If any of this commands are not present in the system, then app will start in diff --git a/res/values/strings.xml b/res/values/strings.xml index cdaf76cf..c8369ce5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -387,6 +387,21 @@ <!-- Bookmarks - Bookmarks - Actions - Bookmark already exists --> <string name="bookmarks_msgs_add_exists">The bookmark already exists.</string> + <!-- Navigation Drawer Item Titles - Home --> + <string name="navigation_item_title_home">Home</string> + <!-- Navigation Drawer Item Titles - Favorites --> + <string name="navigation_item_title_favorites">Favorites</string> + <!-- Navigation Drawer Item Titles - Local storage --> + <string name="navigation_item_title_local">Local storage</string> + <!-- Navigation Drawer Item Titles - Root directory --> + <string name="navigation_item_title_root">Root directory</string> + <!-- Navigation Drawer Item Titles - protected --> + <string name="navigation_item_title_protected">Protected storage</string> + <!-- Navigation Drawer Item Titles - Manage storage sources --> + <string name="navigation_item_title_manage">Manage storage sources</string> + <!-- Navigation Drawer Item Titles - Settings --> + <string name="navigation_item_title_settings">Settings</string> + <!-- Initial directory dialog title --> <string name="initial_directory_dialog_title">Initial folder</string> <!-- Initial directory label --> diff --git a/src/com/cyanogenmod/filemanager/activities/MainActivity.java b/src/com/cyanogenmod/filemanager/activities/MainActivity.java index 83d1936c..e1870227 100755 --- a/src/com/cyanogenmod/filemanager/activities/MainActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/MainActivity.java @@ -22,8 +22,6 @@ import android.app.Dialog; import android.app.FragmentTransaction; import android.content.Intent; import android.content.pm.PackageManager; -import android.content.res.ColorStateList; -import android.graphics.Color; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Bundle; @@ -33,7 +31,7 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarActivity; -import android.support.v7.widget.Toolbar; +import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.MenuItem; @@ -44,6 +42,7 @@ import android.view.WindowManager; import com.cyanogenmod.filemanager.FileManagerApplication; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.preferences.SettingsPreferences; +import com.cyanogenmod.filemanager.controllers.NavigationDrawerController; import com.cyanogenmod.filemanager.model.Bookmark; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.preferences.FileManagerSettings; @@ -53,6 +52,8 @@ import com.cyanogenmod.filemanager.ui.fragments.HomeFragment; import com.cyanogenmod.filemanager.ui.fragments.NavigationFragment; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; +import com.cyanogenmod.filemanager.util.StorageHelper; + import com.cyngn.uicommon.view.Snackbar; import java.io.File; @@ -127,21 +128,9 @@ public class MainActivity extends ActionBarActivity static String MIME_TYPE_LOCALIZED_NAMES[]; - int[][] color_states = new int[][] { - new int[] {android.R.attr.state_checked}, // checked - new int[0] // default - }; - - // TODO: Replace with legitimate colors per item. - int[] colors = new int[] { - R.color.favorites_primary, - Color.BLACK - }; - - private Toolbar mToolbar; private Fragment currentFragment; private DrawerLayout mDrawerLayout; - private NavigationView mNavigationDrawer; + private NavigationDrawerController mNavigationDrawerController; private boolean mPopBackStack = false; @@ -254,16 +243,15 @@ public class MainActivity extends ActionBarActivity private void finishOnCreate() { mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - mNavigationDrawer = (NavigationView) findViewById(R.id.navigation_view); - mNavigationDrawer.setNavigationItemSelectedListener(this); - ColorStateList colorStateList = new ColorStateList(color_states, colors); - // TODO: Figure out why the following doesn't work correctly... - mNavigationDrawer.setItemTextColor(colorStateList); - mNavigationDrawer.setItemIconTintList(colorStateList); + NavigationView navigationDrawer = (NavigationView) findViewById(R.id.navigation_view); + navigationDrawer.setNavigationItemSelectedListener(this); + mNavigationDrawerController = new NavigationDrawerController(this, navigationDrawer); + mNavigationDrawerController.loadNavigationDrawerItems(); MIME_TYPE_LOCALIZED_NAMES = MimeTypeCategory.getFriendlyLocalizedNames(this); showWelcomeMsg(); + setCurrentFragment(FragmentType.HOME); //Initialize nfc adapter @@ -339,6 +327,7 @@ public class MainActivity extends ActionBarActivity */ @Override public boolean onNavigationItemSelected(MenuItem menuItem) { + menuItem.setChecked(false); int id = menuItem.getItemId(); switch (id) { case R.id.navigation_item_home: @@ -351,19 +340,13 @@ public class MainActivity extends ActionBarActivity break; case R.id.navigation_item_internal: if (DEBUG) Log.d(TAG, "onNavigationItemSelected::navigation_item_favorites"); + getIntent().putExtra(EXTRA_NAVIGATE_TO, StorageHelper.getLocalStoragePath(this)); setCurrentFragment(FragmentType.NAVIGATION); break; case R.id.navigation_item_root_d: - // TODO: Implement this path if (DEBUG) Log.d(TAG, "onNavigationItemSelected::navigation_item_root_d"); - break; - case R.id.navigation_item_sd_card: - // TODO: Implement this path - if (DEBUG) Log.d(TAG, "onNavigationItemSelected::navigation_item_sd_card"); - break; - case R.id.navigation_item_usb: - // TODO: Implement this path - if (DEBUG) Log.d(TAG, "onNavigationItemSelected::navigation_item_usb"); + getIntent().putExtra(EXTRA_NAVIGATE_TO, FileHelper.ROOT_DIRECTORY); + setCurrentFragment(FragmentType.NAVIGATION); break; case R.id.navigation_item_protected: // TODO: Implement this path @@ -378,9 +361,17 @@ public class MainActivity extends ActionBarActivity openSettings(); break; default: - // TODO: Implement this path - if (DEBUG) Log.d(TAG, "onNavigationItemSelected::default"); - setCurrentFragment(FragmentType.NAVIGATION); // Temporary... + if (DEBUG) Log.d(TAG, String.format("onNavigationItemSelected::default (%d)", id)); + String path = null; + // Check for item id in storage bookmarks + Bookmark bookmark = mNavigationDrawerController.getBookmarkFromMenuItem(id); + if (bookmark != null) { + path = bookmark.getPath(); + } + + if (TextUtils.isEmpty(path)) { + return false; + } break; } mDrawerLayout.closeDrawers(); @@ -388,6 +379,19 @@ public class MainActivity extends ActionBarActivity } /** + * {@inheritDoc} + */ + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == INTENT_REQUEST_SETTINGS) { + // reset bookmarks list to default as the user could changed the + // root mode which changes the system bookmarks + mNavigationDrawerController.loadNavigationDrawerItems(); + return; + } + } + + /** * Method invoked when an action item is clicked. * * @param view The button pushed diff --git a/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java b/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java new file mode 100755 index 00000000..2a7bf612 --- /dev/null +++ b/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.filemanager.controllers; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.os.Environment; +import android.os.storage.StorageVolume; +import android.support.design.widget.NavigationView; +import android.text.TextUtils; +import android.util.Log; +import com.cyanogenmod.filemanager.FileManagerApplication; + +import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.model.Bookmark; +import com.cyanogenmod.filemanager.preferences.AccessMode; +import com.cyanogenmod.filemanager.util.StorageHelper; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE.SDCARD; +import static com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE.SECURE; +import static com.cyanogenmod.filemanager.model.Bookmark.BOOKMARK_TYPE.USB; + +/** + * NavigationDrawerController. This class is contains logic to add/remove and manage items in + * the NavigationDrawer which uses android support libraries NavigationView. + */ +public class NavigationDrawerController { + private static final String TAG = NavigationDrawerController.class.getSimpleName(); + private static boolean DEBUG = false; + + private static final String STR_USB = "usb"; // $NON-NLS-1$ + + int[][] color_states = new int[][] { + new int[] {android.R.attr.state_checked}, // checked + new int[0] // default + }; + + // TODO: Replace with legitimate colors per item. + int[] colors = new int[] { + R.color.favorites_primary, + Color.BLACK + }; + + private Context mCtx; + private NavigationView mNavigationDrawer; + private Map<Integer, Bookmark> mStorageBookmarks; + + public NavigationDrawerController(Context ctx, NavigationView navigationView) { + mCtx = ctx; + mNavigationDrawer = navigationView; + mStorageBookmarks = new HashMap<Integer, Bookmark>(); + + ColorStateList colorStateList = new ColorStateList(color_states, colors); + // TODO: Figure out why the following doesn't work correctly... + mNavigationDrawer.setItemTextColor(colorStateList); + mNavigationDrawer.setItemIconTintList(colorStateList); + } + + public void loadNavigationDrawerItems() { + // clear current special nav drawer items + removeAllDynamicMenuItemsFromDrawer(); + + // Show/hide root + boolean showRoot = FileManagerApplication.getAccessMode().compareTo(AccessMode.SAFE) != 0; + mNavigationDrawer.getMenu().findItem(R.id.navigation_item_root_d).setVisible(showRoot); + + loadExternalStorageItems(); + } + + /** + * Method that loads the secure digital card and usb storage menu items from the system. + * + * @return List<MenuItem> The storage items to be displayed + */ + private void loadExternalStorageItems() { + List<Bookmark> sdBookmarks = new ArrayList<Bookmark>(); + List<Bookmark> usbBookmarks = new ArrayList<Bookmark>(); + + try { + // Recovery sdcards and usb from storage manager + StorageVolume[] volumes = + StorageHelper.getStorageVolumes(mCtx, true); + for (StorageVolume volume: volumes) { + if (volume != null) { + String mountedState = volume.getState(); + String path = volume.getPath(); + if (!Environment.MEDIA_MOUNTED.equalsIgnoreCase(mountedState) && + !Environment.MEDIA_MOUNTED_READ_ONLY.equalsIgnoreCase(mountedState)) { + if (DEBUG) { + Log.w(TAG, "Ignoring '" + path + "' with state of '" + + mountedState + "'"); + } + continue; + } + if (!TextUtils.isEmpty(path)) { + String lowerPath = path.toLowerCase(Locale.ROOT); + Bookmark bookmark; + if (lowerPath.contains(STR_USB)) { + usbBookmarks.add(new Bookmark(USB, StorageHelper + .getStorageVolumeDescription(mCtx, + volume), path)); + } else { + sdBookmarks.add(new Bookmark(SDCARD, StorageHelper + .getStorageVolumeDescription(mCtx, + volume), path)); + } + } + } + } + + String localStorage = mCtx.getResources().getString(R.string.local_storage_path); + + // Load the bookmarks + for (Bookmark b : sdBookmarks) { + if (TextUtils.equals(b.getPath(), localStorage)) continue; + int hash = b.hashCode(); + addMenuItemToDrawer(hash, b.getName(), R.drawable.ic_sdcard_drawable); + mStorageBookmarks.put(hash, b); + } + for (Bookmark b : usbBookmarks) { + int hash = b.hashCode(); + addMenuItemToDrawer(hash, b.getName(), R.drawable.ic_usb_drawable); + mStorageBookmarks.put(hash, b); + } + } + catch (Throwable ex) { + Log.e(TAG, "Load filesystem bookmarks failed", ex); //$NON-NLS-1$ + } + } + + private void addMenuItemToDrawer(int hash, String title, int iconDrawable) { + if (mNavigationDrawer.getMenu().findItem(hash) == null) { + mNavigationDrawer.getMenu() + .add(R.id.navigation_group_roots, hash, 0, title) + .setIcon(iconDrawable); + } + } + + public void removeMenuItemFromDrawer(int hash) { + mNavigationDrawer.getMenu().removeItem(hash); + } + + public void removeAllDynamicMenuItemsFromDrawer() { + for (int key : mStorageBookmarks.keySet()) { + removeMenuItemFromDrawer(key); + mStorageBookmarks.remove(key); + } + } + + public Bookmark getBookmarkFromMenuItem(int key) { + return mStorageBookmarks.get(key); + } +} diff --git a/src/com/cyanogenmod/filemanager/model/Bookmark.java b/src/com/cyanogenmod/filemanager/model/Bookmark.java index f922a602..a6262d35 100644 --- a/src/com/cyanogenmod/filemanager/model/Bookmark.java +++ b/src/com/cyanogenmod/filemanager/model/Bookmark.java @@ -261,4 +261,11 @@ public class Bookmark implements Serializable, Comparable<Bookmark>, Parcelable ", path=" + this.mPath + "]"; //$NON-NLS-1$//$NON-NLS-2$ } + public String getName() { + return mName; + } + + public String getPath() { + return mPath; + } } diff --git a/src/com/cyanogenmod/filemanager/util/StorageHelper.java b/src/com/cyanogenmod/filemanager/util/StorageHelper.java index ed07fd5e..a1f4b581 100644 --- a/src/com/cyanogenmod/filemanager/util/StorageHelper.java +++ b/src/com/cyanogenmod/filemanager/util/StorageHelper.java @@ -186,4 +186,14 @@ public final class StorageHelper { return null; } + public static String getLocalStoragePath(Context ctx) { + String path = null; + StorageVolume[] volumes = + StorageHelper.getStorageVolumes(ctx, false); + if (volumes != null && volumes.length > 0) { + //Ensure that initial directory is an absolute directory + path = FileHelper.getAbsPath(volumes[0].getPath()); + } + return path; + } } |