├── .gitignore
├── .idea
├── .name
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── encodings.xml
├── gradle.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── king
│ │ └── chatview
│ │ └── ApplicationTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── king
│ │ │ └── chatview
│ │ │ ├── MainActivity.java
│ │ │ ├── app
│ │ │ └── App.java
│ │ │ ├── fragment
│ │ │ └── BaseFragment.java
│ │ │ ├── layout
│ │ │ └── KeyboardDetectorRelativeLayout.java
│ │ │ ├── tools
│ │ │ ├── DImenUtil.java
│ │ │ └── DeviceUtil.java
│ │ │ ├── utils
│ │ │ ├── BundleArguments.java
│ │ │ ├── ContextHolder.java
│ │ │ └── ResourceUtil.java
│ │ │ └── widgets
│ │ │ ├── ChatToolBox.java
│ │ │ ├── CustomIndicator.java
│ │ │ ├── InputChat.java
│ │ │ ├── OnlyView.java
│ │ │ ├── VoicePress.java
│ │ │ └── emotion
│ │ │ ├── EmotionView.java
│ │ │ ├── adapter
│ │ │ ├── BaseEmotionAdapter.java
│ │ │ ├── CustomEmotionAdapter.java
│ │ │ └── EmotionAdapter.java
│ │ │ ├── data
│ │ │ ├── CustomEmoji.java
│ │ │ ├── Emoji.java
│ │ │ ├── Emoticon.java
│ │ │ ├── EmotionData.java
│ │ │ └── UniqueEmoji.java
│ │ │ └── item
│ │ │ └── StickerItem.java
│ └── res
│ │ ├── drawable-hdpi
│ │ ├── avos_plusbox.png
│ │ ├── avos_plusbox_press.png
│ │ ├── icon_indicator_0.png
│ │ └── icon_indicator_1.png
│ │ ├── drawable-xhdpi
│ │ ├── u1f004.png
│ │ ├── u1f30f.png
│ │ ├── u1f319.png
│ │ ├── u1f332.png
│ │ ├── u1f339.png
│ │ ├── u1f33b.png
│ │ ├── u1f349.png
│ │ ├── u1f356.png
│ │ ├── u1f35a.png
│ │ ├── u1f366.png
│ │ ├── u1f36b.png
│ │ ├── u1f377.png
│ │ ├── u1f37b.png
│ │ ├── u1f381.png
│ │ ├── u1f382.png
│ │ ├── u1f384.png
│ │ ├── u1f389.png
│ │ ├── u1f393.png
│ │ ├── u1f3a4.png
│ │ ├── u1f3b2.png
│ │ ├── u1f3b5.png
│ │ ├── u1f3c0.png
│ │ ├── u1f3c2.png
│ │ ├── u1f3e1.png
│ │ ├── u1f434.png
│ │ ├── u1f436.png
│ │ ├── u1f437.png
│ │ ├── u1f44a.png
│ │ ├── u1f44c.png
│ │ ├── u1f44d.png
│ │ ├── u1f44e.png
│ │ ├── u1f44f.png
│ │ ├── u1f451.png
│ │ ├── u1f46a.png
│ │ ├── u1f46b.png
│ │ ├── u1f47b.png
│ │ ├── u1f47c.png
│ │ ├── u1f47d.png
│ │ ├── u1f47f.png
│ │ ├── u1f484.png
│ │ ├── u1f48a.png
│ │ ├── u1f48b.png
│ │ ├── u1f48d.png
│ │ ├── u1f494.png
│ │ ├── u1f4a1.png
│ │ ├── u1f4a2.png
│ │ ├── u1f4a3.png
│ │ ├── u1f4a4.png
│ │ ├── u1f4a9.png
│ │ ├── u1f4aa.png
│ │ ├── u1f4b0.png
│ │ ├── u1f4da.png
│ │ ├── u1f4de.png
│ │ ├── u1f4e2.png
│ │ ├── u1f525.png
│ │ ├── u1f52b.png
│ │ ├── u1f556.png
│ │ ├── u1f600.png
│ │ ├── u1f601.png
│ │ ├── u1f602.png
│ │ ├── u1f603.png
│ │ ├── u1f605.png
│ │ ├── u1f606.png
│ │ ├── u1f607.png
│ │ ├── u1f608.png
│ │ ├── u1f609.png
│ │ ├── u1f60a.png
│ │ ├── u1f60b.png
│ │ ├── u1f60c.png
│ │ ├── u1f60d.png
│ │ ├── u1f60e.png
│ │ ├── u1f60f.png
│ │ ├── u1f611.png
│ │ ├── u1f612.png
│ │ ├── u1f613.png
│ │ ├── u1f614.png
│ │ ├── u1f615.png
│ │ ├── u1f616.png
│ │ ├── u1f618.png
│ │ ├── u1f61a.png
│ │ ├── u1f61c.png
│ │ ├── u1f61d.png
│ │ ├── u1f61e.png
│ │ ├── u1f61f.png
│ │ ├── u1f621.png
│ │ ├── u1f622.png
│ │ ├── u1f623.png
│ │ ├── u1f624.png
│ │ ├── u1f628.png
│ │ ├── u1f629.png
│ │ ├── u1f62a.png
│ │ ├── u1f62b.png
│ │ ├── u1f62c.png
│ │ ├── u1f62d.png
│ │ ├── u1f62e.png
│ │ ├── u1f62f.png
│ │ ├── u1f630.png
│ │ ├── u1f631.png
│ │ ├── u1f632.png
│ │ ├── u1f633.png
│ │ ├── u1f634.png
│ │ ├── u1f635.png
│ │ ├── u1f636.png
│ │ ├── u1f637.png
│ │ ├── u1f648.png
│ │ ├── u1f649.png
│ │ ├── u1f64a.png
│ │ ├── u1f64f.png
│ │ ├── u1f680.png
│ │ ├── u1f6ab.png
│ │ ├── u1f6b2.png
│ │ ├── u1f6bf.png
│ │ ├── u23f0.png
│ │ ├── u23f3.png
│ │ ├── u2600.png
│ │ ├── u2601.png
│ │ ├── u2614.png
│ │ ├── u2615.png
│ │ ├── u261d.png
│ │ ├── u263a.png
│ │ ├── u26a1.png
│ │ ├── u26bd.png
│ │ ├── u26c4.png
│ │ ├── u26c5.png
│ │ ├── u270a.png
│ │ ├── u270b.png
│ │ ├── u270c.png
│ │ ├── u270f.png
│ │ ├── u2744.png
│ │ └── u2b50.png
│ │ ├── drawable-xxhdpi
│ │ ├── amp1.png
│ │ ├── amp2.png
│ │ ├── amp3.png
│ │ ├── amp4.png
│ │ ├── amp5.png
│ │ ├── amp6.png
│ │ ├── amp7.png
│ │ ├── app_panel_ads_normal.png
│ │ ├── app_panel_ads_pressed.png
│ │ ├── app_panel_gallery_normal.png
│ │ ├── app_panel_gallery_pressed.png
│ │ ├── app_panel_location_normal.png
│ │ ├── app_panel_location_pressed.png
│ │ ├── app_panel_video_normal.png
│ │ ├── app_panel_video_pressed.png
│ │ ├── bx_emotion_delete.png
│ │ ├── chatting_setmode_keyboard_btn_normal.png
│ │ ├── chatting_setmode_keyboard_btn_pressed.png
│ │ ├── chatting_setmode_voice_btn_normal.png
│ │ ├── chatting_setmode_voice_btn_pressed.png
│ │ ├── emoji_select_btn_normal.png
│ │ ├── emoji_select_btn_pressed.png
│ │ ├── rcd_cancel_icon.png
│ │ ├── type_select_btn_normal.png
│ │ ├── type_select_btn_pressed.png
│ │ └── voice_rcd_hint.png
│ │ ├── drawable
│ │ ├── app_panel_ads_selector.xml
│ │ ├── app_panel_gallery_selector.xml
│ │ ├── app_panel_location_selector.xml
│ │ ├── app_panel_video_selector.xml
│ │ ├── bg_toolbox.xml
│ │ ├── btn_call.xml
│ │ ├── btn_call_disable.xml
│ │ ├── btn_call_on.xml
│ │ ├── chat_editbox_background.xml
│ │ ├── chat_send_btn.xml
│ │ ├── chatting_setmode_keyboard_btn_selector.xml
│ │ ├── chatting_setmode_voice_btn_selector.xml
│ │ ├── emoji_select_btn_selector.xml
│ │ ├── post_finish_btn.xml
│ │ ├── reddot.xml
│ │ ├── sticker_btn_normal.xml
│ │ ├── sticker_btn_selected.xml
│ │ ├── sticker_style.xml
│ │ ├── talk_btn_bg.xml
│ │ ├── talk_btn_bg_press.xml
│ │ └── type_select_btn_selector.xml
│ │ ├── layout
│ │ ├── activity_main.xml
│ │ ├── avos_input_voice.xml
│ │ ├── avos_voice_cancel.xml
│ │ ├── bx_emotion.xml
│ │ ├── chat_view.xml
│ │ ├── chat_view_new.xml
│ │ ├── emotion_view.xml
│ │ ├── inputchat.xml
│ │ ├── inputchat_new.xml
│ │ ├── item_tool_box.xml
│ │ └── voice_press.xml
│ │ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── emotion_arrays.xml
│ │ ├── ids.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── king
│ └── chatview
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── release.sh
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/workspace.xml
4 | /.idea/libraries
5 | .DS_Store
6 | /build
7 | /captures
8 |
9 |
10 |
11 | # built application files
12 | *.apk
13 | *.ap_
14 |
15 | # files for the dex VM
16 | *.dex
17 |
18 | # Java class files
19 | *.class
20 |
21 | # generated files
22 | bin/
23 | gen/
24 |
25 | # Local configuration file (sdk path, etc)
26 | local.properties
27 | #project.properties
28 |
29 | # Eclipse project files
30 | .classpath
31 | .project
32 | .metadata/
33 |
34 | # IDEA project files
35 | .idea/
36 | *.eml
37 | *.iml
38 | atlassian-ide-plugin.xml
39 |
40 | proguard/
41 | .settings/
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | ChatView
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
19 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 1.7
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AndroidEmotionView
2 | 仿照微信的输入框表情view(从 百姓网 android 端 剥离出来并重构)
3 |
4 | 对外的接口从 InputChat 类的 onInitializeView 开始
5 |
6 | 在外层通过继承 Emoticon 定义好表情元素并根据这些表情元素组合成EmotionData,再把多个EmotionData 组合成 List 后方可传入 EmotionView
7 |
8 | 在设置好EmotionDataList后可以设置Listener监听事件
9 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | applicationId "com.king.chatview"
9 | minSdkVersion 15
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | testCompile 'junit:junit:4.12'
25 | compile 'com.android.support:appcompat-v7:23.1.0'
26 | compile 'com.github.bumptech.glide:glide:3.6.1'
27 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in D:\Android\adt-bundle-windows-x86_64-20140702\sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/king/chatview/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview;
2 |
3 | import android.app.AlertDialog;
4 | import android.content.DialogInterface;
5 | import android.content.Intent;
6 | import android.net.Uri;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.os.Bundle;
9 | import android.util.Log;
10 |
11 | import com.king.chatview.layout.KeyboardDetectorRelativeLayout;
12 | import com.king.chatview.widgets.ChatToolBox;
13 | import com.king.chatview.widgets.InputChat;
14 |
15 | public class MainActivity extends AppCompatActivity {
16 | private static final String INPUT_CHAT_TAG = "input_chat";
17 | InputChat inputChat;
18 |
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.chat_view_new);
23 | inputChat = new InputChat();
24 |
25 | inputChat.addToolBoxData(new ToolAd());
26 |
27 | getSupportFragmentManager().beginTransaction().replace(R.id.input_container, inputChat, INPUT_CHAT_TAG).commit();
28 | inputChat.setInputChatListener(new InputChat.InputChatListener() {
29 | @Override
30 | public void onSendMessage(String msg) {
31 | Log.d("hehe", "sendMessage:" + msg);
32 | }
33 |
34 | @Override
35 | public void onSendVoiceMessage(String path, int duration, String description) {
36 | Log.d("hehe", "SendVoiceMessage:" + "path:" + path + " duration:" + duration + " description:" + description);
37 | }
38 |
39 | @Override
40 | public void onPickPhotoMessage(Intent data) {
41 | Log.d("hehe", "PickPhotoMessage:" + data.toString());
42 | }
43 |
44 | @Override
45 | public void onTakePhotoMessage(Intent data) {
46 | Log.d("hehe", "TakePhotoMessage:" + data.toString());
47 | }
48 |
49 | @Override
50 | public void onPickLocMessage(Intent data) {
51 | Log.d("hehe", "PickLocMessage:" + data.toString());
52 | }
53 | });
54 |
55 | KeyboardDetectorRelativeLayout root = (KeyboardDetectorRelativeLayout) findViewById(R.id.chat_root);
56 | root.setOnSoftKeyboardListener(new KeyboardDetectorRelativeLayout.OnSoftKeyboardListener() {
57 | @Override
58 | public void onShown(int keyboardHeight) {
59 | inputChat.onKeyboardShow(keyboardHeight);
60 | }
61 |
62 | @Override
63 | public void onHidden() {
64 | inputChat.onKeyboardDismiss();
65 | }
66 |
67 | @Override
68 | public void onMeasureFinished() {
69 | // if (inputChat.isBoxShow()) {
70 | // } else {
71 | // }
72 | }
73 | });
74 | }
75 |
76 | private class ToolAd implements ChatToolBox.ChatToolItem {
77 | @Override
78 | public int getIcon() {
79 | return R.drawable.app_panel_ads_selector;
80 | }
81 |
82 | @Override
83 | public String getName() {
84 | return "信息";
85 | }
86 |
87 | @Override
88 | public void onItemSelected() {
89 | AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
90 | .setTitle("请选择")
91 | .setItems(new String[]{"已发布信息", "收藏"}, new DialogInterface.OnClickListener() {
92 | @Override
93 | public void onClick(DialogInterface dialog, int which) {
94 | dialog.dismiss();
95 | }
96 | });
97 | builder.create().show();
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/app/App.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.app;
2 |
3 | import android.app.Application;
4 |
5 | import com.king.chatview.utils.ContextHolder;
6 |
7 | /**
8 | * Created by Administrator on 2015/11/10.
9 | */
10 | public class App extends Application{
11 | @Override
12 | public void onCreate() {
13 | super.onCreate();
14 | ContextHolder.getInstance().init(this);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/fragment/BaseFragment.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.fragment;
2 |
3 | import android.content.Context;
4 | import android.os.Bundle;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.view.inputmethod.InputMethodManager;
10 |
11 | import com.king.chatview.utils.ContextHolder;
12 |
13 | /**
14 | * Created by Administrator on 2015/11/10.
15 | */
16 | public abstract class BaseFragment extends Fragment{
17 | protected abstract View onInitializeView(LayoutInflater inflater, ViewGroup container,
18 | Bundle savedInstanceState);
19 |
20 | @Override
21 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
22 | return onInitializeView(inflater, container, savedInstanceState);
23 | }
24 |
25 | protected final Context getAppContext() {
26 | return ContextHolder.getInstance().get();
27 | }
28 |
29 | protected void hideSoftKeyboard()
30 | {
31 | final View currentRoot = getView();
32 | if (currentRoot != null)
33 | {
34 | final InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
35 | currentRoot.postDelayed(new Runnable() {
36 | public void run() {
37 | mgr.hideSoftInputFromWindow(currentRoot.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
38 | }
39 | }, 100);
40 | }
41 | }
42 |
43 | protected void handleLeftAction() {
44 | if(false == handleBack()) {
45 | // finishActivity();
46 | }
47 | }
48 |
49 | public boolean handleBack()
50 | {
51 | return false;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/layout/KeyboardDetectorRelativeLayout.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.layout;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.util.Log;
6 | import android.widget.RelativeLayout;
7 |
8 | /**
9 | * Created by Administrator on 2015/11/10.
10 | */
11 | public class KeyboardDetectorRelativeLayout extends RelativeLayout {
12 | private OnSoftKeyboardListener listener;
13 |
14 | public KeyboardDetectorRelativeLayout(Context context) {
15 | this(context, null);
16 | }
17 |
18 | public KeyboardDetectorRelativeLayout(Context context, AttributeSet attrs) {
19 | this(context, attrs, 0);
20 | }
21 |
22 | public KeyboardDetectorRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
23 | super(context, attrs, defStyle);
24 | }
25 |
26 | @Override
27 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
28 | final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
29 | final int actualHeight = getHeight();
30 |
31 | int diff = actualHeight - proposedheight;
32 | Log.d("hehe", "diff:"+diff);
33 | if (diff > 100) {
34 | if (null != listener) {
35 | listener.onShown(diff);
36 | }
37 |
38 | } else if (diff < -100) {
39 | if (null != listener) {
40 | listener.onHidden();
41 | }
42 | }
43 | super.onMeasure(widthMeasureSpec, heightMeasureSpec);
44 |
45 | if (null != listener) {
46 | listener.onMeasureFinished();
47 | }
48 | }
49 |
50 | public void setOnSoftKeyboardListener(OnSoftKeyboardListener listener) {
51 | this.listener = listener;
52 | }
53 |
54 | public interface OnSoftKeyboardListener {
55 | void onShown(int keyboardHeight);
56 |
57 | void onHidden();
58 |
59 | void onMeasureFinished();
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/tools/DImenUtil.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.tools;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/10.
7 | */
8 | public class DImenUtil {
9 | /**
10 | * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
11 | */
12 | public static int dip2px(Context context, float dpValue) {
13 | final float scale = context.getResources().getDisplayMetrics().density;
14 | return (int) (dpValue * scale + 0.5f);
15 | }
16 |
17 | /**
18 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
19 | */
20 | public static int px2dip(Context context, float pxValue) {
21 | final float scale = context.getResources().getDisplayMetrics().density;
22 | return (int) (pxValue / scale + 0.5f);
23 | }
24 |
25 | public static int px2sp(Context context, float px) {
26 | float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
27 | return (int) (px/scaledDensity + 0.5f);
28 | }
29 |
30 | public static float sp2px(Context context, float sp) {
31 | float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
32 | return (float)((sp-0.5) * scaledDensity);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/tools/DeviceUtil.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.tools;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.os.Environment;
6 | import android.provider.Settings;
7 | import android.telephony.TelephonyManager;
8 | import android.view.WindowManager;
9 |
10 | import java.util.UUID;
11 |
12 | /**
13 | * Created by Administrator on 2015/11/10.
14 | */
15 | public class DeviceUtil {
16 | public static String getDevicePhoneNumber(Context ctx){
17 | TelephonyManager mTelephonyMgr = (TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE);
18 | String number = null;
19 | if(mTelephonyMgr != null){
20 | number = mTelephonyMgr.getLine1Number();
21 | if(number != null && number.length() >= 11){
22 | number = number.substring(number.length() - 11);
23 | }
24 | }
25 | return number;
26 | }
27 |
28 | private static String PREF_DEVICE_ID = "bx_share_deviceID";
29 | private static String PREF_KEY_DEVICE_ID = "pref_key_device";
30 | private static String DEVICE_ID = "";
31 |
32 | static public String getDeviceUdid(Context context) {
33 |
34 | /**
35 | * Firstly, check if memory exists.
36 | */
37 | if (DEVICE_ID != null && DEVICE_ID.length() > 0)
38 | {
39 | return DEVICE_ID;
40 | }
41 |
42 | /**
43 | * Then, check if we have saved the preference.
44 | */
45 | SharedPreferences pref = context.getSharedPreferences(PREF_DEVICE_ID, Context.MODE_PRIVATE);
46 | if (pref != null && pref.contains(PREF_KEY_DEVICE_ID))
47 | {
48 | DEVICE_ID = pref.getString(PREF_KEY_DEVICE_ID, null);
49 | }
50 |
51 | if (DEVICE_ID != null && DEVICE_ID.length() > 0)
52 | {
53 | return DEVICE_ID;
54 | }
55 |
56 | /**
57 | * And last, get ANDROID_ID or device id, or random id if we cannot get any unique id from android system.
58 | */
59 | try
60 | {
61 | DEVICE_ID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
62 |
63 | /**
64 | * --> 9774d56d682e549c is an android system bug.
65 | * --> null or "null" means cannot get android id.
66 | */
67 | if ("9774d56d682e549c".equals(DEVICE_ID) || DEVICE_ID == null || "null".equalsIgnoreCase(DEVICE_ID.trim())) {
68 | final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
69 | String uuid = deviceId!=null && !"null".equalsIgnoreCase(deviceId.trim()) ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString();
70 |
71 | DEVICE_ID = uuid;
72 | return uuid;
73 | }
74 | }
75 | catch(Throwable t)
76 | {
77 | DEVICE_ID = System.currentTimeMillis() + ""; //If any exception occur, use system current time as unique id.
78 | t.printStackTrace();
79 | }
80 | finally
81 | {
82 | if (pref != null)
83 | {
84 | pref.edit().putString(PREF_KEY_DEVICE_ID, DEVICE_ID).commit();
85 | }
86 | }
87 |
88 | return DEVICE_ID;
89 |
90 | }
91 |
92 | public static int getWidthByContext(Context context){
93 | try {
94 | WindowManager winManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
95 | return winManager.getDefaultDisplay().getWidth();
96 | }
97 | catch(Exception e) {
98 | e.printStackTrace();
99 | }
100 | return 0;
101 | }
102 |
103 | public static int getHeightByContext(Context context){
104 | try {
105 | WindowManager winManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
106 | return winManager.getDefaultDisplay().getHeight();
107 | }
108 | catch(Exception e) {
109 | e.printStackTrace();
110 | }
111 | return 0;
112 | }
113 |
114 |
115 | public static boolean isExternalStorageWriteable() {
116 | String state = Environment.getExternalStorageState();
117 |
118 | return Environment.MEDIA_MOUNTED.equals(state);
119 | }
120 |
121 | public static boolean isExternalStorageReadable() {
122 | String state = Environment.getExternalStorageState();
123 |
124 | return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/utils/BundleArguments.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.utils;
2 |
3 | /**
4 | * Created by Administrator on 2015/11/10.
5 | */
6 | public class BundleArguments {
7 | public static final String ARG_AD = "ad";
8 | public static final String ARG_IS_EDIT = "isEdit";
9 | public static final String ARG_COUNT = "count";
10 | public static final String ARG_USER_BUNDLE_INFO = "user_bundle_info";
11 | public static final String ARG_USER_CREATE_TIME = "user_create_time";
12 | public static final String NEED_PHOTO_UPLOAD = "need_photo_upload";
13 |
14 | public static final String ARGS_LOGIN_DEFAULT_NUMBER = "defaultNumber";
15 | public static final String MSG_AUTO_LOGIN_CLICKED = "MSG_AUTO_LOGIN_CLICKED";
16 |
17 | public static final String ARG_SHARE_AD = "sharedAd";
18 |
19 | public static final String ARG_USER_ID = "user_id";
20 | public static final String ARG_USER_IMAGE = "user_image";
21 | public static final String ARG_USER_NICK = "user_nick";
22 |
23 | public static final String MAP_LON = "map.longitude";
24 | public static final String MAP_LAT = "map.latitude";
25 | public static final String MAP_ADDRESS = "map.address";
26 |
27 | public final static String TYPE_KEY_AD_FRAGMENT = "PersonalPostFragment_type_key";
28 | public final static String BIG_GALLERY_PHOTO_SELECT = "selected_index";
29 | public final static String BIG_GALLERY_URIS = "uris";
30 |
31 | public final static String GUIDE_RES = "res";
32 |
33 | public static final String RESULT = "result";
34 |
35 | public final static String ARG_IS_MY_RESUME = "isMyResume";
36 | public final static String ARG_RESUME = "resume";
37 | public final static String ARG_RESUME_ID = "resume_id";
38 | public static final String RESUME_CREATE_AND_SEND = "create2send";
39 | public static final String RESUME_ARG_EDITMODE = "edit_mode";
40 | public static final String ARG_IS_MODIFY = "isModify";
41 | public static final String ARG_INDEX = "index";
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/utils/ContextHolder.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.utils;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/10.
7 | */
8 | public class ContextHolder {
9 | private static ContextHolder ourInstance = new ContextHolder();
10 |
11 | public static ContextHolder getInstance() {
12 | return ourInstance;
13 | }
14 |
15 | Context context;
16 |
17 | private ContextHolder() {}
18 |
19 | public void init(Context context) {
20 | this.context = context;
21 | }
22 |
23 | public Context get() {
24 | return context;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/utils/ResourceUtil.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.utils;
2 |
3 | import android.content.ContentResolver;
4 | import android.content.Context;
5 |
6 | /**
7 | * Created by Administrator on 2015/11/14.
8 | */
9 | public class ResourceUtil {
10 | public static String getResourceUriString(Context context, int resource) {
11 | return ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
12 | + context.getResources().getResourcePackageName(resource) + "/"
13 | + context.getResources().getResourceTypeName(resource) + "/"
14 | + context.getResources().getResourceEntryName(resource);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/ChatToolBox.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.AdapterView;
8 | import android.widget.BaseAdapter;
9 | import android.widget.GridView;
10 | import android.widget.ImageView;
11 | import android.widget.TextView;
12 |
13 | import com.king.chatview.R;
14 | import com.king.chatview.tools.DImenUtil;
15 | import com.king.chatview.tools.DeviceUtil;
16 |
17 | import java.util.List;
18 |
19 | public class ChatToolBox extends GridView {
20 |
21 | private ChatToolBoxAdapter adapter;
22 |
23 | private static final int GRID_ITEM_WIDTH = 80;
24 | private static final int IMAGE_SIZE_DIP = 60;
25 | //private static final int COMMON_MARGIN = 10;
26 |
27 | public ChatToolBox(Context context) {
28 | this(context, null);
29 | }
30 |
31 | public ChatToolBox(Context context, AttributeSet attrs) {
32 | this(context, attrs, 0);
33 | }
34 |
35 | public ChatToolBox(Context context, AttributeSet attrs, int defStyle) {
36 | super(context, attrs, defStyle);
37 | init();
38 | }
39 |
40 | private void init() {
41 | adapter = new ChatToolBoxAdapter(this.getContext());
42 | this.setAdapter(adapter);
43 | this.setOnItemClickListener(new OnItemClickListener() {
44 | @Override
45 | public void onItemClick(AdapterView> parent, View view,
46 | int position, long id) {
47 | ChatToolItem item = ((ChatToolBoxAdapter)parent.getAdapter()).getItem(position);
48 | if(null != item) {
49 | item.onItemSelected();
50 | }
51 | }
52 | });
53 | this.setSelector(R.color.transparent);
54 |
55 | int screenWidth = DeviceUtil.getWidthByContext(this.getContext());
56 | int itemWidth = DImenUtil.dip2px(this.getContext(), GRID_ITEM_WIDTH);
57 | int imageSize = DImenUtil.dip2px(this.getContext(), IMAGE_SIZE_DIP);
58 | int numColums = screenWidth / itemWidth;
59 |
60 | int padding = (screenWidth - numColums * imageSize) / (2 * numColums + 2);
61 |
62 | //this.setPadding(padding, padding * 2, padding, 0);
63 |
64 | this.setNumColumns(numColums);
65 | this.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
66 | //this.setColumnWidth(itemWidth);
67 | //this.setVerticalSpacing(padding * 2);
68 | }
69 |
70 | public void setData(List items) {
71 | adapter.setData(items);
72 | adapter.notifyDataSetChanged();
73 | }
74 |
75 | public static interface ChatToolItem {
76 | public int getIcon();
77 | public String getName();
78 | public void onItemSelected();
79 | }
80 |
81 | private static class ChatToolBoxAdapter extends BaseAdapter {
82 | Context context;
83 | List items;
84 |
85 | public ChatToolBoxAdapter(Context context) {
86 | this.context = context;
87 | }
88 |
89 | public void setData(List items) {
90 | this.items = items;
91 | }
92 |
93 | @Override
94 | public int getCount() {
95 | if(null != items) {
96 | return items.size();
97 | }
98 | return 0;
99 | }
100 |
101 | @Override
102 | public ChatToolItem getItem(int position) {
103 | if(null != items) {
104 | return items.get(position);
105 | }
106 | return null;
107 | }
108 |
109 | @Override
110 | public long getItemId(int position) {
111 | return position;
112 | }
113 |
114 | @Override
115 | public View getView(int position, View convertView, ViewGroup parent) {
116 | //LayoutInflater inflater
117 | if(null == convertView) {
118 | convertView = inflate(context, R.layout.item_tool_box, null);
119 | ViewHolder holder = new ViewHolder();
120 | holder.txt = (TextView) convertView.findViewById(R.id.tool_text);
121 | holder.img = (ImageView) convertView.findViewById(R.id.tool_img);
122 | /*LinearLayout container = new LinearLayout(context);
123 | container.setOrientation(LinearLayout.VERTICAL);
124 | container.setGravity(Gravity.CENTER);
125 | ViewHolder holder = new ViewHolder();
126 | holder.txt = new TextView(context);
127 | holder.img = new ImageView(context);
128 |
129 | int imageSize = DImenUtil.dip2px(context, IMAGE_SIZE_DIP);
130 | int margin = DImenUtil.dip2px(context, COMMON_MARGIN);
131 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imageSize, imageSize);
132 | params.setMargins(margin, 0, margin, margin/2);
133 | holder.img.setLayoutParams(params);
134 |
135 | holder.txt.setTextColor(Color.DKGRAY);
136 | holder.txt.setGravity(Gravity.CENTER_HORIZONTAL);
137 |
138 | container.addView(holder.img);
139 | container.addView(holder.txt);*/
140 | convertView.setTag(holder);
141 | //convertView = container;
142 | }
143 |
144 | ViewHolder holder = (ViewHolder)convertView.getTag();
145 | ChatToolItem item = this.getItem(position);
146 | if(null == holder || null == item) {
147 | return convertView;
148 | }
149 |
150 | holder.img.setBackgroundResource(item.getIcon());
151 | holder.txt.setText(item.getName());
152 | return convertView;
153 | }
154 |
155 | static class ViewHolder {
156 | TextView txt;
157 | ImageView img;
158 | }
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/CustomIndicator.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets;
2 |
3 | /**
4 | * Created by yqd on 14/11/20.
5 | */
6 |
7 | import android.content.Context;
8 | import android.util.AttributeSet;
9 | import android.widget.ImageView;
10 | import android.widget.LinearLayout;
11 | import android.widget.RelativeLayout;
12 |
13 | import com.king.chatview.R;
14 |
15 | import java.util.ArrayList;
16 | import java.util.List;
17 |
18 | public class CustomIndicator extends LinearLayout {
19 |
20 | private Context mContext;
21 | private int width;
22 | private int height;
23 | private int margin;
24 | private int normalId, selectedId;
25 | private int count = 0;
26 | private int currentCount = 0;
27 | private List views = new ArrayList();
28 |
29 | public CustomIndicator(Context context) {
30 | this(context, null);
31 | }
32 |
33 | public CustomIndicator(Context context, AttributeSet attrs) {
34 | super(context, attrs);
35 | mContext = context;
36 | initParams();
37 | }
38 |
39 | public void setDotMargin(int margin){
40 | this.margin = margin;
41 | }
42 | public void setDotWidth(int width){
43 | this.width = width;
44 | }
45 | public void setDotHeight(int height){
46 | this.height = height;
47 | }
48 | public void setDotCount(int count){
49 | this.count = count;
50 | }
51 | public void setNormalId(int id){
52 | this.normalId = id;
53 | }
54 | public void setSelectedId(int id){
55 | this.selectedId = id;
56 | }
57 |
58 | public void setCurrentPosition(int pos) {
59 | if (count == 0){
60 | return;
61 | }
62 | pos = pos % count;
63 | if(pos < 0) {
64 | pos += count;
65 | }
66 | if(null != views && views.size() > currentCount) {
67 | views.get(currentCount).setBackgroundResource(normalId);
68 | currentCount = pos;
69 | views.get(currentCount).setBackgroundResource(selectedId);
70 | }
71 | }
72 |
73 | public void next() {
74 | setCurrentPosition(currentCount + 1);
75 | }
76 |
77 | public void previous() {
78 | setCurrentPosition(currentCount-1);
79 | }
80 |
81 | private void initParams(){
82 | margin = 10;
83 | width = 40;
84 | height = 40;
85 | count = 0;
86 | normalId = R.drawable.icon_indicator_0;
87 | selectedId = R.drawable.reddot;
88 | }
89 | public void show(){
90 | initViews();
91 | }
92 | private void initViews() {
93 | views.clear();
94 | this.removeAllViews();
95 | for(int i = 0; i < count; i++) {
96 | ImageView view = new ImageView(mContext);
97 | views.add(view);
98 | LayoutParams params = new LayoutParams(width == 0 ? LayoutParams.WRAP_CONTENT : width,
99 | height == 0 ? LayoutParams.WRAP_CONTENT : height);
100 | if(i != count-1) {
101 | params.rightMargin = margin;
102 | }
103 | view.setLayoutParams(params);
104 | view.setBackgroundResource(normalId);
105 | this.addView(view);
106 | }
107 | setCurrentPosition(0);
108 | }
109 |
110 | public void removeMargins() {
111 | RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)getLayoutParams();
112 | params.topMargin = 0;
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/OnlyView.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 | import android.widget.RelativeLayout;
7 |
8 | /**
9 | * Created by yqd on 14/12/4.
10 | */
11 | public class OnlyView extends RelativeLayout {
12 | private View nowView = null;
13 | public OnlyView(Context context) {
14 | this(context, null);
15 | }
16 |
17 | public OnlyView(Context context, AttributeSet attrs) {
18 | this(context, attrs, 0);
19 | }
20 |
21 | public OnlyView(Context context, AttributeSet attrs, int defStyle) {
22 | super(context, attrs, defStyle);
23 | init();
24 | }
25 |
26 | // we will select the first visible view as now target view to show, if none we will choose the first view.
27 | private void init() {
28 | int cout = this.getChildCount();
29 | for (int i = 0; i < cout; i ++){
30 | View v = this.getChildAt(i);
31 | if (v.getVisibility() == View.VISIBLE){
32 | nowView = v;
33 | return;
34 | }
35 | }
36 | if (null == nowView){
37 | nowView = this.getChildAt(0);
38 | }
39 | }
40 | public void setChildView(View view){
41 | if (nowView == view){
42 | return;
43 | }
44 | int cout = this.getChildCount();
45 | for (int i = 0; i < cout; i ++){
46 | View v = this.getChildAt(i);
47 | if (v == view){
48 | v.setVisibility(View.VISIBLE);
49 | }else{
50 | v.setVisibility(View.GONE);
51 | };
52 | }
53 | }
54 | public View getChildView(){
55 | return nowView;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/VoicePress.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets;
2 |
3 | import android.app.Activity;
4 | import android.content.pm.PackageInfo;
5 | import android.content.pm.PackageManager;
6 | import android.os.Bundle;
7 | import android.os.Environment;
8 | import android.os.Handler;
9 | import android.os.SystemClock;
10 | import android.speech.SpeechRecognizer;
11 | import android.view.Gravity;
12 | import android.view.LayoutInflater;
13 | import android.view.MotionEvent;
14 | import android.view.View;
15 | import android.view.ViewGroup;
16 | import android.widget.ImageView;
17 | import android.widget.PopupWindow;
18 | import android.widget.TextView;
19 |
20 | import com.king.chatview.R;
21 | import com.king.chatview.fragment.BaseFragment;
22 | import com.king.chatview.tools.DImenUtil;
23 |
24 | import java.util.ArrayList;
25 |
26 | /**
27 | * Created by Administrator on 2015/11/10.
28 | */
29 | public class VoicePress extends BaseFragment {
30 | private View rootView = null;
31 | private TextView sayTextView;
32 |
33 | private PopupWindow popupWindow, popupCancelWindow;
34 | private View hintView, hintCancelView;
35 |
36 | private ImageView volume;
37 | private boolean hasPermission = false;
38 |
39 | private Handler mHandler = new Handler();
40 | private SpeechRecognizer mRecognizer;
41 | private String mVoiceName;
42 | private String voiceRecognizedResult;
43 | private int voiceDuration;
44 | private boolean voiceCanceled;
45 | // private RecognizerListener mRecognizeListener;
46 | private static final String VOICE_DIR
47 | = Environment.getExternalStorageDirectory().getPath() + "/baixingchat/";
48 | private voiceMessageListener listener = null;
49 |
50 | public static interface voiceMessageListener {
51 | public void onSendVoiceMessage(String path, int duration, String description);
52 | }
53 |
54 | public void setListener(voiceMessageListener listener){
55 | this.listener = listener;
56 | }
57 |
58 | @Override
59 | protected View onInitializeView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
60 | rootView = inflater.inflate(R.layout.voice_press, container, false);
61 | sayTextView = (TextView)rootView.findViewById(R.id.press_to_talk);
62 | init();
63 | return rootView;
64 | }
65 |
66 | private void init() {
67 | initHintView();
68 | initListeners();
69 | // initSpeechUtility();
70 | }
71 |
72 | private void initHintView() {
73 | Activity activity = this.getActivity();
74 | hintView = LayoutInflater.from(activity).inflate(R.layout.avos_input_voice, null);
75 | volume = (ImageView) hintView.findViewById(R.id.id_voice_amplitude);
76 | hintCancelView = LayoutInflater.from(activity).inflate(R.layout.avos_voice_cancel, null);
77 | popupWindow = new PopupWindow(activity);
78 | popupWindow.setContentView(hintView);
79 | popupWindow.setWidth(DImenUtil.dip2px(activity, 200)); popupWindow.setHeight(DImenUtil.dip2px(activity, 200));
80 | popupCancelWindow = new PopupWindow(activity);
81 | popupCancelWindow.setContentView(hintCancelView);
82 | popupCancelWindow.setWidth(DImenUtil.dip2px(activity, 200)); popupCancelWindow.setHeight(DImenUtil.dip2px(activity, 200));
83 |
84 | }
85 |
86 | private void initListeners() {
87 | sayTextView.setOnTouchListener(new View.OnTouchListener() {
88 |
89 | @Override
90 | public boolean onTouch(View v, MotionEvent event) {
91 | float eventY = event.getY();
92 | if (event.getAction() == MotionEvent.ACTION_MOVE) {
93 | if (eventY < -100) {//手指在上面,应hint上滑取消
94 | if (popupWindow.isShowing()) {
95 | popupWindow.dismiss();
96 | }
97 | if (popupCancelWindow != null && !popupCancelWindow.isShowing()) {
98 | popupCancelWindow.showAtLocation(v, Gravity.CENTER, 0, 0);
99 | }
100 | } else {//手指在下面,应hint松开取消
101 | if (popupCancelWindow.isShowing()) {
102 | popupCancelWindow.dismiss();
103 | }
104 | if (popupWindow != null && !popupWindow.isShowing()) {
105 | popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0);
106 | }
107 | }
108 | }
109 |
110 | if (event.getAction() == MotionEvent.ACTION_UP) {
111 | if (popupWindow.isShowing()) {
112 | popupWindow.dismiss();
113 | }
114 | if (popupCancelWindow.isShowing()) {
115 | popupCancelWindow.dismiss();
116 | }
117 | ((TextView) v).setText("按住说话");
118 | v.setBackgroundResource(R.drawable.talk_btn_bg);
119 | stop();
120 | if (eventY > -100 && hasPermission) {//未取消
121 | voiceCanceled = false;
122 | } else {
123 | voiceCanceled = true;
124 | }
125 | } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
126 |
127 | ((TextView) v).setText("松开结束");
128 | v.setBackgroundResource(R.drawable.talk_btn_bg_press);
129 | long startVoiceT = SystemClock.currentThreadTimeMillis();
130 | mVoiceName = startVoiceT + "";
131 | // Log.e("mVoiceName set to", mVoiceName);
132 | start();
133 | }
134 | return true;
135 | }
136 | });
137 | }
138 |
139 | String getVoiceNameWithoutSuffix() {
140 | return mVoiceName;
141 | }
142 | private static final int POLL_INTERVAL = 300;
143 | private void start() {
144 | // Log.e("ChatInputLayout#start", "entering");
145 | voiceRecognizedResult = "";
146 | voiceDuration = 0;
147 |
148 | if (!hasPermission) {
149 | if (!judgePermission()) {
150 | return;
151 | }
152 | }
153 | // BaixingToast.showToast(this.getAppContext(), "开始录音");
154 | //
155 | // mRecognizer = SpeechRecognizer.createRecognizer(this.getActivity(), null);
156 | //
157 | // mRecognizer.setParameter(SpeechConstant.DOMAIN, "iat");
158 | // mRecognizer.setParameter(SpeechConstant.SAMPLE_RATE, "8000");
159 | // mRecognizer.setParameter(SpeechConstant.ACCENT, "mandarin");
160 | // mRecognizer.setParameter(SpeechConstant.ASR_AUDIO_PATH, VOICE_DIR + mVoiceName + ".pcm");
161 |
162 | // initRecognizeListener();
163 | // Log.e("ChatInputLayout#start", "before listening " + mRecognizer.isListening());
164 |
165 | // int startCode = mRecognizer.startListening(mRecognizeListener);
166 | // Log.e("ChatInputLayout#start", "exiting, listener: " + mRecognizeListener.toString());
167 | // Log.e("ChatInputLayout#start", "startCode " + startCode + " isListening " + mRecognizer.isListening());
168 | }
169 |
170 |
171 | private void stop() {
172 | if (mRecognizer == null){
173 | return;
174 | }
175 | }
176 |
177 | private boolean judgePermission() {
178 | PackageInfo packageInfo;
179 | try {
180 | packageInfo = this.getActivity().getPackageManager().getPackageInfo(this.getActivity().getPackageName(), PackageManager.GET_PERMISSIONS);
181 | String permissions[] = packageInfo.requestedPermissions;
182 | ArrayList list = new ArrayList();
183 | for (int i = 0; i < permissions.length; i++) {
184 | list.add(permissions[i]);
185 | }
186 | if (list.contains("android.permission.RECORD_AUDIO")) {
187 | hasPermission = true;
188 | } else {
189 | hasPermission = false;
190 | }
191 | } catch (Exception e) {
192 | e.printStackTrace();
193 | }
194 | return hasPermission;
195 | }
196 |
197 | private void updateDisplay(double signalEMA) {
198 |
199 | switch ((int) signalEMA) {
200 | case 0:
201 | volume.setImageResource(R.drawable.amp1);
202 | break;
203 | case 1:
204 | volume.setImageResource(R.drawable.amp2);
205 |
206 | break;
207 | case 2:
208 | volume.setImageResource(R.drawable.amp3);
209 | break;
210 | case 4:
211 | volume.setImageResource(R.drawable.amp4);
212 | break;
213 | case 5:
214 | volume.setImageResource(R.drawable.amp5);
215 | break;
216 | case 6:
217 | volume.setImageResource(R.drawable.amp6);
218 | break;
219 | default:
220 | volume.setImageResource(R.drawable.amp7);
221 | break;
222 | }
223 | }
224 | }
225 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/EmotionView.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion;
2 |
3 | import android.content.Context;
4 | import android.support.v4.view.ViewPager;
5 | import android.util.AttributeSet;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.widget.ImageButton;
9 | import android.widget.ImageView;
10 | import android.widget.LinearLayout;
11 | import android.widget.RelativeLayout;
12 |
13 | import com.king.chatview.R;
14 | import com.king.chatview.tools.DImenUtil;
15 | import com.king.chatview.widgets.CustomIndicator;
16 | import com.king.chatview.widgets.emotion.adapter.BaseEmotionAdapter;
17 | import com.king.chatview.widgets.emotion.adapter.CustomEmotionAdapter;
18 | import com.king.chatview.widgets.emotion.adapter.EmotionAdapter;
19 | import com.king.chatview.widgets.emotion.data.Emoticon;
20 | import com.king.chatview.widgets.emotion.data.EmotionData;
21 | import com.king.chatview.widgets.emotion.item.StickerItem;
22 |
23 | import java.util.ArrayList;
24 | import java.util.List;
25 |
26 | /**
27 | * Created by Administrator on 2015/11/11.
28 | */
29 | public class EmotionView extends LinearLayout {
30 |
31 | public interface EmotionClickListener {
32 | void OnEmotionClick(Emoticon emotionData, View v, EmotionData.EmotionCategory category);
33 |
34 | void OnUniqueEmotionClick(Emoticon uniqueItem, View v, EmotionData.EmotionCategory category);
35 | }
36 |
37 | private EmotionClickListener emotionClickListener;
38 |
39 | private List emotionDataList;
40 |
41 | private RelativeLayout emotionLinearLayout;
42 | private ViewPager emotionViewPager;
43 | private CustomIndicator emotionIndicator;
44 |
45 | private LinearLayout stickersSlider;
46 | private List stickerList = new ArrayList<>();
47 | private int currentStickerIndex = 0;
48 |
49 | // 用来添加表情包的按钮
50 | private ImageView addStickers;
51 |
52 | private List emotionAdapterList;
53 |
54 | private Context mContext;
55 |
56 | public EmotionView(Context context) {
57 | this(context, null);
58 | }
59 |
60 | public EmotionView(Context context, AttributeSet attrs) {
61 | this(context, attrs, 0);
62 | }
63 |
64 | public EmotionView(Context context, AttributeSet attrs, int defStyleAttr) {
65 | super(context, attrs, defStyleAttr);
66 | mContext = context;
67 | }
68 |
69 | private void init(Context context, List emotionDataList) {
70 | LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
71 | //加载布局文件
72 | mInflater.inflate(R.layout.emotion_view, this, true);
73 |
74 | emotionLinearLayout = (RelativeLayout) findViewById(R.id.emotionLinearLayout);
75 | emotionViewPager = (ViewPager) findViewById(R.id.emotionViewPager);
76 | emotionIndicator = (CustomIndicator) findViewById(R.id.emotionIndicator);
77 |
78 | stickersSlider = (LinearLayout) findViewById(R.id.stickers_slider);
79 | // 暂时未使用
80 | addStickers = (ImageView) findViewById(R.id.add_stickers);
81 |
82 | // 重构
83 | // 初始化tab
84 | initStickers(emotionDataList);
85 |
86 | // 点开界面第一个tab元素必须被初始化
87 | emotionAdapterList = new ArrayList<>();
88 | int index = 0;
89 | for (EmotionData data : emotionDataList) {
90 | BaseEmotionAdapter emotionAdapter = this.createEmotionAdapter(data);
91 | if (index == 0) {
92 | // emoji
93 | this.setEmotionAdapter(emotionAdapter);
94 | }
95 | emotionAdapterList.add(emotionAdapter);
96 | index++;
97 | }
98 |
99 | emotionViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
100 | @Override
101 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
102 | }
103 |
104 | @Override
105 | public void onPageSelected(int position) {
106 | emotionIndicator.setCurrentPosition(position);
107 | }
108 |
109 | @Override
110 | public void onPageScrollStateChanged(int state) {
111 | }
112 | });
113 | }
114 |
115 | private void addStickerButton(ImageButton button) {
116 | stickersSlider.addView(button);
117 | stickerList.add(button);
118 | }
119 |
120 | private void showEmotionIndicator(int count) {
121 | emotionIndicator.setDotCount(count);
122 | emotionIndicator.setDotHeight(DImenUtil.dip2px(mContext, 5));
123 | emotionIndicator.setDotWidth(DImenUtil.dip2px(mContext, 5));
124 | emotionIndicator.setDotMargin(DImenUtil.dip2px(mContext, 10));
125 | emotionIndicator.show();
126 | }
127 |
128 | private void initStickers(List emotionDataList) {
129 | int index = 0;
130 | for (EmotionData data : emotionDataList) {
131 | final StickerItem stickerTab = new StickerItem(mContext, data.getStickerIcon());
132 | this.addStickerButton(stickerTab);
133 | if (index == 0) {
134 | // 初始化选中第一个tab
135 | stickerTab.setSelected(true);
136 | }
137 | // 设置监听
138 | final int tempIndex = index;
139 | stickerTab.setOnClickListener(new OnClickListener() {
140 | @Override
141 | public void onClick(View v) {
142 | for (ImageButton temp : stickerList) {
143 | temp.setSelected(false);
144 | }
145 | stickerTab.setSelected(true);
146 | switchOtherStickers(tempIndex);
147 | }
148 | });
149 | index++;
150 | }
151 | }
152 |
153 | private BaseEmotionAdapter createEmotionAdapter(EmotionData data) {
154 | BaseEmotionAdapter adapter = null;
155 | switch (data.getCategory()) {
156 | case emoji:
157 | adapter = new EmotionAdapter(mContext, emotionViewPager, data, emotionClickListener);
158 | break;
159 | case image:
160 | adapter = new CustomEmotionAdapter(mContext, emotionViewPager, data, emotionClickListener);
161 | default:
162 | }
163 | return adapter;
164 | }
165 |
166 | private void switchOtherStickers(int index) {
167 | this.currentStickerIndex = index;
168 | this.setEmotionAdapter(emotionAdapterList.get(index));
169 | }
170 |
171 | private void setEmotionAdapter(BaseEmotionAdapter adapter) {
172 | emotionViewPager.setAdapter(adapter);
173 | showEmotionIndicator(adapter.getCount());
174 | }
175 |
176 | /**
177 | * EmotionView 在 findViewById 获得引用后所必须调用函数(即为对于该View的初始化)
178 | * 必须位于 setEmotionClickListener 之前
179 | * 必须位于 modifyEmotionDataList 之前
180 | * @param emotionDataList 组织好的用于填充EmotionView的数据结构体
181 | */
182 | public void setEmotionDataList(List emotionDataList) {
183 | this.emotionDataList = emotionDataList;
184 | init(mContext, emotionDataList);
185 | }
186 |
187 | public List getEmotionDataList() {
188 | return emotionDataList;
189 | }
190 |
191 | public EmotionClickListener getEmotionClickListener() {
192 | return emotionClickListener;
193 | }
194 |
195 | public void setEmotionClickListener(EmotionClickListener emotionClickListener) {
196 | this.emotionClickListener = emotionClickListener;
197 | if (emotionAdapterList == null) {
198 | throw new NullPointerException("设置监听前必须先设定表情的List");
199 | }
200 | for (BaseEmotionAdapter adapter : emotionAdapterList) {
201 | adapter.setEmotionClickListener(emotionClickListener);
202 | }
203 | }
204 |
205 | public void modifyEmotionDataList(EmotionData data, int position) {
206 | if (emotionDataList == null) {
207 | throw new NullPointerException("修改List前必须先设定表情的List");
208 | }
209 | emotionDataList.set(position, data);
210 | BaseEmotionAdapter adapter = createEmotionAdapter(data);
211 | emotionAdapterList.set(position, adapter);
212 | if (position == currentStickerIndex) {
213 | setEmotionAdapter(adapter);
214 | }
215 | }
216 | }
217 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/adapter/BaseEmotionAdapter.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.adapter;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.v4.view.PagerAdapter;
6 | import android.support.v4.view.ViewPager;
7 | import android.util.DisplayMetrics;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.AdapterView;
11 | import android.widget.BaseAdapter;
12 | import android.widget.GridView;
13 |
14 | import com.king.chatview.widgets.emotion.EmotionView;
15 | import com.king.chatview.widgets.emotion.data.Emoticon;
16 | import com.king.chatview.widgets.emotion.data.EmotionData;
17 |
18 | /**
19 | * Created by Administrator on 2015/11/12.
20 | */
21 | public abstract class BaseEmotionAdapter extends PagerAdapter implements GridView.OnItemClickListener {
22 | protected static final String EMOTION_ADAPTER_TAG = "emotion_adapter";
23 | protected static final int INDEX_TAG = -1001;
24 |
25 | protected Context mContext;
26 | protected ViewPager mEmotionViewPager;
27 | protected EmotionData mEmotionData;
28 | protected EmotionView.EmotionClickListener mEmotionClickListener;
29 |
30 | /**
31 | * 表示在横向上,一个元素能够分得到的长度大小(包含margin&padding)
32 | */
33 | protected int mSize;
34 | /**
35 | * 表示总共有几页
36 | */
37 | protected int mCount;
38 |
39 | protected int viewPageWidth;
40 |
41 | protected ViewHolder mViewHolder;
42 |
43 | protected int mRow;
44 | protected int mColumn;
45 | /**
46 | * 表示一页有几个元素
47 | */
48 | protected int mPageCount;
49 |
50 | public void setEmotionClickListener(EmotionView.EmotionClickListener clickListener) {
51 | this.mEmotionClickListener = clickListener;
52 | }
53 |
54 | public BaseEmotionAdapter(Context context, ViewPager viewPager, EmotionData emotionData, EmotionView.EmotionClickListener emotionClickListener) {
55 | this.mContext = context;
56 | this.mEmotionViewPager = viewPager;
57 | this.mEmotionData = emotionData;
58 | this.mEmotionClickListener = emotionClickListener;
59 | init(emotionData);
60 | }
61 |
62 | private void init(EmotionData emotionData) {
63 | mRow = emotionData.getRow();
64 | mColumn = emotionData.getColumn();
65 | // 计算一页有几个元素
66 | mPageCount = calcPageCount(emotionData);
67 | // 计算总共有几页
68 | mCount = calcPageNumber(emotionData, mPageCount);
69 | DisplayMetrics dm = mContext.getResources().getDisplayMetrics();
70 | viewPageWidth = dm.widthPixels;
71 | mSize = calcItemSize(viewPageWidth);
72 | }
73 |
74 | /**
75 | * 计算每页有几个元素
76 | *
77 | * @param emotionData 用于提供行列和其他信息
78 | * @return 返回每页需要有几个元素
79 | */
80 | protected int calcPageCount(EmotionData emotionData) {
81 | return emotionData.getRow() * emotionData.getColumn();
82 | }
83 |
84 | /**
85 | * 计算总共会有几页
86 | *
87 | * @param emotionData 提供表情的list
88 | * @param pageCount 每页会出现的表情数
89 | * @return 返回总共的页数
90 | */
91 | protected int calcPageNumber(EmotionData emotionData, int pageCount) {
92 | int listSize = emotionData.getEmotionList().size();
93 | int pageNumber = 0;
94 | if (listSize % mPageCount > 0)
95 | pageNumber = listSize / mPageCount + 1;
96 | else {
97 | pageNumber = listSize / mPageCount;
98 | }
99 | return pageNumber;
100 | }
101 |
102 | /**
103 | * 计算每个元素在总宽上的均分大小(元素为正方形,高度不可知,故只能通过宽度)
104 | *
105 | * @param viewPageWidth 屏幕的宽度(屏幕宽即这个view的宽度,单位像素)
106 | * @return 返回每个元素在总宽的均分大小
107 | */
108 | protected int calcItemSize(int viewPageWidth) {
109 | return viewPageWidth / mColumn;
110 | }
111 |
112 | @Override
113 | public int getCount() {
114 | return mCount;
115 | }
116 |
117 | @Override
118 | public boolean isViewFromObject(View view, Object object) {
119 | ViewHolder holder = (ViewHolder) object;
120 | return view == holder.gridView;
121 | }
122 |
123 | @Override
124 | public final Object instantiateItem(ViewGroup container, int position) {
125 | GridView gridView;
126 | T adapter;
127 | ViewHolder holder;
128 | if (this.mViewHolder == null) {
129 | gridView = instantiateGridView();
130 | if (gridView == null)
131 | throw new NullPointerException("gridView 必须被实例化");
132 | gridView.setNumColumns(mColumn);
133 |
134 | // emotionViewPager在initData阶段是可能没有高度的(gone) 只有在emotionViewPager进行页面填充的时候才一定会有高度
135 | int viewPageHeight = getEmotionPageViewHeight();
136 | gridView = setGridViewMinimumHeight(gridView, viewPageHeight);
137 | setGridViewSpacing(gridView, viewPageHeight, viewPageWidth);
138 |
139 | adapter = createListAdapter(position);
140 | if (adapter == null)
141 | throw new NullPointerException("adapter 必须被实例化");
142 |
143 | holder = new ViewHolder();
144 | holder.gridView = gridView;
145 | holder.adapter = adapter;
146 | } else {
147 | gridView = mViewHolder.gridView;
148 | adapter = mViewHolder.adapter;
149 | holder = mViewHolder;
150 | mViewHolder = null;
151 | }
152 | bingData(adapter, position);
153 | gridView.setAdapter(adapter);
154 | gridView.setOnItemClickListener(this);
155 | container.addView(gridView);
156 | return holder;
157 | }
158 |
159 | @NonNull
160 | public abstract GridView instantiateGridView();
161 |
162 | @Override
163 | public void onItemClick(AdapterView> parent, View view, int position, long id) {
164 | if (mEmotionClickListener == null)
165 | return;
166 | Emoticon emoticon = (Emoticon) parent.getItemAtPosition(position);
167 | if (emoticon.getEmoticonType() == Emoticon.EmoticonType.UNIQUE) {
168 | mEmotionClickListener.OnUniqueEmotionClick(mEmotionData.getUniqueItem(), view, mEmotionData.getCategory());
169 | } else {
170 | mEmotionClickListener.OnEmotionClick(emoticon, view, mEmotionData.getCategory());
171 | }
172 | OnEmoticonClick(emoticon, view);
173 | }
174 |
175 | protected void OnEmoticonClick(Emoticon emoticon, View view) {
176 | }
177 |
178 | @NonNull
179 | public abstract T createListAdapter(int currentPageNumber);
180 |
181 | public abstract T bingData(T listAdapter, int position);
182 |
183 | protected GridView setGridViewMinimumHeight(GridView gridView, int height) {
184 | gridView.setMinimumHeight(height);
185 | return gridView;
186 | }
187 |
188 | protected void setGridViewSpacing(GridView gridView, int viewPageHeight, int viewPageWeight) {
189 | int verticalSpacing = viewPageHeight / mRow - mSize;
190 | if (verticalSpacing < 0)
191 | verticalSpacing = 0;
192 | gridView.setVerticalSpacing(verticalSpacing);
193 | }
194 |
195 | private int getEmotionPageViewHeight() {
196 | return View.MeasureSpec.getSize(mEmotionViewPager.getMeasuredHeight());
197 | }
198 |
199 |
200 | public abstract EmotionData getEmotionData();
201 |
202 | public abstract void setEmotionData(EmotionData emotionData);
203 |
204 | @Override
205 | public void destroyItem(ViewGroup container, int position, Object object) {
206 | this.mViewHolder = (ViewHolder) object;
207 | container.removeView(this.mViewHolder.gridView);
208 | }
209 |
210 | public abstract class BaseListAdapter extends BaseAdapter {
211 | @Override
212 | public final Object getItem(int position) {
213 | return getEmoticonItem(position);
214 | }
215 |
216 | public abstract Emoticon getEmoticonItem(int position);
217 | }
218 |
219 | protected class ViewHolder {
220 | GridView gridView;
221 | T adapter;
222 | }
223 |
224 |
225 |
226 | }
227 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/adapter/CustomEmotionAdapter.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.adapter;
2 |
3 | import android.content.Context;
4 | import android.graphics.Color;
5 | import android.graphics.drawable.ColorDrawable;
6 | import android.support.annotation.NonNull;
7 | import android.support.v4.view.ViewPager;
8 | import android.util.Log;
9 | import android.view.Gravity;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.view.ViewGroup;
13 | import android.widget.GridView;
14 | import android.widget.ImageButton;
15 | import android.widget.ImageView;
16 | import android.widget.ListView;
17 | import android.widget.RelativeLayout;
18 |
19 | import com.bumptech.glide.Glide;
20 | import com.king.chatview.R;
21 | import com.king.chatview.widgets.emotion.EmotionView;
22 | import com.king.chatview.widgets.emotion.data.Emoticon;
23 | import com.king.chatview.widgets.emotion.data.EmotionData;
24 |
25 | import java.util.ArrayList;
26 | import java.util.List;
27 |
28 | /**
29 | * Created by Administrator on 2015/11/13.
30 | */
31 | public class CustomEmotionAdapter extends BaseEmotionAdapter {
32 | /**
33 | * 可能会添加uniqueItem至list的index为0的在该adapter操作的List副本
34 | */
35 | private List customImgPathList;
36 | private List pageAdapterList = new ArrayList<>();
37 |
38 | public CustomEmotionAdapter(Context context, ViewPager viewPager, EmotionData emotionData, EmotionView.EmotionClickListener emotionClickListener) {
39 | super(context, viewPager, emotionData, emotionClickListener);
40 | initData(emotionData);
41 | }
42 |
43 | private void initData(EmotionData emotionData) {
44 | if (emotionData.getUniqueItem() != null) {
45 | customImgPathList = new ArrayList<>(emotionData.getEmotionList());
46 | customImgPathList.add(0, emotionData.getUniqueItem());
47 | } else {
48 | customImgPathList = emotionData.getEmotionList();
49 | }
50 | }
51 |
52 | @Override
53 | protected int calcPageNumber(EmotionData emotionData, int pageCount) {
54 | int listSize = emotionData.getEmotionList().size();
55 | if (emotionData.getUniqueItem() != null)
56 | listSize++;
57 |
58 | int pageNumber;
59 | if (listSize % mPageCount > 0)
60 | pageNumber = listSize / mPageCount + 1;
61 | else {
62 | pageNumber = listSize / mPageCount;
63 | }
64 | return pageNumber;
65 | }
66 |
67 | @NonNull
68 | @Override
69 | public GridView instantiateGridView() {
70 | GridView gridView = (GridView) LayoutInflater.from(mContext).inflate(R.layout.bx_emotion, null);
71 | gridView.setScrollContainer(false);
72 | // 去除 GridView 在点击元素后出现的变色效果
73 | gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
74 | return gridView;
75 | }
76 |
77 | @NonNull
78 | @Override
79 | public CustomEmotionListAdapter createListAdapter(int currentPageNumber) {
80 | CustomEmotionListAdapter adapter = new CustomEmotionListAdapter();
81 | pageAdapterList.add(adapter);
82 | return adapter;
83 | }
84 |
85 | @Override
86 | public CustomEmotionListAdapter bingData(CustomEmotionListAdapter listAdapter, int position) {
87 | int startP = position * mPageCount;
88 | int endP = (position + 1) * mPageCount > customImgPathList.size() ? customImgPathList.size() : (position + 1) * mPageCount;
89 | Emoticon[] list = customImgPathList.subList(startP, endP).toArray(new Emoticon[endP - startP]);
90 | listAdapter.setData(list);
91 | return listAdapter;
92 | }
93 |
94 | @Override
95 | public EmotionData getEmotionData() {
96 | return mEmotionData;
97 | }
98 |
99 | @Override
100 | public void setEmotionData(EmotionData emotionData) {
101 | List list = emotionData.getEmotionList();
102 | customImgPathList = new ArrayList<>(list);
103 | customImgPathList.add(0, emotionData.getUniqueItem());
104 | notifyDataSetChanged();
105 | for (CustomEmotionListAdapter adapter : pageAdapterList) {
106 | adapter.notifyDataSetChanged();
107 | }
108 | }
109 |
110 | class CustomEmotionListAdapter extends BaseEmotionAdapter.BaseListAdapter {
111 | private Emoticon[] emoticonArr;
112 |
113 | public void setData(Emoticon[] pathList) {
114 | this.emoticonArr = pathList;
115 | notifyDataSetChanged();
116 | }
117 |
118 | @Override
119 | public int getCount() {
120 | return emoticonArr == null ? 0 : emoticonArr.length;
121 | }
122 |
123 | @Override
124 | public Emoticon getEmoticonItem(int position) {
125 | return emoticonArr == null ? null : emoticonArr[position];
126 | }
127 |
128 | @Override
129 | public long getItemId(int position) {
130 | return position;
131 | }
132 |
133 | @Override
134 | public View getView(int position, View convertView, ViewGroup parent) {
135 | RelativeLayout containerLayout = new RelativeLayout(mContext);
136 | if (emoticonArr == null) {
137 | return containerLayout;
138 | }
139 | if (emoticonArr[position] != null) {
140 | ImageView img = new ImageView(mContext);
141 | img.setBackgroundResource(R.drawable.sticker_style);
142 | containerLayout.setLayoutParams(new GridView.LayoutParams(mSize, mSize));
143 | containerLayout.setGravity(Gravity.CENTER);
144 | RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
145 | ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
146 | params.setMargins(mSize / 9, mSize / 9, mSize / 9, mSize / 9);
147 | img.setLayoutParams(params);
148 | // 加载
149 | if (emoticonArr[position].getImagePath() != null) {
150 | Glide.with(mContext).load(emoticonArr[position].getImagePath()).centerCrop().into(img);
151 | } else {
152 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon 的 getUri 必须被实现");
153 | }
154 | // 对于ImageButton而言在GridView或者ListView中要不被ImageButton截获点击事件所需要的特殊设置
155 | // img.setFocusable(false);
156 | // img.setFocusableInTouchMode(false);
157 | // img.setClickable(false);
158 | containerLayout.addView(img);
159 | }
160 | // 对于ImageButton而言在GridView或者ListView中要不被ImageButton截获点击事件所需要的特殊设置
161 | // containerLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
162 | return containerLayout;
163 | }
164 | }
165 |
166 | }
167 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/adapter/EmotionAdapter.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.adapter;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.v4.view.ViewPager;
6 | import android.util.Log;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.GridView;
11 | import android.widget.ImageView;
12 |
13 | import com.king.chatview.R;
14 | import com.king.chatview.widgets.emotion.EmotionView;
15 | import com.king.chatview.widgets.emotion.data.Emoticon;
16 | import com.king.chatview.widgets.emotion.data.EmotionData;
17 |
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Administrator on 2015/11/12.
22 | */
23 | public class EmotionAdapter extends BaseEmotionAdapter {
24 |
25 | private Emoticon[][] mPageEmoticon;
26 |
27 | public int rate;
28 | private int item_length;
29 |
30 | public EmotionAdapter(Context context, ViewPager viewPager, EmotionData data, EmotionView.EmotionClickListener clickListener) {
31 | super(context, viewPager, data, clickListener);
32 | initData(data);
33 | }
34 |
35 | @Override
36 | protected int calcPageCount(EmotionData emotionData) {
37 | // 判断unique item 是否存在 存在就是-1 不存在就不处理
38 | int count = super.calcPageCount(emotionData);
39 | if (emotionData.getUniqueItem() != null)
40 | count = count - 1;
41 | return count;
42 | }
43 |
44 | private void initData(EmotionData data) {
45 | List emojiList = data.getEmotionList();
46 |
47 |
48 | mPageEmoticon = new Emoticon[this.mCount][mRow * mColumn];
49 |
50 | for (int i = 0; i < this.mCount; i++) {
51 | for (int j = 0; (j < mPageCount) && (i * mPageCount + j < emojiList.size()); j++) {
52 | Emoticon emoji = emojiList.get(i * mPageCount + j);
53 | mPageEmoticon[i][j] = emoji;
54 | }
55 | }
56 | rate = (viewPageWidth / (mColumn * 10 + 3));
57 | item_length = (this.rate * 9);
58 | }
59 |
60 | @NonNull
61 | @Override
62 | public GridView instantiateGridView() {
63 | GridView gridView = (GridView) LayoutInflater.from(mContext).inflate(R.layout.bx_emotion, null);
64 | gridView.setScrollContainer(false);
65 | gridView.setPadding(this.rate * 2, this.rate * 2, this.rate * 2, 0);
66 | return gridView;
67 | }
68 |
69 | @NonNull
70 | @Override
71 | public EmotionListAdapter createListAdapter(int currentPageNumber) {
72 | return new EmotionListAdapter();
73 | }
74 |
75 | @Override
76 | public EmotionListAdapter bingData(EmotionListAdapter listAdapter, int position) {
77 | listAdapter.setData(this.mPageEmoticon[position]);
78 | return listAdapter;
79 | }
80 |
81 | @Override
82 | protected void setGridViewSpacing(GridView gridView, int viewPageHeight, int viewPageWeight) {
83 | super.setGridViewSpacing(gridView, viewPageHeight, viewPageWeight);
84 | gridView.setHorizontalSpacing(rate);
85 | }
86 |
87 | @Override
88 | public EmotionData getEmotionData() {
89 | return mEmotionData;
90 | }
91 |
92 | @Override
93 | public void setEmotionData(EmotionData emotionData) {
94 | this.mEmotionData = emotionData;
95 | }
96 |
97 | class EmotionListAdapter extends BaseEmotionAdapter.BaseListAdapter {
98 | private Emoticon[] emoticonArr;
99 | public void setData(Emoticon[] emoticons) {
100 | this.emoticonArr = emoticons;
101 | notifyDataSetChanged();
102 | }
103 |
104 | @Override
105 | public int getCount() {
106 | if (this.emoticonArr != null) {
107 | return this.emoticonArr.length;
108 | }
109 | return 0;
110 | }
111 |
112 | @Override
113 | public Emoticon getEmoticonItem(int position) {
114 | if (position == this.emoticonArr.length - 1) {
115 | return mEmotionData.getUniqueItem();
116 | }
117 | return this.emoticonArr[position];
118 | }
119 |
120 | @Override
121 | public long getItemId(int position) {
122 | return position;
123 | }
124 |
125 | @Override
126 | public View getView(int position, View convertView, ViewGroup parent) {
127 | ImageView img = new ImageView(mContext);
128 |
129 | img.setLayoutParams(new GridView.LayoutParams(item_length, item_length));
130 | img.setPadding(rate, rate, rate, rate);
131 |
132 | img.setVisibility(View.INVISIBLE);
133 |
134 | if (mEmotionData.getUniqueItem() == null) {
135 | if (this.emoticonArr[position].getResourceId() != 0) {
136 | img.setImageResource(this.emoticonArr[position].getResourceId());
137 | } else {
138 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon的getResourceId必须被实现");
139 | }
140 | img.setVisibility(View.VISIBLE);
141 | } else {
142 | if (this.emoticonArr[position] != null) {
143 | img.setImageResource(this.emoticonArr[position].getResourceId());
144 | img.setVisibility(View.VISIBLE);
145 | } else if (position == this.emoticonArr.length - 1) {
146 | if (mEmotionData.getUniqueItem().getResourceId() != 0)
147 | img.setImageResource(mEmotionData.getUniqueItem().getResourceId());
148 | else
149 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon的getResourceId必须被实现");
150 | img.setVisibility(View.VISIBLE);
151 | }
152 | }
153 | return img;
154 | }
155 | }
156 | }
157 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/data/CustomEmoji.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.data;
2 |
3 | import android.net.Uri;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/16.
7 | */
8 | public class CustomEmoji implements Emoticon {
9 | private String path;
10 |
11 | public CustomEmoji(String path) {
12 | this.path = path;
13 | }
14 |
15 | @Override
16 | public int getResourceId() {
17 | return 0;
18 | }
19 |
20 | @Override
21 | public String getImagePath() {
22 | return path;
23 | }
24 |
25 | @Override
26 | public Uri getUri() {
27 | return null;
28 | }
29 |
30 | @Override
31 | public String getDesc() {
32 | return path;
33 | }
34 |
35 | @Override
36 | public EmoticonType getEmoticonType() {
37 | return EmoticonType.NORMAL;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/data/Emoji.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.data;
2 |
3 | import android.net.Uri;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/15.
7 | */
8 | public class Emoji implements Emoticon {
9 | private int drawableResId;
10 | private int decInt;
11 |
12 | public Emoji(int drawableResId, int decInt) {
13 | this.drawableResId = drawableResId;
14 | this.decInt = decInt;
15 | }
16 |
17 | @Override
18 | public int getResourceId() {
19 | return drawableResId;
20 | }
21 |
22 | @Override
23 | public String getImagePath() {
24 | return null;
25 | }
26 |
27 | @Override
28 | public Uri getUri() {
29 | return null;
30 | }
31 |
32 | @Override
33 | public String getDesc() {
34 | return new String(Character.toChars(decInt));
35 | }
36 |
37 | @Override
38 | public EmoticonType getEmoticonType() {
39 | return EmoticonType.NORMAL;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/data/Emoticon.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.data;
2 |
3 | import android.net.Uri;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/16.
7 | */
8 | public interface Emoticon {
9 |
10 | int getResourceId();
11 |
12 | String getImagePath();
13 |
14 | Uri getUri();
15 |
16 | String getDesc();
17 |
18 | EmoticonType getEmoticonType();
19 |
20 | enum EmoticonType {
21 | NORMAL, UNIQUE
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/data/EmotionData.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.data;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/14.
7 | */
8 | public class EmotionData{
9 |
10 | public String getStickerIcon() {
11 | return stickerIcon;
12 | }
13 |
14 | public enum EmotionCategory {
15 | emoji, image
16 | }
17 |
18 | private List emotionList;
19 | private String stickerIcon;
20 | private EmotionCategory category;
21 | private int row;
22 | private int column;
23 | private Emoticon uniqueItem;
24 |
25 | /**
26 | * EmotionView所展示的数据结构
27 | * @param emotionList emotionView中显示的图片资源或路径
28 | * @param stickerIcon 在emotionView下发显示的该表情组的icon
29 | * @param category emotionView的类别,现在暂时有 emoji 和 image 两种
30 | * @param row 需要显示的行
31 | * @param column 需要显示的列
32 | */
33 | public EmotionData(List emotionList, String stickerIcon, EmotionCategory category, int row, int column) {
34 | this.emotionList = emotionList;
35 | this.stickerIcon = stickerIcon;
36 | this.category = category;
37 | this.row = row;
38 | this.column = column;
39 | }
40 |
41 | /**
42 | * EmotionView所展示的数据结构
43 | * @param emotionList emotionView中显示的图片资源或路径
44 | * @param stickerIcon 在emotionView下发显示的该表情组的icon
45 | * @param category emotionView的类别,现在暂时有 emoji 和 image 两种
46 | * @param uniqueItem 在这组表情中特有的表情 EmotionAdapter对应为 删除,CustomAdapter对应为添加
47 | * @param row 需要显示的行
48 | * @param column 需要显示的列
49 | */
50 | public EmotionData(List emotionList, String stickerIcon, EmotionCategory category, Emoticon uniqueItem, int row, int column) {
51 | this(emotionList, stickerIcon, category, row, column);
52 | this.uniqueItem = uniqueItem;
53 | }
54 |
55 | public Emoticon getUniqueItem() {
56 | return uniqueItem;
57 | }
58 |
59 | public List getEmotionList() {
60 | return emotionList;
61 | }
62 |
63 | public void setEmotionList(List emotionList) {
64 | this.emotionList = emotionList;
65 | }
66 |
67 | public EmotionCategory getCategory() {
68 | return category;
69 | }
70 |
71 | public int getRow() {
72 | return row;
73 | }
74 |
75 | public int getColumn() {
76 | return column;
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/data/UniqueEmoji.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.data;
2 |
3 | import android.net.Uri;
4 |
5 | /**
6 | * Created by Administrator on 2015/11/16.
7 | */
8 | public class UniqueEmoji implements Emoticon {
9 |
10 | private int resourceId;
11 | private String path;
12 |
13 | public UniqueEmoji(int resourseId) {
14 | this.resourceId = resourseId;
15 | }
16 |
17 | public UniqueEmoji(String path) {
18 | this.path = path;
19 | }
20 |
21 | @Override
22 | public int getResourceId() {
23 | return resourceId;
24 | }
25 |
26 | @Override
27 | public String getImagePath() {
28 | return path;
29 | }
30 |
31 | @Override
32 | public Uri getUri() {
33 | return null;
34 | }
35 |
36 | @Override
37 | public String getDesc() {
38 | return path;
39 | }
40 |
41 | @Override
42 | public EmoticonType getEmoticonType() {
43 | return EmoticonType.UNIQUE;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/king/chatview/widgets/emotion/item/StickerItem.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview.widgets.emotion.item;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.ImageButton;
6 |
7 | import com.bumptech.glide.Glide;
8 | import com.king.chatview.R;
9 |
10 | /**
11 | * Created by Administrator on 2015/11/11.
12 | */
13 | public class StickerItem extends ImageButton {
14 |
15 | private int itemWidth = 0;
16 |
17 | public StickerItem(Context context) {
18 | super(context);
19 | init(context);
20 | }
21 |
22 | public StickerItem(Context context, int backgroundResId) {
23 | this(context);
24 | Glide.with(context).load(backgroundResId).into(this);
25 | }
26 |
27 | public StickerItem(Context context, String path) {
28 | this(context);
29 | Glide.with(context).load(path).into(this);
30 | }
31 |
32 | public StickerItem(Context context, AttributeSet attrs) {
33 | this(context, attrs, 0);
34 | }
35 |
36 | public StickerItem(Context context, AttributeSet attrs, int defStyleAttr) {
37 | super(context, attrs, defStyleAttr);
38 | init(context);
39 | }
40 |
41 | private void init(Context context) {
42 | this.setScaleType(ScaleType.CENTER_INSIDE);
43 | this.setBackgroundResource(R.drawable.sticker_style);
44 | this.setPadding(5, 5, 5, 5);
45 | itemWidth = context.getResources().getDisplayMetrics().widthPixels / 4;
46 | }
47 |
48 | @Override
49 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
50 | if (itemWidth != 0) {
51 | widthMeasureSpec = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY);
52 | setMeasuredDimension(widthMeasureSpec, getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
53 | } else {
54 | super.onMeasure(widthMeasureSpec, heightMeasureSpec);
55 | }
56 | }
57 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/avos_plusbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/avos_plusbox.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/avos_plusbox_press.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/avos_plusbox_press.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/icon_indicator_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/icon_indicator_0.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/icon_indicator_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/icon_indicator_1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f004.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f30f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f30f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f319.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f319.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f332.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f332.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f339.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f339.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f33b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f33b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f349.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f349.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f356.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f356.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f35a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f35a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f366.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f366.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f36b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f36b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f377.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f377.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f37b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f37b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f381.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f381.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f382.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f382.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f384.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f389.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f389.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f393.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f393.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3a4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3a4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3b2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3b2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3b5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3b5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3c0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3c0.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3c2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3c2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f3e1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3e1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f434.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f434.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f436.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f436.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f437.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f437.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f44a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f44c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f44d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f44e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44e.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f44f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f451.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f451.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f46a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f46a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f46b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f46b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f47b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f47c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f47d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f47f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f484.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f484.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f48a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f48b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f48d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f494.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f494.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4a1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4a2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4a3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4a4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4a9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4aa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4aa.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4b0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4b0.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4da.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4da.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4de.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4de.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f4e2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4e2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f525.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f525.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f52b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f52b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f556.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f556.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f600.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f600.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f601.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f601.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f602.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f602.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f603.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f603.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f605.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f605.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f606.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f606.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f607.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f607.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f608.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f608.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f609.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f609.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60e.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f60f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f611.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f611.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f612.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f612.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f613.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f613.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f614.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f614.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f615.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f615.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f616.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f616.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f618.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f61a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f61c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f61d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f61e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61e.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f61f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f621.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f621.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f622.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f622.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f623.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f623.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f624.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f624.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f628.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f628.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f629.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f629.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62e.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f62f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f630.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f630.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f631.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f631.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f632.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f632.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f633.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f633.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f634.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f634.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f635.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f635.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f636.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f636.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f637.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f637.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f648.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f648.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f649.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f649.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f64a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f64a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f64f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f64f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f680.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f680.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f6ab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6ab.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f6b2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6b2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u1f6bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6bf.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u23f0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u23f0.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u23f3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u23f3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2600.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2600.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2601.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2601.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2614.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2614.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2615.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2615.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u261d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u261d.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u263a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u263a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u26a1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26a1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u26bd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26bd.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u26c4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26c4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u26c5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26c5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u270a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270a.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u270b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270b.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u270c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270c.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u270f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270f.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2744.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2744.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/u2b50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2b50.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp6.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/amp7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp7.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_ads_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_ads_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_ads_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_ads_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_gallery_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_gallery_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_gallery_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_gallery_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_location_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_location_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_location_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_location_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_video_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_video_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_panel_video_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_video_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/bx_emotion_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/bx_emotion_delete.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/emoji_select_btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/emoji_select_btn_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/emoji_select_btn_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/emoji_select_btn_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/rcd_cancel_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/rcd_cancel_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/type_select_btn_normal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/type_select_btn_normal.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/type_select_btn_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/type_select_btn_pressed.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/voice_rcd_hint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/voice_rcd_hint.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/app_panel_ads_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/app_panel_gallery_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/app_panel_location_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/app_panel_video_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bg_toolbox.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_call.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_call_disable.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_call_on.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/chat_editbox_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/chat_send_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/chatting_setmode_keyboard_btn_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/chatting_setmode_voice_btn_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/emoji_select_btn_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/post_finish_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/reddot.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sticker_btn_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 | -
15 |
16 |
17 |
18 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sticker_btn_selected.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 | -
15 |
16 |
17 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sticker_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/talk_btn_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/talk_btn_bg_press.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/type_select_btn_selector.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
17 |
23 |
24 |
27 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/avos_input_voice.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
22 |
23 |
31 |
32 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/avos_voice_cancel.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
22 |
23 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/bx_emotion.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/chat_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
13 |
17 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/chat_view_new.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
13 |
17 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/emotion_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
12 |
21 |
22 |
28 |
29 |
30 |
31 |
35 |
39 |
44 |
45 |
46 |
47 |
51 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/inputchat.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
22 |
23 |
28 |
29 |
36 |
37 |
44 |
45 |
46 |
53 |
54 |
59 |
60 |
73 |
74 |
75 |
81 |
82 |
89 |
90 |
97 |
98 |
99 |
105 |
106 |
116 |
117 |
124 |
125 |
132 |
133 |
134 |
135 |
142 |
143 |
151 |
152 |
158 |
162 |
163 |
168 |
169 |
170 |
171 |
172 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/inputchat_new.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
22 |
23 |
28 |
29 |
36 |
37 |
44 |
45 |
46 |
53 |
54 |
59 |
60 |
73 |
74 |
75 |
81 |
82 |
89 |
90 |
97 |
98 |
99 |
105 |
106 |
116 |
117 |
124 |
125 |
132 |
133 |
134 |
135 |
142 |
143 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
174 |
175 |
176 |
177 |
178 |
179 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_tool_box.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
20 |
21 |
22 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/voice_press.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
8 | #e0000000
9 | #FFFFFF
10 | #e5e5e5
11 | #76C920
12 | #000000
13 | #d7d7d7
14 | #84d748
15 | #ffffff
16 | #666666
17 | #4b4b4b
18 | #d6d6d6
19 | #C1C1B9
20 | #86CF2A
21 | #80d646
22 | #99e863
23 | #707070
24 | #d3d3d3
25 | #fefefa
26 | #333333
27 | #7b7b7b
28 | #ffffff
29 | #e86e02
30 | #707070
31 | #333333
32 | #86cf2a
33 | #d3d3d3
34 | #f5f5f5
35 | #ffffff
36 | #c8c8c8
37 |
38 |
39 | #000000
40 | #ffffff
41 | #808080
42 | #333333
43 | #333333
44 | #d6d6d6
45 | #adadad
46 | #FA9A5B
47 | #D04B4B4B
48 |
49 | #EB320D
50 | #fea82e
51 | #d8eef4
52 | #ff6f29
53 | #aa000000
54 |
55 | #00000000
56 | #e5fe7700
57 | #e5ff8f2c
58 |
59 | #ff000000
60 | #ffffffff
61 | #c0ffbd21
62 | #ffc0c0c0
63 | #c099cc00
64 | #ffffffff
65 | #b0000000
66 | #ffffffff
67 | #ffcc0000
68 | #60000000
69 | #808080
70 | #99CC33
71 | #00CC00
72 |
73 |
74 | #eaeef1
75 | #999
76 | #e3e3e3
77 | #333
78 | #666
79 | #fafafa
80 | #ffd6b2
81 |
82 |
83 |
84 | #ffffff
85 |
86 |
87 | #ff4466
88 | #e6ff4466
89 | #26ff4466
90 | #fb4466
91 | #df4466
92 | #e6df4466
93 |
94 |
95 | #f2f3ee
96 | #f2f2ef
97 | #fbfbfb
98 | #e7e7e7
99 | #ebeaea
100 | #c8c8c5
101 | #cfcfcf
102 | #aeaeae
103 | #676767
104 | #121212
105 |
106 | #333333
107 | #626971
108 | #cc000000
109 |
110 |
111 | #d0d0d0
112 |
113 |
114 | #4fe3c1
115 |
116 |
117 | #5F9BF8
118 |
119 |
120 | #2F2737
121 | #ff231b2b
122 |
123 |
124 | #FFC333
125 |
126 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/emotion_arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @drawable/u1f60a
5 | - @drawable/u1f628
6 | - @drawable/u1f60d
7 | - @drawable/u1f633
8 | - @drawable/u1f60e
9 | - @drawable/u1f62d
10 | - @drawable/u1f60c
11 | - @drawable/u1f635
12 | - @drawable/u1f634
13 | - @drawable/u1f622
14 | - @drawable/u1f605
15 | - @drawable/u1f621
16 | - @drawable/u1f61c
17 | - @drawable/u1f600
18 | - @drawable/u1f632
19 | - @drawable/u1f61f
20 | - @drawable/u1f624
21 | - @drawable/u1f61e
22 | - @drawable/u1f62b
23 |
24 | - @drawable/u1f608
25 | - @drawable/u1f609
26 | - @drawable/u1f62f
27 | - @drawable/u1f615
28 | - @drawable/u1f630
29 | - @drawable/u1f60b
30 | - @drawable/u1f61d
31 | - @drawable/u1f613
32 | - @drawable/u1f603
33 | - @drawable/u1f602
34 | - @drawable/u1f618
35 | - @drawable/u1f612
36 | - @drawable/u1f60f
37 | - @drawable/u1f636
38 | - @drawable/u1f631
39 | - @drawable/u1f616
40 | - @drawable/u1f629
41 | - @drawable/u1f614
42 | - @drawable/u1f611
43 | - @drawable/u1f61a
44 | - @drawable/u1f62a
45 | - @drawable/u1f607
46 | - @drawable/u1f64a
47 | - @drawable/u1f44a
48 | - @drawable/u1f44e
49 | - @drawable/u261d
50 | - @drawable/u270c
51 | - @drawable/u1f62c
52 | - @drawable/u1f637
53 | - @drawable/u1f648
54 | - @drawable/u1f44c
55 | - @drawable/u1f44f
56 | - @drawable/u270a
57 | - @drawable/u1f4aa
58 | - @drawable/u1f606
59 | - @drawable/u263a
60 | - @drawable/u1f649
61 | - @drawable/u1f44d
62 | - @drawable/u1f64f
63 | - @drawable/u270b
64 | - @drawable/u2600
65 | - @drawable/u2615
66 | - @drawable/u26c4
67 | - @drawable/u1f4da
68 | - @drawable/u1f381
69 | - @drawable/u1f389
70 | - @drawable/u1f366
71 | - @drawable/u2601
72 | - @drawable/u2744
73 | - @drawable/u26a1
74 | - @drawable/u1f4b0
75 | - @drawable/u1f382
76 | - @drawable/u1f393
77 | - @drawable/u1f356
78 | - @drawable/u2614
79 | - @drawable/u26c5
80 | - @drawable/u270f
81 | - @drawable/u1f4a9
82 | - @drawable/u1f384
83 | - @drawable/u1f377
84 | - @drawable/u1f3a4
85 | - @drawable/u1f3c0
86 | - @drawable/u1f004
87 | - @drawable/u1f4a3
88 | - @drawable/u1f4e2
89 | - @drawable/u1f30f
90 | - @drawable/u1f36b
91 | - @drawable/u1f3b2
92 | - @drawable/u1f3c2
93 | - @drawable/u1f4a1
94 | - @drawable/u1f4a4
95 | - @drawable/u1f6ab
96 | - @drawable/u1f33b
97 | - @drawable/u1f37b
98 | - @drawable/u1f3b5
99 | - @drawable/u1f3e1
100 | - @drawable/u1f4a2
101 | - @drawable/u1f4de
102 | - @drawable/u1f6bf
103 | - @drawable/u1f35a
104 | - @drawable/u1f46a
105 | - @drawable/u1f47c
106 | - @drawable/u1f48a
107 | - @drawable/u1f52b
108 | - @drawable/u1f339
109 | - @drawable/u1f436
110 | - @drawable/u1f484
111 | - @drawable/u1f46b
112 | - @drawable/u1f47d
113 | - @drawable/u1f48b
114 | - @drawable/u1f319
115 | - @drawable/u1f349
116 | - @drawable/u1f437
117 | - @drawable/u1f494
118 | - @drawable/u1f47b
119 | - @drawable/u1f47f
120 | - @drawable/u1f48d
121 | - @drawable/u1f332
122 | - @drawable/u1f434
123 | - @drawable/u1f451
124 | - @drawable/u1f525
125 | - @drawable/u2b50
126 | - @drawable/u26bd
127 | - @drawable/u1f556
128 | - @drawable/u23f0
129 | - @drawable/u1f601
130 | - @drawable/u1f680
131 | - @drawable/u23f3
132 |
133 |
134 | - [/u1F60A]
135 | - [/u1F628]
136 | - [/u1F60D]
137 | - [/u1F633]
138 | - [/u1F60E]
139 | - [/u1F62D]
140 | - [/u1F60C]
141 | - [/u1F635]
142 | - [/u1F634]
143 | - [/u1F622]
144 | - [/u1F605]
145 | - [/u1F621]
146 | - [/u1F61C]
147 | - [/u1F600]
148 | - [/u1F632]
149 | - [/u1F61F]
150 | - [/u1F624]
151 | - [/u1F61E]
152 | - [/u1F62B]
153 |
154 | - [/u1F608]
155 | - [/u1F609]
156 | - [/u1F62F]
157 | - [/u1F615]
158 | - [/u1F630]
159 | - [/u1F60B]
160 | - [/u1F61D]
161 | - [/u1F613]
162 | - [/u1F603]
163 | - [/u1F602]
164 | - [/u1F618]
165 | - [/u1F612]
166 | - [/u1F60F]
167 | - [/u1F636]
168 | - [/u1F631]
169 | - [/u1F616]
170 | - [/u1F629]
171 | - [/u1F614]
172 | - [/u1F611]
173 | - [/u1F61A]
174 | - [/u1F62A]
175 | - [/u1F607]
176 | - [/u1F64A]
177 | - [/u1F44A]
178 | - [/u1F44E]
179 | - [/u261D]
180 | - [/u270C]
181 | - [/u1F62C]
182 | - [/u1F637]
183 | - [/u1F648]
184 | - [/u1F44C]
185 | - [/u1F44F]
186 | - [/u270A]
187 | - [/u1F4AA]
188 | - [/u1F606]
189 | - [/u263A]
190 | - [/u1F649]
191 | - [/u1F44D]
192 | - [/u1F64F]
193 | - [/u270B]
194 | - [/u2600]
195 | - [/u2615]
196 | - [/u26C4]
197 | - [/u1F4DA]
198 | - [/u1F381]
199 | - [/u1F389]
200 | - [/u1F366]
201 | - [/u2601]
202 | - [/u2744]
203 | - [/u26A1]
204 | - [/u1F4B0]
205 | - [/u1F382]
206 | - [/u1F393]
207 | - [/u1F356]
208 | - [/u2614]
209 | - [/u26C5]
210 | - [/u270F]
211 | - [/u1F4A9]
212 | - [/u1F384]
213 | - [/u1F377]
214 | - [/u1F3A4]
215 | - [/u1F3C0]
216 | - [/u1F004]
217 | - [/u1F4A3]
218 | - [/u1F4E2]
219 | - [/u1F30F]
220 | - [/u1F36B]
221 | - [/u1F3B2]
222 | - [/u1F3C2]
223 | - [/u1F4A1]
224 | - [/u1F4A4]
225 | - [/u1F6AB]
226 | - [/u1F33B]
227 | - [/u1F37B]
228 | - [/u1F3B5]
229 | - [/u1F3E1]
230 | - [/u1F4A2]
231 | - [/u1F4DE]
232 | - [/u1F6BF]
233 | - [/u1F35A]
234 | - [/u1F46A]
235 | - [/u1F47C]
236 | - [/u1F48A]
237 | - [/u1F52B]
238 | - [/u1F339]
239 | - [/u1F436]
240 | - [/u1F484]
241 | - [/u1F46B]
242 | - [/u1F47D]
243 | - [/u1F48B]
244 | - [/u1F319]
245 | - [/u1F349]
246 | - [/u1F437]
247 | - [/u1F494]
248 | - [/u1F47B]
249 | - [/u1F47F]
250 | - [/u1F48D]
251 | - [/u1F332]
252 | - [/u1F434]
253 | - [/u1F451]
254 | - [/u1F525]
255 | - [/u2B50]
256 | - [/u26BD]
257 | - [/u1F556]
258 | - [/u23F0]
259 | - [/u1F601]
260 | - [/u1F680]
261 | - [/u23F3]
262 |
263 |
264 | - "128522"
265 | - "128552"
266 | - "128525"
267 | - "128563"
268 | - "128526"
269 | - "128557"
270 | - "128524"
271 | - "128565"
272 | - "128564"
273 | - "128546"
274 | - "128517"
275 | - "128545"
276 | - "128540"
277 | - "128512"
278 | - "128562"
279 | - "128543"
280 | - "128548"
281 | - "128542"
282 | - "128555"
283 |
284 | - "128520"
285 | - "128521"
286 | - "128559"
287 | - "128533"
288 | - "128560"
289 | - "128523"
290 | - "128541"
291 | - "128531"
292 | - "128515"
293 | - "128514"
294 | - "128536"
295 | - "128530"
296 | - "128527"
297 | - "128566"
298 | - "128561"
299 | - "128534"
300 | - "128553"
301 | - "128532"
302 | - "128529"
303 | - "128538"
304 | - "128554"
305 | - "128519"
306 | - "128586"
307 | - "128074"
308 | - "128078"
309 | - "9757"
310 | - "9996"
311 | - "128556"
312 | - "128567"
313 | - "128584"
314 | - "128076"
315 | - "128079"
316 | - "9994"
317 | - "128170"
318 | - "128518"
319 | - "9786"
320 | - "128585"
321 | - "128077"
322 | - "128591"
323 | - "9995"
324 | - "9728"
325 | - "9749"
326 | - "9924"
327 | - "128218"
328 | - "127873"
329 | - "127881"
330 | - "127846"
331 | - "9729"
332 | - "10052"
333 | - "9889"
334 | - "128176"
335 | - "127874"
336 | - "127891"
337 | - "127830"
338 | - "9748"
339 | - "9925"
340 | - "9999"
341 | - "128169"
342 | - "127876"
343 | - "127863"
344 | - "127908"
345 | - "127936"
346 | - "126980"
347 | - "128163"
348 | - "128226"
349 | - "127759"
350 | - "127851"
351 | - "127922"
352 | - "127938"
353 | - "128161"
354 | - "128164"
355 | - "128683"
356 | - "127803"
357 | - "127867"
358 | - "127925"
359 | - "127969"
360 | - "128162"
361 | - "128222"
362 | - "128703"
363 | - "127834"
364 | - "128106"
365 | - "128124"
366 | - "128138"
367 | - "128299"
368 | - "127801"
369 | - "128054"
370 | - "128132"
371 | - "128107"
372 | - "128125"
373 | - "128139"
374 | - "127769"
375 | - "127817"
376 | - "128055"
377 | - "128148"
378 | - "128123"
379 | - "128127"
380 | - "128141"
381 | - "127794"
382 | - "128052"
383 | - "128081"
384 | - "128293"
385 | - "11088"
386 | - "9917"
387 | - "128342"
388 | - "9200"
389 | - "128513"
390 | - "128640"
391 | - "9203"
392 |
393 |
394 | - 128522
395 | - 128552
396 | - 128525
397 | - 128563
398 | - 128526
399 | - 128557
400 | - 128524
401 | - 128565
402 | - 128564
403 | - 128546
404 | - 128517
405 | - 128545
406 | - 128540
407 | - 128512
408 | - 128562
409 | - 128543
410 | - 128548
411 | - 128542
412 | - 128555
413 |
414 | - 128520
415 | - 128521
416 | - 128559
417 | - 128533
418 | - 128560
419 | - 128523
420 | - 128541
421 | - 128531
422 | - 128515
423 | - 128514
424 | - 128536
425 | - 128530
426 | - 128527
427 | - 128566
428 | - 128561
429 | - 128534
430 | - 128553
431 | - 128532
432 | - 128529
433 | - 128538
434 | - 128554
435 | - 128519
436 | - 128586
437 | - 128074
438 | - 128078
439 | - 9757
440 | - 9996
441 | - 128556
442 | - 128567
443 | - 128584
444 | - 128076
445 | - 128079
446 | - 9994
447 | - 128170
448 | - 128518
449 | - 9786
450 | - 128585
451 | - 128077
452 | - 128591
453 | - 9995
454 | - 9728
455 | - 9749
456 | - 9924
457 | - 128218
458 | - 127873
459 | - 127881
460 | - 127846
461 | - 9729
462 | - 10052
463 | - 9889
464 | - 128176
465 | - 127874
466 | - 127891
467 | - 127830
468 | - 9748
469 | - 9925
470 | - 9999
471 | - 128169
472 | - 127876
473 | - 127863
474 | - 127908
475 | - 127936
476 | - 126980
477 | - 128163
478 | - 128226
479 | - 127759
480 | - 127851
481 | - 127922
482 | - 127938
483 | - 128161
484 | - 128164
485 | - 128683
486 | - 127803
487 | - 127867
488 | - 127925
489 | - 127969
490 | - 128162
491 | - 128222
492 | - 128703
493 | - 127834
494 | - 128106
495 | - 128124
496 | - 128138
497 | - 128299
498 | - 127801
499 | - 128054
500 | - 128132
501 | - 128107
502 | - 128125
503 | - 128139
504 | - 127769
505 | - 127817
506 | - 128055
507 | - 128148
508 | - 128123
509 | - 128127
510 | - 128141
511 | - 127794
512 | - 128052
513 | - 128081
514 | - 128293
515 | - 11088
516 | - 9917
517 | - 128342
518 | - 9200
519 | - 128513
520 | - 128640
521 | - 9203
522 |
523 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ChatView
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/test/java/com/king/chatview/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.king.chatview;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * To work on unit tests, switch the Test Artifact in the Build Variants view.
9 | */
10 | public class ExampleUnitTest {
11 | @Test
12 | public void addition_isCorrect() throws Exception {
13 | assertEquals(4, 2 + 2);
14 | }
15 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:1.3.0'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | mavenCentral()
19 | }
20 | }
21 |
22 | task clean(type: Delete) {
23 | delete rootProject.buildDir
24 | }
25 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Oct 21 11:34:03 PDT 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/release.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | if [[ $# -gt 4 || $# -lt 1 ]]
4 | then
5 | echo "Missing parameters!"
6 | echo "release.sh "
7 | exit 1
8 | fi
9 |
10 | keystore=$2
11 |
12 | cd ~/Desktop
13 | if [ ! -f "$keystore" ]; then
14 | echo "keystore file not exist!"
15 | cd -
16 | exit 1
17 | fi
18 | cd -
19 |
20 | gradle clean assembleRelease
21 |
22 | echo "gradle assemble end!"
23 |
24 | cd app/build/outputs/apk
25 |
26 | echo "begin to use apktool decode the apk"
27 |
28 | apktool decode -o decode app-release-unsigned.apk
29 |
30 | titles=(`echo "$1" | tr "," "\n"`)
31 |
32 | password1=$3
33 | password2=$4
34 |
35 | for title in "${titles[@]}"
36 | do
37 | sed 's/android:label="[^"]*"/android:label="'"$title"'"/g' decode/AndroidManifest.xml > decode/AndroidManifest.xml.new
38 | mv decode/AndroidManifest.xml.new decode/AndroidManifest.xml
39 | apktool build -o app_${title}.apk decode
40 | jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ~/Desktop/$keystore -storepass $password1 -keypass $password2 app_${title}.apk $keystore
41 | jarsigner -verify app_${title}.apk
42 | zipalign -v 4 app_${title}.apk app_${title}-signed.apk
43 | rm app_${title}.apk
44 | done
45 |
46 |
47 | rm -r decode
48 | rm app-release-unsigned.apk
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------