Browse Source

Merge pull request #7643 from nextcloud/activityItemViewBinding

Android view binding for activities view holder
Andy Scherzinger 4 năm trước cách đây
mục cha
commit
ccaa502252

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

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

+ 0 - 4
src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java

@@ -27,7 +27,6 @@ import com.nextcloud.client.network.ClientFactory;
 import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.ActivityListLayoutBinding;
-import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.activities.model.RichObject;
@@ -109,12 +108,9 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
     private void setupContent() {
         binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_activity);
 
-        FileDataStorageManager storageManager = new FileDataStorageManager(getAccount(), getContentResolver());
         adapter = new ActivityListAdapter(this,
                                           getUserAccountManager(),
                                           this,
-                                          storageManager,
-                                          getCapabilities(),
                                           clientFactory,
                                           false);
         binding.list.setAdapter(adapter);

+ 0 - 2
src/main/java/com/owncloud/android/ui/activities/StickyHeaderItemDecoration.java

@@ -115,6 +115,4 @@ public class StickyHeaderItemDecoration extends RecyclerView.ItemDecoration {
         view.measure(childWidthSpec, childHeightSpec);
         view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
     }
-
-
 }

+ 23 - 33
src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java

@@ -3,9 +3,11 @@
  *
  * @author Chris Narkiewicz
  * @author Tobias Kaminsky
+ * @author Andy Scherzinger
  *
  * Copyright (C) 2019 Tobias Kaminsky
  * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ * Copyright (C) 2020 Andy Scherzinger
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
@@ -26,19 +28,15 @@ package com.owncloud.android.ui.adapter;
 import android.content.Context;
 import android.text.format.DateFormat;
 import android.view.LayoutInflater;
-import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
 
 import com.nextcloud.client.account.CurrentAccountProvider;
 import com.nextcloud.client.network.ClientFactory;
 import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.R;
-import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.databinding.VersionListItemBinding;
 import com.owncloud.android.lib.resources.activities.model.Activity;
 import com.owncloud.android.lib.resources.files.model.FileVersion;
-import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.ui.interfaces.VersionListInterface;
 import com.owncloud.android.utils.DisplayUtils;
@@ -49,24 +47,20 @@ import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
-import butterknife.BindView;
-import butterknife.ButterKnife;
 
 public class ActivityAndVersionListAdapter extends ActivityListAdapter {
-
     private static final int VERSION_TYPE = 102;
-    private VersionListInterface.View versionListInterface;
+
+    private final VersionListInterface.View versionListInterface;
 
     public ActivityAndVersionListAdapter(
         Context context,
         CurrentAccountProvider currentAccountProvider,
         ActivityListInterface activityListInterface,
         VersionListInterface.View versionListInterface,
-        FileDataStorageManager storageManager,
-        OCCapability capability,
         ClientFactory clientFactory
     ) {
-        super(context, currentAccountProvider, activityListInterface, storageManager, capability, clientFactory, true);
+        super(context, currentAccountProvider, activityListInterface, clientFactory, true);
 
         this.versionListInterface = versionListInterface;
     }
@@ -129,14 +123,11 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
     @NonNull
     @Override
     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-        switch (viewType) {
-            case VERSION_TYPE:
-                View versionView = LayoutInflater.from(parent.getContext()).inflate(R.layout.version_list_item,
-                        parent, false);
-                return new VersionViewHolder(versionView);
-            default:
-                return super.onCreateViewHolder(parent, viewType);
+        if (viewType == VERSION_TYPE) {
+            return new VersionViewHolder(VersionListItemBinding.inflate(LayoutInflater.from(parent.getContext())));
         }
+
+        return super.onCreateViewHolder(parent, viewType);
     }
 
     @Override
@@ -145,11 +136,14 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
             final VersionViewHolder versionViewHolder = (VersionViewHolder) holder;
             FileVersion fileVersion = (FileVersion) values.get(position);
 
-            versionViewHolder.size.setText(DisplayUtils.bytesToHumanReadable(fileVersion.getFileLength()));
-            versionViewHolder.time.setText(DateFormat.format("HH:mm", new Date(fileVersion.getModifiedTimestamp())
-                    .getTime()));
+            versionViewHolder.binding.size.setText(DisplayUtils.bytesToHumanReadable(fileVersion.getFileLength()));
+            versionViewHolder.binding.time.setText(
+                DateFormat.format("HH:mm", new Date(fileVersion.getModifiedTimestamp()).getTime())
+            );
 
-            versionViewHolder.restore.setOnClickListener(v -> versionListInterface.onRestoreClicked(fileVersion));
+            versionViewHolder.binding.restore.setOnClickListener(
+                v -> versionListInterface.onRestoreClicked(fileVersion)
+            );
         } else {
             super.onBindViewHolder(holder, position);
         }
