emoji_keyboard: first keyboard, supports only unicode emojis
This commit is contained in:
parent
cbcb3838dd
commit
06eda38140
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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" />
|
|
@ -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" />
|
|
@ -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" />
|
|
@ -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>
|
Loading…
Reference in New Issue