Custom emoji in more places

This commit is contained in:
Grishka
2022-02-10 22:10:16 +03:00
parent 82a8d0cc29
commit c9078ca8d7
7 changed files with 140 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.os.Bundle;
@@ -17,6 +18,7 @@ import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.model.AccountField;
import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
import org.joinmastodon.android.ui.views.LinkedTextView;
@@ -28,7 +30,11 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.ListImageLoaderWrapper;
import me.grishka.appkit.imageloader.RecyclerViewDelegate;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V;
@@ -44,6 +50,7 @@ public class ProfileAboutFragment extends Fragment{
private boolean isInEditMode;
private ItemTouchHelper dragHelper=new ItemTouchHelper(new ReorderCallback());
private RecyclerView.ViewHolder draggedViewHolder;
private ListImageLoaderWrapper imgLoader;
public void setFields(List<AccountField> fields){
this.fields=fields;
@@ -61,6 +68,7 @@ public class ProfileAboutFragment extends Fragment{
list=new UsableRecyclerView(getActivity());
list.setId(R.id.list);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
imgLoader=new ListImageLoaderWrapper(getActivity(), list, new RecyclerViewDelegate(list), null);
list.setAdapter(adapter=new AboutAdapter());
int pad=V.dp(16);
list.setPadding(pad, pad, pad, pad);
@@ -95,9 +103,9 @@ public class ProfileAboutFragment extends Fragment{
return fields;
}
private class AboutAdapter extends UsableRecyclerView.Adapter<BaseViewHolder>{
private class AboutAdapter extends UsableRecyclerView.Adapter<BaseViewHolder> implements ImageLoaderRecyclerAdapter{
public AboutAdapter(){
super(null);
super(imgLoader);
}
@NonNull
@@ -139,6 +147,16 @@ public class ProfileAboutFragment extends Fragment{
}
return 0;
}
@Override
public int getImageCountForItem(int position){
return isInEditMode || fields.get(position).emojiRequests==null ? 0 : fields.get(position).emojiRequests.size();
}
@Override
public ImageLoaderRequest getImageRequest(int position, int image){
return fields.get(position).emojiRequests.get(image);
}
}
private abstract class BaseViewHolder extends BindableViewHolder<AccountField>{
@@ -164,7 +182,7 @@ public class ProfileAboutFragment extends Fragment{
}
}
private class AboutViewHolder extends BaseViewHolder{
private class AboutViewHolder extends BaseViewHolder implements ImageLoaderViewHolder{
private TextView title;
private LinkedTextView value;
@@ -177,9 +195,22 @@ public class ProfileAboutFragment extends Fragment{
@Override
public void onBind(AccountField item){
super.onBind(item);
title.setText(item.name);
title.setText(item.parsedName);
value.setText(item.parsedValue);
}
@Override
public void setImage(int index, Drawable image){
CustomEmojiSpan span=index>=item.nameEmojis.length ? item.valueEmojis[index-item.nameEmojis.length] : item.nameEmojis[index];
span.setDrawable(image);
title.invalidate();
value.invalidate();
}
@Override
public void clearImage(int index){
setImage(index, null);
}
}
private class EditableAboutViewHolder extends BaseViewHolder{

View File

@@ -12,6 +12,7 @@ import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -42,6 +43,7 @@ import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.ui.drawables.CoverOverlayGradientDrawable;
import org.joinmastodon.android.ui.tabs.TabLayout;
import org.joinmastodon.android.ui.tabs.TabLayoutMediator;
import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.CoverImageView;
@@ -266,7 +268,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
setSubtitle(getResources().getQuantityString(R.plurals.x_posts, account.statusesCount, account.statusesCount));
ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(account.avatar, V.dp(100), V.dp(100)));
ViewImageLoader.load(cover, null, new UrlImageLoaderRequest(account.header, 1000, 1000));
name.setText(account.displayName);
SpannableStringBuilder ssb=new SpannableStringBuilder(account.displayName);
HtmlParser.parseCustomEmoji(ssb, account.emojis);
name.setText(ssb);
setTitle(ssb);
username.setText('@'+account.acct);
bio.setText(HtmlParser.parse(account.note, account.emojis));
followersCount.setText(UiUtils.abbreviateNumber(account.followersCount));
@@ -276,6 +281,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
followingLabel.setText(getResources().getQuantityString(R.plurals.following, account.followingCount));
postsLabel.setText(getResources().getQuantityString(R.plurals.posts, account.statusesCount));
UiUtils.loadCustomEmojiInTextView(name);
UiUtils.loadCustomEmojiInTextView(bio);
if(AccountSessionManager.getInstance().isSelf(accountID, account)){
actionButton.setText(R.string.edit_profile);
}else{
@@ -285,12 +293,24 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
fields.clear();
AccountField joined=new AccountField();
joined.name=getString(R.string.profile_joined);
joined.parsedName=joined.name=getString(R.string.profile_joined);
joined.parsedValue=joined.value=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(LocalDateTime.ofInstant(account.createdAt, ZoneId.systemDefault()));
fields.add(joined);
for(AccountField field:account.fields){
field.parsedValue=HtmlParser.parse(field.value, account.emojis);
field.parsedValue=ssb=HtmlParser.parse(field.value, account.emojis);
field.valueEmojis=ssb.getSpans(0, ssb.length(), CustomEmojiSpan.class);
ssb=new SpannableStringBuilder(field.name);
HtmlParser.parseCustomEmoji(ssb, account.emojis);
field.parsedName=ssb;
field.nameEmojis=ssb.getSpans(0, ssb.length(), CustomEmojiSpan.class);
field.emojiRequests=new ArrayList<>(field.nameEmojis.length+field.valueEmojis.length);
for(CustomEmojiSpan span:field.nameEmojis){
field.emojiRequests.add(span.createImageLoaderRequest());
}
for(CustomEmojiSpan span:field.valueEmojis){
field.emojiRequests.add(span.createImageLoaderRequest());
}
fields.add(field);
}