Search in sources :

Example 1 with NotificationViewData

use of com.keylesspalace.tusky.viewdata.NotificationViewData in project Tusky by tuskyapp.

the class NotificationsFragment method onFetchNotificationsFailure.

private void onFetchNotificationsFailure(Exception exception, FetchEnd fetchEnd, int position) {
    swipeRefreshLayout.setRefreshing(false);
    if (fetchEnd == FetchEnd.MIDDLE && !notifications.get(position).isRight()) {
        NotificationViewData placeholderVD = new NotificationViewData.Placeholder(false);
        notifications.setPairedItem(position, placeholderVD);
        adapter.updateItemWithNotify(position, placeholderVD, true);
    }
    Log.e(TAG, "Fetch failure: " + exception.getMessage());
    fulfillAnyQueuedFetches(fetchEnd);
}
Also used : NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData)

Example 2 with NotificationViewData

use of com.keylesspalace.tusky.viewdata.NotificationViewData in project Tusky by tuskyapp.

the class NotificationsFragment method onContentHiddenChange.

@Override
public void onContentHiddenChange(boolean isShowing, int position) {
    NotificationViewData.Concrete old = (NotificationViewData.Concrete) notifications.getPairedItem(position);
    StatusViewData.Concrete statusViewData = new StatusViewData.Builder(old.getStatusViewData()).setIsShowingSensitiveContent(isShowing).createStatusViewData();
    NotificationViewData notificationViewData = new NotificationViewData.Concrete(old.getType(), old.getId(), old.getAccount(), statusViewData, old.isExpanded());
    notifications.setPairedItem(position, notificationViewData);
    adapter.updateItemWithNotify(position, notificationViewData, false);
}
Also used : StatusViewData(com.keylesspalace.tusky.viewdata.StatusViewData) NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData)

Example 3 with NotificationViewData

use of com.keylesspalace.tusky.viewdata.NotificationViewData in project Tusky by tuskyapp.

the class NotificationsAdapter method onBindViewHolder.

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    if (position < notifications.size()) {
        NotificationViewData notification = notifications.get(position);
        if (notification instanceof NotificationViewData.Placeholder) {
            NotificationViewData.Placeholder placeholder = ((NotificationViewData.Placeholder) notification);
            PlaceholderViewHolder holder = (PlaceholderViewHolder) viewHolder;
            holder.setup(!placeholder.isLoading(), statusListener);
            return;
        }
        NotificationViewData.Concrete concreteNotificaton = (NotificationViewData.Concrete) notification;
        Notification.Type type = concreteNotificaton.getType();
        switch(type) {
            case MENTION:
                {
                    StatusViewHolder holder = (StatusViewHolder) viewHolder;
                    StatusViewData.Concrete status = concreteNotificaton.getStatusViewData();
                    holder.setupWithStatus(status, statusListener, mediaPreviewEnabled);
                    break;
                }
            case FAVOURITE:
            case REBLOG:
                {
                    StatusNotificationViewHolder holder = (StatusNotificationViewHolder) viewHolder;
                    StatusViewData.Concrete statusViewData = concreteNotificaton.getStatusViewData();
                    if (statusViewData == null) {
                        holder.showNotificationContent(false);
                    } else {
                        holder.showNotificationContent(true);
                        holder.setDisplayName(statusViewData.getUserFullName());
                        holder.setUsername(statusViewData.getNickname());
                        holder.setCreatedAt(statusViewData.getCreatedAt());
                        holder.setAvatars(concreteNotificaton.getStatusViewData().getAvatar(), concreteNotificaton.getAccount().getAvatar());
                    }
                    holder.setMessage(concreteNotificaton, statusListener);
                    holder.setupButtons(notificationActionListener, concreteNotificaton.getAccount().getId(), concreteNotificaton.getId());
                    break;
                }
            case FOLLOW:
                {
                    FollowViewHolder holder = (FollowViewHolder) viewHolder;
                    holder.setMessage(concreteNotificaton.getAccount().getName(), concreteNotificaton.getAccount().getUsername(), concreteNotificaton.getAccount().getAvatar());
                    holder.setupButtons(notificationActionListener, concreteNotificaton.getAccount().getId());
                    break;
                }
        }
    } else {
        FooterViewHolder holder = (FooterViewHolder) viewHolder;
        holder.setState(footerState);
    }
}
Also used : NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData) Notification(com.keylesspalace.tusky.entity.Notification)

