SubwayTooter-Android-App/emoji/src/main/java/jp/juggler/emoji/EmojiMap.java

141 lines
4.6 KiB
Java

package jp.juggler.emoji;
import android.util.SparseArray;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class EmojiMap {
public static final int CATEGORY_PEOPLE = 0;
public static final int CATEGORY_NATURE = 1;
public static final int CATEGORY_FOODS = 2;
public static final int CATEGORY_ACTIVITY = 3;
public static final int CATEGORY_PLACES = 4;
public static final int CATEGORY_OBJECTS = 5;
public static final int CATEGORY_SYMBOLS = 6;
public static final int CATEGORY_FLAGS = 7;
public static final int CATEGORY_OTHER = 8;
public static class Category {
public final int category_id; // this is String resource id;
public final ArrayList< String > emoji_list = new ArrayList<>();
public Category( int category_id ){
this.category_id = category_id;
}
}
public static class EmojiResource {
@DrawableRes
public final int drawableId;
@Nullable
public final String assetsName;
public EmojiResource( @DrawableRes int drawableId ){
this.drawableId = drawableId;
this.assetsName = null;
}
EmojiResource( @NonNull String assetsName ){
this.drawableId = 0;
this.assetsName = assetsName;
}
public boolean isSvg(){
return assetsName != null;
}
}
public static class EmojiInfo {
@NonNull public final String unified;
@NonNull public final EmojiResource er;
public EmojiInfo( @NonNull String unified, @NonNull EmojiResource er ){
this.unified = unified;
this.er = er;
}
}
// 表示に使う。絵文字のユニコードシーケンスから画像リソースIDへのマップ
public int utf16MaxLength;
public final HashMap< String, EmojiResource> utf16ToEmojiResource = new HashMap<>();
public final EmojiTrie<EmojiResource> utf16Trie = new EmojiTrie<>();
// 表示と投稿に使う。絵文字のショートコードから画像リソースIDとユニコードシーケンスへのマップ
public final HashMap< String, EmojiInfo> shortNameToEmojiInfo = new HashMap<>();
// 入力補完に使う。絵文字のショートコードのソートされたリスト
public final ArrayList< String > shortNameList = new ArrayList<>();
// ピッカーに使う。カテゴリのリスト
public final SparseArray<Category> categoryMap = new SparseArray<>();
// 素の数字とcopyright,registered, trademark は絵文字にしない
private boolean isIgnored( @NonNull String code ){
int c = code.charAt( 0 );
return code.length() == 1 && c <= 0xae || c == 0x2122;
}
// PNG
// private void code( @NonNull String code, @DrawableRes int resId ){
// if( isIgnored( code ) ) return;
// EmojiResource res = new EmojiResource( resId );
// utf16ToEmojiResource.put( code, res);
// utf16Trie.append(code,0,res);
// }
// Assets
void code(@NonNull String code, @NonNull String assetsName ){
if( isIgnored( code ) ) return;
EmojiResource res = new EmojiResource( assetsName );
utf16ToEmojiResource.put( code, res);
utf16Trie.append(code,0,res);
}
void name( @NonNull String name, @NonNull String unified ){
if( isIgnored( unified ) ) return;
EmojiResource er = utf16ToEmojiResource.get( unified );
if( er == null ) throw new IllegalStateException( "missing emoji for code " + unified );
shortNameToEmojiInfo.put( name, new EmojiInfo( unified, er ) );
shortNameList.add( name );
}
void category(@StringRes int string_id, @NonNull String name ){
EmojiMap.Category c = categoryMap.get( string_id );
if( c == null ){
c = new EmojiMap.Category( string_id );
categoryMap.put( string_id, c );
}
c.emoji_list.add( name );
}
private EmojiMap(){
EmojiMapInitializer.initAll(this);
Collections.sort( shortNameList );
}
public static final EmojiMap sMap = new EmojiMap();
//////////////////////////////////////////////////////
public boolean isStartChar(char c) {
return utf16Trie.hasNext(c);
}
}