浏览代码

Merge pull request #11192 from nextcloud/fix/browseup-wrong-title

Reset search when browsing to a folder from the favorites list
Álvaro Brey 2 年之前
父节点
当前提交
a264730116

+ 103 - 7
app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt

@@ -23,22 +23,31 @@ package com.nextcloud.client
 
 import android.app.Activity
 import androidx.test.espresso.Espresso
-import androidx.test.espresso.action.ViewActions
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
 import androidx.test.espresso.contrib.DrawerActions
 import androidx.test.espresso.contrib.NavigationViewActions
+import androidx.test.espresso.contrib.RecyclerViewActions
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.espresso.matcher.ViewMatchers
+import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
+import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
 import androidx.test.platform.app.InstrumentationRegistry
 import com.nextcloud.test.RetryTestRule
 import com.owncloud.android.AbstractOnServerIT
 import com.owncloud.android.R
 import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation
 import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation
+import com.owncloud.android.lib.resources.files.ToggleFavoriteRemoteOperation
 import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation
 import com.owncloud.android.lib.resources.shares.OCShare
 import com.owncloud.android.lib.resources.shares.ShareType
 import com.owncloud.android.operations.CreateFolderOperation
 import com.owncloud.android.ui.activity.FileDisplayActivity
+import com.owncloud.android.ui.adapter.OCFileListItemViewHolder
 import org.junit.Assert
 import org.junit.Rule
 import org.junit.Test
@@ -120,10 +129,10 @@ class FileDisplayActivityIT : AbstractOnServerIT() {
         InstrumentationRegistry.getInstrumentation().waitForIdleSync()
 
         // open drawer
-        Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
 
         // click "shared"
-        Espresso.onView(ViewMatchers.withId(R.id.nav_view))
+        onView(withId(R.id.nav_view))
             .perform(NavigationViewActions.navigateTo(R.id.nav_shared))
         shortSleep()
         shortSleep()
@@ -148,10 +157,10 @@ class FileDisplayActivityIT : AbstractOnServerIT() {
         Assert.assertEquals(storageManager.getFileByPath("/test/"), sut.currentDir)
 
         // open drawer
-        Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
 
         // click "all files"
-        Espresso.onView(ViewMatchers.withId(R.id.nav_view))
+        onView(withId(R.id.nav_view))
             .perform(NavigationViewActions.navigateTo(R.id.nav_all_files))
 
         // then should be in root again
@@ -159,6 +168,93 @@ class FileDisplayActivityIT : AbstractOnServerIT() {
         Assert.assertEquals(storageManager.getFileByPath("/"), sut.currentDir)
     }
 
+    @Test
+    fun checkToolbarTitleOnNavigation() {
+        // Create folder structure
+        val topFolder = "folder1"
+        val childFolder = "folder2"
+
+        CreateFolderOperation("/$topFolder/", user, targetContext, storageManager)
+            .execute(client)
+
+        CreateFolderOperation("/$topFolder/$childFolder/", user, targetContext, storageManager)
+            .execute(client)
+
+        activityRule.launchActivity(null)
+
+        shortSleep()
+
+        // go into "foo"
+        onView(withText(topFolder)).perform(click())
+        shortSleep()
+
+        // check title is right
+        checkToolbarTitle(topFolder)
+
+        // go into "bar"
+        onView(withText(childFolder)).perform(click())
+        shortSleep()
+
+        // check title is right
+        checkToolbarTitle(childFolder)
+
+        // browse back up, we should be back in "foo"
+        Espresso.pressBack()
+        shortSleep()
+
+        // check title is right
+        checkToolbarTitle(topFolder)
+    }
+
+    private fun checkToolbarTitle(childFolder: String) {
+        onView(withId(R.id.appbar)).check(
+            matches(
+                hasDescendant(
+                    withText(childFolder)
+                )
+            )
+        )
+    }
+
+    @Test
+    fun browseFavoriteAndBack() {
+        // Create folder structure
+        val topFolder = "folder1"
+
+        CreateFolderOperation("/$topFolder/", user, targetContext, storageManager)
+            .execute(client)
+        ToggleFavoriteRemoteOperation(true, "/$topFolder/")
+            .execute(client)
+
+        val sut = activityRule.launchActivity(null)
+
+        // navigate to favorites
+        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        onView(withId(R.id.nav_view))
+            .perform(NavigationViewActions.navigateTo(R.id.nav_favorites))
+        shortSleep()
+
+        // check sort button is not shown, favorites are not sortable
+        onView(withId(R.id.sort_button)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
+
+        // browse into folder
+        onView(withId(R.id.list_root)).perform(
+            RecyclerViewActions.actionOnItemAtPosition<OCFileListItemViewHolder>(
+                0,
+                click()
+            )
+        )
+        shortSleep()
+        checkToolbarTitle(topFolder)
+        // sort button should now be visible
+        onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed()))
+
+        // browse back, should be back to All Files
+        Espresso.pressBack()
+        checkToolbarTitle(sut.getString(R.string.app_name))
+        onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed()))
+    }
+
     @Test
     fun switchToGridView() {
         activityRule.launchActivity(null)
@@ -167,12 +263,12 @@ class FileDisplayActivityIT : AbstractOnServerIT() {
                 .execute(client)
                 .isSuccess
         )
-        Espresso.onView(ViewMatchers.withId(R.id.switch_grid_view_button)).perform(ViewActions.click())
+        onView(withId(R.id.switch_grid_view_button)).perform(click())
     }
 
     @Test
     fun openAccountSwitcher() {
         activityRule.launchActivity(null)
-        Espresso.onView(ViewMatchers.withId(R.id.switch_account_button)).perform(ViewActions.click())
+        onView(withId(R.id.switch_account_button)).perform(click())
     }
 }

