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