Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
Arseny271 committed Aug 28, 2023
1 parent 83e15c0 commit 8808857
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 133 deletions.
10 changes: 10 additions & 0 deletions app/src/main/java/org/thunderdog/challegram/ui/ListItem.java
Expand Up @@ -170,6 +170,7 @@ public class ListItem {
private final int checkId;
private int flags;
private long longId;
private String highlight;

private @Nullable String[] sliderValues;
private int sliderValue;
Expand Down Expand Up @@ -413,6 +414,11 @@ public ListItem setSelected (boolean isSelected) {
return this;
}

public ListItem setHighlightValue (String highlight) {
this.highlight = highlight;
return this;
}

public int decrementSelectionIndex () {
if ((flags & FLAG_USE_SELECTION_INDEX) != 0) {
intValue--;
Expand Down Expand Up @@ -511,6 +517,10 @@ public int getStringResource () {
return stringResource;
}

public String getHighlightValue () {
return highlight;
}

private int[] stringResources;

public boolean hasStringResources () {
Expand Down
131 changes: 71 additions & 60 deletions app/src/main/java/org/thunderdog/challegram/ui/StickersController.java
Expand Up @@ -37,6 +37,7 @@
import org.thunderdog.challegram.tool.Screen;
import org.thunderdog.challegram.tool.Strings;
import org.thunderdog.challegram.tool.UI;
import org.thunderdog.challegram.util.text.Highlight;
import org.thunderdog.challegram.v.CustomRecyclerView;
import org.thunderdog.challegram.widget.DoubleTextView;
import org.thunderdog.challegram.widget.NonMaterialButton;
Expand All @@ -46,6 +47,7 @@

import me.vkryl.android.AnimatorUtils;
import me.vkryl.core.ArrayUtils;
import me.vkryl.core.StringUtils;
import me.vkryl.core.collection.LongList;
import me.vkryl.core.collection.LongSparseIntArray;
import me.vkryl.td.Td;
Expand Down Expand Up @@ -126,15 +128,11 @@ protected void onCreateView (Context context, CustomRecyclerView recyclerView) {
adapter = new SettingsAdapter(this) {
@Override
protected void setStickerSet (ListItem item, int position, DoubleTextView group, boolean isArchived, boolean isUpdate) {
TGStickerSetInfo stickerSet;
if (isArchived && archivedSets != null) {
stickerSet = archivedSets.get(position - getArchivedStartIndex());
} else if (stickerSets != null) {
stickerSet = stickerSets.get(position - getStartIndex());
} else {
TGStickerSetInfo stickerSet = findStickerSetById(item.getLongId());
if (stickerSet == null) {
return;
}
group.setStickerSet(stickerSet);
group.setStickerSet(stickerSet, item.getHighlightValue());
if (isArchived) {
NonMaterialButton button = group.getButton();
if (button != null) {
Expand Down Expand Up @@ -225,7 +223,7 @@ public void onSwiped (RecyclerView.ViewHolder viewHolder, int direction) {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled (RecyclerView recyclerView, int dx, int dy) {
if (!isLoading && ((stickerSets != null && !stickerSets.isEmpty()) || (archivedSets != null && !archivedSets.isEmpty()))) {
if (!isLoading && ((stickerSets != null && !stickerSets.isEmpty()))) {
int position = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
if (position != RecyclerView.NO_POSITION) {
position += 10;
Expand Down Expand Up @@ -438,37 +436,28 @@ public void onClick (View v) {
}
}
}
if (archivedSets != null && !archivedSets.isEmpty()) {
for (TGStickerSetInfo info : archivedSets) {
if (info.getId() == stickerSetId) {
return info;
}
}
}
return null;
}

private @Nullable ArrayList<TGStickerSetInfo> stickerSets;
private @Nullable ArrayList<TGStickerSetInfo> archivedSets;
private @Nullable ArrayList<TGStickerSetInfo> foundStickerSets;

@UiThread
public void addMoreStickerSets (ArrayList<TGStickerSetInfo> stickerSets, @Nullable ArrayList<TGStickerSetInfo> archivedSets) {
public void addMoreStickerSets (ArrayList<TGStickerSetInfo> stickerSets) {
switch (mode) {
case MODE_STICKERS_ARCHIVED: {
if (this.stickerSets == null || this.stickerSets.isEmpty() || stickerSets.isEmpty()) {
return;
}
this.stickerSets.addAll(stickerSets);
List<ListItem> items = adapter.getItems();
int startIndex = items.size() - 1 - (isEmoji ? 1: 0);
// ListItem shadow = items.remove(startIndex);
int startIndex = items.size() - 2;
int i = startIndex;
for (TGStickerSetInfo info : stickerSets) {
info.setBoundList(this.stickerSets);
items.add(i, new ListItem(ListItem.TYPE_ARCHIVED_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId()));
i++;
}
// items.add(shadow);
adapter.notifyItemRangeInserted(startIndex, stickerSets.size());
updateEmojiPacksCount();
break;
Expand All @@ -477,16 +466,17 @@ public void addMoreStickerSets (ArrayList<TGStickerSetInfo> stickerSets, @Nullab
}

@UiThread
public void setStickerSets (ArrayList<TGStickerSetInfo> stickerSets, @Nullable ArrayList<TGStickerSetInfo> archivedSets) {
public void setStickerSets (ArrayList<TGStickerSetInfo> stickerSets) {
this.stickerSets = stickerSets;
this.archivedSets = archivedSets;
buildCells();
}

private void buildCells () {
ArrayList<ListItem> items = new ArrayList<>(Math.max(0, stickerSets != null ? stickerSets.size() * 2 - 1 : 0));

if (!stickerSets.isEmpty() || (archivedSets != null && !archivedSets.isEmpty())) {
ArrayList<TGStickerSetInfo> actualStickerSets = getActualStickerSetsList();

if (!actualStickerSets.isEmpty()) {
if (mode == MODE_STICKERS_ARCHIVED) {
items.add(new ListItem(ListItem.TYPE_EMPTY_OFFSET_SMALL));
items.add(new ListItem(ListItem.TYPE_DESCRIPTION, 0, 0, Lang.getString(!isEmoji ? R.string.ArchivedStickersInfo: R.string.ArchivedEmojiInfo, Strings.buildCounter(tdlib.getInstalledStickerSetLimit())), false));
Expand All @@ -495,37 +485,33 @@ private void buildCells () {
items.add(new ListItem(ListItem.TYPE_EMPTY_OFFSET_SMALL));
items.add(new ListItem(ListItem.TYPE_DESCRIPTION, 0, 0, R.string.MasksHint));

if (!stickerSets.isEmpty()) {
if (!actualStickerSets.isEmpty()) {
items.add(new ListItem(ListItem.TYPE_SHADOW_TOP));
}
}

if (mode == MODE_STICKERS_ARCHIVED) {
for (TGStickerSetInfo info : stickerSets) {
for (TGStickerSetInfo info : actualStickerSets) {
items.add(new ListItem(ListItem.TYPE_ARCHIVED_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId()));
}
} else {
for (TGStickerSetInfo info : stickerSets) {
items.add(new ListItem(ListItem.TYPE_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId()));
boolean oldIsArchived = false;
for (TGStickerSetInfo info : actualStickerSets) {
boolean isArchived = info.isArchived();
if (oldIsArchived != isArchived && mode == MODE_MASKS) {
items.add(new ListItem(ListItem.TYPE_SHADOW_BOTTOM));
items.add(new ListItem(ListItem.TYPE_HEADER, 0, 0, R.string.Archived));
items.add(new ListItem(ListItem.TYPE_SHADOW_TOP));
oldIsArchived = isArchived;
}
items.add(new ListItem(isArchived ? ListItem.TYPE_STICKER_SET: ListItem.TYPE_ARCHIVED_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId()).setHighlightValue(searchRequest));
}
}
if (!stickerSets.isEmpty()) {
if (!actualStickerSets.isEmpty()) {
items.add(new ListItem(ListItem.TYPE_SHADOW_BOTTOM));
}

if (mode == MODE_MASKS && archivedSets != null && !archivedSets.isEmpty()) {
items.add(new ListItem(ListItem.TYPE_HEADER, 0, 0, R.string.Archived));
items.add(new ListItem(ListItem.TYPE_SHADOW_TOP));
for (TGStickerSetInfo info : archivedSets) {
items.add(new ListItem(ListItem.TYPE_ARCHIVED_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId()));
}
items.add(new ListItem(ListItem.TYPE_SHADOW_BOTTOM));
}

if (isEmoji) {
items.add(new ListItem(ListItem.TYPE_DESCRIPTION_CENTERED, R.id.view_emojiPacksCount, 0, Lang.pluralBold(R.string.xEmojiPacks, stickerSets != null ? stickerSets.size(): 0), false));
} else if (mode == MODE_STICKERS) {
items.add(new ListItem(ListItem.TYPE_DESCRIPTION, 0, 0, Lang.getString(R.string.ArchivedStickersInfo, Strings.buildCounter(tdlib.getInstalledStickerSetLimit())), false));
if (mode != MODE_MASKS) {
items.add(new ListItem(ListItem.TYPE_DESCRIPTION_CENTERED, R.id.view_emojiPacksCount, 0, Lang.pluralBold(isEmoji ? R.string.xEmojiPacks : R.string.xStickerPacks, actualStickerSets != null ? actualStickerSets.size() : 0), false));
}
} else if (mode == MODE_STICKERS_ARCHIVED) {
items.add(new ListItem(ListItem.TYPE_EMPTY, 0, 0, Lang.getString(!isEmoji ? R.string.ArchivedStickersInfo: R.string.ArchivedEmojiInfo, Strings.buildCounter(tdlib.getInstalledStickerSetLimit())), false));
Expand All @@ -537,7 +523,7 @@ private void buildCells () {
}

private void updateEmojiPacksCount () {
if (mode != MODE_STICKERS && mode != MODE_STICKERS_ARCHIVED || !isEmoji) return;
if (mode != MODE_STICKERS && mode != MODE_STICKERS_ARCHIVED) return;

int i = adapter.indexOfViewById(R.id.view_emojiPacksCount);
if (i != -1) {
Expand Down Expand Up @@ -589,7 +575,7 @@ private void addArchivedSet (TdApi.StickerSetInfo rawInfo) {
}

private void addArchivedMasks (TdApi.StickerSetInfo rawInfo) {
if (archivedSets == null) {
/*if (archivedSets == null) {
archivedSets = new ArrayList<>();
} else {
for (TGStickerSetInfo prevInfo : archivedSets) {
Expand All @@ -608,9 +594,9 @@ private void addArchivedMasks (TdApi.StickerSetInfo rawInfo) {
int startIndex = getArchivedStartIndex();
ListItem item = new ListItem(ListItem.TYPE_ARCHIVED_STICKER_SET, R.id.btn_stickerSetInfo, 0, 0).setLongId(info.getId());
archivedSets.add(0, info);
archivedMasks.add(0, info);
if (archivedSets.size() == 1) {
if (archivedMasks.size() == 1) {
int index = adapter.getItems().size();
adapter.getItems().add(new ListItem(ListItem.TYPE_HEADER, 0, 0, R.string.Archived));
adapter.getItems().add(new ListItem(ListItem.TYPE_SHADOW_TOP));
Expand All @@ -620,7 +606,7 @@ private void addArchivedMasks (TdApi.StickerSetInfo rawInfo) {
} else {
adapter.getItems().add(startIndex, item);
adapter.notifyItemInserted(startIndex);
}
}*/
}

@Override
Expand Down Expand Up @@ -684,9 +670,12 @@ public void onResult (final TdApi.Object object) {
if (!isDestroyed()) {
isLoading = false;
if (isLoadingMore) {
addMoreStickerSets(stickerSets, archivedSets);
addMoreStickerSets(stickerSets);
} else {
setStickerSets(stickerSets, archivedSets);
if (archivedSets != null) {
stickerSets.addAll(archivedSets);
}
setStickerSets(stickerSets);
}
}
});
Expand All @@ -696,9 +685,9 @@ public void onResult (final TdApi.Object object) {
if (!isDestroyed()) {
isLoading = false;
if (isLoadingMore) {
addMoreStickerSets(stickerSets, null);
addMoreStickerSets(stickerSets);
} else {
setStickerSets(stickerSets, null);
setStickerSets(stickerSets);
}
}
});
Expand Down Expand Up @@ -833,19 +822,19 @@ private void setApplyingChanges (boolean applyingChanges) {
}

private void removeArchivedSet (int index) {
if (archivedSets == null || archivedSets.isEmpty()) {
/*if (archivedMasks == null || archivedMasks.isEmpty()) {
return;
}
TGStickerSetInfo info = archivedSets.remove(index);
TGStickerSetInfo info = archivedMasks.remove(index);
if (currentStates != null) {
currentStates.delete(info.getId());
}
if (archivedSets.isEmpty()) {
if (archivedMasks.isEmpty()) {
adapter.removeRange(getArchivedStartIndex() - 2, 4);
} else {
adapter.removeRange(getArchivedStartIndex() + index, 1);
}
}*/
}

private void changeStickerSets (long[] stickerSetIds) {
Expand Down Expand Up @@ -912,14 +901,14 @@ private void changeStickerSets (long[] stickerSetIds) {
totalIndex++;
}

if (archivedSets != null && !archivedSets.isEmpty()) {
final int size = archivedSets.size();
/*if (archivedMasks != null && !archivedMasks.isEmpty()) {
final int size = archivedMasks.size();
for (int i = size - 1; i >= 0; i--) {
if (allItems.get(archivedSets.get(i).getId(), -1) != -1) {
if (allItems.get(archivedMasks.get(i).getId(), -1) != -1) {
removeArchivedSet(i);
}
}
}
}*/

// First, remove items
final int removedCount = removedStickerSets.size();
Expand Down Expand Up @@ -981,7 +970,29 @@ public void onResult (TdApi.Object object) {
}
}

public void search (String request) {

private @Nullable String searchRequest;

private ArrayList<TGStickerSetInfo> getActualStickerSetsList () {
return StringUtils.isEmpty(searchRequest) ? stickerSets: foundStickerSets;
}

//private CancellableResultHandler resultHandler;

public void search (String request) {
this.searchRequest = request;
if (StringUtils.isEmpty(request) || stickerSets == null) {
foundStickerSets = null;
} else {
foundStickerSets = new ArrayList<>(stickerSets.size());
for (TGStickerSetInfo info: stickerSets) {
if (Highlight.isExactMatch(Highlight.valueOf(info.getTitle(), request))) {
foundStickerSets.add(info);
}
}
}
if (getWrapUnchecked() != null) {
buildCells();
}
}
}
Expand Up @@ -15,11 +15,15 @@

package org.thunderdog.challegram.util.text;

import android.util.Pair;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.util.SparseArray;

import androidx.annotation.Nullable;

import org.thunderdog.challegram.theme.ColorId;
import org.thunderdog.challegram.util.CustomTypefaceSpan;

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

Expand Down Expand Up @@ -385,4 +389,16 @@ public void clear () {
highlights.clear();
}
}

public static CharSequence toSpannable (String text, String highlight) {
Highlight h = valueOf(text, highlight);
if (h == null) {
return text;
}
SpannableStringBuilder b = new SpannableStringBuilder(text);
for (Highlight.Part part : h.parts) {
b.setSpan(new CustomTypefaceSpan(null, ColorId.textSearchQueryHighlight), part.start, part.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return b;
}
}
Expand Up @@ -49,6 +49,7 @@
import org.thunderdog.challegram.tool.Screen;
import org.thunderdog.challegram.tool.Views;
import org.thunderdog.challegram.util.EmojiStatusHelper;
import org.thunderdog.challegram.util.text.Highlight;
import org.thunderdog.challegram.util.text.TextColorSets;

import me.vkryl.core.lambda.Destroyable;
Expand Down Expand Up @@ -248,9 +249,9 @@ public void detach () {
private @Nullable Path stickerSetContour;
private boolean useAvatarReceiver;

public void setStickerSet (@NonNull TGStickerSetInfo stickerSet) {
public void setStickerSet (@NonNull TGStickerSetInfo stickerSet, String highlight) {
needPlaceholder = false;
titleView.setText(stickerSet.getTitle());
titleView.setText(Highlight.toSpannable(stickerSet.getTitle(), highlight));
subtitleView.setText(Lang.plural(stickerSet.isMasks() ? R.string.xMasks : stickerSet.isEmoji() ? R.string.xEmoji : R.string.xStickers, stickerSet.getSize()));
receiver.getImageReceiver(0).requestFile(stickerSet.getPreviewImage());
receiver.getGifReceiver(0).requestFile(stickerSet.getPreviewAnimation());
Expand Down

0 comments on commit 8808857

Please sign in to comment.