+ 0 - 1
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -1091,7 +1091,6 @@ public class FileDisplayActivity extends FileActivity
                 showSortListGroup(true);
                 resetTitleBarAndScrolling();
                 setDrawerAllFiles();
-                EventBus.getDefault().post(new ChangeMenuEvent()); // for OCFileListFragment to update sort menu
             }
         } else if (leftFragment instanceof PreviewTextStringFragment) {
             createMinFragments(null);

+ 45 - 20
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -826,6 +826,14 @@ public class OCFileListFragment extends ExtendedListFragment implements
             mOriginalMenuItems.add(menu.findItem(R.id.action_search));
         }
 
+        if(menuItemAddRemoveValue == MenuItemAddRemove.REMOVE_GRID_AND_SORT){
+            menu.removeItem(R.id.action_search);
+        }
+
+        updateSortAndGridMenuItems();
+    }
+
+    private void updateSortAndGridMenuItems() {
         switch (menuItemAddRemoveValue) {
             case ADD_GRID_AND_SORT_WITH_SEARCH:
                 mSwitchGridViewButton.setVisibility(View.VISIBLE);
@@ -837,7 +845,6 @@ public class OCFileListFragment extends ExtendedListFragment implements
                 break;
 
             case REMOVE_GRID_AND_SORT:
-                menu.removeItem(R.id.action_search);
                 mSortButton.setVisibility(View.GONE);
                 mSwitchGridViewButton.setVisibility(View.GONE);
                 break;
@@ -851,10 +858,10 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
     /**
      * Call this, when the user presses the up button.
-     *
-     * Tries to move up the current folder one level. If the parent folder was removed from the
-     * database, it continues browsing up until finding an existing folders.
-     *
+     * <p>
+     * Tries to move up the current folder one level. If the parent folder was removed from the database, it continues
+     * browsing up until finding an existing folders.
+     * <p>
      * return       Count of folder levels browsed up.
      */
     public int onBrowseUp() {
@@ -972,11 +979,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                                               R.string.copy_move_to_encrypted_folder_not_supported,
                                               Snackbar.LENGTH_LONG).show();
                             } else {
-                                listDirectory(file, MainApp.isOnlyOnDevice(), false);
-                                // then, notify parent activity to let it update its state and view
-                                mContainerActivity.onBrowsedDownTo(file);
-                                // save index and top position
-                                saveIndexAndTopPosition(position);
+                                browseToFolder(file, position);
                             }
                         } else {
                             Log_OC.d(TAG, "no public key for " + user.getAccountName());
@@ -994,11 +997,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                         // update state and view of this fragment
                         searchFragment = false;
                         setEmptyListLoadingMessage();
-                        listDirectory(file, MainApp.isOnlyOnDevice(), false);
-                        // then, notify parent activity to let it update its state and view
-                        mContainerActivity.onBrowsedDownTo(file);
-                        // save index and top position
-                        saveIndexAndTopPosition(position);
+                        browseToFolder(file, position);
                     }
 
                 } else if (mFileSelectable) {
@@ -1064,12 +1063,28 @@ public class OCFileListFragment extends ExtendedListFragment implements
                         }
                     }
                 }
-        } else {
+            } else {
                 Log_OC.d(TAG, "Null object in ListAdapter!");
             }
         }
     }
 
+    private void browseToFolder(OCFile file, int position) {
+        resetSearchIfBrowsingFromFavorites();
+        listDirectory(file, MainApp.isOnlyOnDevice(), false);
+        // then, notify parent activity to let it update its state and view
+        mContainerActivity.onBrowsedDownTo(file);
+        // save index and top position
+        saveIndexAndTopPosition(position);
+    }
+
+    private void resetSearchIfBrowsingFromFavorites() {
+        if (currentSearchType == FAVORITE_SEARCH) {
+            resetSearchAttributes();
+            resetMenuItems();
+        }
+    }
+
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == SETUP_ENCRYPTION_REQUEST_CODE &&
@@ -1330,6 +1345,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                 } else if (previousDirectory == null || !previousDirectory.equals(directory)) {
                     getRecyclerView().scrollToPosition(0);
                 }
+
             }
         } else if (isSearchEventSet(searchEvent)) {
             handleSearchEvent(searchEvent);
@@ -1531,11 +1547,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onMessageEvent(ChangeMenuEvent changeMenuEvent) {
-        searchFragment = false;
-        searchEvent = null;
-        currentSearchType = SearchType.NO_SEARCH;
+        resetSearchAttributes();
 
-        menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH;
+        resetMenuItems();
         Activity activity = getActivity();
         if (activity != null) {
             activity.invalidateOptionsMenu();
@@ -1556,6 +1570,17 @@ public class OCFileListFragment extends ExtendedListFragment implements
         setFabVisible(true);
     }
 
+    private void resetMenuItems() {
+        menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH;
+        updateSortAndGridMenuItems();
+    }
+
+    private void resetSearchAttributes() {
+        searchFragment = false;
+        searchEvent = null;
+        currentSearchType = SearchType.NO_SEARCH;
+    }
+
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onMessageEvent(CommentsEvent event) {
         mAdapter.refreshCommentsCount(event.remoteId);