diff options
Diffstat (limited to 'src/com/cyanogenmod')
4 files changed, 142 insertions, 34 deletions
diff --git a/src/com/cyanogenmod/filemanager/activities/MainActivity.java b/src/com/cyanogenmod/filemanager/activities/MainActivity.java index 19e8b3ca..25e0017c 100755 --- a/src/com/cyanogenmod/filemanager/activities/MainActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/MainActivity.java @@ -31,6 +31,7 @@ import android.provider.Settings; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentManager.OnBackStackChangedListener; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarActivity; import android.text.TextUtils; @@ -56,6 +57,7 @@ import com.cyanogenmod.filemanager.preferences.Preferences; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.fragments.HomeFragment; import com.cyanogenmod.filemanager.ui.fragments.NavigationFragment; +import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnBackRequestListener; import com.cyanogenmod.filemanager.util.DialogHelper; import com.cyanogenmod.filemanager.util.FileHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; @@ -68,6 +70,9 @@ import java.io.InvalidClassException; import java.util.ArrayList; import java.util.List; +import static com.cyanogenmod.filemanager.controllers.NavigationDrawerController + .NAVIGATION_DRAWER_HOME; + /** * The main navigation activity. This activity is the center of the application. * From this the user can navigate, search, make actions.<br/> @@ -81,7 +86,7 @@ import java.util.List; * the app is killed, is restarted from his initial state. */ public class MainActivity extends ActionBarActivity - implements OnItemClickListener { + implements OnItemClickListener, OnBackRequestListener { private static final String TAG = MainActivity.class.getSimpleName(); @@ -258,6 +263,16 @@ public class MainActivity extends ActionBarActivity showWelcomeMsg(); + //FragmentManager.OnBackStackChangedListener + getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() { + @Override + public void onBackStackChanged() { + updateCurrentFragment(); + if (isCurrentFragment(FragmentType.HOME)) { + mNavigationDrawerController.setSelected(NAVIGATION_DRAWER_HOME); + } + } + }); setCurrentFragment(FragmentType.HOME); //Initialize nfc adapter @@ -291,26 +306,56 @@ public class MainActivity extends ActionBarActivity private void setCurrentFragment(FragmentType fragmentType) { FragmentManager fragmentManager = getSupportFragmentManager(); + String fragmentTag = null; switch (fragmentType) { case NAVIGATION: mPopBackStack = false; currentFragment = new NavigationFragment(); + ((NavigationFragment)currentFragment) + .setOnBackRequestListener(this); + fragmentTag = fragmentType.name(); break; case HOME: default: mPopBackStack = false; currentFragment = HomeFragment.newInstance(); + fragmentTag = fragmentType.name(); + mNavigationDrawerController.setSelected(NAVIGATION_DRAWER_HOME); break; } fragmentManager.beginTransaction() - .replace(R.id.navigation_fragment_container, currentFragment) + .replace(R.id.navigation_fragment_container, currentFragment, fragmentTag) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) - .addToBackStack(null) + .addToBackStack(fragmentTag) .commit(); } + private void updateCurrentFragment() { + for (FragmentType type : FragmentType.values()) { + Fragment fragment = getSupportFragmentManager().findFragmentByTag(type.name()); + if (fragment != null && fragment.isVisible()) { + currentFragment = fragment; + } + } + } + + private boolean isCurrentFragment(FragmentType fragmentType) { + Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentType.name()); + return (fragment != null && fragment.isVisible()); + } + + public void navigateToPath(String path) { + if (isCurrentFragment(FragmentType.NAVIGATION)) { + NavigationFragment fragment = (NavigationFragment) currentFragment; + fragment.getCurrentNavigationView().changeCurrentDir(path, true); + } else { + getIntent().putExtra(EXTRA_NAVIGATE_TO, path); + setCurrentFragment(FragmentType.NAVIGATION); + } + } + public void addBookmark(Bookmark bookmark) { // stub } @@ -319,7 +364,6 @@ public class MainActivity extends ActionBarActivity // stub } - /** * {@inheritDoc} */ @@ -353,13 +397,11 @@ 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); + navigateToPath(StorageHelper.getLocalStoragePath(this)); break; case R.id.navigation_item_root_d: if (DEBUG) Log.d(TAG, "onNavigationItemSelected::navigation_item_root_d"); - getIntent().putExtra(EXTRA_NAVIGATE_TO, FileHelper.ROOT_DIRECTORY); - setCurrentFragment(FragmentType.NAVIGATION); + navigateToPath(FileHelper.ROOT_DIRECTORY); break; case R.id.navigation_item_manage: // TODO: Implement this path @@ -380,7 +422,10 @@ public class MainActivity extends ActionBarActivity path = bookmark.getPath(); } - if (TextUtils.isEmpty(path)) { + if (!TextUtils.isEmpty(path)) { + // Check for item id in remote roots + navigateToPath(path); + } else { return; } break; @@ -552,4 +597,26 @@ public class MainActivity extends ActionBarActivity return false; } } + + @Override + public void onBackPressed() { + if (mDrawerLayout.isDrawerOpen(Gravity.START)) { + mDrawerLayout.closeDrawer(Gravity.START); + return; + } + if (currentFragment instanceof NavigationFragment) { + if (((NavigationFragment)currentFragment).back()) { + return; + } + } + if (getSupportFragmentManager().getBackStackEntryCount() == 1) { + finish(); + } + super.onBackPressed(); + } + + @Override + public void onBackRequested() { + onBackPressed(); + } } diff --git a/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java b/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java index 14381de7..c69446b6 100755 --- a/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java +++ b/src/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java @@ -61,6 +61,8 @@ public class NavigationDrawerController { private static final String STR_USB = "usb"; // $NON-NLS-1$ + public static final int NAVIGATION_DRAWER_HOME = 1; + private Context mCtx; private NavigationView mNavigationDrawer; private NavigationDrawerAdapter mAdapter; @@ -75,7 +77,7 @@ public class NavigationDrawerController { mStorageBookmarks = new HashMap<Integer, Bookmark>(); mNavigationDrawerItemList = new ArrayList<NavigationDrawerItem>(); mLastRoot = 0; - mCurrentSelection = -1; + mCurrentSelection = NAVIGATION_DRAWER_HOME; ListView listView = (ListView)mNavigationDrawer.findViewById(R.id.navigation_view_listview); listView.setOnItemClickListener(((MainActivity)mCtx)); mAdapter = new NavigationDrawerAdapter(mCtx, mNavigationDrawerItemList); @@ -158,7 +160,7 @@ public class NavigationDrawerController { NavigationDrawerItemType.SINGLE, title, summary, R.drawable.ic_settings, color)); // Notify dataset changed here because we aren't sure when/if storage providers will return. - mAdapter.notifyDataSetChanged(); + updateDataSet(); } @@ -251,6 +253,18 @@ public class NavigationDrawerController { } } + private void updateDataSet() { + if (mCurrentSelection > 0 && mCurrentSelection < mNavigationDrawerItemList.size()) { + NavigationDrawerItem item = mNavigationDrawerItemList.get(mCurrentSelection); + NavigationDrawerItemType type = item.getType(); + if (type != NavigationDrawerItemType.DIVIDER && + type != NavigationDrawerItemType.HEADER) { + item.setSelected(true); + } + } + mAdapter.notifyDataSetChanged(); + } + public void removeAllItemsFromDrawer() { // reset menu list mNavigationDrawerItemList.clear(); @@ -270,13 +284,7 @@ public class NavigationDrawerController { item.setSelected(false); } - // Set new selection - if (position > 0 && position < mNavigationDrawerItemList.size()) { - NavigationDrawerItem item = mNavigationDrawerItemList.get(position); - item.setSelected(true); - } - mCurrentSelection = position; - mAdapter.notifyDataSetChanged(); + updateDataSet(); } } diff --git a/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java b/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java index 5e2d364e..fbd063db 100644 --- a/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java +++ b/src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java @@ -116,6 +116,7 @@ import com.cyanogenmod.filemanager.ui.widgets.Breadcrumb; import com.cyanogenmod.filemanager.ui.widgets.ButtonItem; import com.cyanogenmod.filemanager.ui.widgets.NavigationCustomTitleView; import com.cyanogenmod.filemanager.ui.widgets.NavigationView; +import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnBackRequestListener; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationRequestMenuListener; import com.cyanogenmod.filemanager.ui.widgets.NavigationView.OnNavigationSelectionChangedListener; import com.cyanogenmod.filemanager.ui.widgets.SelectionView; @@ -227,6 +228,7 @@ public class NavigationFragment extends Fragment private View mTitleLayout; private View mStatusBar; + private OnBackRequestListener mOnBackRequestListener; private final BroadcastReceiver mNotificationReceiver = new BroadcastReceiver() { @Override @@ -1480,6 +1482,7 @@ public class NavigationFragment extends Fragment //- 0 this.mNavigationViews[0] = (NavigationView) mView.findViewById(R.id.navigation_view); this.mNavigationViews[0].setId(0); + this.mNavigationViews[0].setOnBackRequestListener(mOnBackRequestListener); } /** @@ -2129,14 +2132,6 @@ public class NavigationFragment extends Fragment this.mHistory.remove(i); } - if (mDrawerHistory.getChildCount() == 0) { - mDrawerHistoryEmpty.setVisibility(View.VISIBLE); - } - - //Navigate - final boolean clearHistory = - mHistoryTab.isSelected() && mHistorySaved.size() > 0; - mClearHistory.setVisibility(clearHistory ? View.VISIBLE : View.GONE); return true; } catch (Throwable ex) { @@ -2197,7 +2192,6 @@ public class NavigationFragment extends Fragment } //Nothing to apply - mClearHistory.setVisibility(View.GONE); return false; } @@ -2648,4 +2642,13 @@ public class NavigationFragment extends Fragment return mDescription; } } + + /* + * Method that sets the listener for back requests + * + * @param onBackRequestListener The listener reference + */ + public void setOnBackRequestListener(OnBackRequestListener onBackRequestListener) { + mOnBackRequestListener = onBackRequestListener; + } } diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java index 95141ac0..a33f03ca 100755 --- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java +++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java @@ -141,6 +141,17 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe } /** + * An interface to communicate a request to go back to previous view + */ + public interface OnBackRequestListener { + /** + * Method invoked when a back (previous view) is requested + * + */ + void onBackRequested(); + } + + /** * The navigation view mode * @hide */ @@ -315,11 +326,6 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe } if (ex instanceof CancelledOperationException || ex instanceof AuthenticationFailedException) { - if (TextUtils.isEmpty(mCurrentDir)) { - // If currentDir isn't set, load default - // This is local storage or root depending on mode - mCurrentDir = FileHelper.ROOT_DIRECTORY; - } return null; } @@ -394,8 +400,20 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe // Do animation fadeEfect(false); } else { - // Reload current directory - changeCurrentDir(mCurrentDir); + if (TextUtils.isEmpty(mCurrentDir)) { + if (mOnBackRequestListener != null) { + // Go back to previous view + post(new Runnable() { + @Override + public void run() { + mOnBackRequestListener.onBackRequested(); + } + }); + } + } else { + // Reload current directory + changeCurrentDir(mCurrentDir); + } } } @@ -436,6 +454,7 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe private OnNavigationRequestMenuListener mOnNavigationRequestMenuListener; private OnFilePickedListener mOnFilePickedListener; private OnDirectoryChangedListener mOnDirectoryChangedListener; + private OnBackRequestListener mOnBackRequestListener; private boolean mChRooted; @@ -734,6 +753,17 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe } /** + * Method that sets the listener for back requests + * + * @param onBackRequestListener The listener reference + */ + public void setOnBackRequestListener( + OnBackRequestListener onBackRequestListener) { + this.mOnBackRequestListener = onBackRequestListener; + } + + + /** * Method that sets if the view should use flinger gesture detection. * * @param useFlinger If the view should use flinger gesture detection |