Welcome to mirror list, hosted at ThFree Co, Russian Federation.

CardCommentsMentionProposer.java « comments « card « ui « deck « nextcloud « niedermann « it « java « main « src « app - github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fe10f6cfa5c32c023b6881ed8f31e8124a2be7a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package it.niedermann.nextcloud.deck.ui.card.comments;

import android.annotation.SuppressLint;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.core.util.Pair;
import androidx.lifecycle.LifecycleOwner;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import java.util.ArrayList;
import java.util.List;

import it.niedermann.android.reactivelivedata.ReactiveLiveData;
import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.model.Account;
import it.niedermann.nextcloud.deck.model.User;
import it.niedermann.nextcloud.deck.repository.BaseRepository;
import it.niedermann.nextcloud.deck.ui.card.comments.util.CommentsUtil;

public class CardCommentsMentionProposer implements TextWatcher {

    private final int avatarSize;
    @NonNull
    private final BaseRepository baseRepository;
    @NonNull
    private final LinearLayout.LayoutParams layoutParams;
    @NonNull
    private final LifecycleOwner owner;
    @NonNull
    private final Account account;
    private final long boardLocalId;
    @NonNull
    private final EditText editText;
    @NonNull
    private final LinearLayout mentionProposer;
    @NonNull
    private final LinearLayout mentionProposerWrapper;

    @NonNull
    private final List<User> users = new ArrayList<>();

    public CardCommentsMentionProposer(@NonNull LifecycleOwner owner, @NonNull Account account, long boardLocalId, @NonNull EditText editText, LinearLayout mentionProposerWrapper, @NonNull LinearLayout avatarProposer) {
        this.owner = owner;
        this.account = account;
        this.boardLocalId = boardLocalId;
        this.editText = editText;
        this.mentionProposerWrapper = mentionProposerWrapper;
        this.mentionProposer = avatarProposer;
        baseRepository = new BaseRepository(editText.getContext());
        avatarSize = mentionProposer.getResources().getDimensionPixelSize(R.dimen.avatar_size_small);
        layoutParams = new LinearLayout.LayoutParams(avatarSize, avatarSize);
        layoutParams.setMarginEnd(mentionProposer.getResources().getDimensionPixelSize(R.dimen.spacer_1x));
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        final int selectionStart = editText.getSelectionStart();
        final int selectionEnd = editText.getSelectionEnd();
        final var mentionProposal = CommentsUtil.getUserNameForMentionProposal(s.toString(), selectionStart);
        if (mentionProposal == null || (mentionProposal.first != null && mentionProposal.first.length() == 0) || selectionStart != selectionEnd) {
            mentionProposer.removeAllViews();
            mentionProposerWrapper.setVisibility(View.GONE);
            this.users.clear();
        } else {
            if (mentionProposal.first != null && mentionProposal.second != null) {
                new ReactiveLiveData<>(baseRepository.searchUserByUidOrDisplayNameForCards(account.getId(), boardLocalId, -1L, mentionProposal.first))
                        .observeOnce(owner, users -> {
                            if (!users.equals(this.users)) {
                                mentionProposer.removeAllViews();
                                if (users.size() > 0) {
                                    mentionProposerWrapper.setVisibility(View.VISIBLE);
                                    for (final var user : users) {
                                        final var avatar = new ImageView(mentionProposer.getContext());
                                        avatar.setLayoutParams(layoutParams);
                                        updateListenerOfView(avatar, s, mentionProposal, user);

                                        mentionProposer.addView(avatar);

                                        Glide.with(avatar.getContext())
                                                .load(account.getAvatarUrl(avatarSize, user.getUid()))
                                                .apply(RequestOptions.circleCropTransform())
                                                .placeholder(R.drawable.ic_person_grey600_24dp)
                                                .error(R.drawable.ic_person_grey600_24dp)
                                                .into(avatar);
                                    }
                                } else {
                                    mentionProposerWrapper.setVisibility(View.GONE);
                                }
                                this.users.clear();
                                this.users.addAll(users);
                            } else {
                                int i = 0;
                                for (User user : users) {
                                    updateListenerOfView(mentionProposer.getChildAt(i), s, mentionProposal, user);
                                    i++;
                                }
                            }
                        });
            } else {
                this.users.clear();
                mentionProposer.removeAllViews();
                mentionProposerWrapper.setVisibility(View.GONE);
            }
        }
    }

    @SuppressLint("SetTextI18n")
    private void updateListenerOfView(View avatar, CharSequence s, Pair<String, Integer> mentionProposal, User user) {
        avatar.setOnClickListener((c) -> {
            editText.setText(
                    s.subSequence(0, mentionProposal.second) +
                            user.getUid() +
                            s.subSequence(mentionProposal.second + mentionProposal.first.length(), s.length())
            );
            editText.setSelection(mentionProposal.second + user.getUid().length());
            mentionProposerWrapper.setVisibility(View.GONE);
        });
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
}