aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard MacGregor <rmacgregor@cyngn.com>2015-06-25 12:45:17 -0700
committerSteve Kondik <steve@cyngn.com>2016-11-02 17:46:15 -0700
commit7eca05f3da4975683d93cd2c07d19021e2e60e93 (patch)
tree1ae3d618749d3ef750ef09173d2b2e068eb8e5c0
parent2250ae7ee5e8ce66503359ccccd66ea7d1eb0013 (diff)
downloadandroid_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.xml27
-rw-r--r--res/values/overlay.xml3
-rw-r--r--res/values/strings.xml15
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/activities/MainActivity.java72
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java174
-rw-r--r--src/com/cyanogenmod/filemanager/model/Bookmark.java7
-rw-r--r--src/com/cyanogenmod/filemanager/util/StorageHelper.java10
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;
+ }
}