You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

129 lines
4.5 KiB

package com.keylesspalace.tusky.adapter;
import android.view.*;
import android.util.*;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.google.android.flexbox.FlexboxLayoutManager;
import androidx.viewpager2.widget.ViewPager2;
import androidx.recyclerview.widget.*;
import androidx.emoji.widget.EmojiAppCompatButton;
import androidx.emoji.text.EmojiCompat;
import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.view.EmojiKeyboard;
import com.keylesspalace.tusky.util.Emojis;
import java.util.*;
public class UnicodeEmojiAdapter
extends RecyclerView.Adapter<SingleViewHolder>
implements TabLayoutMediator.TabConfigurationStrategy, EmojiKeyboard.EmojiKeyboardAdapter {
private String id;
private List<String> recents;
private EmojiKeyboard.OnEmojiSelectedListener listener;
private RecyclerView recentsView;
private final static float BUTTON_WIDTH_DP = 65.0f; // empirically found value :(
public UnicodeEmojiAdapter(String id, EmojiKeyboard.OnEmojiSelectedListener listener) {
super();
this.id = id;
this.listener = listener;
}
@Override
public void onConfigureTab(TabLayout.Tab tab, int position) {
if(position == 0) {
tab.setIcon(R.drawable.ic_access_time);
} else {
tab.setText(Emojis.EMOJIS[position - 1][0]);
}
}
@Override
public int getItemCount() {
return Emojis.EMOJIS.length + 1;
}
@Override
public void onBindViewHolder(SingleViewHolder holder, int position) {
if(position == 0) {
recentsView = ((RecyclerView)holder.itemView);
recentsView.setAdapter(new UnicodeEmojiPageAdapter(recents, id, listener));
} else {
((RecyclerView)holder.itemView).setAdapter(
new UnicodeEmojiPageAdapter(Arrays.asList(Emojis.EMOJIS[position - 1]), id, listener));
}
}
@Override
public SingleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_emoji_keyboard_page, parent, false);
SingleViewHolder holder = new SingleViewHolder(view);
DisplayMetrics dm = parent.getContext().getResources().getDisplayMetrics();
float wdp = dm.widthPixels / dm.density;
int rows = (int) (wdp / BUTTON_WIDTH_DP + 0.5);
((RecyclerView)view).setLayoutManager(new GridLayoutManager(view.getContext(), rows));
return holder;
}
@Override
public void onRecentsUpdate(Set<String> set) {
recents = new ArrayList<String>(set);
Collections.reverse(recents);
if(recentsView != null)
recentsView.getAdapter().notifyDataSetChanged();
}
private abstract class UnicodeEmojiBasePageAdapter extends RecyclerView.Adapter<SingleViewHolder> {
private final EmojiKeyboard.OnEmojiSelectedListener listener;
private final String id;
public UnicodeEmojiBasePageAdapter(String id, EmojiKeyboard.OnEmojiSelectedListener listener) {
this.id = id;
this.listener = listener;
}
abstract public String getEmoji(int position);
@Override
public void onBindViewHolder(SingleViewHolder holder, int position) {
String emoji = getEmoji(position);
EmojiAppCompatButton btn = (EmojiAppCompatButton)holder.itemView;
btn.setText(emoji);
btn.setOnClickListener(v -> listener.onEmojiSelected(id, emoji));
}
@Override
public SingleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_emoji_keyboard_emoji, parent, false);
return new SingleViewHolder(view);
}
}
private class UnicodeEmojiPageAdapter extends UnicodeEmojiBasePageAdapter {
private final List<String> emojis;
public UnicodeEmojiPageAdapter(List<String> emojis, String id, EmojiKeyboard.OnEmojiSelectedListener listener) {
super(id, listener);
this.emojis = emojis;
}
@Override
public int getItemCount() {
return emojis.size();
}
@Override
public String getEmoji(int position) {
return emojis.get(position);
}
}
}