@@ -169,16 +163,12 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
     }
 
     protected class VersionViewHolder extends RecyclerView.ViewHolder {
-        @BindView(R.id.size)
-        public TextView size;
-        @BindView(R.id.time)
-        public TextView time;
-        @BindView(R.id.restore)
-        public ImageView restore;
-
-        VersionViewHolder(View itemView) {
-            super(itemView);
-            ButterKnife.bind(this, itemView);
+
+        VersionListItemBinding binding;
+
+        VersionViewHolder(VersionListItemBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
         }
     }
 }

+ 47 - 60
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -3,9 +3,11 @@
  *
  * @author Alejandro Bautista
  * @author Chris Narkiewicz
+ * @author Andy Scherzinger
  *
  * Copyright (C) 2017 Alejandro Bautista
  * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ * Copyright (C) 2020 Andy Scherzinger
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@@ -42,7 +44,6 @@ import android.text.style.StyleSpan;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.GridLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -58,13 +59,13 @@ import com.nextcloud.client.network.ClientFactory;
 import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
-import com.owncloud.android.datamodel.FileDataStorageManager;
+import com.owncloud.android.databinding.ActivityListItemBinding;
+import com.owncloud.android.databinding.ActivityListItemHeaderBinding;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.activities.model.Activity;
 import com.owncloud.android.lib.resources.activities.model.RichElement;
 import com.owncloud.android.lib.resources.activities.model.RichObject;
 import com.owncloud.android.lib.resources.activities.models.PreviewObject;
-import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
@@ -81,7 +82,7 @@ import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
- * Adapter for the activity view
+ * Adapter for the activity view.
  */
 public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StickyHeaderAdapter {
 
@@ -95,8 +96,6 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     protected Context context;
     private CurrentAccountProvider currentAccountProvider;
     private ClientFactory clientFactory;
-    private FileDataStorageManager storageManager;
-    private OCCapability capability;
     protected List<Object> values;
     private boolean isDetailView;
 
@@ -104,17 +103,12 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         Context context,
         CurrentAccountProvider currentAccountProvider,
         ActivityListInterface activityListInterface,
-        FileDataStorageManager storageManager,
-        OCCapability capability,
         ClientFactory clientFactory,
-        boolean isDetailView
-    ) {
+        boolean isDetailView) {
         this.values = new ArrayList<>();
         this.context = context;
         this.currentAccountProvider = currentAccountProvider;
         this.activityListInterface = activityListInterface;
-        this.storageManager = storageManager;
-        this.capability = capability;
         this.clientFactory = clientFactory;
         px = getThumbnailDimension();
         this.isDetailView = isDetailView;
@@ -154,11 +148,13 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     @Override
     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         if (viewType == ACTIVITY_TYPE) {
-            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item, parent, false);
-            return new ActivityViewHolder(v);
+            return new ActivityViewHolder(
+                ActivityListItemBinding.inflate(LayoutInflater.from(parent.getContext()))
+            );
         } else {
-            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list_item_header, parent, false);
-            return new ActivityViewHeaderHolder(v);
+            return new ActivityViewHeaderHolder(
+                ActivityListItemHeaderBinding.inflate(LayoutInflater.from(parent.getContext()))
+            );
         }
     }
 
