Skip to content

Commit

Permalink
added emoji support for user fields
Browse files Browse the repository at this point in the history
  • Loading branch information
nuclearfog committed Mar 14, 2024
1 parent 2a09287 commit ae44ded
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 13 deletions.
27 changes: 27 additions & 0 deletions app/src/main/java/org/nuclearfog/twidda/model/lists/Emojis.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.nuclearfog.twidda.model.lists;

import org.nuclearfog.twidda.model.Emoji;

import java.util.ArrayList;
import java.util.Arrays;

/**
* @author nuclearfog
*/
public class Emojis extends ArrayList<Emoji> {

private static final long serialVersionUID = 9203293103283870491L;

/**
*
*/
public Emojis() {
}

/**
*
*/
public Emojis(Emoji[] emojis) {
super(Arrays.asList(emojis));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

import org.nuclearfog.twidda.model.Field;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

/**
* @author nuclearfog
*/
public class Fields extends LinkedList<Field> {
public class Fields extends ArrayList<Field> {

private static final long serialVersionUID = -1117517407497703438L;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import androidx.recyclerview.widget.RecyclerView.Adapter;

import org.nuclearfog.twidda.backend.utils.Tagger.OnTagClickListener;
import org.nuclearfog.twidda.model.Emoji;
import org.nuclearfog.twidda.model.lists.Emojis;
import org.nuclearfog.twidda.model.lists.Fields;
import org.nuclearfog.twidda.ui.adapter.recyclerview.holder.FieldHolder;

Expand All @@ -21,6 +23,7 @@ public class FieldAdapter extends Adapter<FieldHolder> implements OnTagClickList
private OnLinkClickListener listener;

private Fields items = new Fields();
private Emojis emojis = new Emojis();

/**
*
Expand All @@ -39,7 +42,7 @@ public FieldHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

@Override
public void onBindViewHolder(@NonNull FieldHolder holder, int position) {
holder.setContent(items.get(position));
holder.setContent(items.get(position), emojis.toArray(new Emoji[0]));
}


Expand All @@ -63,10 +66,13 @@ public void onLinkClick(String link) {
* replace all existing items with new ones
*
* @param newFields items to insert
* @param newEmojis emoji list used by all fields
*/
public void setItems(Fields newFields) {
public void setItems(Fields newFields, Emojis newEmojis) {
items.clear();
items.addAll(newFields);
emojis.clear();
emojis.addAll(newEmojis);
Collections.sort(items);
notifyDataSetChanged();
}
Expand Down Expand Up @@ -95,6 +101,13 @@ public Fields getItems() {
return new Fields(items);
}

/**
*
*/
public Emojis getEmojis() {
return emojis;
}

/**
* Click listener for url
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,49 @@
package org.nuclearfog.twidda.ui.adapter.recyclerview.holder;

import android.graphics.Color;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;

import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.async.AsyncExecutor.AsyncCallback;
import org.nuclearfog.twidda.backend.async.TextEmojiLoader;
import org.nuclearfog.twidda.backend.utils.AppStyles;
import org.nuclearfog.twidda.backend.utils.EmojiUtils;
import org.nuclearfog.twidda.backend.utils.StringUtils;
import org.nuclearfog.twidda.backend.utils.Tagger;
import org.nuclearfog.twidda.backend.utils.Tagger.OnTagClickListener;
import org.nuclearfog.twidda.config.GlobalSettings;
import org.nuclearfog.twidda.model.Emoji;
import org.nuclearfog.twidda.model.Field;

import java.util.Random;

/**
* ViewHolder for {@link org.nuclearfog.twidda.ui.adapter.recyclerview.FieldAdapter}
*
* @author nuclearfog
*/
public class FieldHolder extends ViewHolder {
public class FieldHolder extends ViewHolder implements AsyncCallback<TextEmojiLoader.Result> {

private static final Random RND = new Random();

private View verified;
private TextView key, value, time;

private TextEmojiLoader emojiLoader;
private GlobalSettings settings;
private OnTagClickListener listener;

private long tagId = RND.nextLong();

/**
*
*/
Expand All @@ -43,19 +56,29 @@ public FieldHolder(ViewGroup parent, OnTagClickListener listener) {
value = itemView.findViewById(R.id.item_field_value);
time = itemView.findViewById(R.id.item_field_timestamp);
settings = GlobalSettings.get(parent.getContext());
emojiLoader = new TextEmojiLoader(parent.getContext());
this.listener = listener;

value.setMovementMethod(LinkMovementMethod.getInstance());
background.setCardBackgroundColor(settings.getCardColor());
AppStyles.setTheme(container, Color.TRANSPARENT);
}


@Override
public void onResult(@NonNull TextEmojiLoader.Result result) {
if (result.id == tagId) {
Spannable spannable = EmojiUtils.addEmojis(value.getContext(), result.spannable, result.images);
value.setText(spannable);
}
}

/**
* set view content
*/
public void setContent(Field field) {
public void setContent(Field field, Emoji[] emojis) {
key.setText(field.getKey());
value.setText(Tagger.makeTextWithLinks(field.getValue(), settings.getHighlightColor(), listener));
Spannable valueSpan = Tagger.makeTextWithLinks(field.getValue(), settings.getHighlightColor(), listener);
if (field.getTimestamp() != 0L) {
verified.setVisibility(View.VISIBLE);
time.setText(R.string.field_verified);
Expand All @@ -64,5 +87,12 @@ public void setContent(Field field) {
verified.setVisibility(View.GONE);
time.setVisibility(View.GONE);
}
if (emojis.length > 0) {
TextEmojiLoader.Param param = new TextEmojiLoader.Param(tagId, emojis, valueSpan, value.getResources().getDimensionPixelSize(R.dimen.item_field_emoji_size));
emojiLoader.execute(param, this);
value.setText(EmojiUtils.removeTags(valueSpan));
} else {
value.setText(valueSpan);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.nuclearfog.twidda.backend.async.UserLoader;
import org.nuclearfog.twidda.backend.utils.ErrorUtils;
import org.nuclearfog.twidda.backend.utils.LinkUtils;
import org.nuclearfog.twidda.model.lists.Emojis;
import org.nuclearfog.twidda.model.lists.Fields;
import org.nuclearfog.twidda.ui.adapter.recyclerview.FieldAdapter;
import org.nuclearfog.twidda.ui.adapter.recyclerview.FieldAdapter.OnLinkClickListener;
Expand All @@ -23,9 +24,23 @@
*/
public class FieldFragment extends ListFragment implements OnLinkClickListener, AsyncCallback<UserLoader.Result> {

/**
* Bundle key used to set user ID
* value type is Long
*/
public static final String KEY_ID = "user-id";

private static final String KEY_SAVE = "fields-save";
/**
* Bundle key used to save/restore fields
* value type is {@link Fields}
*/
private static final String KEY_FIELDS = "fields-save";

/**
* Bundle key used to save/restore emoji list
* value type is {@link Emojis}
*/
private static final String KEY_EMOJIS = "emojis-save";

private UserLoader userLoader;
private FieldAdapter adapter;
Expand All @@ -44,9 +59,10 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
id = param.getLong(KEY_ID);
}
if (savedInstanceState != null) {
Object data = savedInstanceState.getSerializable(KEY_SAVE);
if (data instanceof Fields) {
adapter.setItems((Fields) data);
Object fieldData = savedInstanceState.getSerializable(KEY_FIELDS);
Object emojiData = savedInstanceState.getSerializable(KEY_EMOJIS);
if (fieldData instanceof Fields) {
adapter.setItems((Fields) fieldData, (Emojis) emojiData);
}
}
if (adapter.isEmpty()) {
Expand All @@ -58,7 +74,8 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putSerializable(KEY_SAVE, adapter.getItems());
outState.putSerializable(KEY_FIELDS, adapter.getItems());
outState.putSerializable(KEY_EMOJIS, adapter.getEmojis());
super.onSaveInstanceState(outState);
}

Expand Down Expand Up @@ -103,7 +120,8 @@ protected void onReset() {
public void onResult(@NonNull UserLoader.Result result) {
if (result.user != null) {
Fields fields = new Fields(result.user.getFields());
adapter.setItems(fields);
Emojis emojis = new Emojis(result.user.getEmojis());
adapter.setItems(fields, emojis);
} else {
Context context = getContext();
if (context != null) {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,7 @@
<dimen name="item_field_textsize_value">14sp</dimen>
<dimen name="item_field_textsize_time">10sp</dimen>
<dimen name="item_field_icon_size">18sp</dimen>
<dimen name="item_field_emoji_size">16sp</dimen>

<!--dimens of dialog_meta.xml-->
<dimen name="dialog_meta_textsize_title">22sp</dimen>
Expand Down

0 comments on commit ae44ded

Please sign in to comment.