From 4467853b7107cbd8f305ef46d1024a0a65f7a6ed Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 8 Jul 2022 10:20:40 +0200 Subject: [PATCH] Fix issue #222 - Profiles truncated when long bio + missing fields --- .../android/activities/ProfileActivity.java | 42 +- .../app/fedilab/android/helper/Helper.java | 31 +- .../android/ui/drawer/FieldAdapter.java | 85 +++ .../FragmentMastodonNotification.java | 14 +- app/src/main/res/layout/activity_profile.xml | 525 ++++++------------ app/src/main/res/layout/drawer_field.xml | 37 ++ 6 files changed, 326 insertions(+), 408 deletions(-) create mode 100644 app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java create mode 100644 app/src/main/res/layout/drawer_field.xml diff --git a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java index e8d8fc52..bcd6bbc6 100644 --- a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java @@ -32,7 +32,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.Html; -import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.method.LinkMovementMethod; @@ -94,6 +93,7 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.helper.SpannableHelper; import app.fedilab.android.helper.ThemeHelper; +import app.fedilab.android.ui.drawer.FieldAdapter; import app.fedilab.android.ui.drawer.IdentityProofsAdapter; import app.fedilab.android.ui.pageadapter.FedilabProfileTLPageAdapter; import app.fedilab.android.viewmodel.mastodon.AccountsVM; @@ -357,43 +357,9 @@ public class ProfileActivity extends BaseActivity { //Fields for profile List fields = account.fields; if (fields != null && fields.size() > 0) { - for (int i = 0; i < fields.size(); i++) { - LinearLayout field; - TextView labelView; - TextView valueView; - switch (i) { - case 1: - field = binding.field1; - labelView = binding.label1; - valueView = binding.value1; - break; - case 2: - field = binding.field2; - labelView = binding.label2; - valueView = binding.value2; - break; - case 3: - field = binding.field3; - labelView = binding.label3; - valueView = binding.value3; - break; - default: - field = binding.field4; - labelView = binding.label4; - valueView = binding.value4; - break; - } - - field.setVisibility(View.VISIBLE); - if (fields.get(i).verified_at != null) { - valueView.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(ProfileActivity.this, R.drawable.ic_baseline_verified_24), null); - fields.get(i).value_span.setSpan(new ForegroundColorSpan(ContextCompat.getColor(ProfileActivity.this, R.color.verified_text)), 0, fields.get(i).value_span.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - valueView.setText(fields.get(i).value_span != null ? fields.get(i).value_span : fields.get(i).value, TextView.BufferType.SPANNABLE); - valueView.setMovementMethod(LinkMovementMethod.getInstance()); - labelView.setText(fields.get(i).name); - } - binding.fieldsContainer.setVisibility(View.VISIBLE); + FieldAdapter fieldAdapter = new FieldAdapter(fields); + binding.fieldsContainer.setAdapter(fieldAdapter); + binding.fieldsContainer.setLayoutManager(new LinearLayoutManager(ProfileActivity.this)); } if (account.span_display_name == null && account.display_name == null) { binding.accountDn.setText(account.username); diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 602954f7..8029b84a 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -117,7 +117,6 @@ import java.security.Security; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -1381,7 +1380,6 @@ public class Helper { } - private static final List present = new ArrayList<>(); private static int notificationId = 1; /** @@ -1519,26 +1517,19 @@ public class Helper { notificationBuilder.setLargeIcon(icon); - Notification summaryNotification = null; - - if (!present.contains(account.mastodon_account.acct + "@" + account.instance)) { - summaryNotification = new NotificationCompat.Builder(context, channelId) - .setContentTitle(title) - .setContentText(channelTitle) - .setContentIntent(pIntent) - .setLargeIcon(icon) - .setSmallIcon(R.drawable.ic_notification) - .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) - .setGroup(account.mastodon_account.acct + "@" + account.instance) - .setGroupSummary(true) - .build(); - present.add(account.mastodon_account.acct + "@" + account.instance); - } + Notification summaryNotification = summaryNotification = new NotificationCompat.Builder(context, channelId) + .setContentTitle(title) + .setContentText(channelTitle) + .setContentIntent(pIntent) + .setLargeIcon(icon) + .setSmallIcon(R.drawable.ic_notification) + .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) + .setGroup(account.mastodon_account.acct + "@" + account.instance) + .setGroupSummary(true) + .build(); notificationManager.notify(notificationId++, notificationBuilder.build()); - if (summaryNotification != null) { - notificationManager.notify(0, summaryNotification); - } + notificationManager.notify(0, summaryNotification); } public static void transfertIfExist(Context context) { diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java new file mode 100644 index 00000000..df8bbe27 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java @@ -0,0 +1,85 @@ +package app.fedilab.android.ui.drawer; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + + +import android.content.Context; +import android.text.Spannable; +import android.text.method.LinkMovementMethod; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import app.fedilab.android.R; +import app.fedilab.android.client.entities.api.Field; +import app.fedilab.android.databinding.DrawerFieldBinding; + + +public class FieldAdapter extends RecyclerView.Adapter { + + private final List fields; + private Context context; + + public FieldAdapter(List fields) { + this.fields = fields; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return fields.size(); + } + + @NonNull + @Override + public FieldViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + context = parent.getContext(); + DrawerFieldBinding itemBinding = DrawerFieldBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new FieldViewHolder(itemBinding); + } + + @Override + public void onBindViewHolder(@NonNull FieldViewHolder holder, int position) { + Field field = fields.get(position); + if (field.verified_at != null) { + holder.binding.value.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(context, R.drawable.ic_baseline_verified_24), null); + field.value_span.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, R.color.verified_text)), 0, field.value_span.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + holder.binding.value.setText(field.value_span != null ? field.value_span : field.value, TextView.BufferType.SPANNABLE); + holder.binding.value.setMovementMethod(LinkMovementMethod.getInstance()); + holder.binding.label.setText(field.name); + } + + + public static class FieldViewHolder extends RecyclerView.ViewHolder { + DrawerFieldBinding binding; + + FieldViewHolder(DrawerFieldBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java index 9e39d61c..7fe93351 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java @@ -20,9 +20,11 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.service.notification.StatusBarNotification; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -179,8 +181,16 @@ public class FragmentMastodonNotification extends Fragment implements Notificati @Override public void onResume() { super.onResume(); - NotificationManager notificationManager = (NotificationManager) requireActivity().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancel(Helper.NOTIFICATION_USER_NOTIF); + NotificationManager mNotificationManager = (NotificationManager) requireActivity().getSystemService(Context.NOTIFICATION_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && BaseMainActivity.currentAccount != null && BaseMainActivity.currentAccount.mastodon_account != null) { + for (StatusBarNotification statusBarNotification : mNotificationManager.getActiveNotifications()) { + if ((BaseMainActivity.currentAccount.mastodon_account.acct + "@" + BaseMainActivity.currentAccount.instance).equals(statusBarNotification.getGroupKey())) { + mNotificationManager.cancel(statusBarNotification.getId()); + } + } + } else { + mNotificationManager.cancelAll(); + } } diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index d1ff16c4..54f6c192 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -42,9 +42,9 @@ + android:paddingTop="?attr/actionBarSize"> - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/account_un"> - - - - - - - - - - - - - - - - - - - - - - + + + + + android:textColor="@color/red" + android:visibility="gone" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -510,6 +345,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:backgroundTint="?colorPrimaryDark" + app:layout_scrollFlags="scroll|enterAlways" app:layout_collapseMode="pin"> - - - - + - - + \ No newline at end of file diff --git a/app/src/main/res/layout/drawer_field.xml b/app/src/main/res/layout/drawer_field.xml new file mode 100644 index 00000000..ddfa1bbc --- /dev/null +++ b/app/src/main/res/layout/drawer_field.xml @@ -0,0 +1,37 @@ + + + + + + + + + + \ No newline at end of file