Example 4 with NotificationViewData

use of com.keylesspalace.tusky.viewdata.NotificationViewData in project Tusky by Vavassor.

the class NotificationsFragment method updateStatus.

private void updateStatus(String statusId, Function<Status, Status> mapper) {
    int index = CollectionsKt.indexOfFirst(this.notifications, (s) -> s.isRight() && s.asRight().getStatus() != null && s.asRight().getStatus().getId().equals(statusId));
    if (index == -1)
        return;
    // We have quite some graph here:
    // 
    // Notification --------> Status
    // ^
    // |
    // StatusViewData
    // ^
    // |
    // NotificationViewData -----+
    // 
    // So if we have "new" status we need to update all references to be sure that data is
    // up-to-date:
    // 1. update status
    // 2. update notification
    // 3. update statusViewData
    // 4. update notificationViewData
    Status oldStatus = notifications.get(index).asRight().getStatus();
    NotificationViewData.Concrete oldViewData = (NotificationViewData.Concrete) this.notifications.getPairedItem(index);
    Status newStatus = mapper.apply(oldStatus);
    Notification newNotification = this.notifications.get(index).asRight().copyWithStatus(newStatus);
    StatusViewData.Concrete newStatusViewData = Objects.requireNonNull(oldViewData.getStatusViewData()).copyWithStatus(newStatus);
    NotificationViewData.Concrete newViewData = oldViewData.copyWithStatus(newStatusViewData);
    notifications.set(index, new Either.Right<>(newNotification));
    notifications.setPairedItem(index, newViewData);
    updateAdapter();
}
Also used : Status(com.keylesspalace.tusky.entity.Status) StatusViewData(com.keylesspalace.tusky.viewdata.StatusViewData) NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData) Either(com.keylesspalace.tusky.util.Either) Notification(com.keylesspalace.tusky.entity.Notification)

Example 5 with NotificationViewData

use of com.keylesspalace.tusky.viewdata.NotificationViewData in project Tusky by Vavassor.