@@ -168,34 +164,34 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
             final ActivityViewHolder activityViewHolder = (ActivityViewHolder) holder;
             Activity activity = (Activity) values.get(position);
             if (activity.getDatetime() != null) {
-                activityViewHolder.dateTime.setVisibility(View.VISIBLE);
-                activityViewHolder.dateTime.setText(DateFormat.format("HH:mm", activity.getDatetime().getTime()));
+                activityViewHolder.binding.datetime.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.datetime.setText(DateFormat.format("HH:mm", activity.getDatetime().getTime()));
             } else {
-                activityViewHolder.dateTime.setVisibility(View.GONE);
+                activityViewHolder.binding.datetime.setVisibility(View.GONE);
             }
 
             if (activity.getRichSubjectElement() != null &&
                 !TextUtils.isEmpty(activity.getRichSubjectElement().getRichSubject())) {
-                activityViewHolder.subject.setVisibility(View.VISIBLE);
-                activityViewHolder.subject.setMovementMethod(LinkMovementMethod.getInstance());
-                activityViewHolder.subject.setText(addClickablePart(activity.getRichSubjectElement()), TextView.BufferType.SPANNABLE);
-                activityViewHolder.subject.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.subject.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.subject.setMovementMethod(LinkMovementMethod.getInstance());
+                activityViewHolder.binding.subject.setText(addClickablePart(activity.getRichSubjectElement()), TextView.BufferType.SPANNABLE);
+                activityViewHolder.binding.subject.setVisibility(View.VISIBLE);
             } else if (!TextUtils.isEmpty(activity.getSubject())) {
-                activityViewHolder.subject.setVisibility(View.VISIBLE);
-                activityViewHolder.subject.setText(activity.getSubject());
+                activityViewHolder.binding.subject.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.subject.setText(activity.getSubject());
             } else {
-                activityViewHolder.subject.setVisibility(View.GONE);
+                activityViewHolder.binding.subject.setVisibility(View.GONE);
             }
 
             if (!TextUtils.isEmpty(activity.getMessage())) {
-                activityViewHolder.message.setText(activity.getMessage());
-                activityViewHolder.message.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.message.setText(activity.getMessage());
+                activityViewHolder.binding.message.setVisibility(View.VISIBLE);
             } else {
-                activityViewHolder.message.setVisibility(View.GONE);
+                activityViewHolder.binding.message.setVisibility(View.GONE);
             }
 
             if (!TextUtils.isEmpty(activity.getIcon())) {
-                downloadIcon(activity, activityViewHolder.activityIcon);
+                downloadIcon(activity, activityViewHolder.binding.icon);
             }
 
             int nightModeFlag = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
@@ -203,25 +199,25 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
             if (!"file_created".equalsIgnoreCase(activity.getType()) &&
                 !"file_deleted".equalsIgnoreCase(activity.getType())) {
                 if (Configuration.UI_MODE_NIGHT_YES == nightModeFlag) {
-                    activityViewHolder.activityIcon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
+                    activityViewHolder.binding.icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
                 } else {
-                    activityViewHolder.activityIcon.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
+                    activityViewHolder.binding.icon.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
                 }
             }
 
 
             if (activity.getRichSubjectElement() != null &&
                 activity.getRichSubjectElement().getRichObjectList().size() > 0) {
-                activityViewHolder.list.setVisibility(View.VISIBLE);
-                activityViewHolder.list.removeAllViews();
+                activityViewHolder.binding.list.setVisibility(View.VISIBLE);
+                activityViewHolder.binding.list.removeAllViews();
 
-                activityViewHolder.list.post(() -> {
-                    int w = activityViewHolder.list.getMeasuredWidth();
+                activityViewHolder.binding.list.post(() -> {
+                    int w = activityViewHolder.binding.list.getMeasuredWidth();
                     int elPxSize = px + 20;
                     int totalColumnCount = w / elPxSize;
 
                     try {
-                        activityViewHolder.list.setColumnCount(totalColumnCount);
+                        activityViewHolder.binding.list.setColumnCount(totalColumnCount);
                     } catch (IllegalArgumentException e) {
                         Log_OC.e(TAG, "error setting column count to " + totalColumnCount);
                     }
@@ -234,16 +230,16 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                                                                  activity
                                                                      .getRichSubjectElement()
                                                                      .getRichObjectList());
-                        activityViewHolder.list.addView(imageView);
+                        activityViewHolder.binding.list.addView(imageView);
                     }
                 }
             } else {
-                activityViewHolder.list.removeAllViews();
-                activityViewHolder.list.setVisibility(View.GONE);
+                activityViewHolder.binding.list.removeAllViews();
+                activityViewHolder.binding.list.setVisibility(View.GONE);
             }
         } else {
             ActivityViewHeaderHolder activityViewHeaderHolder = (ActivityViewHeaderHolder) holder;
-            activityViewHeaderHolder.title.setText((String) values.get(position));
+            activityViewHeaderHolder.binding.header.setText((String) values.get(position));
         }
     }
 
@@ -420,7 +416,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
 
     @Override
     public void bindHeaderData(View header, int headerPosition) {
-        TextView textView = header.findViewById(R.id.title_header);
+        TextView textView = header.findViewById(R.id.header);
         String headline = (String) values.get(headerPosition);
         textView.setText(headline);
     }
