aboutsummaryrefslogtreecommitdiffstats
path: root/libs/emojicon/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'libs/emojicon/src/main/java')
-rw-r--r--libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java85
-rw-r--r--libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java14
-rw-r--r--libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconsPopup.java28
3 files changed, 123 insertions, 4 deletions
diff --git a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java
index c84bebb8..3e032c42 100644
--- a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java
+++ b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconHandler.java
@@ -19,8 +19,14 @@ import github.ankushsachdeva.emojicon.R;
import android.content.Context;
import android.text.Spannable;
+import android.text.style.ImageSpan;
import android.util.SparseIntArray;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* @author Hieu Rocker (rockerhieu@gmail.com)
*/
@@ -28,6 +34,16 @@ public final class EmojiconHandler {
private EmojiconHandler() {
}
+ public static boolean isParseEmoticons() {
+ return bParseEmoticons;
+ }
+
+ public static void setParseEmoticons(boolean bParseEmoticons) {
+ EmojiconHandler.bParseEmoticons = bParseEmoticons;
+ }
+
+ private static boolean bParseEmoticons = true;
+
private static final SparseIntArray sEmojisMap = new SparseIntArray(846);
private static final SparseIntArray sSoftbanksMap = new SparseIntArray(471);
@@ -1384,6 +1400,72 @@ public final class EmojiconHandler {
addEmojis(context, text, emojiSize, 0, -1);
}
+ public static final Map<Pattern, Integer> ANDROID_EMOTICONS = new HashMap<Pattern, Integer>();
+
+ private static final Spannable.Factory spannableFactory = Spannable.Factory
+ .getInstance();
+
+ static {
+ addPattern(ANDROID_EMOTICONS, ":-?\\)", R.drawable.emo_im_happy);
+ addPattern(ANDROID_EMOTICONS, ":-?\\(", R.drawable.emo_im_sad);
+ addPattern(ANDROID_EMOTICONS, ";-?\\)", R.drawable.emo_im_winking);
+ addPattern(ANDROID_EMOTICONS, ":-?[pP]",
+ R.drawable.emo_im_tongue_sticking_out);
+ addPattern(ANDROID_EMOTICONS, "=-[oO0]", R.drawable.emo_im_surprised);
+ addPattern(ANDROID_EMOTICONS, ":-?\\*", R.drawable.emo_im_kissing);
+ addPattern(ANDROID_EMOTICONS, ":-?[oO0]", R.drawable.emo_im_wtf);
+ addPattern(ANDROID_EMOTICONS, "[8B]-?\\)", R.drawable.emo_im_cool);
+ addPattern(ANDROID_EMOTICONS, ":-?\\$", R.drawable.emo_im_money_mouth);
+ addPattern(ANDROID_EMOTICONS, ":-?!", R.drawable.emo_im_foot_in_mouth);
+ addPattern(ANDROID_EMOTICONS, ":-?\\[", R.drawable.emo_im_embarrassed);
+ addPattern(ANDROID_EMOTICONS, "[oO0]:-?\\)", R.drawable.emo_im_angel);
+ addPattern(ANDROID_EMOTICONS, ":-?[\\\\/]", R.drawable.emo_im_undecided);
+ addPattern(ANDROID_EMOTICONS, ":'-?\\(", R.drawable.emo_im_crying);
+ addPattern(ANDROID_EMOTICONS, ":-?D", R.drawable.emo_im_laughing);
+ addPattern(ANDROID_EMOTICONS, "O_o", R.drawable.emo_im_wtf);
+ addPattern(ANDROID_EMOTICONS, "o_O", R.drawable.emo_im_wtf);
+ addPattern(ANDROID_EMOTICONS, ">:[oO0]", R.drawable.emo_im_yelling);
+ addPattern(ANDROID_EMOTICONS, ":-?[sS]", R.drawable.emo_im_lips_are_sealed);
+ addPattern(ANDROID_EMOTICONS, "<3", R.drawable.emo_im_heart);
+ }
+
+ private static void addPattern(Map<Pattern, Integer> map, String smile,
+ int resource) {
+ map.put(Pattern.compile(smile), resource);
+ }
+
+ private static boolean getSmiledText(Context context, Spannable spannable) {
+ // remove spans throughout all text
+ ImageSpan[] oldSpans = spannable.getSpans(0, spannable.length(), EmojiconImageSpan.class);
+ for (int i = 0; i < oldSpans.length; i++) {
+ spannable.removeSpan(oldSpans[i]);
+ }
+ boolean hasChanges = false;
+ Map<Pattern, Integer> emoticons = ANDROID_EMOTICONS;
+ for (Map.Entry<Pattern, Integer> entry : emoticons.entrySet()) {
+ Matcher matcher = entry.getKey().matcher(spannable);
+ while (matcher.find()) {
+ boolean set = true;
+ for (EmojiconImageSpan span : spannable.getSpans(matcher.start(),
+ matcher.end(), EmojiconImageSpan.class))
+ if (spannable.getSpanStart(span) >= matcher.start()
+ && spannable.getSpanEnd(span) <= matcher.end())
+ spannable.removeSpan(span);
+ else {
+ set = false;
+ break;
+ }
+ if (set) {
+ spannable.setSpan(new EmojiconImageSpan(context, entry.getValue()),
+ matcher.start(), matcher.end(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ hasChanges = true;
+ }
+ }
+ }
+ return hasChanges;
+ }
+
/**
* Convert emoji characters of the given Spannable to the according emojicon.
*
@@ -1394,6 +1476,9 @@ public final class EmojiconHandler {
* @param length
*/
public static void addEmojis(Context context, Spannable text, int emojiSize, int index, int length) {
+ if (isParseEmoticons()) {
+ getSmiledText(context, text);
+ }
int textLength = text.length();
int textLengthToProcessMax = textLength - index;
int textLengthToProcess = length < 0 || length >= textLengthToProcessMax ? textLength : (length+index);
diff --git a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java
new file mode 100644
index 00000000..8ad8fbb5
--- /dev/null
+++ b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconImageSpan.java
@@ -0,0 +1,14 @@
+package github.ankushsachdeva.emojicon;
+
+import android.content.Context;
+import android.text.style.ImageSpan;
+
+/**
+ * Created by lookshe on 16.08.2015.
+ */
+public class EmojiconImageSpan extends ImageSpan {
+
+ EmojiconImageSpan(Context context, int resourceId) {
+ super(context, resourceId);
+ }
+}
diff --git a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconsPopup.java b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconsPopup.java
index 12bc16e0..b5d26047 100644
--- a/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconsPopup.java
+++ b/libs/emojicon/src/main/java/github/ankushsachdeva/emojicon/EmojiconsPopup.java
@@ -29,16 +29,21 @@ import java.util.List;
import android.app.Activity;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Rect;
+import android.os.Build;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager.LayoutParams;
@@ -155,13 +160,28 @@ public class EmojiconsPopup extends PopupWindow implements ViewPager.OnPageChang
.getHeight();
int heightDifference = screenHeight
- (r.bottom - r.top);
- int resourceId = mContext.getResources()
+ Resources resources = mContext.getResources();
+ int statusBarId = resources
.getIdentifier("status_bar_height",
"dimen", "android");
- if (resourceId > 0) {
- heightDifference -= mContext.getResources()
- .getDimensionPixelSize(resourceId);
+ if (statusBarId > 0) {
+ heightDifference -= resources
+ .getDimensionPixelSize(statusBarId);
}
+
+ //Resolved using http://stackoverflow.com/a/16608481/2853322
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ int navBarId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
+ boolean hasMenuKey;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ hasMenuKey = ViewConfiguration.get(mContext).hasPermanentMenuKey();
+ } else hasMenuKey = true; //Skip has menu key below ICS
+ boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
+ if (navBarId > 0 && !hasMenuKey && !hasBackKey) {
+ heightDifference -= resources.getDimensionPixelSize(navBarId);
+ }
+ }
+
if (heightDifference > 100) {
keyBoardHeight = heightDifference;
setSize(LayoutParams.MATCH_PARENT, keyBoardHeight);