mirror of
				https://codeberg.org/tom79/Fedilab.git
				synced 2025-10-20 11:20:16 +03:00 
			
		
		
		
	Hide messages instead of removing them and add fetch more support
This commit is contained in:
		
							parent
							
								
									6f288acbc9
								
							
						
					
					
						commit
						ab9b367a38
					
				
					 4 changed files with 157 additions and 21 deletions
				
			
		|  | @ -73,7 +73,6 @@ public class TimelineHelper { | |||
|      */ | ||||
|     public static List<Status> filterStatus(Context context, List<Status> statuses, Timeline.TimeLineEnum filterTimeLineType) { | ||||
|         //A security to make sure filters have been fetched before displaying messages | ||||
|         List<Status> statusesToRemove = new ArrayList<>(); | ||||
|         if (!BaseMainActivity.filterFetched) { | ||||
|             MastodonFiltersService mastodonFiltersService = initv2(context); | ||||
|             List<Filter> filterList; | ||||
|  | @ -132,12 +131,7 @@ public class TimelineHelper { | |||
|                                 content = Html.fromHtml(status.reblog != null ? status.reblog.content : status.content).toString(); | ||||
|                             Matcher m = p.matcher(content); | ||||
|                             if (m.find()) { | ||||
| 
 | ||||
|                                 if (filter.filter_action.equalsIgnoreCase("warn")) { | ||||
|                                     status.filteredByApp = filter; | ||||
|                                 } else { | ||||
|                                     statusesToRemove.add(status); | ||||
|                                 } | ||||
|                                 status.filteredByApp = filter; | ||||
|                                 continue; | ||||
|                             } | ||||
|                             if (status.spoiler_text != null) { | ||||
|  | @ -148,22 +142,14 @@ public class TimelineHelper { | |||
|                                     spoilerText = Html.fromHtml(status.reblog != null ? status.reblog.spoiler_text : status.spoiler_text).toString(); | ||||
|                                 Matcher ms = p.matcher(spoilerText); | ||||
|                                 if (ms.find()) { | ||||
|                                     if (filter.filter_action.equalsIgnoreCase("warn")) { | ||||
|                                         status.filteredByApp = filter; | ||||
|                                     } else { | ||||
|                                         statusesToRemove.add(status); | ||||
|                                     } | ||||
|                                     status.filteredByApp = filter; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|         if (statuses != null) { | ||||
|             statuses.removeAll(statusesToRemove); | ||||
|         } | ||||
|         return statuses; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -127,6 +127,7 @@ import app.fedilab.android.client.entities.app.Timeline; | |||
| import app.fedilab.android.databinding.DrawerStatusArtBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusFilteredBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusFilteredHideBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusHiddenBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusNotificationBinding; | ||||
| import app.fedilab.android.databinding.DrawerStatusReportBinding; | ||||
|  | @ -156,6 +157,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|     public static final int STATUS_VISIBLE = 1; | ||||
|     public static final int STATUS_ART = 2; | ||||
|     public static final int STATUS_FILTERED = 3; | ||||
|     public static final int STATUS_FILTERED_HIDE = 4; | ||||
|     private final List<Status> statusList; | ||||
|     private final boolean minified; | ||||
|     private final Timeline.TimeLineEnum timelineType; | ||||
|  | @ -2188,7 +2190,15 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|             return STATUS_ART; | ||||
|         } else { | ||||
|             if (statusList.get(position).filteredByApp != null) { | ||||
|                 return STATUS_FILTERED; | ||||
|                 if (statusList.get(position).filteredByApp.filter_action.equals("warn")) { | ||||
|                     return STATUS_FILTERED; | ||||
|                 } else { //These messages should not be displayed unless they contain a fetch more button | ||||
|                     if (!statusList.get(position).isFetchMore) { | ||||
|                         return STATUS_HIDDEN; | ||||
|                     } else { | ||||
|                         return STATUS_FILTERED_HIDE; | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 return isVisible(timelineType, statusList.get(position)) ? STATUS_VISIBLE : STATUS_HIDDEN; | ||||
|             } | ||||
|  | @ -2206,9 +2216,12 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|         } else if (viewType == STATUS_ART) { //Art statuses | ||||
|             DrawerStatusArtBinding itemBinding = DrawerStatusArtBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); | ||||
|             return new StatusViewHolder(itemBinding); | ||||
|         } else if (viewType == STATUS_FILTERED) { //Art statuses | ||||
|         } else if (viewType == STATUS_FILTERED) { //Filtered warn | ||||
|             DrawerStatusFilteredBinding itemBinding = DrawerStatusFilteredBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); | ||||
|             return new StatusViewHolder(itemBinding); | ||||
|         } else if (viewType == STATUS_FILTERED_HIDE) { //Filtered hide | ||||
|             DrawerStatusFilteredHideBinding itemBinding = DrawerStatusFilteredHideBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); | ||||
|             return new StatusViewHolder(itemBinding); | ||||
|         } else { //Classic statuses | ||||
|             if (!minified) { | ||||
|                 DrawerStatusBinding itemBinding = DrawerStatusBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); | ||||
|  | @ -2245,13 +2258,80 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|             StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class); | ||||
|             SearchVM searchVM = new ViewModelProvider((ViewModelStoreOwner) context).get(SearchVM.class); | ||||
|             statusManagement(context, statusesVM, searchVM, holder, this, statusList, status, timelineType, minified, canBeFederated, checkRemotely, fetchMoreCallBack); | ||||
|         } else if (viewHolder.getItemViewType() == STATUS_FILTERED_HIDE) { | ||||
|             StatusViewHolder holder = (StatusViewHolder) viewHolder; | ||||
| 
 | ||||
|             if (status.isFetchMore && fetchMoreCallBack != null) { | ||||
|                 holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE); | ||||
|                 holder.bindingFilteredHide.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> { | ||||
|                     status.isFetchMore = false; | ||||
|                     notifyItemChanged(holder.getBindingAdapterPosition()); | ||||
|                     if (holder.getBindingAdapterPosition() < statusList.size() - 1) { | ||||
|                         String fromId; | ||||
|                         if (status.positionFetchMore == Status.PositionFetchMore.TOP) { | ||||
|                             fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id; | ||||
|                         } else { | ||||
|                             fromId = status.id; | ||||
|                         } | ||||
|                         fetchMoreCallBack.onClickMinId(fromId, status); | ||||
|                     } | ||||
|                 }); | ||||
|                 holder.bindingFilteredHide.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> { | ||||
|                     //We hide the button | ||||
|                     status.isFetchMore = false; | ||||
|                     String fromId; | ||||
|                     if (status.positionFetchMore == Status.PositionFetchMore.TOP) { | ||||
|                         fromId = statusList.get(holder.getBindingAdapterPosition()).id; | ||||
|                     } else { | ||||
|                         fromId = statusList.get(holder.getBindingAdapterPosition() - 1).id; | ||||
|                     } | ||||
|                     fetchMoreCallBack.onClickMaxId(fromId, status); | ||||
|                     notifyItemChanged(holder.getBindingAdapterPosition()); | ||||
|                 }); | ||||
|             } else { | ||||
|                 holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE); | ||||
|             } | ||||
| 
 | ||||
|         } else if (viewHolder.getItemViewType() == STATUS_FILTERED) { | ||||
|             StatusViewHolder holder = (StatusViewHolder) viewHolder; | ||||
| 
 | ||||
|             holder.bindingFiltered.filteredText.setText(context.getString(R.string.filtered_by, status.filteredByApp.title)); | ||||
|             holder.bindingFiltered.displayButton.setOnClickListener(v -> { | ||||
|                 status.filteredByApp = null; | ||||
|                 notifyItemChanged(position); | ||||
|             }); | ||||
| 
 | ||||
|             if (status.isFetchMore && fetchMoreCallBack != null) { | ||||
|                 holder.bindingFiltered.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE); | ||||
|                 holder.bindingFiltered.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> { | ||||
|                     status.isFetchMore = false; | ||||
|                     notifyItemChanged(holder.getBindingAdapterPosition()); | ||||
|                     if (holder.getBindingAdapterPosition() < statusList.size() - 1) { | ||||
|                         String fromId; | ||||
|                         if (status.positionFetchMore == Status.PositionFetchMore.TOP) { | ||||
|                             fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id; | ||||
|                         } else { | ||||
|                             fromId = status.id; | ||||
|                         } | ||||
|                         fetchMoreCallBack.onClickMinId(fromId, status); | ||||
|                     } | ||||
|                 }); | ||||
|                 holder.bindingFiltered.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> { | ||||
|                     //We hide the button | ||||
|                     status.isFetchMore = false; | ||||
|                     String fromId; | ||||
|                     if (status.positionFetchMore == Status.PositionFetchMore.TOP) { | ||||
|                         fromId = statusList.get(holder.getBindingAdapterPosition()).id; | ||||
|                     } else { | ||||
|                         fromId = statusList.get(holder.getBindingAdapterPosition() - 1).id; | ||||
|                     } | ||||
|                     fetchMoreCallBack.onClickMaxId(fromId, status); | ||||
|                     notifyItemChanged(holder.getBindingAdapterPosition()); | ||||
|                 }); | ||||
|             } else { | ||||
|                 holder.bindingFiltered.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE); | ||||
|             } | ||||
| 
 | ||||
