Enable muting for all timelines, except where it's useless

main
Alibek Omarov 5 years ago
parent e8f945fbcb
commit 542aea22b3
  1. 26
      app/src/main/java/com/keylesspalace/tusky/adapter/TimelineAdapter.java
  2. 4
      app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java
  3. 59
      app/src/main/java/com/keylesspalace/tusky/fragment/TimelineFragment.java

@ -39,6 +39,7 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
} }
private static final int VIEW_TYPE_STATUS = 0; private static final int VIEW_TYPE_STATUS = 0;
private static final int VIEW_TYPE_STATUS_MUTED = 1;
private static final int VIEW_TYPE_PLACEHOLDER = 2; private static final int VIEW_TYPE_PLACEHOLDER = 2;
private final AdapterDataSource<StatusViewData> dataSource; private final AdapterDataSource<StatusViewData> dataSource;
@ -77,6 +78,11 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
.inflate(R.layout.item_status, viewGroup, false); .inflate(R.layout.item_status, viewGroup, false);
return new StatusViewHolder(view); return new StatusViewHolder(view);
} }
case VIEW_TYPE_STATUS_MUTED: {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_status_muted, viewGroup, false);
return new MutedStatusViewHolder(view);
}
case VIEW_TYPE_PLACEHOLDER: { case VIEW_TYPE_PLACEHOLDER: {
View view = LayoutInflater.from(viewGroup.getContext()) View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_status_placeholder, viewGroup, false); .inflate(R.layout.item_status_placeholder, viewGroup, false);
@ -102,11 +108,16 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
PlaceholderViewHolder holder = (PlaceholderViewHolder) viewHolder; PlaceholderViewHolder holder = (PlaceholderViewHolder) viewHolder;
holder.setup(statusListener, ((StatusViewData.Placeholder) status).isLoading()); holder.setup(statusListener, ((StatusViewData.Placeholder) status).isLoading());
} else if (status instanceof StatusViewData.Concrete) { } else if (status instanceof StatusViewData.Concrete) {
StatusViewHolder holder = (StatusViewHolder) viewHolder; StatusViewData.Concrete concrete = (StatusViewData.Concrete)status;
holder.setupWithStatus((StatusViewData.Concrete) status, if(concrete.isThreadMuted()) {
statusListener, MutedStatusViewHolder holder = (MutedStatusViewHolder) viewHolder;
statusDisplayOptions, holder.setupWithStatus(concrete, statusListener, statusDisplayOptions,
payloads != null && !payloads.isEmpty() ? payloads.get(0) : null);
} else {
StatusViewHolder holder = (StatusViewHolder) viewHolder;
holder.setupWithStatus(concrete, statusListener, statusDisplayOptions,
payloads != null && !payloads.isEmpty() ? payloads.get(0) : null); payloads != null && !payloads.isEmpty() ? payloads.get(0) : null);
}
} }
} }
@ -120,7 +131,12 @@ public final class TimelineAdapter extends RecyclerView.Adapter {
if (dataSource.getItemAt(position) instanceof StatusViewData.Placeholder) { if (dataSource.getItemAt(position) instanceof StatusViewData.Placeholder) {
return VIEW_TYPE_PLACEHOLDER; return VIEW_TYPE_PLACEHOLDER;
} else { } else {
return VIEW_TYPE_STATUS; StatusViewData.Concrete concrete = (StatusViewData.Concrete)dataSource.getItemAt(position);
if(concrete.isThreadMuted()) {
return VIEW_TYPE_STATUS_MUTED;
} else {
return VIEW_TYPE_STATUS;
}
} }
} }

@ -330,7 +330,7 @@ public class NotificationsFragment extends SFragment implements
if (posAndNotification == null) if (posAndNotification == null)
return; return;
int conversaionId = posAndNotification.second.getStatus().getConversationId(); int conversationId = posAndNotification.second.getStatus().getConversationId();
if(conversationId == -1) { // invalid conversation ID if(conversationId == -1) { // invalid conversation ID
setMutedStatusForStatus(posAndNotification.first, posAndNotification.second.getStatus(), event.getMute()); setMutedStatusForStatus(posAndNotification.first, posAndNotification.second.getStatus(), event.getMute());
@ -341,7 +341,7 @@ public class NotificationsFragment extends SFragment implements
Notification notification = notifications.get(i).asRightOrNull(); Notification notification = notifications.get(i).asRightOrNull();
if (notification != null && notification.getStatus() != null if (notification != null && notification.getStatus() != null
&& notification.getType() == Notification.Type.MENTION && && notification.getType() == Notification.Type.MENTION &&
notification.getStatus().getConversationId() == conversaionId) { notification.getStatus().getConversationId() == conversationId) {
setMutedStatusForStatus(i, notification.getStatus(), event.getMute()); setMutedStatusForStatus(i, notification.getStatus(), event.getMute());
} }
} }

