Selaa lähdekoodia

Merge pull request #10009 from nextcloud/fix/dark-mode-scroll

Fix several scrolling bugs
Álvaro Brey 3 vuotta sitten
vanhempi
commit
23a72722d3

+ 11 - 6
app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityScreenshotIT.kt

@@ -53,12 +53,14 @@ class FileDisplayActivityScreenshotIT : AbstractIT() {
     @ScreenshotTest
     fun open() {
         val sut = activityRule.launchActivity(null)
-        sut.listOfFilesFragment!!.setFabEnabled(false)
+
+        shortSleep()
         sut.runOnUiThread {
+            sut.listOfFilesFragment!!.setFabEnabled(false)
+            sut.resetScrolling()
             sut.listOfFilesFragment!!.setEmptyListLoadingMessage()
             sut.listOfFilesFragment!!.isLoading = false
         }
-
         shortSleep()
         waitForIdleSync()
         screenshot(sut)
@@ -103,13 +105,16 @@ class FileDisplayActivityScreenshotIT : AbstractIT() {
     fun drawer() {
         val sut = activityRule.launchActivity(null)
         Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
-        sut.listOfFilesFragment!!.setFabEnabled(false)
-        sut.listOfFilesFragment!!.setEmptyListLoadingMessage()
-        sut.listOfFilesFragment!!.isLoading = false
+
+        shortSleep()
         sut.runOnUiThread {
             sut.hideInfoBox()
+            sut.resetScrolling()
+            sut.listOfFilesFragment!!.setFabEnabled(false)
+            sut.listOfFilesFragment!!.setEmptyListLoadingMessage()
+            sut.listOfFilesFragment!!.isLoading = false
         }
-
+        shortSleep()
         waitForIdleSync()
         screenshot(sut)
     }

+ 43 - 16
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -135,6 +135,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.widget.SearchView;
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
@@ -514,7 +515,7 @@ public class FileDisplayActivity extends FileActivity
         transaction.replace(R.id.left_fragment_container, fragment, TAG_LIST_OF_FILES);
         transaction.commit();
 
-        if (fragment instanceof UnifiedSearchFragment) {
+        if (fragment instanceof UnifiedSearchFragment || fragment instanceof PreviewMediaFragment) {
             showSortListGroup(false);
         } else {
             showSortListGroup(true);
@@ -542,8 +543,7 @@ public class FileDisplayActivity extends FileActivity
 
     protected void resetTitleBarAndScrolling() {
         updateActionBarTitleAndHomeButton(null);
-        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) findViewById(R.id.root_layout).getLayoutParams();
-        params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
+        resetScrolling();
     }
 
     public void updateListOfFilesFragment(boolean fromSearch) {
@@ -1019,8 +1019,7 @@ public class FileDisplayActivity extends FileActivity
             createMinFragments(null);
         } else {
             // pop back
-            ((CoordinatorLayout.LayoutParams) binding.rootLayout.getLayoutParams())
-                .setBehavior(new AppBarLayout.ScrollingViewBehavior());
+            resetScrolling();
             hideSearchView(getCurrentDir());
             showSortListGroup(true);
             super.onBackPressed();
@@ -1264,9 +1263,19 @@ public class FileDisplayActivity extends FileActivity
                         DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT));
 
                         Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress);
+
+
                         OCFileListFragment ocFileListFragment = getListOfFilesFragment();
                         if (ocFileListFragment != null) {
                             ocFileListFragment.setLoading(mSyncInProgress);
+                            if (!mSyncInProgress && !ocFileListFragment.isLoading()) {
+                                // update scrolling when load finishes
+                                if (ocFileListFragment.isEmpty()) {
+                                    lockScrolling();
+                                } else {
+                                    resetScrolling();
+                                }
+                            }
                         }
                         setBackgroundText();
                     }
@@ -1505,7 +1514,7 @@ public class FileDisplayActivity extends FileActivity
     public void showDetails(OCFile file, int activeTab) {
         User currentUser = getUser().orElseThrow(RuntimeException::new);
 
-        resetHeaderScrollingState();
+        resetScrolling();
 
         setFile(file);
         Fragment detailFragment = FileDetailFragment.newInstance(file, currentUser, activeTab);
@@ -1515,14 +1524,33 @@ public class FileDisplayActivity extends FileActivity
         mDrawerToggle.setDrawerIndicatorEnabled(false);
     }
 
-    private void resetHeaderScrollingState() {
-        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) findViewById(R.id.root_layout).getLayoutParams();
-        params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
-        AppBarLayout appBarLayout = findViewById(R.id.appbar);
+    /**
+     * Prevents content scrolling and toolbar collapse
+     */
+    @VisibleForTesting
+    public void lockScrolling() {
+        final CoordinatorLayout.LayoutParams coordinatorParams = (CoordinatorLayout.LayoutParams) binding.rootLayout.getLayoutParams();
+        coordinatorParams.setBehavior(null);
+        binding.rootLayout.setLayoutParams(coordinatorParams);
+        binding.rootLayout.setNestedScrollingEnabled(false);
+        final AppBarLayout.LayoutParams appbarParams = (AppBarLayout.LayoutParams) binding.appbar.toolbarFrame.getLayoutParams();
+        appbarParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL);
+        binding.appbar.toolbarFrame.setLayoutParams(appbarParams);
+        binding.appbar.appbar.setExpanded(true, false);
+    }
 
