Merge pull request #7639 from nextcloud/notificationItemViewBinding

Android view binding for notification-adapter's view holder
This commit is contained in:
Andy Scherzinger 2021-01-05 21:44:50 +01:00 committed by GitHub
commit e930ad31e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 68 deletions

View File

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

View File

@ -34,11 +34,9 @@ import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bumptech.glide.GenericRequestBuilder;
import com.bumptech.glide.Glide;
@ -48,6 +46,7 @@ import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
import com.caverock.androidsvg.SVG;
import com.google.android.material.button.MaterialButton;
import com.owncloud.android.R;
import com.owncloud.android.databinding.NotificationListItemBinding;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.resources.notifications.models.Action;
import com.owncloud.android.lib.resources.notifications.models.Notification;
@ -68,8 +67,6 @@ import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* This Adapter populates a RecyclerView with all notifications for an account within the app.
@ -101,32 +98,34 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
@NonNull
@Override
public NotificationViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(notificationsActivity).inflate(R.layout.notification_list_item, parent, false);
return new NotificationViewHolder(v);
return new NotificationViewHolder(
NotificationListItemBinding.inflate(LayoutInflater.from(notificationsActivity))
);
}
@Override
public void onBindViewHolder(@NonNull NotificationViewHolder holder, int position) {
Notification notification = notificationsList.get(position);
holder.dateTime.setText(DisplayUtils.getRelativeTimestamp(notificationsActivity,
notification.getDatetime().getTime()));
holder.binding.datetime.setText(DisplayUtils.getRelativeTimestamp(notificationsActivity,
notification.getDatetime().getTime()));
RichObject file = notification.subjectRichParameters.get(FILE);
String subject = notification.getSubject();
if (file == null && !TextUtils.isEmpty(notification.getLink())) {
subject = subject + "";
holder.subject.setTypeface(holder.subject.getTypeface(), Typeface.BOLD);
holder.subject.setOnClickListener(v -> openLink(notification.getLink()));
holder.subject.setText(subject);
holder.binding.subject.setTypeface(holder.binding.subject.getTypeface(),
Typeface.BOLD);
holder.binding.subject.setOnClickListener(v -> openLink(notification.getLink()));
holder.binding.subject.setText(subject);
} else {
if (!TextUtils.isEmpty(notification.subjectRich)) {
holder.subject.setText(makeSpecialPartsBold(notification));
holder.binding.subject.setText(makeSpecialPartsBold(notification));
} else {
holder.subject.setText(subject);
holder.binding.subject.setText(subject);
}
if (file != null && !TextUtils.isEmpty(file.id)) {
holder.subject.setOnClickListener(v -> {
holder.binding.subject.setOnClickListener(v -> {
Intent intent = new Intent(notificationsActivity, FileDisplayActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(FileDisplayActivity.KEY_FILE_ID, file.id);
@ -136,28 +135,32 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
}
}
holder.message.setText(notification.getMessage());
holder.binding.message.setText(notification.getMessage());
if (!TextUtils.isEmpty(notification.getIcon())) {
downloadIcon(notification.getIcon(), holder.icon);
downloadIcon(notification.getIcon(), holder.binding.icon);
}
int nightModeFlag = notificationsActivity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (Configuration.UI_MODE_NIGHT_YES == nightModeFlag) {
holder.icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
} else {
holder.icon.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
}
int nightModeFlag =
notificationsActivity.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
if (Configuration.UI_MODE_NIGHT_YES == nightModeFlag) {
holder.binding.icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
} else {
holder.binding.icon.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
}
setButtons(holder, notification);
holder.dismiss.setOnClickListener(v -> new DeleteNotificationTask(client, notification, holder,
notificationsActivity).execute());
holder.binding.dismiss.setOnClickListener(v -> new DeleteNotificationTask(client,
notification,
holder,
notificationsActivity).execute());
}
public void setButtons(NotificationViewHolder holder, Notification notification) {
// add action buttons
holder.buttons.removeAllViews();
holder.binding.buttons.removeAllViews();
MaterialButton button;
Resources resources = notificationsActivity.getResources();
@ -168,7 +171,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
0,
resources.getDimensionPixelOffset(R.dimen.standard_half_margin),
0
);
);
for (Action action : notification.getActions()) {
button = new MaterialButton(notificationsActivity);
@ -207,7 +210,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
}
});
holder.buttons.addView(button);
holder.binding.buttons.addView(button);
}
}
@ -231,7 +234,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
ssb.setSpan(styleSpanBold, openingBrace, closingBrace, 0);
ssb.setSpan(foregroundColorSpanBlack, openingBrace, closingBrace,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
openingBrace = text.indexOf('{', closingBrace);
}
@ -256,31 +259,31 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
public void setButtonEnabled(NotificationViewHolder holder, boolean enabled) {
for (int i = 0; i < holder.buttons.getChildCount(); i++) {
holder.buttons.getChildAt(i).setEnabled(enabled);
for (int i = 0; i < holder.binding.buttons.getChildCount(); i++) {
holder.binding.buttons.getChildAt(i).setEnabled(enabled);
}
}
private void downloadIcon(String icon, ImageView itemViewType) {
GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder = Glide.with(notificationsActivity)
.using(Glide.buildStreamModelLoader(Uri.class, notificationsActivity), InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
.sourceEncoder(new StreamEncoder())
.cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder()))
.decoder(new SvgDecoder())
.placeholder(R.drawable.ic_notification)
.error(R.drawable.ic_notification)
.animate(android.R.anim.fade_in)
.listener(new SvgSoftwareLayerSetter<>());
.using(Glide.buildStreamModelLoader(Uri.class, notificationsActivity), InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
.sourceEncoder(new StreamEncoder())
.cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder()))
.decoder(new SvgDecoder())
.placeholder(R.drawable.ic_notification)
.error(R.drawable.ic_notification)
.animate(android.R.anim.fade_in)
.listener(new SvgSoftwareLayerSetter<>());
Uri uri = Uri.parse(icon);
requestBuilder
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.load(uri)
.into(itemViewType);
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.load(uri)
.into(itemViewType);
}
private void openLink(String link) {
@ -295,22 +298,11 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
}
public static class NotificationViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.notification_icon)
public ImageView icon;
@BindView(R.id.notification_subject)
public TextView subject;
@BindView(R.id.notification_message)
public TextView message;
@BindView(R.id.notification_datetime)
public TextView dateTime;
@BindView(R.id.notification_buttons)
public LinearLayout buttons;
@BindView(R.id.notification_dismiss)
public ImageView dismiss;
NotificationListItemBinding binding;
private NotificationViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
private NotificationViewHolder(NotificationListItemBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

View File

@ -31,7 +31,7 @@
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/notification_icon"
android:id="@+id/icon"
android:layout_width="@dimen/notification_icon_width"
android:layout_height="@dimen/notification_icon_height"
android:layout_alignParentTop="true"
@ -45,8 +45,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignTop="@id/notification_icon"
android:layout_toEndOf="@id/notification_icon">
android:layout_alignTop="@id/icon"
android:layout_toEndOf="@id/icon">
<LinearLayout
android:layout_width="match_parent"
@ -54,7 +54,7 @@
android:orientation="horizontal">
<TextView
android:id="@+id/notification_subject"
android:id="@+id/subject"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@ -63,7 +63,7 @@
tools:text="@string/placeholder_filename" />
<ImageView
android:id="@+id/notification_dismiss"
android:id="@+id/dismiss"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_close"
@ -71,7 +71,7 @@
</LinearLayout>
<TextView
android:id="@+id/notification_message"
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
@ -80,7 +80,7 @@
android:textAppearance="?android:attr/textAppearanceListItem"/>
<LinearLayout
android:id="@+id/notification_buttons"
android:id="@+id/buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/alternate_half_margin"
@ -89,7 +89,7 @@
android:orientation="horizontal"/>
<TextView
android:id="@+id/notification_datetime"
android:id="@+id/datetime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"