@ -48,17 +48,7 @@ import com.keylesspalace.tusky.BaseActivity;
import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.adapter.StatusBaseViewHolder; import com.keylesspalace.tusky.adapter.StatusBaseViewHolder;
import com.keylesspalace.tusky.adapter.TimelineAdapter; import com.keylesspalace.tusky.adapter.TimelineAdapter;
import com.keylesspalace.tusky.appstore.BlockEvent; import com.keylesspalace.tusky.appstore.*;
import com.keylesspalace.tusky.appstore.BookmarkEvent;
import com.keylesspalace.tusky.appstore.DomainMuteEvent;
import com.keylesspalace.tusky.appstore.EventHub;
import com.keylesspalace.tusky.appstore.FavoriteEvent;
import com.keylesspalace.tusky.appstore.MuteEvent;
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent;
import com.keylesspalace.tusky.appstore.ReblogEvent;
import com.keylesspalace.tusky.appstore.StatusComposedEvent;
import com.keylesspalace.tusky.appstore.StatusDeletedEvent;
import com.keylesspalace.tusky.appstore.UnfollowEvent;
import com.keylesspalace.tusky.db.AccountManager; import com.keylesspalace.tusky.db.AccountManager;
import com.keylesspalace.tusky.di.Injectable; import com.keylesspalace.tusky.di.Injectable;
import com.keylesspalace.tusky.entity.Filter; import com.keylesspalace.tusky.entity.Filter;
@ -508,6 +498,10 @@ public class TimelineFragment extends SFragment implements
String id = ((BlockEvent) event).getAccountId(); String id = ((BlockEvent) event).getAccountId();
removeAllByAccountId(id); removeAllByAccountId(id);
} }
} else if (event instanceof MuteStatusEvent) {
if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {
handleMuteStatusEvent((MuteStatusEvent)event);
}
} else if (event instanceof MuteEvent) { } else if (event instanceof MuteEvent) {
if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) { if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {
String id = ((MuteEvent) event).getAccountId(); String id = ((MuteEvent) event).getAccountId();
@ -667,6 +661,26 @@ public class TimelineFragment extends SFragment implements
statuses.setPairedItem(actual.second, newViewData); statuses.setPairedItem(actual.second, newViewData);
updateAdapter(); updateAdapter();
} }
@Override
public void onMute(int position, boolean isMuted) {
StatusViewData.Concrete statusViewData =
new StatusViewData.Builder((StatusViewData.Concrete)statuses.getPairedItem(position))
.setThreadMuted(isMuted)
.createStatusViewData();
statuses.setPairedItem(position, statusViewData);
updateAdapter();
}
private void setMutedStatusForStatus(int position, Status status, boolean muted) {
status.setThreadMuted(muted);
StatusViewData.Builder statusViewData = new StatusViewData.Builder((StatusViewData.Concrete)statuses.getPairedItem(position));
statusViewData.setThreadMuted(muted);
statusViewData.setThreadMutedOnBackend(muted);
statuses.setPairedItem(position, statusViewData.createStatusViewData());
}
public void onVoteInPoll(int position, @NonNull List<Integer> choices) { public void onVoteInPoll(int position, @NonNull List<Integer> choices) {
@ -1325,6 +1339,29 @@ public class TimelineFragment extends SFragment implements
} }
onRefresh(); onRefresh();
} }
private void handleMuteStatusEvent(MuteStatusEvent event) {
int pos = findStatusOrReblogPositionById(event.getStatusId());
if (pos < 0)
return;
Status eventStatus = statuses.get(pos).asRight();
int conversationId = eventStatus.getConversationId();
if(conversationId == -1) { // invalid conversation ID
setMutedStatusForStatus(pos, eventStatus, event.getMute());
} else {
//noinspection ConstantConditions
for (int i = 0; i < statuses.size(); i++) {
Status status = statuses.get(i).asRightOrNull();
if (status != null && status.getConversationId() == conversationId) {
setMutedStatusForStatus(i, status, event.getMute());
}
}
}
updateAdapter();
}
private List<Either<Placeholder, Status>> liftStatusList(List<Status> list) { private List<Either<Placeholder, Status>> liftStatusList(List<Status> list) {
return CollectionsKt.map(list, statusLifter); return CollectionsKt.map(list, statusLifter);

Loading…
Cancel
Save