Search in sources :

Example 21 with Status

use of com.keylesspalace.tusky.entity.Status in project Tusky by Vavassor.

the class ViewThreadFragment method setContext.

private void setContext(List<Status> unfilteredAncestors, List<Status> unfilteredDescendants) {
    Status mainStatus = null;
    // In case of refresh, remove old ancestors and descendants first. We'll remove all blindly,
    // as we have no guarantee on their order to be the same as before
    int oldSize = statuses.size();
    if (oldSize > 1) {
        mainStatus = statuses.get(statusIndex);
        statuses.clear();
        adapter.clearItems();
    }
    ArrayList<Status> ancestors = new ArrayList<>();
    for (Status status : unfilteredAncestors) if (!filterModel.shouldFilterStatus(status))
        ancestors.add(status);
    // Insert newly fetched ancestors
    statusIndex = ancestors.size();
    adapter.setDetailedStatusPosition(statusIndex);
    statuses.addAll(0, ancestors);
    List<StatusViewData.Concrete> ancestorsViewDatas = statuses.getPairedCopy().subList(0, statusIndex);
    if (BuildConfig.DEBUG && ancestors.size() != ancestorsViewDatas.size()) {
        String error = String.format(Locale.getDefault(), "Incorrectly got statusViewData sublist." + " ancestors.size == %d ancestorsViewDatas.size == %d," + " statuses.size == %d", ancestors.size(), ancestorsViewDatas.size(), statuses.size());
        throw new AssertionError(error);
    }
    adapter.addAll(0, ancestorsViewDatas);
    if (mainStatus != null) {
        // In case we needed to delete everything (which is way easier than deleting
        // everything except one), re-insert the remaining status here.
        // Not filtering the main status, since the user explicitly chose to be here
        statuses.add(statusIndex, mainStatus);
        StatusViewData.Concrete viewData = statuses.getPairedItem(statusIndex);
        adapter.addItem(statusIndex, viewData);
    }
    ArrayList<Status> descendants = new ArrayList<>();
    for (Status status : unfilteredDescendants) if (!filterModel.shouldFilterStatus(status))
        descendants.add(status);
    // Insert newly fetched descendants
    statuses.addAll(descendants);
    List<StatusViewData.Concrete> descendantsViewData;
    descendantsViewData = statuses.getPairedCopy().subList(statuses.size() - descendants.size(), statuses.size());
    if (BuildConfig.DEBUG && descendants.size() != descendantsViewData.size()) {
        String error = String.format(Locale.getDefault(), "Incorrectly got statusViewData sublist." + " descendants.size == %d descendantsViewData.size == %d," + " statuses.size == %d", descendants.size(), descendantsViewData.size(), statuses.size());
        throw new AssertionError(error);
    }
    adapter.addAll(descendantsViewData);
    updateRevealIcon();
}
Also used : Status(com.keylesspalace.tusky.entity.Status) StatusViewData(com.keylesspalace.tusky.viewdata.StatusViewData) ArrayList(java.util.ArrayList)

Example 22 with Status

use of com.keylesspalace.tusky.entity.Status in project Tusky by Vavassor.

the class ViewThreadFragment method onReblog.

@Override
public void onReblog(final boolean reblog, final int position) {
    final Status status = statuses.get(position);
    timelineCases.reblog(statuses.get(position).getId(), reblog).observeOn(AndroidSchedulers.mainThread()).to(autoDisposable(from(this))).subscribe(this::replaceStatus, (t) -> Log.d(TAG, "Failed to reblog status: " + status.getId(), t));
}
Also used : Status(com.keylesspalace.tusky.entity.Status)

Example 23 with Status

use of com.keylesspalace.tusky.entity.Status in project Tusky by Vavassor.

the class ViewThreadFragment method onFavourite.

@Override
public void onFavourite(final boolean favourite, final int position) {
    final Status status = statuses.get(position);
    timelineCases.favourite(statuses.get(position).getId(), favourite).observeOn(AndroidSchedulers.mainThread()).to(autoDisposable(from(this))).subscribe(this::replaceStatus, (t) -> Log.d(TAG, "Failed to favourite status: " + status.getId(), t));
}
Also used : Status(com.keylesspalace.tusky.entity.Status)

Example 24 with Status

use of com.keylesspalace.tusky.entity.Status in project Tusky by Vavassor.

