Pārlūkot izejas kodu

Merge pull request #6341 from nextcloud/fragmentContainerView

Replace fragment by FragmentContainerView
Tobias Kaminsky 4 gadi atpakaļ
vecāks
revīzija
4073cd235c

+ 1 - 0
build.gradle

@@ -295,6 +295,7 @@ dependencies {
     implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
     implementation "androidx.work:work-runtime:2.3.4"
     implementation "androidx.work:work-runtime-ktx:2.3.4"
+    implementation "androidx.fragment:fragment:1.2.5"
     implementation 'com.github.albfernandez:juniversalchardet:2.0.3' // need this version for Android <7
     compileOnly 'com.google.code.findbugs:annotations:2.0.1'
     implementation 'commons-io:commons-io:2.7'

+ 6 - 0
lint.xml

@@ -55,4 +55,10 @@
     <issue id="NewApi" severity="error">
         <ignore path="build" />
     </issue>
+
+    <issue id="ObsoleteLintCustomCheck" severity="warning">
+        <ignore path="**/fragment-1.2.5/**/lint.jar" />
+        <ignore path="**/work-runtime-2.3.4/**/lint.jar" />
+        <ignore path="**/jetified-butterknife-runtime-10.2.1/**/lint.jar" />
+    </issue>
 </lint>

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 85 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 83 warnings</span>

+ 16 - 7
scripts/uploadReport.sh

@@ -1,6 +1,21 @@
 #!/usr/bin/env bash
 
+deleteOldComments() {
+    # delete all old comments, matching this type
+    echo "Deleting old comments for $BRANCH_TYPE"
+    oldComments=$(curl 2>/dev/null -u $GITHUB_USER:$GITHUB_PASSWORD -X GET https://api.github.com/repos/nextcloud/android/issues/$PR/comments | jq --arg TYPE $BRANCH_TYPE '.[] | (.id |tostring) + "|" + (.user.login | test("nextcloud-android-bot") | tostring) + "|" + (.body | test([$TYPE]) | tostring)'| grep "true|true" | tr -d "\"" | cut -f1 -d"|")
+    count=$(echo $oldComments | grep true | wc -l)
+    echo "Found $count old comments"
+
+    echo $oldComments | while read comment ; do
+        echo "Deleting comment: $comment"
+        curl 2>/dev/null -u $GITHUB_USER:$GITHUB_PASSWORD -X DELETE https://api.github.com/repos/nextcloud/android/issues/comments/$comment
+    done
+}
+
 upload() {
+    deleteOldComments
+
     cd $1
 
     find . -type d -exec curl -u $USER:$PASS -X MKCOL $URL/$REMOTE_FOLDER/$(echo {} | sed s#\./##) \;
@@ -8,13 +23,6 @@ upload() {
 
     echo "Uploaded failing tests to https://www.kaminsky.me/nc-dev/android-integrationTests/$REMOTE_FOLDER"
 
-    # delete all old comments, matching this type
-    oldComments=$(curl 2>/dev/null -u $GITHUB_USER:$GITHUB_PASSWORD -X GET https://api.github.com/repos/nextcloud/android/issues/$PR/comments | jq --arg TYPE $BRANCH_TYPE '.[] | (.id |tostring) + "|" + (.user.login | test("nextcloud-android-bot") | tostring) + "|" + (.body | test([$TYPE]) | tostring)'| grep "true|true" | tr -d "\"" | cut -f1 -d"|")
-
-    echo $oldComments | while read comment ; do
-        curl 2>/dev/null -u $GITHUB_USER:$GITHUB_PASSWORD -X DELETE https://api.github.com/repos/nextcloud/android/issues/comments/$comment
-    done
-
     curl -u $GITHUB_USER:$GITHUB_PASSWORD -X POST https://api.github.com/repos/nextcloud/android/issues/$PR/comments \
     -d "{ \"body\" : \"$BRANCH_TYPE test failed: https://www.kaminsky.me/nc-dev/android-integrationTests/$REMOTE_FOLDER \" }"
 
@@ -55,6 +63,7 @@ fi
 if [ -e $FOLDER ]; then
     upload $FOLDER
 else
+    deleteOldComments
     echo "$BRANCH_TYPE test failed, but no output was generated. Maybe a preliminary stage failed."
 
     curl -u $GITHUB_USER:$GITHUB_PASSWORD \

+ 2 - 2
src/main/java/com/nextcloud/client/etm/EtmMenuFragment.kt

@@ -33,11 +33,11 @@ class EtmMenuFragment : EtmBaseFragment() {
     private lateinit var list: RecyclerView
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        adapter = EtmMenuAdapter(context!!, this::onClickedItem)
+        adapter = EtmMenuAdapter(requireContext(), this::onClickedItem)
         adapter.pages = vm.pages
         val view = inflater.inflate(R.layout.fragment_etm_menu, container, false)
         list = view.findViewById(R.id.etm_menu_list)
-        list.layoutManager = LinearLayoutManager(context!!)
+        list.layoutManager = LinearLayoutManager(requireContext())
         list.adapter = adapter
         return view
     }

+ 1 - 1
src/main/java/com/nextcloud/client/etm/pages/EtmBackgroundJobsFragment.kt

@@ -112,7 +112,7 @@ class EtmBackgroundJobsFragment : EtmBaseFragment() {
         list.layoutManager = LinearLayoutManager(context)
         list.addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
         list.adapter = adapter
-        vm.backgroundJobs.observe(this, Observer { onBackgroundJobsUpdated(it) })
+        vm.backgroundJobs.observe(viewLifecycleOwner, Observer { onBackgroundJobsUpdated(it) })
         return view
     }
 

+ 3 - 28
src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -21,6 +21,7 @@
 package com.owncloud.android.ui.activity;
 
 import android.accounts.Account;
+import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Intent;
 import android.content.res.ColorStateList;
@@ -51,7 +52,6 @@ import com.owncloud.android.ui.dialog.LocalStoragePathPickerDialogFragment;
 import com.owncloud.android.ui.dialog.SortingOrderDialogFragment;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
 import com.owncloud.android.ui.fragment.LocalFileListFragment;
-import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.ThemeUtils;
 
@@ -64,14 +64,11 @@ import javax.inject.Inject;
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.widget.SearchView;
-import androidx.core.content.res.ResourcesCompat;
 import androidx.core.view.MenuItemCompat;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
-import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFragment;
-
 /**
  * Displays local files and let the user choose what of them wants to upload to the current ownCloud account.
  */
@@ -107,7 +104,6 @@ public class UploadFilesActivity extends FileActivity implements LocalFileListFr
     private Menu mOptionsMenu;
     private SearchView mSearchView;
     private Spinner mBehaviourSpinner;
-    private MaterialButton sortButton;
 
     /**
      * Helper to launch the UploadFilesActivity for which you would like a result when it finished. Your
@@ -125,6 +121,7 @@ public class UploadFilesActivity extends FileActivity implements LocalFileListFr
     }
 
     @Override
+    @SuppressLint("WrongViewCast") // wrong error on finding local_files_list
     public void onCreate(Bundle savedInstanceState) {
         Log_OC.d(TAG, "onCreate() start");
         super.onCreate(savedInstanceState);
@@ -170,7 +167,7 @@ public class UploadFilesActivity extends FileActivity implements LocalFileListFr
             ((MaterialButton) findViewById(R.id.upload_files_btn_upload)).setText(R.string.uploader_btn_alternative_text);
         }
 
-        mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentById(R.id.local_files_list);
+        mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentByTag("local_files_list");
 
         // Set input controllers
         MaterialButton cancelButton = findViewById(R.id.upload_files_btn_cancel);
@@ -181,27 +178,6 @@ public class UploadFilesActivity extends FileActivity implements LocalFileListFr
         ThemeUtils.colorPrimaryButton(uploadButton, this);
         uploadButton.setOnClickListener(this);
 
-        sortButton = findViewById(R.id.sort_button);
-        FileSortOrder fileSortOrder = preferences.getSortOrderByType(FileSortOrder.Type.uploadFilesView);
-        sortButton.setText(DisplayUtils.getSortOrderStringId(fileSortOrder));
-        sortButton.setOnClickListener(l -> openSortingOrderDialogFragment(getSupportFragmentManager(), fileSortOrder));
-
-        MaterialButton switchButton = findViewById(R.id.switch_grid_view_button);
-        switchButton.setOnClickListener(l -> {
-            if (isGridView()) {
-                switchButton.setIcon(ResourcesCompat.getDrawable(getResources(),
-                                                                 R.drawable.ic_view_module,
-                                                                 null));
-                mFileListFragment.switchToListView();
-            } else {
-                switchButton.setIcon(ResourcesCompat.getDrawable(getResources(),
-                                                                 R.drawable.ic_view_list,
-                                                                 null));
-                mFileListFragment.switchToGridView();
-
-            }
-        });
-
         int localBehaviour = preferences.getUploaderBehaviour();
 
         // file upload spinner
@@ -339,7 +315,6 @@ public class UploadFilesActivity extends FileActivity implements LocalFileListFr
     @Override
     public void onSortingOrderChosen(FileSortOrder selection) {
         preferences.setSortOrder(FileSortOrder.Type.uploadFilesView, selection);
-        sortButton.setText(DisplayUtils.getSortOrderStringId(selection));
         mFileListFragment.sortFiles(selection);
     }
 

+ 12 - 1
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -82,6 +82,7 @@ import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 import androidx.appcompat.widget.SearchView;
+import androidx.core.content.ContextCompat;
 import androidx.core.view.MenuItemCompat;
 import androidx.fragment.app.Fragment;
 import androidx.recyclerview.widget.GridLayoutManager;
@@ -188,7 +189,7 @@ public class ExtendedListFragment extends Fragment implements
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         final MenuItem item = menu.findItem(R.id.action_search);
         searchView = (SearchView) MenuItemCompat.getActionView(item);
         closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
@@ -748,4 +749,14 @@ public class ExtendedListFragment extends Fragment implements
             ((GridLayoutManager) getRecyclerView().getLayoutManager()).setSpanCount(maxColumnSize);
         }
     }
+
+    protected void setGridSwitchButton() {
+        if (isGridEnabled()) {
+            mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_list_view));
+            mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_list));
+        } else {
+            mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_grid_view));
+            mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_module));
+        }
+    }
 }

+ 24 - 6
src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -36,6 +36,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.adapter.LocalFileListAdapter;
 import com.owncloud.android.ui.interfaces.LocalFileListFragmentInterface;
+import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 
 import java.io.File;
@@ -46,13 +47,15 @@ import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFragment;
+
 
 /**
  * A Fragment that lists all files and folders in a given LOCAL path.
  */
 public class LocalFileListFragment extends ExtendedListFragment implements
-        LocalFileListFragmentInterface,
-        Injectable {
+    LocalFileListFragmentInterface,
+    Injectable {
 
     private static final String TAG = LocalFileListFragment.class.getSimpleName();
 
@@ -82,13 +85,13 @@ public class LocalFileListFragment extends ExtendedListFragment implements
      * {@inheritDoc}
      */
     @Override
-    public void onAttach(Activity activity) {
+    public void onAttach(@NonNull Activity activity) {
         super.onAttach(activity);
         try {
             mContainerActivity = (ContainerActivity) activity;
         } catch (ClassCastException e) {
             throw new IllegalArgumentException(activity.toString() + " must implement " +
-                    LocalFileListFragment.ContainerActivity.class.getSimpleName(), e);
+                                                   LocalFileListFragment.ContainerActivity.class.getSimpleName(), e);
         }
     }
 
@@ -125,11 +128,25 @@ public class LocalFileListFragment extends ExtendedListFragment implements
         super.onActivityCreated(savedInstanceState);
 
         mAdapter = new LocalFileListAdapter(mContainerActivity.isFolderPickerMode(),
-                mContainerActivity.getInitialDirectory(), this, preferences, getActivity());
+                                            mContainerActivity.getInitialDirectory(), this, preferences, getActivity());
         setRecyclerViewAdapter(mAdapter);
 
         listDirectory(mContainerActivity.getInitialDirectory());
 
+        FileSortOrder sortOrder = preferences.getSortOrderByType(FileSortOrder.Type.uploadFilesView);
+        mSortButton.setOnClickListener(v -> openSortingOrderDialogFragment(requireFragmentManager(), sortOrder));
+        mSortButton.setText(DisplayUtils.getSortOrderStringId(sortOrder));
+
+        setGridSwitchButton();
+        mSwitchGridViewButton.setOnClickListener(v -> {
+            if (isGridEnabled()) {
+                switchToListView();
+            } else {
+                switchToGridView();
+            }
+            setGridSwitchButton();
+        });
+
         Log_OC.i(TAG, "onActivityCreated() stop");
     }
 
@@ -137,7 +154,7 @@ public class LocalFileListFragment extends ExtendedListFragment implements
      * {@inheritDoc}
      */
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         if (mContainerActivity.isFolderPickerMode()) {
             menu.removeItem(R.id.action_select_all);
             menu.removeItem(R.id.action_search);
@@ -265,6 +282,7 @@ public class LocalFileListFragment extends ExtendedListFragment implements
     }
 
     public void sortFiles(FileSortOrder sortOrder) {
+        mSortButton.setText(DisplayUtils.getSortOrderStringId(sortOrder));
         mAdapter.setSortOrder(sortOrder);
     }
 

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

@@ -1315,16 +1315,6 @@ public class OCFileListFragment extends ExtendedListFragment implements
         mAdapter.setSortOrder(mFile, sortOrder);
     }
 
-    private void setGridSwitchButton() {
-        if (isGridEnabled()) {
-            mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_list_view));
-            mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_list));
-        } else {
-            mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_grid_view));
-            mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_module));
-        }
-    }
-
     /**
      * Determines if user set folder to grid or list view. If folder is not set itself,
      * it finds a parent that is set (at least root is set).

+ 1 - 1
src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java

@@ -162,7 +162,7 @@ public class ContactListFragment extends FileFragment implements Injectable {
      * {@inheritDoc}
      */
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
         inflater.inflate(R.menu.fragment_contact_list, menu);
     }

+ 4 - 3
src/main/res/layout/upload_files_layout.xml

@@ -25,9 +25,10 @@
 
     <include layout="@layout/toolbar_standard" />
 
-    <fragment
-        android:id="@+id/local_files_list"
-        class="com.owncloud.android.ui.fragment.LocalFileListFragment"
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/local_files_list_container"
+        android:name="com.owncloud.android.ui.fragment.LocalFileListFragment"
+        android:tag="local_files_list"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1" />