@@ -432,30 +428,21 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
 
     protected class ActivityViewHolder extends RecyclerView.ViewHolder {
 
-        private final ImageView activityIcon;
-        private final TextView subject;
-        private final TextView message;
-        private final TextView dateTime;
-        private final GridLayout list;
-
-        ActivityViewHolder(View itemView) {
-            super(itemView);
-            activityIcon = itemView.findViewById(R.id.activity_icon);
-            subject = itemView.findViewById(R.id.activity_subject);
-            message = itemView.findViewById(R.id.activity_message);
-            dateTime = itemView.findViewById(R.id.activity_datetime);
-            list = itemView.findViewById(R.id.list);
+        ActivityListItemBinding binding;
+
+        ActivityViewHolder(ActivityListItemBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
         }
     }
 
     protected class ActivityViewHeaderHolder extends RecyclerView.ViewHolder {
 
-        private final TextView title;
-
-        ActivityViewHeaderHolder(View itemView) {
-            super(itemView);
-            title = itemView.findViewById(R.id.title_header);
+        ActivityListItemHeaderBinding binding;
 
+        ActivityViewHeaderHolder(ActivityListItemHeaderBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
         }
     }
 }

+ 0 - 2
src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java

@@ -228,8 +228,6 @@ public class FileDetailActivitiesFragment extends Fragment implements
                                                     accountManager,
                                                     this,
                                                     this,
-                                                    storageManager,
-                                                    capability,
                                                     clientFactory
         );
         binding.list.setAdapter(adapter);

+ 24 - 25
src/main/res/layout/activity_list_item.xml

@@ -17,75 +17,74 @@
   You should have received a copy of the GNU Affero General Public
   License along with this program. If not, see <http://www.gnu.org/licenses/>.
 -->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:background="@color/bg_default"
     android:orientation="horizontal"
-    android:paddingRight="@dimen/standard_padding"
-    android:paddingBottom="@dimen/standard_padding"
     android:paddingLeft="@dimen/standard_padding"
-    android:background="@color/bg_default">
+    android:paddingRight="@dimen/standard_padding"
+    android:paddingBottom="@dimen/standard_padding">
 
     <ImageView
-        android:id="@+id/activity_icon"
+        android:id="@+id/icon"
         android:layout_width="@dimen/activity_icon_width"
         android:layout_height="@dimen/activity_icon_height"
         android:layout_alignParentTop="true"
         android:layout_marginTop="@dimen/standard_margin"
         android:alpha="0.5"
-        android:padding="2dp"
         android:contentDescription="@string/activity_icon"
+        android:padding="2dp"
         android:src="@drawable/ic_activity" />
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:layout_toEndOf="@id/activity_icon">
+        android:layout_toEndOf="@id/icon"
+        android:orientation="vertical">
 
         <TextView
-            android:id="@+id/activity_subject"
+            android:id="@+id/subject"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:ellipsize="end"
-            android:paddingEnd="@dimen/zero"
             android:paddingStart="@dimen/activity_icon_layout_right_end_margin"
             android:paddingTop="@dimen/standard_padding"
-            tools:text="@string/placeholder_filename"
-            android:textAppearance="?android:attr/textAppearanceListItem" />
+            android:paddingEnd="@dimen/zero"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            tools:text="@string/placeholder_filename" />
 
         <TextView
-            android:id="@+id/activity_message"
+            android:id="@+id/message"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingEnd="@dimen/zero"
-            android:paddingStart="@dimen/activity_icon_layout_right_end_margin"
             android:ellipsize="end"
-            tools:text="@string/placeholder_sentence"
-            android:textAppearance="?android:attr/textAppearanceListItem"/>
+            android:paddingStart="@dimen/activity_icon_layout_right_end_margin"
+            android:paddingEnd="@dimen/zero"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            tools:text="@string/placeholder_sentence" />
 
         <GridLayout
             android:id="@+id/list"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/alternate_half_margin"
             android:layout_marginStart="@dimen/activity_list_item_grid_layout_left_start_margin"
-            android:paddingEnd="@dimen/zero"
+            android:layout_marginTop="@dimen/alternate_half_margin"
+            android:columnCount="3"
             android:paddingStart="@dimen/activity_icon_layout_right_end_margin"
-            android:columnCount="3" />
+            android:paddingEnd="@dimen/zero" />
 
         <TextView
-            android:id="@+id/activity_datetime"
+            android:id="@+id/datetime"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="end"
             android:ellipsize="end"
-            android:paddingEnd="@dimen/zero"
             android:paddingStart="@dimen/activity_icon_layout_right_end_margin"
-            tools:text="@string/placeholder_sentence"
-            android:textColor="?android:attr/textColorSecondary"/>
+            android:paddingEnd="@dimen/zero"
+            android:textColor="?android:attr/textColorSecondary"
+            tools:text="@string/placeholder_sentence" />
 
     </LinearLayout>
 

+ 1 - 1
src/main/res/layout/activity_list_item_header.xml

@@ -24,7 +24,7 @@
     android:background="@color/bg_default">
 
     <TextView
-        android:id="@+id/title_header"
+        android:id="@+id/header"
         android:layout_width="match_parent"
         android:layout_height="60dp"
         android:layout_marginStart="@dimen/standard_list_item_size"