emoji_keyboard: first keyboard, supports only unicode emojis

This commit is contained in:
Alibek Omarov 2020-04-10 02:11:31 +03:00
parent cbcb3838dd
commit 06eda38140
6 changed files with 243 additions and 0 deletions

View File

@ -0,0 +1,94 @@
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;
public class UnicodeEmojiAdapter
extends RecyclerView.Adapter<SingleViewHolder>
implements TabLayoutMediator.TabConfigurationStrategy {
private String id;
private EmojiKeyboard.OnEmojiSelectedListener listener;
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) {
tab.setText(Emojis.EMOJIS[position][0]);
}
@Override
public int getItemCount() {
return Emojis.EMOJIS.length;
}
@Override
public void onBindViewHolder(SingleViewHolder holder, int position) {
((RecyclerView)holder.itemView).setAdapter(new UnicodeEmojiPageAdapter(Emojis.EMOJIS[position], 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;
}
private class UnicodeEmojiPageAdapter extends RecyclerView.Adapter<SingleViewHolder> {
private final String[] emojis;
private final String id;
private final EmojiKeyboard.OnEmojiSelectedListener listener;
public UnicodeEmojiPageAdapter(String[] emojis, String id, EmojiKeyboard.OnEmojiSelectedListener listener) {
this.emojis = emojis;
this.id = id;
this.listener = listener;
}
@Override
public int getItemCount() {
return emojis.length;
}
@Override
public void onBindViewHolder(SingleViewHolder holder, int position) {
String emoji = emojis[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);
}
}
}

View File

@ -0,0 +1,89 @@
package com.keylesspalace.tusky.view;
import android.view.*;
import android.content.*;
import android.util.*;
import android.widget.*;
import android.app.*;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import androidx.viewpager2.widget.ViewPager2;
import androidx.recyclerview.widget.RecyclerView;
import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.adapter.UnicodeEmojiAdapter;
public class EmojiKeyboard extends LinearLayout {
private TabLayout tabs;
private ViewPager2 pager;
private TabLayoutMediator currentMediator;
public EmojiKeyboard(Context context) {
super(context);
init(context);
}
public EmojiKeyboard(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public EmojiKeyboard(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
void init(Context context) {
inflate(context, R.layout.item_emoji_picker, this);
tabs = findViewById(R.id.picker_tabs);
pager = findViewById(R.id.picker_pager);
}
public static final int UNICODE_MODE = 0;
public static final int CUSTOM_MODE = 1;
public static final int STICKER_MODE = 2;
void setupKeyboard(String id, int mode, OnEmojiSelectedListener listener) {
RecyclerView.Adapter adapter;
switch(mode) {
case CUSTOM_MODE:
// UNDONE
//break;
case STICKER_MODE:
// UNDONE
//break;
default:
case UNICODE_MODE:
adapter = new UnicodeEmojiAdapter(id, listener);
break;
}
pager.setAdapter(adapter);
if(currentMediator != null)
currentMediator.detach();
currentMediator = new TabLayoutMediator(tabs, pager, (TabLayoutMediator.TabConfigurationStrategy)adapter);
currentMediator.attach();
}
public interface OnEmojiSelectedListener {
void onEmojiSelected(String id, String emoji);
}
public static void show(Context ctx, String id, int mode, OnEmojiSelectedListener listener) {
final Dialog dialog = new Dialog(ctx);
dialog.setTitle(null);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_emoji_keyboard);
EmojiKeyboard kbd = (EmojiKeyboard)dialog.findViewById(R.id.dialog_emoji_keyboard);
kbd.setupKeyboard(id, mode, (_id, _emoji) -> {
listener.onEmojiSelected(_id, _emoji);
dialog.dismiss();
});
dialog.show();
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<com.keylesspalace.tusky.view.EmojiKeyboard
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/dialog_emoji_keyboard"
android:layout_width="320dp"
android:layout_height="250dp" />

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- not a best way but I'm lazy to do proper button -->
<androidx.emoji.widget.EmojiAppCompatButton
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/emoji_keyboard_emoji"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:minWidth="0dp"
android:lines="1"
android:textAlignment="viewStart"
android:textColor="?android:attr/textColorPrimary"
android:textSize="?attr/status_text_medium"
app:backgroundTint="@color/emoji_reaction_button"
tools:text="A" />

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false" />

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/picker_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMaxWidth="0dp"
app:tabMinWidth="0dp"
app:tabGravity="fill"
app:tabMode="scrollable" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/picker_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?attr/windowBackgroundColor" />
</LinearLayout>