the class StatusBaseViewHolder method setupWithStatus.

public void setupWithStatus(StatusViewData.Concrete status, final StatusActionListener listener, StatusDisplayOptions statusDisplayOptions, @Nullable Object payloads) {
    if (payloads == null) {
        Status actionable = status.getActionable();
        setDisplayName(actionable.getAccount().getDisplayName(), actionable.getAccount().getEmojis(), statusDisplayOptions);
        setUsername(status.getUsername());
        setCreatedAt(actionable.getCreatedAt(), statusDisplayOptions);
        setIsReply(actionable.getInReplyToId() != null);
        setAvatar(actionable.getAccount().getAvatar(), status.getRebloggedAvatar(), actionable.getAccount().getBot(), statusDisplayOptions);
        setReblogged(actionable.getReblogged());
        setFavourited(actionable.getFavourited());
        setBookmarked(actionable.getBookmarked());
        List<Attachment> attachments = actionable.getAttachments();
        boolean sensitive = actionable.getSensitive();
        if (statusDisplayOptions.mediaPreviewEnabled() && hasPreviewableAttachment(attachments)) {
            setMediaPreviews(attachments, sensitive, listener, status.isShowingContent(), statusDisplayOptions.useBlurhash());
            if (attachments.size() == 0) {
                hideSensitiveMediaWarning();
            }
            // Hide the unused label.
            for (TextView mediaLabel : mediaLabels) {
                mediaLabel.setVisibility(View.GONE);
            }
        } else {
            setMediaLabel(attachments, sensitive, listener, status.isShowingContent());
            // Hide all unused views.
            mediaPreviews[0].setVisibility(View.GONE);
            mediaPreviews[1].setVisibility(View.GONE);
            mediaPreviews[2].setVisibility(View.GONE);
            mediaPreviews[3].setVisibility(View.GONE);
            hideSensitiveMediaWarning();
        }
        if (cardView != null) {
            setupCard(status, statusDisplayOptions.cardViewMode(), statusDisplayOptions, listener);
        }
        setupButtons(listener, actionable.getAccount().getId(), status.getContent().toString(), statusDisplayOptions);
        setRebloggingEnabled(actionable.rebloggingAllowed(), actionable.getVisibility());
        setSpoilerAndContent(status.isExpanded(), status.getContent(), status.getSpoilerText(), actionable.getMentions(), actionable.getEmojis(), PollViewDataKt.toViewData(actionable.getPoll()), statusDisplayOptions, listener);
        setDescriptionForStatus(status, statusDisplayOptions);
        // Workaround for RecyclerView 1.0.0 / androidx.core 1.0.0
        // RecyclerView tries to set AccessibilityDelegateCompat to null
        // but ViewCompat code replaces is with the default one. RecyclerView never
        // fetches another one from its delegate because it checks that it's set so we remove it
        // and let RecyclerView ask for a new delegate.
        itemView.setAccessibilityDelegate(null);
    } else {
        if (payloads instanceof List)
            for (Object item : (List<?>) payloads) {
                if (Key.KEY_CREATED.equals(item)) {
                    setCreatedAt(status.getActionable().getCreatedAt(), statusDisplayOptions);
                }
            }
    }
}
Also used : Status(com.keylesspalace.tusky.entity.Status) Attachment(com.keylesspalace.tusky.entity.Attachment) TextView(android.widget.TextView) List(java.util.List)

Example 25 with Status

use of com.keylesspalace.tusky.entity.Status in project Tusky by Vavassor.

the class NotificationsAdapter method bindViewHolder.

