aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard MacGregor <rmacgregor@cyngn.com>2015-07-02 18:41:38 -0700
committerSteve Kondik <steve@cyngn.com>2016-11-02 18:17:55 -0700
commitb936925b2e176aba9f7a2d917d22d9ad45d966de (patch)
tree20b026d45c7dda6edf1626df7b61566ecbe70ac9
parent1b5cca923058fa4f87a32f991582fc596121ab16 (diff)
downloadandroid_packages_apps_CMFileManager-b936925b2e176aba9f7a2d917d22d9ad45d966de.tar.gz
android_packages_apps_CMFileManager-b936925b2e176aba9f7a2d917d22d9ad45d966de.tar.bz2
android_packages_apps_CMFileManager-b936925b2e176aba9f7a2d917d22d9ad45d966de.zip
Fix onBack behavior
- Fix onback behavior for cloudstorage browsing. - Fix onback behavior for fragments - Fix onback behavior for protected storage (failed/aborted login) Change-Id: I6fd8aba3717f91f250c30a9f8a78c1ea44fa81f7
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/activities/MainActivity.java85
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/controllers/NavigationDrawerController.java26
-rw-r--r--src/com/cyanogenmod/filemanager/ui/fragments/NavigationFragment.java21
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java44
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