mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-22 06:37:30 +00:00
Convert Emoji parsing utils to kotlin. austinhuang0131/barinsta#1311
This commit is contained in:
parent
2ac05569e1
commit
d611006438
@ -184,7 +184,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
|
|||||||
getSupportFragmentManager().addOnBackStackChangedListener(this);
|
getSupportFragmentManager().addOnBackStackChangedListener(this);
|
||||||
// Initialise the internal map
|
// Initialise the internal map
|
||||||
AppExecutors.INSTANCE.getTasksThread().execute(() -> {
|
AppExecutors.INSTANCE.getTasksThread().execute(() -> {
|
||||||
EmojiParser.setup(this);
|
EmojiParser.Companion.getInstance(this);
|
||||||
EmojiVariantManager.getInstance();
|
EmojiVariantManager.getInstance();
|
||||||
});
|
});
|
||||||
initEmojiCompat();
|
initEmojiCompat();
|
||||||
|
@ -31,7 +31,7 @@ public class DirectReactionViewHolder extends RecyclerView.ViewHolder {
|
|||||||
this.onReactionClickListener = onReactionClickListener;
|
this.onReactionClickListener = onReactionClickListener;
|
||||||
binding.info.setVisibility(View.GONE);
|
binding.info.setVisibility(View.GONE);
|
||||||
binding.secondaryImage.setVisibility(View.VISIBLE);
|
binding.secondaryImage.setVisibility(View.VISIBLE);
|
||||||
emojiParser = EmojiParser.getInstance();
|
emojiParser = EmojiParser.Companion.getInstance(itemView.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void bind(final DirectItemEmojiReaction reaction,
|
public void bind(final DirectItemEmojiReaction reaction,
|
||||||
|
@ -80,7 +80,7 @@ public class DirectItemContextMenu extends PopupWindow {
|
|||||||
if (!showReactions && (options == null || options.isEmpty())) {
|
if (!showReactions && (options == null || options.isEmpty())) {
|
||||||
throw new IllegalArgumentException("showReactions is set false and options are empty");
|
throw new IllegalArgumentException("showReactions is set false and options are empty");
|
||||||
}
|
}
|
||||||
reactionsManager = ReactionsManager.getInstance();
|
reactionsManager = ReactionsManager.getInstance(context);
|
||||||
final Resources resources = context.getResources();
|
final Resources resources = context.getResources();
|
||||||
emojiSize = resources.getDimensionPixelSize(R.dimen.reaction_picker_emoji_size);
|
emojiSize = resources.getDimensionPixelSize(R.dimen.reaction_picker_emoji_size);
|
||||||
emojiMargin = resources.getDimensionPixelSize(R.dimen.reaction_picker_emoji_margin);
|
emojiMargin = resources.getDimensionPixelSize(R.dimen.reaction_picker_emoji_margin);
|
||||||
|
@ -20,6 +20,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
|||||||
import awais.instagrabber.R;
|
import awais.instagrabber.R;
|
||||||
import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
|
import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
import awais.instagrabber.utils.emoji.EmojiParser;
|
||||||
|
|
||||||
public class EmojiBottomSheetDialog extends BottomSheetDialogFragment {
|
public class EmojiBottomSheetDialog extends BottomSheetDialogFragment {
|
||||||
public static final String TAG = EmojiBottomSheetDialog.class.getSimpleName();
|
public static final String TAG = EmojiBottomSheetDialog.class.getSimpleName();
|
||||||
@ -89,7 +90,8 @@ public class EmojiBottomSheetDialog extends BottomSheetDialogFragment {
|
|||||||
grid.setHasFixedSize(true);
|
grid.setHasFixedSize(true);
|
||||||
grid.setClipToPadding(false);
|
grid.setClipToPadding(false);
|
||||||
grid.addItemDecoration(new GridSpacingItemDecoration(Utils.convertDpToPx(8)));
|
grid.addItemDecoration(new GridSpacingItemDecoration(Utils.convertDpToPx(8)));
|
||||||
final EmojiGridAdapter adapter = new EmojiGridAdapter(null, (view, emoji) -> {
|
final EmojiParser emojiParser = EmojiParser.Companion.getInstance(context);
|
||||||
|
final EmojiGridAdapter adapter = new EmojiGridAdapter(emojiParser, null, (view, emoji) -> {
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onClick(view, emoji);
|
callback.onClick(view, emoji);
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,14 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import awais.instagrabber.customviews.emoji.EmojiPicker.OnEmojiClickListener;
|
import awais.instagrabber.customviews.emoji.EmojiPicker.OnEmojiClickListener;
|
||||||
|
import awais.instagrabber.utils.emoji.EmojiParser;
|
||||||
|
|
||||||
public class EmojiCategoryPageViewHolder extends RecyclerView.ViewHolder {
|
public class EmojiCategoryPageViewHolder extends RecyclerView.ViewHolder {
|
||||||
// private static final String TAG = EmojiCategoryPageViewHolder.class.getSimpleName();
|
// private static final String TAG = EmojiCategoryPageViewHolder.class.getSimpleName();
|
||||||
|
|
||||||
private final View rootView;
|
private final View rootView;
|
||||||
private final OnEmojiClickListener onEmojiClickListener;
|
private final OnEmojiClickListener onEmojiClickListener;
|
||||||
|
private final EmojiParser emojiParser = EmojiParser.Companion.getInstance(itemView.getContext());
|
||||||
|
|
||||||
public EmojiCategoryPageViewHolder(@NonNull final View rootView,
|
public EmojiCategoryPageViewHolder(@NonNull final View rootView,
|
||||||
@NonNull final RecyclerView itemView,
|
@NonNull final RecyclerView itemView,
|
||||||
@ -24,6 +26,7 @@ public class EmojiCategoryPageViewHolder extends RecyclerView.ViewHolder {
|
|||||||
public void bind(final EmojiCategory emojiCategory) {
|
public void bind(final EmojiCategory emojiCategory) {
|
||||||
final RecyclerView emojiGrid = (RecyclerView) itemView;
|
final RecyclerView emojiGrid = (RecyclerView) itemView;
|
||||||
final EmojiGridAdapter adapter = new EmojiGridAdapter(
|
final EmojiGridAdapter adapter = new EmojiGridAdapter(
|
||||||
|
emojiParser,
|
||||||
emojiCategory.getType(),
|
emojiCategory.getType(),
|
||||||
onEmojiClickListener,
|
onEmojiClickListener,
|
||||||
(position, view, parent) -> {
|
(position, view, parent) -> {
|
||||||
|
@ -43,14 +43,14 @@ public class EmojiGridAdapter extends RecyclerView.Adapter<EmojiGridAdapter.Emoj
|
|||||||
private final EmojiVariantManager emojiVariantManager;
|
private final EmojiVariantManager emojiVariantManager;
|
||||||
private final AppExecutors appExecutors;
|
private final AppExecutors appExecutors;
|
||||||
|
|
||||||
public EmojiGridAdapter(final EmojiCategoryType emojiCategoryType,
|
public EmojiGridAdapter(@NonNull final EmojiParser emojiParser,
|
||||||
|
final EmojiCategoryType emojiCategoryType,
|
||||||
final OnEmojiClickListener onEmojiClickListener,
|
final OnEmojiClickListener onEmojiClickListener,
|
||||||
final OnEmojiLongClickListener onEmojiLongClickListener) {
|
final OnEmojiLongClickListener onEmojiLongClickListener) {
|
||||||
this.onEmojiClickListener = onEmojiClickListener;
|
this.onEmojiClickListener = onEmojiClickListener;
|
||||||
this.onEmojiLongClickListener = onEmojiLongClickListener;
|
this.onEmojiLongClickListener = onEmojiLongClickListener;
|
||||||
differ = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
|
differ = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
|
||||||
new AsyncDifferConfig.Builder<>(diffCallback).build());
|
new AsyncDifferConfig.Builder<>(diffCallback).build());
|
||||||
final EmojiParser emojiParser = EmojiParser.getInstance();
|
|
||||||
final Map<EmojiCategoryType, EmojiCategory> categoryMap = emojiParser.getCategoryMap();
|
final Map<EmojiCategoryType, EmojiCategory> categoryMap = emojiParser.getCategoryMap();
|
||||||
emojiVariantManager = EmojiVariantManager.getInstance();
|
emojiVariantManager = EmojiVariantManager.getInstance();
|
||||||
appExecutors = AppExecutors.INSTANCE;
|
appExecutors = AppExecutors.INSTANCE;
|
||||||
|
@ -67,7 +67,9 @@ public class EmojiPicker extends LinearLayout {
|
|||||||
viewPager2.setAdapter(new EmojiPickerPageAdapter(rootView, onEmojiClickListener));
|
viewPager2.setAdapter(new EmojiPickerPageAdapter(rootView, onEmojiClickListener));
|
||||||
viewPager2.setOffscreenPageLimit(1);
|
viewPager2.setOffscreenPageLimit(1);
|
||||||
|
|
||||||
final EmojiParser emojiParser = EmojiParser.getInstance();
|
final Context context = getContext();
|
||||||
|
if (context == null) return;
|
||||||
|
final EmojiParser emojiParser = EmojiParser.Companion.getInstance(context);
|
||||||
final List<EmojiCategory> categories = emojiParser.getEmojiCategories();
|
final List<EmojiCategory> categories = emojiParser.getEmojiCategories();
|
||||||
|
|
||||||
new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
|
new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
|
||||||
|
@ -37,13 +37,14 @@ public class EmojiPickerPageAdapter extends RecyclerView.Adapter<EmojiCategoryPa
|
|||||||
private final OnEmojiClickListener onEmojiClickListener;
|
private final OnEmojiClickListener onEmojiClickListener;
|
||||||
private final AsyncListDiffer<EmojiCategory> differ;
|
private final AsyncListDiffer<EmojiCategory> differ;
|
||||||
|
|
||||||
public EmojiPickerPageAdapter(final View rootView,
|
public EmojiPickerPageAdapter(@NonNull final View rootView,
|
||||||
final OnEmojiClickListener onEmojiClickListener) {
|
final OnEmojiClickListener onEmojiClickListener) {
|
||||||
this.rootView = rootView;
|
this.rootView = rootView;
|
||||||
this.onEmojiClickListener = onEmojiClickListener;
|
this.onEmojiClickListener = onEmojiClickListener;
|
||||||
differ = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
|
differ = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
|
||||||
new AsyncDifferConfig.Builder<>(diffCallback).build());
|
new AsyncDifferConfig.Builder<>(diffCallback).build());
|
||||||
differ.submitList(EmojiParser.getInstance().getEmojiCategories());
|
final EmojiParser emojiParser = EmojiParser.Companion.getInstance(rootView.getContext());
|
||||||
|
differ.submitList(emojiParser.getEmojiCategories());
|
||||||
setHasStableIds(true);
|
setHasStableIds(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package awais.instagrabber.customviews.emoji;
|
package awais.instagrabber.customviews.emoji;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -26,24 +29,24 @@ public class ReactionsManager {
|
|||||||
|
|
||||||
private static ReactionsManager instance;
|
private static ReactionsManager instance;
|
||||||
|
|
||||||
public static ReactionsManager getInstance() {
|
public static ReactionsManager getInstance(@NonNull final Context context) {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
instance = new ReactionsManager();
|
instance = new ReactionsManager(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ReactionsManager() {
|
private ReactionsManager(@NonNull final Context context) {
|
||||||
|
final EmojiParser emojiParser = EmojiParser.Companion.getInstance(context);
|
||||||
String reactionsJson = Utils.settingsHelper.getString(PREF_REACTIONS);
|
String reactionsJson = Utils.settingsHelper.getString(PREF_REACTIONS);
|
||||||
if (TextUtils.isEmpty(reactionsJson)) {
|
if (TextUtils.isEmpty(reactionsJson)) {
|
||||||
final ImmutableList<String> list = ImmutableList.of("❤️", "\uD83D\uDE02", "\uD83D\uDE2E", "\uD83D\uDE22", "\uD83D\uDE21", "\uD83D\uDC4D");
|
final ImmutableList<String> list = ImmutableList.of("❤️", "\uD83D\uDE02", "\uD83D\uDE2E", "\uD83D\uDE22", "\uD83D\uDE21", "\uD83D\uDC4D");
|
||||||
reactionsJson = new JSONArray(list).toString();
|
reactionsJson = new JSONArray(list).toString();
|
||||||
}
|
}
|
||||||
final EmojiParser emojiParser = EmojiParser.getInstance();
|
|
||||||
final Map<String, Emoji> allEmojis = emojiParser.getAllEmojis();
|
final Map<String, Emoji> allEmojis = emojiParser.getAllEmojis();
|
||||||
try {
|
try {
|
||||||
final JSONArray reactionsJsonArray = new JSONArray(reactionsJson);
|
final JSONArray reactionsJsonArray = new JSONArray(reactionsJson);
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package awais.instagrabber.utils
|
||||||
|
|
||||||
|
open class SingletonHolder<out T : Any, in A>(creator: (A) -> T) {
|
||||||
|
private var creator: ((A) -> T)? = creator
|
||||||
|
|
||||||
|
@Volatile
|
||||||
|
private var instance: T? = null
|
||||||
|
|
||||||
|
fun getInstance(arg: A): T {
|
||||||
|
val i = instance
|
||||||
|
if (i != null) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
return synchronized(this) {
|
||||||
|
val i2 = instance
|
||||||
|
if (i2 != null) {
|
||||||
|
i2
|
||||||
|
} else {
|
||||||
|
val created = creator!!(arg)
|
||||||
|
instance = created
|
||||||
|
creator = null
|
||||||
|
created
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,52 +1,44 @@
|
|||||||
package awais.instagrabber.utils.emoji;
|
package awais.instagrabber.utils.emoji
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log
|
||||||
|
import awais.instagrabber.customviews.emoji.Emoji
|
||||||
|
import awais.instagrabber.customviews.emoji.EmojiCategory
|
||||||
|
import awais.instagrabber.customviews.emoji.EmojiCategoryType
|
||||||
|
import awais.instagrabber.utils.extensions.TAG
|
||||||
|
import com.google.gson.JsonDeserializationContext
|
||||||
|
import com.google.gson.JsonDeserializer
|
||||||
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonParseException
|
||||||
|
import java.lang.reflect.Type
|
||||||
|
|
||||||
import com.google.gson.JsonDeserializationContext;
|
class EmojiCategoryDeserializer : JsonDeserializer<EmojiCategory> {
|
||||||
import com.google.gson.JsonDeserializer;
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.google.gson.JsonParseException;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
@Throws(JsonParseException::class)
|
||||||
import java.util.LinkedHashMap;
|
override fun deserialize(
|
||||||
import java.util.Map;
|
json: JsonElement,
|
||||||
|
typeOfT: Type,
|
||||||
import awais.instagrabber.customviews.emoji.Emoji;
|
context: JsonDeserializationContext
|
||||||
import awais.instagrabber.customviews.emoji.EmojiCategory;
|
): EmojiCategory {
|
||||||
import awais.instagrabber.customviews.emoji.EmojiCategoryType;
|
val jsonObject = json.asJsonObject
|
||||||
|
val typeElement = jsonObject["type"]
|
||||||
public class EmojiCategoryDeserializer implements JsonDeserializer<EmojiCategory> {
|
val emojisObject = jsonObject.getAsJsonObject("emojis")
|
||||||
private static final String TAG = EmojiCategoryDeserializer.class.getSimpleName();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EmojiCategory deserialize(final JsonElement json,
|
|
||||||
final Type typeOfT,
|
|
||||||
final JsonDeserializationContext context) throws JsonParseException {
|
|
||||||
final JsonObject jsonObject = json.getAsJsonObject();
|
|
||||||
final JsonElement typeElement = jsonObject.get("type");
|
|
||||||
final JsonObject emojisObject = jsonObject.getAsJsonObject("emojis");
|
|
||||||
if (typeElement == null || emojisObject == null) {
|
if (typeElement == null || emojisObject == null) {
|
||||||
throw new JsonParseException("Invalid json for EmojiCategory");
|
throw JsonParseException("Invalid json for EmojiCategory")
|
||||||
}
|
}
|
||||||
final String typeString = typeElement.getAsString();
|
val typeString = typeElement.asString
|
||||||
EmojiCategoryType type;
|
val type: EmojiCategoryType = try {
|
||||||
try {
|
EmojiCategoryType.valueOf(typeString)
|
||||||
type = EmojiCategoryType.valueOf(typeString);
|
} catch (e: IllegalArgumentException) {
|
||||||
} catch (IllegalArgumentException e) {
|
Log.e(TAG, "deserialize: ", e)
|
||||||
Log.e(TAG, "deserialize: ", e);
|
EmojiCategoryType.OTHERS
|
||||||
type = EmojiCategoryType.OTHERS;
|
|
||||||
}
|
}
|
||||||
final Map<String, Emoji> emojis = new LinkedHashMap<>();
|
val emojis: MutableMap<String, Emoji> = linkedMapOf()
|
||||||
for (final Map.Entry<String, JsonElement> emojiObjectEntry : emojisObject.entrySet()) {
|
for ((unicode, value) in emojisObject.entrySet()) {
|
||||||
final String unicode = emojiObjectEntry.getKey();
|
|
||||||
final JsonElement value = emojiObjectEntry.getValue();
|
|
||||||
if (unicode == null || value == null) {
|
if (unicode == null || value == null) {
|
||||||
throw new JsonParseException("Invalid json for EmojiCategory");
|
throw JsonParseException("Invalid json for EmojiCategory")
|
||||||
}
|
}
|
||||||
final Emoji emoji = context.deserialize(value, Emoji.class);
|
emojis[unicode] = context.deserialize(value, Emoji::class.java)
|
||||||
emojis.put(unicode, emoji);
|
|
||||||
}
|
}
|
||||||
return new EmojiCategory(type, emojis);
|
return EmojiCategory(type, emojis)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,44 +1,40 @@
|
|||||||
package awais.instagrabber.utils.emoji;
|
package awais.instagrabber.utils.emoji
|
||||||
|
|
||||||
import com.google.gson.JsonArray;
|
import awais.instagrabber.customviews.emoji.Emoji
|
||||||
import com.google.gson.JsonDeserializationContext;
|
import com.google.gson.JsonDeserializationContext
|
||||||
import com.google.gson.JsonDeserializer;
|
import com.google.gson.JsonDeserializer
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonParseException
|
||||||
import com.google.gson.JsonParseException;
|
import java.lang.reflect.Type
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
class EmojiDeserializer : JsonDeserializer<Emoji> {
|
||||||
import java.util.LinkedList;
|
@Throws(JsonParseException::class)
|
||||||
import java.util.List;
|
override fun deserialize(
|
||||||
|
json: JsonElement,
|
||||||
import awais.instagrabber.customviews.emoji.Emoji;
|
typeOfT: Type,
|
||||||
|
context: JsonDeserializationContext
|
||||||
public class EmojiDeserializer implements JsonDeserializer<Emoji> {
|
): Emoji {
|
||||||
@Override
|
val jsonObject = json.asJsonObject
|
||||||
public Emoji deserialize(final JsonElement json,
|
val unicodeElement = jsonObject["unicode"]
|
||||||
final Type typeOfT,
|
val nameElement = jsonObject["name"]
|
||||||
final JsonDeserializationContext context) throws JsonParseException {
|
|
||||||
final JsonObject jsonObject = json.getAsJsonObject();
|
|
||||||
final JsonElement unicodeElement = jsonObject.get("unicode");
|
|
||||||
final JsonElement nameElement = jsonObject.get("name");
|
|
||||||
if (unicodeElement == null || nameElement == null) {
|
if (unicodeElement == null || nameElement == null) {
|
||||||
throw new JsonParseException("Invalid json for Emoji class");
|
throw JsonParseException("Invalid json for Emoji class")
|
||||||
}
|
}
|
||||||
final JsonElement variantsElement = jsonObject.get("variants");
|
val variantsElement = jsonObject["variants"]
|
||||||
final List<Emoji> variants = new LinkedList<>();
|
val variants: MutableList<Emoji> = mutableListOf()
|
||||||
if (variantsElement != null) {
|
if (variantsElement != null) {
|
||||||
final JsonArray variantsArray = variantsElement.getAsJsonArray();
|
val variantsArray = variantsElement.asJsonArray
|
||||||
for (final JsonElement variantElement : variantsArray) {
|
for (variantElement in variantsArray) {
|
||||||
final Emoji variant = context.deserialize(variantElement, Emoji.class);
|
val variant = context.deserialize<Emoji>(variantElement, Emoji::class.java)
|
||||||
if (variant != null) {
|
if (variant != null) {
|
||||||
variants.add(variant);
|
variants.add(variant)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Emoji(
|
return Emoji(
|
||||||
unicodeElement.getAsString(),
|
unicodeElement.asString,
|
||||||
nameElement.getAsString(),
|
nameElement.asString,
|
||||||
variants
|
variants
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,115 +1,53 @@
|
|||||||
package awais.instagrabber.utils.emoji;
|
package awais.instagrabber.utils.emoji
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context
|
||||||
import android.util.Log;
|
import android.util.Log
|
||||||
|
import awais.instagrabber.R
|
||||||
|
import awais.instagrabber.customviews.emoji.Emoji
|
||||||
|
import awais.instagrabber.customviews.emoji.EmojiCategory
|
||||||
|
import awais.instagrabber.customviews.emoji.EmojiCategoryType
|
||||||
|
import awais.instagrabber.utils.NetworkUtils
|
||||||
|
import awais.instagrabber.utils.SingletonHolder
|
||||||
|
import awais.instagrabber.utils.extensions.TAG
|
||||||
|
import com.google.gson.FieldNamingPolicy
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
class EmojiParser private constructor(context: Context) {
|
||||||
|
var allEmojis: Map<String, Emoji> = emptyMap()
|
||||||
|
var categoryMap: Map<EmojiCategoryType, EmojiCategory> = emptyMap()
|
||||||
|
val emojiCategories: List<EmojiCategory> by lazy {
|
||||||
|
categoryMap.values.toList()
|
||||||
|
}
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
fun getEmoji(emoji: String): Emoji? {
|
||||||
import com.google.gson.FieldNamingPolicy;
|
return allEmojis[emoji]
|
||||||
import com.google.gson.Gson;
|
}
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.reflect.TypeToken;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
init {
|
||||||
import java.lang.reflect.Type;
|
try {
|
||||||
import java.util.Collection;
|
context.applicationContext.resources.openRawResource(R.raw.emojis).use { `in` ->
|
||||||
import java.util.Collections;
|
val json = NetworkUtils.readFromInputStream(`in`)
|
||||||
import java.util.LinkedHashMap;
|
val gson = GsonBuilder().apply {
|
||||||
import java.util.List;
|
setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
||||||
import java.util.Map;
|
registerTypeAdapter(EmojiCategory::class.java, EmojiCategoryDeserializer())
|
||||||
import java.util.function.Function;
|
registerTypeAdapter(Emoji::class.java, EmojiDeserializer())
|
||||||
import java.util.stream.Collectors;
|
setLenient()
|
||||||
import java.util.stream.Stream;
|
}.create()
|
||||||
|
val type = object : TypeToken<Map<EmojiCategoryType, EmojiCategory>>() {}.type
|
||||||
import awais.instagrabber.R;
|
categoryMap = gson.fromJson(json, type)
|
||||||
import awais.instagrabber.customviews.emoji.Emoji;
|
// Log.d(TAG, "EmojiParser: " + categoryMap);
|
||||||
import awais.instagrabber.customviews.emoji.EmojiCategory;
|
allEmojis = categoryMap
|
||||||
import awais.instagrabber.customviews.emoji.EmojiCategoryType;
|
.flatMap { (_, emojiCategory) -> emojiCategory.emojis.values }
|
||||||
import awais.instagrabber.utils.NetworkUtils;
|
.flatMap { listOf(it) + it.variants }
|
||||||
|
.filterNotNull()
|
||||||
public final class EmojiParser {
|
.map { it.unicode to it }
|
||||||
private static final String TAG = EmojiParser.class.getSimpleName();
|
.toMap()
|
||||||
private static final Object LOCK = new Object();
|
|
||||||
|
|
||||||
private static EmojiParser instance;
|
|
||||||
|
|
||||||
private Map<String, Emoji> allEmojis = Collections.emptyMap();
|
|
||||||
private Map<EmojiCategoryType, EmojiCategory> categoryMap = Collections.emptyMap();
|
|
||||||
private ImmutableList<EmojiCategory> categories;
|
|
||||||
|
|
||||||
public static void setup(@NonNull final Context context) {
|
|
||||||
if (instance == null) {
|
|
||||||
synchronized (LOCK) {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new EmojiParser(context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "EmojiParser: ", e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EmojiParser getInstance() {
|
companion object : SingletonHolder<EmojiParser, Context>(::EmojiParser)
|
||||||
if (instance == null) {
|
}
|
||||||
throw new RuntimeException("Setup not done!");
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private EmojiParser(final Context context) {
|
|
||||||
try (final InputStream in = context.getResources().openRawResource(R.raw.emojis)) {
|
|
||||||
final String json = NetworkUtils.readFromInputStream(in);
|
|
||||||
final Gson gson = new GsonBuilder()
|
|
||||||
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
|
||||||
.registerTypeAdapter(EmojiCategory.class, new EmojiCategoryDeserializer())
|
|
||||||
.registerTypeAdapter(Emoji.class, new EmojiDeserializer())
|
|
||||||
.setLenient()
|
|
||||||
.create();
|
|
||||||
final Type type = new TypeToken<Map<EmojiCategoryType, EmojiCategory>>() {}.getType();
|
|
||||||
categoryMap = gson.fromJson(json, type);
|
|
||||||
// Log.d(TAG, "EmojiParser: " + categoryMap);
|
|
||||||
allEmojis = categoryMap.values()
|
|
||||||
.stream()
|
|
||||||
.flatMap((Function<EmojiCategory, Stream<Emoji>>) emojiCategory -> {
|
|
||||||
final Map<String, Emoji> emojis = emojiCategory.getEmojis();
|
|
||||||
return emojis.values().stream();
|
|
||||||
})
|
|
||||||
.flatMap(emoji -> ImmutableList.<Emoji>builder()
|
|
||||||
.add(emoji)
|
|
||||||
.addAll(emoji.getVariants())
|
|
||||||
.build()
|
|
||||||
.stream())
|
|
||||||
.collect(Collectors.toMap(
|
|
||||||
Emoji::getUnicode,
|
|
||||||
Function.identity(),
|
|
||||||
(u, v) -> u,
|
|
||||||
LinkedHashMap::new
|
|
||||||
));
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e(TAG, "EmojiParser: ", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<EmojiCategoryType, EmojiCategory> getCategoryMap() {
|
|
||||||
return categoryMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<EmojiCategory> getEmojiCategories() {
|
|
||||||
if (categories == null) {
|
|
||||||
final Collection<EmojiCategory> categoryCollection = categoryMap.values();
|
|
||||||
categories = ImmutableList.copyOf(categoryCollection);
|
|
||||||
}
|
|
||||||
return categories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, Emoji> getAllEmojis() {
|
|
||||||
return allEmojis;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Emoji getEmoji(final String emoji) {
|
|
||||||
if (emoji == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return allEmojis.get(emoji);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user