|         } else if (viewHolder.getItemViewType() == STATUS_ART) { | ||||
|             StatusViewHolder holder = (StatusViewHolder) viewHolder; | ||||
|             MastodonHelper.loadPPMastodon(holder.bindingArt.artPp, status.account); | ||||
|  | @ -2352,7 +2432,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|         DrawerStatusNotificationBinding bindingNotification; | ||||
|         DrawerStatusArtBinding bindingArt; | ||||
|         DrawerStatusFilteredBinding bindingFiltered; | ||||
| 
 | ||||
|         DrawerStatusFilteredHideBinding bindingFilteredHide; | ||||
|         StatusViewHolder(DrawerStatusBinding itemView) { | ||||
|             super(itemView.getRoot()); | ||||
|             binding = itemView; | ||||
|  | @ -2385,6 +2465,11 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> | |||
|             super(itemView.getRoot()); | ||||
|             bindingFiltered = itemView; | ||||
|         } | ||||
| 
 | ||||
|         StatusViewHolder(DrawerStatusFilteredHideBinding itemView) { | ||||
|             super(itemView.getRoot()); | ||||
|             bindingFilteredHide = itemView; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ | |||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="center" | ||||
|             android:textSize="16sp" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintBottom_toTopOf="@+id/container_fetchmore" | ||||
|             app:layout_constraintEnd_toStartOf="@+id/display_button" | ||||
|             app:layout_constraintStart_toStartOf="parent" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|  | @ -51,10 +51,29 @@ | |||
|             android:layout_height="wrap_content" | ||||
|             android:text="@string/show_anyway" | ||||
|             android:textColor="@color/cyanea_accent_dark_reference" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintBottom_toTopOf="@+id/container_fetchmore" | ||||
|             app:layout_constraintEnd_toEndOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@+id/filtered_text" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             app:strokeColor="@color/cyanea_accent_dark_reference" /> | ||||
| 
 | ||||
|         <androidx.appcompat.widget.LinearLayoutCompat | ||||
|             android:id="@+id/container_fetchmore" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintEnd_toEndOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@+id/filtered_text"> | ||||
| 
 | ||||
|             <include | ||||
|                 android:id="@+id/layout_fetch_more" | ||||
|                 layout="@layout/drawer_fetch_more" | ||||
|                 android:visibility="gone" | ||||
|                 app:layout_constraintBottom_toBottomOf="parent" | ||||
|                 app:layout_constraintEnd_toEndOf="parent" | ||||
|                 app:layout_constraintStart_toEndOf="@+id/filtered_text" | ||||
|                 app:layout_constraintTop_toTopOf="parent" | ||||
|                 tools:visibility="visible" /> | ||||
|         </androidx.appcompat.widget.LinearLayoutCompat> | ||||
|     </androidx.constraintlayout.widget.ConstraintLayout> | ||||
| </com.google.android.material.card.MaterialCardView> | ||||
							
								
								
									
										46
									
								
								app/src/main/res/layout/drawer_status_filtered_hide.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								app/src/main/res/layout/drawer_status_filtered_hide.xml
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| <?xml version="1.0" encoding="utf-8"?><!-- | ||||
|     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 <http://www.gnu.org/licenses> | ||||
| --> | ||||
| <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:id="@+id/cardview_container" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:layout_marginHorizontal="@dimen/card_margin" | ||||
|     android:layout_marginTop="@dimen/card_margin" | ||||
|     android:clipChildren="false" | ||||
|     android:clipToPadding="false" | ||||
|     app:cardElevation="0dp"> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.LinearLayoutCompat | ||||
|         android:id="@+id/container_fetchmore" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="vertical" | ||||
|         android:padding="5dp"> | ||||
| 
 | ||||
|         <include | ||||
|             android:id="@+id/layout_fetch_more" | ||||
|             layout="@layout/drawer_fetch_more" | ||||
|             android:visibility="gone" | ||||
|             app:layout_constraintBottom_toBottomOf="parent" | ||||
|             app:layout_constraintEnd_toEndOf="parent" | ||||
|             app:layout_constraintStart_toEndOf="@+id/filtered_text" | ||||
|             app:layout_constraintTop_toTopOf="parent" | ||||
|             tools:visibility="visible" /> | ||||
|     </androidx.appcompat.widget.LinearLayoutCompat> | ||||
| </com.google.android.material.card.MaterialCardView> | ||||
		Loading…
	
		Reference in a new issue