the class NotificationsFragment method onCreateView.

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_timeline_notifications, container, false);
    // from inflater to silence warning
    @NonNull Context context = inflater.getContext();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    boolean showNotificationsFilterSetting = preferences.getBoolean("showNotificationsFilter", true);
    // Clear notifications on filter visibility change to force refresh
    if (showNotificationsFilterSetting != showNotificationsFilter)
        notifications.clear();
    showNotificationsFilter = showNotificationsFilterSetting;
    // Setup the SwipeRefreshLayout.
    swipeRefreshLayout = rootView.findViewById(R.id.swipeRefreshLayout);
    recyclerView = rootView.findViewById(R.id.recyclerView);
    progressBar = rootView.findViewById(R.id.progressBar);
    statusView = rootView.findViewById(R.id.statusView);
    appBarOptions = rootView.findViewById(R.id.appBarOptions);
    swipeRefreshLayout.setOnRefreshListener(this);
    swipeRefreshLayout.setColorSchemeResources(R.color.tusky_blue);
    loadNotificationsFilter();
    // Setup the RecyclerView.
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(context);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAccessibilityDelegateCompat(new ListStatusAccessibilityDelegate(recyclerView, this, (pos) -> {
        NotificationViewData notification = notifications.getPairedItemOrNull(pos);
        // We support replies only for now
        if (notification instanceof NotificationViewData.Concrete) {
            return ((NotificationViewData.Concrete) notification).getStatusViewData();
        } else {
            return null;
        }
    }));
    recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL));
    StatusDisplayOptions statusDisplayOptions = new StatusDisplayOptions(preferences.getBoolean("animateGifAvatars", false), accountManager.getActiveAccount().getMediaPreviewEnabled(), preferences.getBoolean("absoluteTimeView", false), preferences.getBoolean("showBotOverlay", true), preferences.getBoolean("useBlurhash", true), CardViewMode.NONE, preferences.getBoolean("confirmReblogs", true), preferences.getBoolean("confirmFavourites", false), preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false), preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false));
    adapter = new NotificationsAdapter(accountManager.getActiveAccount().getAccountId(), dataSource, statusDisplayOptions, this, this, this);
    alwaysShowSensitiveMedia = accountManager.getActiveAccount().getAlwaysShowSensitiveMedia();
    alwaysOpenSpoiler = accountManager.getActiveAccount().getAlwaysOpenSpoiler();
    recyclerView.setAdapter(adapter);
    topLoading = false;
    bottomLoading = false;
    bottomId = null;
    updateAdapter();
    Button buttonClear = rootView.findViewById(R.id.buttonClear);
    buttonClear.setOnClickListener(v -> confirmClearNotifications());
    buttonFilter = rootView.findViewById(R.id.buttonFilter);
    buttonFilter.setOnClickListener(v -> showFilterMenu());
    if (notifications.isEmpty()) {
        swipeRefreshLayout.setEnabled(false);
        sendFetchNotificationsRequest(null, null, FetchEnd.BOTTOM, -1);
    } else {
        progressBar.setVisibility(View.GONE);
    }
    ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
    updateFilterVisibility();
    return rootView;
}
Also used : Context(android.content.Context) DividerItemDecoration(androidx.recyclerview.widget.DividerItemDecoration) Bundle(android.os.Bundle) ProgressBar(android.widget.ProgressBar) NonNull(androidx.annotation.NonNull) AsyncDifferConfig(androidx.recyclerview.widget.AsyncDifferConfig) SimpleItemAnimator(androidx.recyclerview.widget.SimpleItemAnimator) Utils(at.connyduck.sparkbutton.helpers.Utils) AccountActionListener(com.keylesspalace.tusky.interfaces.AccountActionListener) NotificationTypeConverterKt(com.keylesspalace.tusky.util.NotificationTypeConverterKt) AppBarLayout(com.google.android.material.appbar.AppBarLayout) BackgroundMessageView(com.keylesspalace.tusky.view.BackgroundMessageView) Locale(java.util.Locale) FloatingActionButton(com.google.android.material.floatingactionbutton.FloatingActionButton) ActionButtonActivity(com.keylesspalace.tusky.interfaces.ActionButtonActivity) View(android.view.View) Button(android.widget.Button) RecyclerView(androidx.recyclerview.widget.RecyclerView) Function(androidx.arch.core.util.Function) Log(android.util.Log) ViewDataUtils(com.keylesspalace.tusky.util.ViewDataUtils) StatusViewData(com.keylesspalace.tusky.viewdata.StatusViewData) CoordinatorLayout(androidx.coordinatorlayout.widget.CoordinatorLayout) ListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback) DiffUtil(androidx.recyclerview.widget.DiffUtil) PreferenceChangedEvent(com.keylesspalace.tusky.appstore.PreferenceChangedEvent) StatusActionListener(com.keylesspalace.tusky.interfaces.StatusActionListener) Set(java.util.Set) Function1(kotlin.jvm.functions.Function1) Relationship(com.keylesspalace.tusky.entity.Relationship) ViewGroup(android.view.ViewGroup) ReselectableFragment(com.keylesspalace.tusky.interfaces.ReselectableFragment) Objects(java.util.Objects) FavoriteEvent(com.keylesspalace.tusky.appstore.FavoriteEvent) StatusDisplayOptions(com.keylesspalace.tusky.util.StatusDisplayOptions) AndroidSchedulers(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers) List(java.util.List) Unit(kotlin.Unit) AutoDispose.autoDisposable(autodispose2.AutoDispose.autoDisposable) Nullable(androidx.annotation.Nullable) Pair(androidx.core.util.Pair) Disposable(io.reactivex.rxjava3.disposables.Disposable) CollectionsKt(kotlin.collections.CollectionsKt) AsyncListDiffer(androidx.recyclerview.widget.AsyncListDiffer) ListView(android.widget.ListView) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) StringUtils.isLessThan(com.keylesspalace.tusky.util.StringUtils.isLessThan) AccountEntity(com.keylesspalace.tusky.db.AccountEntity) Context(android.content.Context) BookmarkEvent(com.keylesspalace.tusky.appstore.BookmarkEvent) Notification(com.keylesspalace.tusky.entity.Notification) Single(io.reactivex.rxjava3.core.Single) AlertDialog(androidx.appcompat.app.AlertDialog) Status(com.keylesspalace.tusky.entity.Status) AndroidLifecycleScopeProvider.from(autodispose2.androidx.lifecycle.AndroidLifecycleScopeProvider.from) ReblogEvent(com.keylesspalace.tusky.appstore.ReblogEvent) Poll(com.keylesspalace.tusky.entity.Poll) NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData) PairedList(com.keylesspalace.tusky.util.PairedList) ArrayList(java.util.ArrayList) StatusBaseViewHolder(com.keylesspalace.tusky.adapter.StatusBaseViewHolder) PrefKeys(com.keylesspalace.tusky.settings.PrefKeys) HashSet(java.util.HashSet) Inject(javax.inject.Inject) Lifecycle(androidx.lifecycle.Lifecycle) CompositeDisposable(io.reactivex.rxjava3.disposables.CompositeDisposable) R(com.keylesspalace.tusky.R) CardViewMode(com.keylesspalace.tusky.util.CardViewMode) Observable(io.reactivex.rxjava3.core.Observable) AttachmentViewData(com.keylesspalace.tusky.viewdata.AttachmentViewData) DialogInterface(android.content.DialogInterface) ListStatusAccessibilityDelegate(com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate) EventHub(com.keylesspalace.tusky.appstore.EventHub) BlockEvent(com.keylesspalace.tusky.appstore.BlockEvent) Iterator(java.util.Iterator) LayoutInflater(android.view.LayoutInflater) SwipeRefreshLayout(androidx.swiperefreshlayout.widget.SwipeRefreshLayout) PopupWindow(android.widget.PopupWindow) HttpHeaderLink(com.keylesspalace.tusky.util.HttpHeaderLink) Either(com.keylesspalace.tusky.util.Either) IOException(java.io.IOException) TimeUnit(java.util.concurrent.TimeUnit) ArrayAdapter(android.widget.ArrayAdapter) SparseBooleanArray(android.util.SparseBooleanArray) PinEvent(com.keylesspalace.tusky.appstore.PinEvent) SharedPreferences(android.content.SharedPreferences) NotificationsAdapter(com.keylesspalace.tusky.adapter.NotificationsAdapter) PreferenceManager(androidx.preference.PreferenceManager) ListUtils(com.keylesspalace.tusky.util.ListUtils) AccountManager(com.keylesspalace.tusky.db.AccountManager) EndlessOnScrollListener(com.keylesspalace.tusky.view.EndlessOnScrollListener) Injectable(com.keylesspalace.tusky.di.Injectable) Activity(android.app.Activity) Collections(java.util.Collections) SimpleItemAnimator(androidx.recyclerview.widget.SimpleItemAnimator) SharedPreferences(android.content.SharedPreferences) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) DividerItemDecoration(androidx.recyclerview.widget.DividerItemDecoration) BackgroundMessageView(com.keylesspalace.tusky.view.BackgroundMessageView) View(android.view.View) RecyclerView(androidx.recyclerview.widget.RecyclerView) ListView(android.widget.ListView) StatusDisplayOptions(com.keylesspalace.tusky.util.StatusDisplayOptions) NotificationsAdapter(com.keylesspalace.tusky.adapter.NotificationsAdapter) ListStatusAccessibilityDelegate(com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate) FloatingActionButton(com.google.android.material.floatingactionbutton.FloatingActionButton) Button(android.widget.Button) NonNull(androidx.annotation.NonNull) NotificationViewData(com.keylesspalace.tusky.viewdata.NotificationViewData) Nullable(androidx.annotation.Nullable)

Aggregations

NotificationViewData (com.keylesspalace.tusky.viewdata.NotificationViewData)12 Notification (com.keylesspalace.tusky.entity.Notification)7 StatusViewData (com.keylesspalace.tusky.viewdata.StatusViewData)6 Status (com.keylesspalace.tusky.entity.Status)3 Either (com.keylesspalace.tusky.util.Either)3 Activity (android.app.Activity)2 Context (android.content.Context)2 DialogInterface (android.content.DialogInterface)2 SharedPreferences (android.content.SharedPreferences)2 Bundle (android.os.Bundle)2 Log (android.util.Log)2 SparseBooleanArray (android.util.SparseBooleanArray)2 LayoutInflater (android.view.LayoutInflater)2 View (android.view.View)2 ViewGroup (android.view.ViewGroup)2 ArrayAdapter (android.widget.ArrayAdapter)2 Button (android.widget.Button)2 ListView (android.widget.ListView)2 PopupWindow (android.widget.PopupWindow)2 ProgressBar (android.widget.ProgressBar)2