-        if (appBarLayout != null) {
-            appBarLayout.setExpanded(true);
-        }
+    /**
+     * Resets content scrolling and toolbar collapse
+     */
+    @VisibleForTesting
+    public void resetScrolling() {
+        final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) binding.rootLayout.getLayoutParams();
+        params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
+        binding.rootLayout.setLayoutParams(params);
+        AppBarLayout.LayoutParams appbarParams = (AppBarLayout.LayoutParams) binding.appbar.toolbarFrame.getLayoutParams();
+        appbarParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
+        binding.appbar.toolbarFrame.setLayoutParams(appbarParams);
+        binding.appbar.appbar.setExpanded(true, false);
     }
 
     @Override
@@ -2077,10 +2105,9 @@ public class FileDisplayActivity extends FileActivity
             return; // not reachable under normal conditions
         }
         if (showPreview && file.isDown() && !file.isDownloading() || streamMedia) {
-            showSortListGroup(false);
+            configureToolbarForMediaPreview(file);
             Fragment mediaFragment = PreviewMediaFragment.newInstance(file, user.get(), startPlaybackPosition, autoplay);
             setLeftFragment(mediaFragment);
-            configureToolbarForMediaPreview(file);
         } else {
             Intent previewIntent = new Intent();
             previewIntent.putExtra(EXTRA_FILE, file);
@@ -2095,7 +2122,7 @@ public class FileDisplayActivity extends FileActivity
 
     public void configureToolbarForMediaPreview(OCFile file) {
         showSortListGroup(false);
-        ((CoordinatorLayout.LayoutParams) binding.rootLayout.getLayoutParams()).setBehavior(null);
+        lockScrolling();
         super.updateActionBarTitleAndHomeButton(file);
     }
 

+ 4 - 0
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -1843,4 +1843,8 @@ public class OCFileListFragment extends ExtendedListFragment implements
             }
         }
     }
+
+    public boolean isEmpty(){
+        return  mAdapter == null || mAdapter.isEmpty();
+    }
 }

+ 8 - 7
app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -185,10 +185,6 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
 
         emptyListView = binding.emptyView.emptyListView;
 
-        if(getActivity() instanceof FileDisplayActivity){
-            ((FileDisplayActivity) getActivity()).configureToolbarForMediaPreview(getFile());
-        }
-
         setLoadingView();
         return view;
     }
@@ -580,6 +576,9 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
     public void onResume() {
         super.onResume();
         autoplay = false;
+        if(getActivity() instanceof FileDisplayActivity){
+            ((FileDisplayActivity) getActivity()).configureToolbarForMediaPreview(getFile());
+        }
         Log_OC.v(TAG, "onResume");
     }
 
@@ -703,9 +702,11 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
 
     @Override
     public void onDetach() {
-      
-        exoPlayer.stop();
-        exoPlayer.release();
+
+        if (exoPlayer != null) {
+            exoPlayer.stop();
+            exoPlayer.release();
+        }
 
         super.onDetach();
     }

+ 1 - 1
app/src/main/res/layout/files.xml

@@ -28,7 +28,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <include layout="@layout/toolbar_standard" />
+        <include android:id="@+id/appbar" layout="@layout/toolbar_standard" />
 
         <!-- The main content view -->
         <LinearLayout

+ 1 - 0
app/src/main/res/layout/toolbar_standard.xml

@@ -29,6 +29,7 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:id="@+id/toolbar_frame"
         app:layout_scrollFlags="scroll|enterAlways">
 
         <!-- sorting/layout bar -->