private void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position, @Nullable List payloads) {
    Object payloadForHolder = payloads != null && !payloads.isEmpty() ? payloads.get(0) : null;
    if (position < this.dataSource.getItemCount()) {
        NotificationViewData notification = dataSource.getItemAt(position);
        if (notification instanceof NotificationViewData.Placeholder) {
            if (payloadForHolder == null) {
                NotificationViewData.Placeholder placeholder = ((NotificationViewData.Placeholder) notification);
                PlaceholderViewHolder holder = (PlaceholderViewHolder) viewHolder;
                holder.setup(statusListener, placeholder.isLoading());
            }
            return;
        }
        NotificationViewData.Concrete concreteNotificaton = (NotificationViewData.Concrete) notification;
        switch(viewHolder.getItemViewType()) {
            case VIEW_TYPE_STATUS:
                {
                    StatusViewHolder holder = (StatusViewHolder) viewHolder;
                    StatusViewData.Concrete status = concreteNotificaton.getStatusViewData();
                    holder.setupWithStatus(status, statusListener, statusDisplayOptions, payloadForHolder);
                    if (concreteNotificaton.getType() == Notification.Type.POLL) {
                        holder.setPollInfo(accountId.equals(concreteNotificaton.getAccount().getId()));
                    } else {
                        holder.hideStatusInfo();
                    }
                    break;
                }
            case VIEW_TYPE_STATUS_NOTIFICATION:
                {
                    StatusNotificationViewHolder holder = (StatusNotificationViewHolder) viewHolder;
                    StatusViewData.Concrete statusViewData = concreteNotificaton.getStatusViewData();
                    if (payloadForHolder == null) {
                        if (statusViewData == null) {
                            holder.showNotificationContent(false);
                        } else {
                            holder.showNotificationContent(true);
                            Status status = statusViewData.getActionable();
                            holder.setDisplayName(status.getAccount().getDisplayName(), status.getAccount().getEmojis());
                            holder.setUsername(status.getAccount().getUsername());
                            holder.setCreatedAt(status.getCreatedAt());
                            if (concreteNotificaton.getType() == Notification.Type.STATUS) {
                                holder.setAvatar(status.getAccount().getAvatar(), status.getAccount().getBot());
                            } else {
                                holder.setAvatars(status.getAccount().getAvatar(), concreteNotificaton.getAccount().getAvatar());
                            }
                        }
                        holder.setMessage(concreteNotificaton, statusListener);
                        holder.setupButtons(notificationActionListener, concreteNotificaton.getAccount().getId(), concreteNotificaton.getId());
                    } else {
                        if (payloadForHolder instanceof List)
                            for (Object item : (List) payloadForHolder) {
                                if (StatusBaseViewHolder.Key.KEY_CREATED.equals(item) && statusViewData != null) {
                                    holder.setCreatedAt(statusViewData.getStatus().getActionableStatus().getCreatedAt());
                                }
                            }
                    }
                    break;
                }
            case VIEW_TYPE_FOLLOW:
                {
                    if (payloadForHolder == null) {
                        FollowViewHolder holder = (FollowViewHolder) viewHolder;
                        holder.setMessage(concreteNotificaton.getAccount());
                        holder.setupButtons(notificationActionListener, concreteNotificaton.getAccount().getId());
                    }
                    break;
                }
            case VIEW_TYPE_FOLLOW_REQUEST:
                {
                    if (payloadForHolder == null) {
                        FollowRequestViewHolder holder = (FollowRequestViewHolder) viewHolder;
                        holder.setupWithAccount(concreteNotificaton.getAccount(), statusDisplayOptions.animateAvatars(), statusDisplayOptions.animateEmojis());
                        holder.setupActionListener(accountActionListener, concreteNotificaton.getAccount().getId());
                    }
                    break;
                }
            default:
        }
    }
}
Also used : Status(com.keylesspalace.tusky.entity.Status) NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData) List(java.util.List)

Aggregations

Status (com.keylesspalace.tusky.entity.Status)48 StatusViewData (com.keylesspalace.tusky.viewdata.StatusViewData)13 Notification (com.keylesspalace.tusky.entity.Notification)10 Intent (android.content.Intent)4 ArrayList (java.util.ArrayList)4 Either (com.keylesspalace.tusky.util.Either)3 NotificationViewData (com.keylesspalace.tusky.viewdata.NotificationViewData)3 List (java.util.List)3 Context (android.content.Context)2 Pair (android.support.v4.util.Pair)2 TextView (android.widget.TextView)2 AccountEntity (com.keylesspalace.tusky.db.AccountEntity)2 PendingIntent (android.app.PendingIntent)1 ClipData (android.content.ClipData)1 ClipboardManager (android.content.ClipboardManager)1 BitmapDrawable (android.graphics.drawable.BitmapDrawable)1 ColorDrawable (android.graphics.drawable.ColorDrawable)1 Drawable (android.graphics.drawable.Drawable)1 Spanned (android.text.Spanned)1 TextUtils (android.text.TextUtils)1