├── MobIM_1.0.0.zip ├── MobIM_demoV1.0.1.2017121502.apk ├── README.md ├── Sample ├── app │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ ├── cn │ │ │ └── sharerec │ │ │ │ └── editor │ │ │ │ └── gui │ │ │ │ └── trimvideo │ │ │ │ └── recorder │ │ │ │ ├── AudioRecorderByMedia.java │ │ │ │ ├── IRecorder.java │ │ │ │ └── VolumeChangeListener.java │ │ └── com │ │ │ └── mob │ │ │ └── demo │ │ │ └── mobim │ │ │ ├── BaseActivity.java │ │ │ ├── BaseFragment.java │ │ │ ├── GlideBoardTransform.java │ │ │ ├── GlideConfig.java │ │ │ ├── GlideRoundTransform.java │ │ │ ├── MainApplication.java │ │ │ ├── SimpleMobIMMessageReceiver.java │ │ │ ├── biz │ │ │ └── UserManager.java │ │ │ ├── component │ │ │ ├── DialogIKnown.java │ │ │ ├── DialogYesOrNo.java │ │ │ ├── IMultiItemSupport.java │ │ │ ├── PieView.java │ │ │ ├── QuickAdapter.java │ │ │ ├── ViewHolder.java │ │ │ ├── animation │ │ │ │ ├── PieAngleAnimation.java │ │ │ │ └── PieStrokeWidthAnimation.java │ │ │ └── annotation │ │ │ │ ├── ColorInt.java │ │ │ │ └── FloatRange.java │ │ │ ├── emoji │ │ │ ├── DefaultEmojiconDatas.java │ │ │ ├── EmojiGridAdapter.java │ │ │ ├── Emojicon.java │ │ │ └── SmileUtils.java │ │ │ ├── model │ │ │ ├── MsgItem.java │ │ │ ├── MsgReceiverListener.java │ │ │ ├── RecyclingBitmapDrawable.java │ │ │ ├── RecyclingImageView.java │ │ │ └── VideoEntity.java │ │ │ ├── ui │ │ │ ├── ChatActivity.java │ │ │ ├── ChatDetailActivity.java │ │ │ ├── ChatDetailFragment.java │ │ │ ├── ChatFragment.java │ │ │ ├── FragmentBlackList.java │ │ │ ├── FragmentContacts.java │ │ │ ├── FragmentConversation.java │ │ │ ├── FragmentMine.java │ │ │ ├── FragmentUpdateUserAvatar.java │ │ │ ├── FragmentUpdateUserName.java │ │ │ ├── GroupAddUserActivity.java │ │ │ ├── GroupCreateActivity.java │ │ │ ├── GroupListActivity.java │ │ │ ├── GroupPickUserActivity.java │ │ │ ├── GroupSearchActivity.java │ │ │ ├── ImagePickerActivity.java │ │ │ ├── InputForResultActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── ReminderDetailsActivity.java │ │ │ ├── ReminderListActivity.java │ │ │ ├── UpdateUserInfoActivity.java │ │ │ ├── UserDetailsActivity.java │ │ │ └── UserSearchActivity.java │ │ │ └── utils │ │ │ ├── ChatUtils.java │ │ │ ├── FileUtil.java │ │ │ ├── ImageCache.java │ │ │ ├── ImageResizer.java │ │ │ ├── ImageWorker.java │ │ │ ├── LoadImageUtils.java │ │ │ ├── RecyclingBitmapDrawable.java │ │ │ └── Utils.java │ │ └── res │ │ ├── anim │ │ └── anim_pop.xml │ │ ├── color │ │ ├── group_join_txt.xml │ │ └── tab_txt.xml │ │ ├── drawable-xhdpi │ │ ├── actionbar_camera_icon.png │ │ ├── addcamera.png │ │ ├── addfile.png │ │ ├── addpic.png │ │ ├── arrow.png │ │ ├── attach.png │ │ ├── audio.png │ │ ├── audio_send.png │ │ ├── back.png │ │ ├── chat_add.png │ │ ├── chat_remove.png │ │ ├── ckb_false.png │ │ ├── ckb_true.png │ │ ├── default_play_icon.png │ │ ├── ee_1.png │ │ ├── ee_10.png │ │ ├── ee_11.png │ │ ├── ee_12.png │ │ ├── ee_13.png │ │ ├── ee_14.png │ │ ├── ee_15.png │ │ ├── ee_16.png │ │ ├── ee_17.png │ │ ├── ee_18.png │ │ ├── ee_19.png │ │ ├── ee_2.png │ │ ├── ee_20.png │ │ ├── ee_21.png │ │ ├── ee_22.png │ │ ├── ee_23.png │ │ ├── ee_24.png │ │ ├── ee_25.png │ │ ├── ee_26.png │ │ ├── ee_27.png │ │ ├── ee_28.png │ │ ├── ee_29.png │ │ ├── ee_3.png │ │ ├── ee_30.png │ │ ├── ee_31.png │ │ ├── ee_32.png │ │ ├── ee_33.png │ │ ├── ee_34.png │ │ ├── ee_35.png │ │ ├── ee_4.png │ │ ├── ee_5.png │ │ ├── ee_6.png │ │ ├── ee_7.png │ │ ├── ee_8.png │ │ ├── ee_9.png │ │ ├── ee_bye.png │ │ ├── ee_coldsweat.png │ │ ├── ee_daze.png │ │ ├── ee_envelop.png │ │ ├── ee_fade.png │ │ ├── ee_haughty.png │ │ ├── ee_lovely.png │ │ ├── ee_mmd.png │ │ ├── ee_no.png │ │ ├── ee_ok.png │ │ ├── ee_pingpang.png │ │ ├── ee_pity.png │ │ ├── ee_rain.png │ │ ├── ee_rightcar.png │ │ ├── ee_rightgroan.png │ │ ├── ee_righttaiji.png │ │ ├── ee_seduce.png │ │ ├── ee_shake.png │ │ ├── ee_shit.png │ │ ├── ee_sword.png │ │ ├── ee_titter.png │ │ ├── ee_vomit.png │ │ ├── emoj.png │ │ ├── empty_photo.png │ │ ├── face1.png │ │ ├── face2.png │ │ ├── face3.png │ │ ├── face4.png │ │ ├── face5.png │ │ ├── file.png │ │ ├── ic_add.png │ │ ├── ic_add_user.png │ │ ├── ic_arrow_right.png │ │ ├── ic_back.png │ │ ├── ic_default_reminder.png │ │ ├── ic_default_user.png │ │ ├── ic_group.png │ │ ├── ic_select.png │ │ ├── ic_select_ed.png │ │ ├── info_people.png │ │ ├── keybord.png │ │ ├── msg_back.9.png │ │ ├── msg_from.9.png │ │ ├── playrevaudio1.png │ │ ├── playrevaudio2.png │ │ ├── playrevaudio3.png │ │ ├── playsendaudio1.png │ │ ├── playsendaudio2.png │ │ ├── playsendaudio3.png │ │ ├── recorder_volume1.png │ │ ├── recorder_volume2.png │ │ ├── recorder_volume3.png │ │ ├── recorder_volume4.png │ │ ├── recorder_volume5.png │ │ ├── speak.png │ │ ├── tab_contacts_n.png │ │ ├── tab_contacts_p.png │ │ ├── tab_conversation_n.png │ │ ├── tab_conversation_p.png │ │ ├── tab_mine_n.png │ │ ├── tab_mine_p.png │ │ ├── titlebar_bg.png │ │ └── warn.png │ │ ├── drawable │ │ ├── anim_playrevaudio.xml │ │ ├── anim_playsendaudio.xml │ │ ├── bg_dialog.xml │ │ ├── bg_recordview.xml │ │ ├── bg_touchspeak.xml │ │ ├── btn_green_raduis_2.xml │ │ ├── btn_select.xml │ │ ├── circle_check.xml │ │ ├── circle_dot.xml │ │ ├── circle_uncheck.xml │ │ ├── ckb_bg.xml │ │ ├── divider_contacts.xml │ │ ├── gray_thumb.xml │ │ ├── gray_track.xml │ │ ├── green_thumb.xml │ │ ├── green_track.xml │ │ ├── input_title_bar_search.xml │ │ ├── mob_photogrid_list_selector.xml │ │ ├── round_white_4.xml │ │ ├── selector_contacts_item.xml │ │ ├── selector_dialog_i_known.xml │ │ ├── selector_dialog_no.xml │ │ ├── selector_dialog_yes.xml │ │ ├── tab_contacts.xml │ │ ├── tab_conversation.xml │ │ ├── tab_mine.xml │ │ ├── thumb.xml │ │ └── track.xml │ │ ├── layout │ │ ├── activity_frame.xml │ │ ├── activity_group_add_user.xml │ │ ├── activity_group_create.xml │ │ ├── activity_group_list.xml │ │ ├── activity_group_search.xml │ │ ├── activity_main.xml │ │ ├── activity_reminder_details.xml │ │ ├── activity_user_details.xml │ │ ├── activity_user_search.xml │ │ ├── attach_detail.xml │ │ ├── choose_griditem.xml │ │ ├── dialog_i_known.xml │ │ ├── dialog_yes_or_no.xml │ │ ├── fragment_black_list.xml │ │ ├── fragment_chat.xml │ │ ├── fragment_chatdetail.xml │ │ ├── fragment_contacts.xml │ │ ├── fragment_conversation.xml │ │ ├── fragment_groupchatdetail.xml │ │ ├── fragment_mine.xml │ │ ├── fragment_update_user_avatar.xml │ │ ├── fragment_update_user_name.xml │ │ ├── friend_item.xml │ │ ├── input_frame.xml │ │ ├── item_popup.xml │ │ ├── layout_loading.xml │ │ ├── list_black_list_item.xml │ │ ├── list_contacts_item.xml │ │ ├── list_contacts_item_bar.xml │ │ ├── list_contacts_item_search.xml │ │ ├── list_conversation_item.xml │ │ ├── list_group_add_user_item.xml │ │ ├── list_reminder_details.xml │ │ ├── list_reminder_list_item.xml │ │ ├── list_search_user_item.xml │ │ ├── msg_audiorev_item.xml │ │ ├── msg_audiosend_item.xml │ │ ├── msg_file_item.xml │ │ ├── msg_filerev_item.xml │ │ ├── msg_image_item.xml │ │ ├── msg_imagerev_item.xml │ │ ├── msg_text_item.xml │ │ ├── msg_textrev_item.xml │ │ ├── msg_video_item.xml │ │ ├── msg_videorev_item.xml │ │ ├── pickpic.xml │ │ ├── record_dialog.xml │ │ ├── time_show.xml │ │ ├── title_bar.xml │ │ ├── title_bar_search.xml │ │ ├── title_bar_txt.xml │ │ ├── update_user_avatar_item.xml │ │ └── warn_data.xml │ │ ├── mipmap-hdpi │ │ ├── chat_add.png │ │ ├── chat_remove.png │ │ ├── ic_launcher.png │ │ └── mobpush_notification_icon.png │ │ ├── mipmap-mdpi │ │ ├── chat_add.png │ │ ├── chat_remove.png │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── speak.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-sw768dp │ │ └── dimens.xml │ │ ├── values-v19 │ │ └── ag_style_theme.xml │ │ ├── values-v21 │ │ └── ag_style_theme.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── dimens.xml │ │ ├── mob_colors.xml │ │ ├── mob_dimens.xml │ │ ├── sdk_error.xml │ │ ├── strings.xml │ │ └── style.xml │ │ └── xml │ │ └── filepaths.xml ├── build.gradle ├── buildCommon.gradle ├── gradle.properties └── settings.gradle └── 获取MobIM.md /MobIM_1.0.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/MobIM_1.0.0.zip -------------------------------------------------------------------------------- /MobIM_demoV1.0.1.2017121502.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/MobIM_demoV1.0.1.2017121502.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MobIM集成文档 2 | 3 | ## 配置gradle 4 | 5 | ### 1、将下面的脚本添加到您的根模块build.gradle中: 6 | ``` gradle 7 | buildscript { 8 | // 添加MobSDK的maven地址 9 | repositories { 10 | maven { 11 | url "http://mvn.mob.com/android" 12 | } 13 | } 14 | 15 | dependencies { 16 | // 注册MobSDK 17 | classpath 'com.mob.sdk:MobSDK:+' 18 | } 19 | } 20 | ``` 21 | 22 | ### 2、在使用MobIM模块的build.gradle中,添加MobSDK插件和扩展,如: 23 | ``` gradle 24 | // 添加插件 25 | apply plugin: 'com.mob.sdk' 26 | 27 | // 在MobSDK的扩展中注册MobIM的相关信息 28 | MobSDK { 29 | appKey "d580ad56b***" 30 | appSecret "7fcae59a62342e7e2759e9e397c82***" 31 | 32 | MobIM {} 33 | } 34 | ``` 35 | 36 | ## 添加代码 37 | 38 | ### 1、初始化MobIM 39 | 40 | 如果您没有在`AndroidManifest`中设置`appliaction`的类名,MobSDK会将这个设置为`com.mob.MobApplication`,但如果您设置了,请在您自己的Application类中调用: 41 | ```java 42 | MobSDK.init(this); 43 | ``` 44 | 以初始化MobSDK。 45 | 46 | #### 2、调用API 47 | 48 | 在应用启动后,用户自己的用户登录系统登录成功后调用如下api,设置用户到MobIM即可。 49 | 50 | 登录成功后,设置用户信息(IM会使用此用户进行通讯) 51 | ```java 52 | MobSDK.setUser("用户ID", "用户昵称","用户头像地址", null); 53 | ``` 54 | 在需要监听消息回调的地方,调用如下api,设置消息监听 55 | ```java 56 | MobIM.addMessageReceiver(MobIMMessageReceiver mobMsgRever); 57 | ``` 58 | 在IM程序时,调用移除监听消息接口: 59 | ```java 60 | MobIM.removeMessageReceiver(MobIMMessageReceiver mobMsgRever); 61 | ``` 62 | 注:MobIMMessageReceiver是处理收到消息的回调接口,根据获取的消息进行处理,接口实现如下: 63 | ```java 64 | public interface MobIMMessageReceiver { 65 | void onMessageReceived(List messageList); 66 | } 67 | ``` 68 | 获取会话列表 69 | ```java 70 | MobIM.getChatManager().getAllLocalConversations(MobIMCallback> conversations) 71 | ``` 72 | 发送消息 73 | ```java 74 | MobIM.getChatManager().sendMessage(msg, new MobIMCallback() { 75 | public void onSuccess(Void result) { 76 | // TODO 处理消息发送成功的结果 77 | } 78 | public void onError(int code, String message) { 79 | // TODO 根据错误码(code)处理错误返回 80 | } 81 | }); 82 | ``` 83 | 备注: 84 | MobIM并不自带用户系统(没有登录与注册操作,需要用户有自己的),用户成功登陆您自有用户系统后,开发者可对接登录MobIM中相对应的用户。 85 | 86 | ## MOBIMCallback 87 | MobIMCallback是MobIM所有异步操作的结果回调,包含下面2个方法: 88 | 89 | 方法名称|参数列表|使用说明 90 | -------|-------|------- 91 | onSuccess|T t 具体操作的结果数据|成功回调 92 | onError|int code, String message 具体操作的异常类型
关于错误码的项目描述,请参考 [MobIM错误码][1]|错误回调 93 | ## 混淆设置 94 | 95 | MobIM已经做了混淆处理,再次混淆会导致不可预期的错误,请在您的混淆脚本中添加如下的配置,跳过对MobIM的混淆操作: 96 | ``` 97 | -keep class com.mob.**{*;} 98 | ``` 99 | ## 注意事项 100 | 1. MobSDK默认为MobIM提供最新版本的集成,如果您想锁定某个版本,可以在`MobIM`下设置“version "某个版本"”来固定使用这个版本 101 | 2. 如果使用MobSDK的模块会被其它模块依赖,请确保依赖它的模块也引入MobSDK插件,或在此模块的gradle中添加: 102 | ``` gradle 103 | repositories { 104 | maven { 105 | url "http://mvn.mob.com/android" 106 | } 107 | } 108 | ``` 109 | 110 | 111 | [1]: http://wiki.mob.com/mobim%E9%94%99%E8%AF%AF%E7%A0%81-android/ -------------------------------------------------------------------------------- /Sample/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply from: '../buildCommon.gradle' 3 | // 添加插件 4 | apply plugin: 'com.mob.sdk' 5 | 6 | // 在MobSDK的扩展中注册UMSSDK的相关信息 7 | MobSDK { 8 | appKey "moba6b6c6d6" 9 | appSecret "b89d2427a3bc7ad1aea1e1e8c1d36bf3" 10 | MobIM {} 11 | } 12 | 13 | dependencies { 14 | compile 'com.android.support:support-v4:25.0.1' 15 | compile 'com.github.bumptech.glide:glide:3.7.0' 16 | } -------------------------------------------------------------------------------- /Sample/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 /Users/orange/Library/Android/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 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/cn/sharerec/editor/gui/trimvideo/recorder/AudioRecorderByMedia.java: -------------------------------------------------------------------------------- 1 | package cn.sharerec.editor.gui.trimvideo.recorder; 2 | 3 | import android.media.MediaRecorder; 4 | import android.os.Handler; 5 | import android.os.Message; 6 | 7 | import com.mob.tools.MobHandlerThread; 8 | 9 | import java.io.IOException; 10 | 11 | public class AudioRecorderByMedia implements IRecorder { 12 | private boolean recordering = false; 13 | Handler checkVolume; 14 | MediaRecorder recorder; 15 | private long start; 16 | private long end; 17 | private int base = 600; 18 | private int space = 300;// 间隔取样时间 19 | 20 | private VolumeChangeListener volumeChangeListener; 21 | 22 | private void init() { 23 | if (recorder == null) { 24 | recorder = new MediaRecorder(); 25 | try { 26 | recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 27 | } catch (Exception ex) { 28 | ex.printStackTrace(); 29 | recorder.reset(); 30 | recorder.release(); 31 | recorder = null; 32 | try { 33 | recorder = new MediaRecorder(); 34 | recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 35 | //recorder.setAudioSource(MediaRecorder.AudioSource.); 36 | } catch (Exception ex2) { 37 | ex2.printStackTrace(); 38 | } 39 | } 40 | 41 | recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 42 | recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 43 | } 44 | MobHandlerThread handlerThread = new MobHandlerThread(); 45 | handlerThread.start(); 46 | checkVolume = new Handler(handlerThread.getLooper(), 47 | new Handler.Callback() { 48 | public boolean handleMessage(Message msg) { 49 | checkVolume.removeMessages(0); 50 | int volume = getVolume(); 51 | if (recordering) { 52 | if (volumeChangeListener != null) { 53 | volumeChangeListener.onVolumeChange(volume); 54 | } 55 | checkVolume.sendEmptyMessageDelayed(0, space); 56 | } 57 | return true; 58 | } 59 | }); 60 | 61 | } 62 | 63 | private int getVolume() { 64 | if (recorder != null) { 65 | // int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768; 66 | int ratio = 0; 67 | try { 68 | ratio = recorder.getMaxAmplitude() / base; 69 | } catch (Exception ex) { 70 | ex.printStackTrace(); 71 | } 72 | int db = 0;// 分贝 73 | if (ratio > 1) { 74 | db = (int) (20 * Math.log10(ratio)); 75 | } 76 | return db / 4; 77 | } 78 | return 0; 79 | } 80 | 81 | public void startRecorder(String path, VolumeChangeListener volumeChangeListener) { 82 | init(); 83 | try { 84 | recorder.setOutputFile(path);// 设置录音文件输出路径 85 | try { 86 | recorder.prepare(); 87 | } catch (IllegalStateException e) { 88 | // TODO Auto-generated catch block 89 | e.printStackTrace(); 90 | } catch (IOException e) { 91 | // TODO Auto-generated catch block 92 | e.printStackTrace(); 93 | } 94 | this.volumeChangeListener = volumeChangeListener; 95 | recorder.start(); 96 | start = System.currentTimeMillis(); 97 | recordering = true; 98 | checkVolume.sendEmptyMessageDelayed(0, space); 99 | } catch (Throwable t) { 100 | t.printStackTrace(); 101 | } 102 | } 103 | 104 | public void stopRecorder() { 105 | if (recordering) { 106 | try { 107 | recorder.stop(); 108 | } catch (Exception e) { 109 | e.printStackTrace(); 110 | } 111 | end = System.currentTimeMillis(); 112 | recorder.reset(); 113 | recorder.release(); 114 | recorder = null; 115 | } 116 | recordering = false; 117 | } 118 | 119 | @Override 120 | public void pause() { 121 | if (recordering) { 122 | // recorder. 123 | } 124 | } 125 | 126 | public void resume() { 127 | 128 | } 129 | 130 | public long getDuration() { 131 | return end - start; 132 | } 133 | 134 | } 135 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/cn/sharerec/editor/gui/trimvideo/recorder/IRecorder.java: -------------------------------------------------------------------------------- 1 | package cn.sharerec.editor.gui.trimvideo.recorder; 2 | 3 | public interface IRecorder { 4 | 5 | public void startRecorder(String path, VolumeChangeListener volumeChangeListener); 6 | 7 | public void stopRecorder(); 8 | 9 | public void pause(); 10 | 11 | public void resume(); 12 | 13 | public long getDuration(); 14 | } 15 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/cn/sharerec/editor/gui/trimvideo/recorder/VolumeChangeListener.java: -------------------------------------------------------------------------------- 1 | package cn.sharerec.editor.gui.trimvideo.recorder; 2 | 3 | public interface VolumeChangeListener { 4 | 5 | public void onVolumeChange(long volume); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim; 2 | 3 | import android.content.pm.PackageInfo; 4 | import android.content.pm.PackageManager; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.support.annotation.LayoutRes; 8 | import android.support.annotation.NonNull; 9 | import android.support.annotation.Nullable; 10 | import android.support.v4.app.FragmentActivity; 11 | import android.view.LayoutInflater; 12 | import android.view.View; 13 | import android.view.Window; 14 | import android.widget.Toast; 15 | 16 | import java.util.ArrayList; 17 | 18 | public class BaseActivity extends FragmentActivity { 19 | 20 | protected void onCreate(@Nullable Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | 23 | if (Build.VERSION.SDK_INT >= 21) {//状态栏全透明 24 | Window window = getWindow(); 25 | window.clearFlags(0x04000000 // LayoutParams.FLAG_TRANSLUCENT_STATUS 26 | | 0x08000000); // LayoutParams.FLAG_TRANSLUCENT_NAVIGATION 27 | window.getDecorView().setSystemUiVisibility(0x00000400 // View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 28 | | 0x00000200 // View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 29 | | 0x00000100); // View.SYSTEM_UI_FLAG_LAYOUT_STABLE 30 | window.addFlags(0x80000000); // LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 31 | } 32 | } 33 | 34 | public void setContentView(@LayoutRes int layoutResID) { 35 | View view = LayoutInflater.from(this).inflate(layoutResID, null); 36 | setContentView(view); 37 | } 38 | 39 | public void setContentView(View view) { 40 | super.setContentView(view); 41 | view.setFitsSystemWindows(true); 42 | } 43 | 44 | /* 检查使用权限 */ 45 | protected void checkPermissions() { 46 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 47 | try { 48 | PackageManager pm = getPackageManager(); 49 | PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS); 50 | ArrayList list = new ArrayList(); 51 | for (String p : pi.requestedPermissions) { 52 | if (checkSelfPermission(p) != PackageManager.PERMISSION_GRANTED) { 53 | list.add(p); 54 | } 55 | } 56 | if (list.size() > 0) { 57 | String[] permissions = list.toArray(new String[list.size()]); 58 | if (permissions != null) { 59 | requestPermissions(permissions, 1); 60 | } 61 | } 62 | } catch (Throwable t) { 63 | t.printStackTrace(); 64 | } 65 | } 66 | } 67 | 68 | @Override 69 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 70 | super.onRequestPermissionsResult(requestCode, permissions, grantResults); 71 | try { 72 | if (permissions != null && permissions.length > 0) { 73 | StringBuilder sb = null; 74 | String permission; 75 | for (int i = 0; i < permissions.length; i++) { 76 | if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 77 | continue; 78 | } 79 | if (sb == null) { 80 | sb = new StringBuilder(); 81 | } 82 | permission = permissions[i]; 83 | } 84 | if (sb != null) { 85 | //toast 提示用户已经禁用了必要的权限,然后去权限中心打开即可 86 | Toast.makeText(getApplication(), R.string.toast_permission_deny, Toast.LENGTH_SHORT).show(); 87 | } 88 | } 89 | } catch (Throwable t) { 90 | t.printStackTrace(); 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/GlideBoardTransform.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.graphics.Bitmap; 6 | import android.graphics.BitmapShader; 7 | import android.graphics.Canvas; 8 | import android.graphics.Paint; 9 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 10 | import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; 11 | 12 | public class GlideBoardTransform extends BitmapTransformation { 13 | private float radius = 0f; 14 | private Paint borderPaint; 15 | private float borderWidth; 16 | 17 | public GlideBoardTransform(Context context, int radius) { 18 | super(context); 19 | this.radius = radius; 20 | } 21 | 22 | public GlideBoardTransform(Context context, int radius, int borderWidth, int borderColor) { 23 | super(context); 24 | this.radius = radius; 25 | this.borderWidth = Resources.getSystem().getDisplayMetrics().density * borderWidth; 26 | borderPaint = new Paint(); 27 | borderPaint.setDither(true); 28 | borderPaint.setAntiAlias(true); 29 | borderPaint.setColor(borderColor); 30 | borderPaint.setStyle(Paint.Style.STROKE); 31 | borderPaint.setStrokeWidth(this.borderWidth); 32 | } 33 | 34 | protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 35 | return roundCrop(pool, toTransform); 36 | } 37 | 38 | private Bitmap roundCrop(BitmapPool pool, Bitmap source) { 39 | if (source == null) { 40 | return null; 41 | } 42 | int size = (int) (Math.min(source.getWidth(), source.getHeight()) - (borderWidth / 2)); 43 | int x = (source.getWidth() - size) / 2; 44 | int y = (source.getHeight() - size) / 2; 45 | // TODO this could be acquired from the pool too 46 | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); 47 | Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); 48 | if (result == null) { 49 | result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 50 | } 51 | Canvas canvas = new Canvas(result); 52 | Paint paint = new Paint(); 53 | paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 54 | paint.setAntiAlias(true); 55 | float r = size / 2f; 56 | canvas.drawCircle(r, r, r, paint); 57 | if (borderPaint != null) { 58 | float borderRadius = r - borderWidth / 2; 59 | canvas.drawCircle(r, r, borderRadius, borderPaint); 60 | } 61 | return result; 62 | } 63 | 64 | @Override 65 | public String getId() { 66 | return getClass().getName() + Math.round(radius); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/GlideConfig.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim; 2 | 3 | import android.content.Context; 4 | 5 | import com.bumptech.glide.Glide; 6 | import com.bumptech.glide.GlideBuilder; 7 | import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory; 8 | import com.bumptech.glide.module.GlideModule; 9 | 10 | import java.io.File; 11 | 12 | public class GlideConfig implements GlideModule { 13 | public void applyOptions(Context context, GlideBuilder builder) { 14 | try { 15 | File cacheDir = context.getExternalCacheDir();//指定的是数据的缓存地址 16 | //设置磁盘缓存大小 17 | builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getPath(), "images", 1024 * 1024 * 100)); 18 | } catch (Throwable t) { 19 | t.printStackTrace(); 20 | } 21 | } 22 | 23 | public void registerComponents(Context context, Glide glide) { 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/GlideRoundTransform.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.BitmapShader; 6 | import android.graphics.Canvas; 7 | import android.graphics.Paint; 8 | import android.graphics.RectF; 9 | 10 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 11 | import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; 12 | 13 | public class GlideRoundTransform extends BitmapTransformation { 14 | private float radius = 0f; 15 | 16 | public GlideRoundTransform(Context context, int radius) { 17 | super(context); 18 | this.radius = radius; 19 | } 20 | 21 | protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 22 | return roundCrop(pool, toTransform); 23 | } 24 | 25 | private Bitmap roundCrop(BitmapPool pool, Bitmap source) { 26 | if (source == null) { 27 | return null; 28 | } 29 | Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); 30 | if (result == null) { 31 | result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); 32 | } 33 | 34 | Canvas canvas = new Canvas(result); 35 | Paint paint = new Paint(); 36 | paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 37 | paint.setAntiAlias(true); 38 | RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); 39 | canvas.drawRoundRect(rectF, radius, radius, paint); 40 | return result; 41 | } 42 | 43 | public String getId() { 44 | return getClass().getName() + Math.round(radius); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim; 2 | 3 | import com.mob.MobApplication; 4 | import com.mob.demo.mobim.model.MsgReceiverListener; 5 | import com.mob.imsdk.MobIM; 6 | 7 | public class MainApplication extends MobApplication { 8 | private SimpleMobIMMessageReceiver mobMsgRever = null; 9 | 10 | public void onCreate() { 11 | super.onCreate(); 12 | } 13 | 14 | public void regMsgRev() { 15 | if (mobMsgRever == null) { 16 | mobMsgRever = new SimpleMobIMMessageReceiver(this); 17 | MobIM.addMessageReceiver(mobMsgRever); 18 | } 19 | } 20 | 21 | public void onTerminate() { 22 | super.onTerminate(); 23 | if (mobMsgRever != null) { 24 | MobIM.removeMessageReceiver(mobMsgRever); 25 | } 26 | mobMsgRever = null; 27 | } 28 | 29 | public void addMsgRever(MsgReceiverListener listener) { 30 | mobMsgRever.addMsgRever(listener); 31 | } 32 | 33 | public void removeMsgRever(MsgReceiverListener listener) { 34 | mobMsgRever.removeMsgRever(listener); 35 | } 36 | 37 | public void addGroupMsgRever(MsgReceiverListener listener) { 38 | mobMsgRever.addGroupMsgRever(listener); 39 | } 40 | 41 | public void removeGroupMsgRever(MsgReceiverListener listener) { 42 | mobMsgRever.removeGroupMsgRever(listener); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/DialogIKnown.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.support.annotation.NonNull; 6 | import android.view.Gravity; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.Window; 10 | import android.view.WindowManager; 11 | import android.widget.TextView; 12 | 13 | import com.mob.MobSDK; 14 | import com.mob.demo.mobim.R; 15 | import com.mob.tools.utils.ResHelper; 16 | 17 | public class DialogIKnown extends Dialog { 18 | private OnConfirmClickListener listener; 19 | 20 | public DialogIKnown(@NonNull Context context, String message, int knownResId, OnConfirmClickListener listener) { 21 | super(context, R.style.DialogStyle); 22 | this.listener = listener; 23 | init(context, message, knownResId); 24 | } 25 | 26 | private void init(Context context, String message, int knownResId) { 27 | View view = LayoutInflater.from(context).inflate(R.layout.dialog_i_known, null); 28 | setContentView(view); 29 | 30 | TextView tvContent = (TextView) view.findViewById(R.id.tvContent); 31 | TextView tvOK = (TextView) view.findViewById(R.id.tvOK); 32 | 33 | tvContent.setText(message); 34 | if (knownResId > 0) { 35 | tvOK.setText(knownResId); 36 | } 37 | 38 | tvOK.setOnClickListener(new View.OnClickListener() { 39 | public void onClick(View v) { 40 | dismiss(); 41 | if (listener != null) { 42 | listener.onConfirm(); 43 | } 44 | } 45 | }); 46 | } 47 | 48 | public void show() { 49 | Window window = getWindow(); 50 | WindowManager.LayoutParams wlp = window.getAttributes(); 51 | wlp.gravity = Gravity.CENTER; 52 | wlp.width = MobSDK.getContext().getResources().getDisplayMetrics().widthPixels - ResHelper.dipToPx(MobSDK.getContext(), 50); 53 | super.show(); 54 | } 55 | 56 | public interface OnConfirmClickListener { 57 | void onConfirm(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/DialogYesOrNo.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.support.annotation.NonNull; 7 | import android.view.Gravity; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.Window; 11 | import android.view.WindowManager; 12 | import android.widget.TextView; 13 | 14 | import com.mob.MobSDK; 15 | import com.mob.demo.mobim.R; 16 | import com.mob.tools.utils.ResHelper; 17 | 18 | public class DialogYesOrNo extends Dialog implements View.OnClickListener { 19 | private OnConfirmClickListener listener; 20 | private OnCancelClickListener cancelClickListener; 21 | private boolean isConfirmClick = false; 22 | 23 | public DialogYesOrNo(@NonNull Context context, String message, int noResId, int yesResId, OnConfirmClickListener listener) { 24 | this(context, message, noResId, yesResId, listener, null); 25 | } 26 | 27 | public DialogYesOrNo(@NonNull Context context, String message, int noResId, int yesResId, OnConfirmClickListener listener, 28 | OnCancelClickListener cancelClickListener) { 29 | super(context, R.style.DialogStyle); 30 | this.listener = listener; 31 | this.cancelClickListener = cancelClickListener; 32 | init(context, message, noResId, yesResId); 33 | } 34 | 35 | private void init(Context context, String message, int noResId, int yesResId) { 36 | View view = LayoutInflater.from(context).inflate(R.layout.dialog_yes_or_no, null); 37 | setContentView(view); 38 | 39 | TextView tvContent = (TextView) view.findViewById(R.id.tvContent); 40 | TextView tvCancel = (TextView) view.findViewById(R.id.tvCancel); 41 | TextView tvOK = (TextView) view.findViewById(R.id.tvOK); 42 | 43 | tvContent.setText(message); 44 | if (noResId > 0) { 45 | tvCancel.setText(noResId); 46 | } 47 | if (yesResId > 0) { 48 | tvOK.setText(yesResId); 49 | } 50 | 51 | tvCancel.setOnClickListener(this); 52 | tvOK.setOnClickListener(this); 53 | 54 | setOnDismissListener(new OnDismissListener() { 55 | public void onDismiss(DialogInterface dialog) { 56 | if (isConfirmClick) { 57 | if (listener != null) { 58 | listener.onConfirm(); 59 | } 60 | } else if (cancelClickListener != null) { 61 | cancelClickListener.onCancel(); 62 | } 63 | } 64 | }); 65 | } 66 | 67 | public void show() { 68 | isConfirmClick = false; 69 | Window window = getWindow(); 70 | WindowManager.LayoutParams wlp = window.getAttributes(); 71 | wlp.gravity = Gravity.CENTER; 72 | wlp.width = MobSDK.getContext().getResources().getDisplayMetrics().widthPixels - ResHelper.dipToPx(MobSDK.getContext(), 50); 73 | super.show(); 74 | } 75 | 76 | public void onClick(View v) { 77 | if (v.getId() == R.id.tvOK) { 78 | isConfirmClick = true; 79 | } 80 | dismiss(); 81 | } 82 | 83 | public interface OnConfirmClickListener { 84 | void onConfirm(); 85 | } 86 | 87 | public interface OnCancelClickListener { 88 | void onCancel(); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/IMultiItemSupport.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component; 2 | 3 | public interface IMultiItemSupport { 4 | int getViewTypeCount(); 5 | 6 | /*** 7 | * @return 返回itemViewType, 从1开始 8 | */ 9 | int getItemViewType(T t); 10 | 11 | int getLayoutId(int itemViewType); 12 | } 13 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/ViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component; 2 | 3 | import android.util.SparseArray; 4 | import android.view.View; 5 | import android.widget.TextView; 6 | 7 | public class ViewHolder { 8 | private View convertView; 9 | private SparseArray views; 10 | 11 | public ViewHolder(View convertView) { 12 | this.convertView = convertView; 13 | views = new SparseArray(); 14 | } 15 | 16 | public T getView(int viewId) { 17 | View view = views.get(viewId); 18 | if (view == null) { 19 | view = convertView.findViewById(viewId); 20 | views.put(viewId, view); 21 | } 22 | return (T) view; 23 | } 24 | 25 | public void setText(int resId, String text) { 26 | ((TextView) getView(resId)).setText(text); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/animation/PieAngleAnimation.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component.animation; 2 | 3 | import android.view.animation.Animation; 4 | import android.view.animation.Transformation; 5 | 6 | import com.mob.demo.mobim.component.PieView; 7 | 8 | /** 9 | * @author Alejandro Zürcher (alejandro.zurcher@gmail.com) 10 | */ 11 | public class PieAngleAnimation extends Animation { 12 | 13 | private PieView arcView; 14 | private float oldAngle; 15 | 16 | public PieAngleAnimation(PieView arcView) { 17 | this.oldAngle = arcView.getPieAngle(); 18 | this.arcView = arcView; 19 | } 20 | 21 | @Override 22 | protected void applyTransformation(float interpolatedTime, Transformation transformation) { 23 | float angle = oldAngle * interpolatedTime; 24 | arcView.setPieAngle(angle); 25 | arcView.requestLayout(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/animation/PieStrokeWidthAnimation.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component.animation; 2 | 3 | import android.view.animation.Animation; 4 | import android.view.animation.Transformation; 5 | 6 | import com.mob.demo.mobim.component.PieView; 7 | 8 | /** 9 | * @author Alejandro Zürcher (alejandro.zurcher@gmail.com) 10 | */ 11 | public class PieStrokeWidthAnimation extends Animation { 12 | 13 | private PieView arcView; 14 | private int oldWidth; 15 | 16 | public PieStrokeWidthAnimation(PieView arcView) { 17 | this.oldWidth = arcView.getPieInnerPadding(); 18 | this.arcView = arcView; 19 | } 20 | 21 | @Override 22 | protected void applyTransformation(float interpolatedTime, Transformation transformation) { 23 | int width = (int) (oldWidth * interpolatedTime); 24 | arcView.setPieInnerPadding(width); 25 | arcView.requestLayout(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/annotation/ColorInt.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Denotes that the annotated element represents a packed color 10 | * int, {@code AARRGGBB}. If applied to an int array, every element 11 | * in the array represents a color integer. 12 | *

13 | * Example: 14 | *

{@code
15 |  *  public abstract void setTextColor(@ColorInt int color);
16 |  * }
17 | */ 18 | @Retention(RetentionPolicy.CLASS) 19 | @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.FIELD}) 20 | public @interface ColorInt { 21 | } 22 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/component/annotation/FloatRange.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.component.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Denotes that the annotated element should be a float or double in the given range 10 | *

11 | * Example: 12 | *

{@code
13 |  *  @FloatRange(from=0.0,to=1.0)
14 |  *  public float getAlpha() {
15 |  *  ...
16 |  *  }
17 |  * }
18 | */ 19 | @Retention(RetentionPolicy.CLASS) 20 | @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.LOCAL_VARIABLE}) 21 | public @interface FloatRange { 22 | /** 23 | * Smallest value. Whether it is inclusive or not is determined 24 | * by {@link #fromInclusive} 25 | */ 26 | double from() default Double.NEGATIVE_INFINITY; 27 | 28 | /** 29 | * Largest value. Whether it is inclusive or not is determined 30 | * by {@link #toInclusive} 31 | */ 32 | double to() default Double.POSITIVE_INFINITY; 33 | 34 | /** 35 | * Whether the from value is included in the range 36 | */ 37 | boolean fromInclusive() default true; 38 | 39 | /** 40 | * Whether the to value is included in the range 41 | */ 42 | boolean toInclusive() default true; 43 | } 44 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/emoji/DefaultEmojiconDatas.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.emoji; 2 | 3 | import com.mob.demo.mobim.R; 4 | 5 | public class DefaultEmojiconDatas { 6 | 7 | private static String[] emojis = new String[]{ 8 | SmileUtils.EE_1, 9 | SmileUtils.EE_2, 10 | SmileUtils.EE_3, 11 | SmileUtils.EE_4, 12 | SmileUtils.EE_5, 13 | SmileUtils.EE_6, 14 | SmileUtils.EE_7, 15 | SmileUtils.EE_8, 16 | SmileUtils.EE_9, 17 | SmileUtils.EE_10, 18 | SmileUtils.EE_11, 19 | SmileUtils.EE_12, 20 | SmileUtils.EE_13, 21 | SmileUtils.EE_14, 22 | SmileUtils.EE_15, 23 | SmileUtils.EE_16, 24 | SmileUtils.EE_17, 25 | SmileUtils.EE_18, 26 | SmileUtils.EE_19, 27 | SmileUtils.EE_20, 28 | SmileUtils.EE_21, 29 | SmileUtils.EE_22, 30 | SmileUtils.EE_23, 31 | SmileUtils.EE_24, 32 | SmileUtils.EE_25, 33 | SmileUtils.EE_26, 34 | SmileUtils.EE_27, 35 | SmileUtils.EE_28, 36 | SmileUtils.EE_29, 37 | SmileUtils.EE_30, 38 | SmileUtils.EE_31, 39 | SmileUtils.EE_32, 40 | SmileUtils.EE_33, 41 | SmileUtils.EE_34, 42 | SmileUtils.EE_35, 43 | 44 | }; 45 | 46 | 47 | private static int[] icons = new int[]{ 48 | R.drawable.ee_1, 49 | R.drawable.ee_2, 50 | R.drawable.ee_3, 51 | R.drawable.ee_4, 52 | R.drawable.ee_5, 53 | R.drawable.ee_6, 54 | R.drawable.ee_7, 55 | R.drawable.ee_8, 56 | R.drawable.ee_9, 57 | R.drawable.ee_10, 58 | R.drawable.ee_11, 59 | R.drawable.ee_12, 60 | R.drawable.ee_13, 61 | R.drawable.ee_14, 62 | R.drawable.ee_15, 63 | R.drawable.ee_16, 64 | R.drawable.ee_17, 65 | R.drawable.ee_18, 66 | R.drawable.ee_19, 67 | R.drawable.ee_20, 68 | R.drawable.ee_21, 69 | R.drawable.ee_22, 70 | R.drawable.ee_23, 71 | R.drawable.ee_24, 72 | R.drawable.ee_25, 73 | R.drawable.ee_26, 74 | R.drawable.ee_27, 75 | R.drawable.ee_28, 76 | R.drawable.ee_29, 77 | R.drawable.ee_30, 78 | R.drawable.ee_31, 79 | R.drawable.ee_32, 80 | R.drawable.ee_33, 81 | R.drawable.ee_34, 82 | R.drawable.ee_35, 83 | }; 84 | 85 | //private static String[] emojis = new String[]{ 86 | //SmileUtils.ee_no, 87 | //SmileUtils.ee_ok, 88 | //SmileUtils.ee_rain, 89 | //SmileUtils.ee_mmd, 90 | //SmileUtils.ee_pingpang, 91 | //SmileUtils.ee_shit, 92 | //SmileUtils.ee_envelop, 93 | //SmileUtils.ee_titter, 94 | //SmileUtils.ee_haughty, 95 | //SmileUtils.ee_bye, 96 | //SmileUtils.ee_coldsweat, 97 | //SmileUtils.ee_fade, 98 | //SmileUtils.ee_sword, 99 | //SmileUtils.ee_seduce, 100 | //SmileUtils.ee_daze, 101 | //SmileUtils.ee_shake, 102 | //SmileUtils.ee_pity, 103 | // 104 | //SmileUtils.ee_lovely, 105 | //SmileUtils.ee_rightgroan, 106 | //SmileUtils.ee_righttaiji, 107 | //SmileUtils.ee_rightcar, 108 | //SmileUtils.ee_vomit, 109 | // 110 | // 111 | //}; 112 | //private static int[] icons = new int[]{ 113 | //R.drawable.ee_no, 114 | //R.drawable.ee_ok, 115 | //R.drawable.ee_rain, 116 | //R.drawable.ee_mmd, 117 | //R.drawable.ee_pingpang, 118 | //R.drawable.ee_shit, 119 | //R.drawable.ee_envelop, 120 | //R.drawable.ee_titter, 121 | //R.drawable.ee_haughty, 122 | //R.drawable.ee_bye, 123 | //R.drawable.ee_coldsweat, 124 | //R.drawable.ee_fade, 125 | //R.drawable.ee_sword, 126 | //R.drawable.ee_seduce, 127 | //R.drawable.ee_daze, 128 | //R.drawable.ee_shake, 129 | //R.drawable.ee_pity, 130 | //R.drawable.ee_lovely, 131 | //R.drawable.ee_rightgroan, 132 | //R.drawable.ee_righttaiji, 133 | //R.drawable.ee_rightcar, 134 | //R.drawable.ee_vomit, 135 | //}; 136 | 137 | 138 | private static final Emojicon[] DATA = createData(); 139 | 140 | private static Emojicon[] createData() { 141 | Emojicon[] datas = new Emojicon[icons.length]; 142 | for (int i = 0; i < icons.length; i++) { 143 | datas[i] = new Emojicon(icons[i], emojis[i], Emojicon.Type.NORMAL); 144 | } 145 | return datas; 146 | } 147 | 148 | public static Emojicon[] getData() { 149 | return DATA; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/model/MsgReceiverListener.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.model; 2 | 3 | import com.mob.imsdk.MobIMMessageReceiver; 4 | 5 | public class MsgReceiverListener { 6 | 7 | private String fromId; 8 | private MobIMMessageReceiver imMessageReceiver; 9 | public MsgReceiverListener(String fromId,MobIMMessageReceiver imMessageReceiver) { 10 | this.fromId = fromId; 11 | this.imMessageReceiver = imMessageReceiver; 12 | } 13 | public String getFromId() { 14 | return fromId; 15 | } 16 | 17 | public void setFromId(String fromId) { 18 | this.fromId = fromId; 19 | } 20 | 21 | public MobIMMessageReceiver getImMessageReceiver() { 22 | return imMessageReceiver; 23 | } 24 | 25 | public void setImMessageReceiver(MobIMMessageReceiver imMessageReceiver) { 26 | this.imMessageReceiver = imMessageReceiver; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/model/RecyclingBitmapDrawable.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.model; 2 | 3 | import android.content.res.Resources; 4 | import android.graphics.Bitmap; 5 | import android.graphics.drawable.BitmapDrawable; 6 | 7 | public class RecyclingBitmapDrawable extends BitmapDrawable { 8 | static final String TAG = "CountingBitmapDrawable"; 9 | 10 | private int cacheRefCount = 0; 11 | private int displayRefCount = 0; 12 | 13 | private boolean hasBeenDisplayed; 14 | 15 | public RecyclingBitmapDrawable(Resources res, Bitmap bitmap) { 16 | super(res, bitmap); 17 | } 18 | 19 | /** 20 | * Notify the drawable that the displayed state has changed. Internally a 21 | * count is kept so that the drawable knows when it is no longer being 22 | * displayed. 23 | * 24 | * @param isDisplayed - Whether the drawable is being displayed or not 25 | */ 26 | public void setIsDisplayed(boolean isDisplayed) { 27 | // BEGIN_INCLUDE(set_is_displayed) 28 | synchronized (this) { 29 | if (isDisplayed) { 30 | displayRefCount++; 31 | hasBeenDisplayed = true; 32 | } else { 33 | displayRefCount--; 34 | } 35 | } 36 | 37 | // Check to see if recycle() can be called 38 | checkState(); 39 | // END_INCLUDE(set_is_displayed) 40 | } 41 | 42 | /** 43 | * Notify the drawable that the cache state has changed. Internally a count 44 | * is kept so that the drawable knows when it is no longer being cached. 45 | * 46 | * @param isCached - Whether the drawable is being cached or not 47 | */ 48 | public void setIsCached(boolean isCached) { 49 | // BEGIN_INCLUDE(set_is_cached) 50 | synchronized (this) { 51 | if (isCached) { 52 | cacheRefCount++; 53 | } else { 54 | cacheRefCount--; 55 | } 56 | } 57 | 58 | // Check to see if recycle() can be called 59 | checkState(); 60 | // END_INCLUDE(set_is_cached) 61 | } 62 | 63 | private synchronized void checkState() { 64 | // BEGIN_INCLUDE(check_state) 65 | // If the drawable cache and display ref counts = 0, and this drawable 66 | // has been displayed, then recycle 67 | if (cacheRefCount <= 0 && displayRefCount <= 0 && hasBeenDisplayed 68 | && hasValidBitmap()) { 69 | // if (BuildConfig.DEBUG) { 70 | // Log.d(TAG, "No longer being used or cached so recycling. " 71 | // + toString()); 72 | // } 73 | 74 | getBitmap().recycle(); 75 | } 76 | // END_INCLUDE(check_state) 77 | } 78 | 79 | private synchronized boolean hasValidBitmap() { 80 | Bitmap bitmap = getBitmap(); 81 | return bitmap != null && !bitmap.isRecycled(); 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/model/RecyclingImageView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.mob.demo.mobim.model; 18 | 19 | import android.content.Context; 20 | import android.graphics.drawable.Drawable; 21 | import android.graphics.drawable.LayerDrawable; 22 | import android.util.AttributeSet; 23 | import android.widget.ImageView; 24 | 25 | /** 26 | * Sub-class of ImageView which automatically notifies the drawable when it is 27 | * being displayed. 28 | */ 29 | public class RecyclingImageView extends ImageView { 30 | 31 | public RecyclingImageView(Context context) { 32 | super(context); 33 | } 34 | 35 | public RecyclingImageView(Context context, AttributeSet attrs) { 36 | super(context, attrs); 37 | } 38 | 39 | /** 40 | * @see ImageView#onDetachedFromWindow() 41 | */ 42 | @Override 43 | protected void onDetachedFromWindow() { 44 | // This has been detached from Window, so clear the drawable 45 | setImageDrawable(null); 46 | 47 | super.onDetachedFromWindow(); 48 | } 49 | 50 | /** 51 | * @see ImageView#setImageDrawable(Drawable) 52 | */ 53 | @Override 54 | public void setImageDrawable(Drawable drawable) { 55 | // Keep hold of previous Drawable 56 | final Drawable previousDrawable = getDrawable(); 57 | 58 | // Call super to set new Drawable 59 | super.setImageDrawable(drawable); 60 | 61 | // Notify new Drawable that it is being displayed 62 | notifyDrawable(drawable, true); 63 | 64 | // Notify old Drawable so it is no longer being displayed 65 | notifyDrawable(previousDrawable, false); 66 | } 67 | 68 | /** 69 | * Notifies the drawable that it's displayed state has changed. 70 | * 71 | * @param drawable 72 | * @param isDisplayed 73 | */ 74 | private static void notifyDrawable(Drawable drawable, final boolean isDisplayed) { 75 | if (drawable instanceof RecyclingBitmapDrawable) { 76 | // The drawable is a CountingBitmapDrawable, so notify it 77 | ((RecyclingBitmapDrawable) drawable).setIsDisplayed(isDisplayed); 78 | } else if (drawable instanceof LayerDrawable) { 79 | // The drawable is a LayerDrawable, so recurse on each layer 80 | LayerDrawable layerDrawable = (LayerDrawable) drawable; 81 | for (int i = 0, z = layerDrawable.getNumberOfLayers(); i < z; i++) { 82 | notifyDrawable(layerDrawable.getDrawable(i), isDisplayed); 83 | } 84 | } 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/model/VideoEntity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.model; 2 | 3 | public class VideoEntity { 4 | public int id; 5 | public String title; 6 | public String filePath; 7 | public int size; 8 | public int duration; 9 | } 10 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/ChatDetailActivity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | 7 | import com.mob.demo.mobim.BaseActivity; 8 | import com.mob.demo.mobim.R; 9 | import com.mob.demo.mobim.utils.Utils; 10 | import com.mob.imsdk.model.IMGroup; 11 | import com.mob.imsdk.model.IMUser; 12 | 13 | public class ChatDetailActivity extends BaseActivity { 14 | 15 | //private String id ; 16 | private boolean isGroup; 17 | 18 | protected void onCreate(@Nullable Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_frame); 21 | Intent intent = getIntent(); 22 | if (intent != null) { 23 | // id = getIntent().getExtras().getString("id"); 24 | isGroup = getIntent().getExtras().getBoolean("isgroup"); 25 | IMGroup group = null; 26 | IMUser user = null; 27 | ChatDetailFragment chatFragment = null; 28 | if (isGroup) { 29 | group = (IMGroup) getIntent().getExtras().getSerializable("group"); 30 | Utils.showLog("chatdetailAct", " ===== group.getId() " + group.getId()); 31 | chatFragment = ChatDetailFragment.instace(group); 32 | } else { 33 | user = (IMUser) getIntent().getExtras().getSerializable("user"); 34 | Utils.showLog("chatdetailAct", " ===== user.getId() " + user.getId()); 35 | chatFragment = ChatDetailFragment.instace(user); 36 | } 37 | 38 | 39 | if (chatFragment != null) { 40 | getSupportFragmentManager().beginTransaction().replace(R.id.flContainer, chatFragment).commit(); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/FragmentMine.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.app.Activity; 4 | import android.content.ClipData; 5 | import android.content.ClipboardManager; 6 | import android.content.Context; 7 | import android.content.Intent; 8 | import android.os.Bundle; 9 | import android.support.annotation.Nullable; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.ImageView; 14 | import android.widget.TextView; 15 | import android.widget.Toast; 16 | 17 | import com.mob.demo.mobim.BaseFragment; 18 | import com.mob.demo.mobim.R; 19 | import com.mob.demo.mobim.biz.UserManager; 20 | import com.mob.demo.mobim.utils.LoadImageUtils; 21 | import com.mob.imsdk.model.IMUser; 22 | 23 | public class FragmentMine extends BaseFragment implements View.OnClickListener { 24 | private ImageView ivAvatar; 25 | private TextView tvUserName; 26 | private TextView tvUserId; 27 | 28 | protected boolean useLoadingView() { 29 | //使用loadingView 30 | return true; 31 | } 32 | 33 | protected void reload() { 34 | loadData(); 35 | } 36 | 37 | public View onCreateContentView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 38 | return inflater.inflate(R.layout.fragment_mine, container, false); 39 | } 40 | 41 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 42 | super.onViewCreated(view, savedInstanceState); 43 | ivAvatar = (ImageView) view.findViewById(R.id.ivAvatar); 44 | tvUserName = (TextView) view.findViewById(R.id.tvUserName); 45 | tvUserId = (TextView) view.findViewById(R.id.tvUserId); 46 | 47 | view.findViewById(R.id.llAvatar).setOnClickListener(this); 48 | view.findViewById(R.id.llUserName).setOnClickListener(this); 49 | view.findViewById(R.id.llBlackList).setOnClickListener(this); 50 | view.findViewById(R.id.llUserId).setOnLongClickListener(new View.OnLongClickListener() { 51 | public boolean onLongClick(View v) { 52 | //复制内容到剪切板 53 | ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); 54 | cm.setPrimaryClip(ClipData.newPlainText("id", tvUserId.getText())); 55 | Toast.makeText(getContext().getApplicationContext(), R.string.toast_id_copied, Toast.LENGTH_LONG).show(); 56 | return true; 57 | } 58 | }); 59 | 60 | loadData(); 61 | } 62 | 63 | void loadData() { 64 | IMUser user = UserManager.getUser(); 65 | if (user == null) { 66 | showLoadingFailed(); 67 | Toast.makeText(getContext(), R.string.toast_get_user_failed, Toast.LENGTH_SHORT).show(); 68 | } else { 69 | LoadImageUtils.showAvatar(getContext(), ivAvatar, user.getAvatar(), R.drawable.ic_group); 70 | tvUserName.setText(user.getNickname()); 71 | tvUserId.setText(user.getId()); 72 | showContentView(); 73 | } 74 | } 75 | 76 | public void onActivityResult(int requestCode, int resultCode, Intent data) { 77 | super.onActivityResult(requestCode, resultCode, data); 78 | if (resultCode == Activity.RESULT_OK) { 79 | if (requestCode == 1001 && data != null) { 80 | String link = data.getStringExtra("link"); 81 | LoadImageUtils.showAvatar(getContext(), ivAvatar, link, R.drawable.ic_group); 82 | } else if (requestCode == 1002 && data != null) { 83 | String name = data.getStringExtra("name"); 84 | tvUserName.setText(name); 85 | } 86 | } 87 | } 88 | 89 | public void onClick(View v) { 90 | int vId = v.getId(); 91 | switch (vId) { 92 | case R.id.llAvatar: { 93 | UpdateUserInfoActivity.gotoUpdateUserAvatarPage(this, 1001); 94 | } break; 95 | case R.id.llUserName: { 96 | UpdateUserInfoActivity.gotoUpdateUserInfoPage(this, 1002); 97 | } break; 98 | case R.id.llBlackList: { 99 | UpdateUserInfoActivity.gotoBlackListPage(getContext()); 100 | } break; 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/FragmentUpdateUserName.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.os.Handler; 8 | import android.support.annotation.Nullable; 9 | import android.text.TextUtils; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.view.inputmethod.InputMethodManager; 14 | import android.widget.EditText; 15 | import android.widget.TextView; 16 | import android.widget.Toast; 17 | 18 | import com.mob.MobSDK; 19 | import com.mob.demo.mobim.BaseFragment; 20 | import com.mob.demo.mobim.R; 21 | import com.mob.demo.mobim.biz.UserManager; 22 | import com.mob.imsdk.MobIMCallback; 23 | import com.mob.imsdk.model.IMUser; 24 | 25 | public class FragmentUpdateUserName extends BaseFragment implements View.OnClickListener { 26 | private InputMethodManager inputMethodManager; 27 | private EditText etContent; 28 | 29 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 30 | return inflater.inflate(R.layout.fragment_update_user_name, container, false); 31 | } 32 | 33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 34 | super.onViewCreated(view, savedInstanceState); 35 | inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 36 | 37 | TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle); 38 | etContent = (EditText) view.findViewById(R.id.etContent); 39 | view.findViewById(R.id.tvTitleLeft).setOnClickListener(this); 40 | view.findViewById(R.id.tvTitleRight).setOnClickListener(this); 41 | 42 | tvTitle.setText(R.string.title_update_user_name); 43 | IMUser imUser = UserManager.getUser(); 44 | if (imUser == null) { 45 | etContent.setHint(R.string.hint_input_user_name); 46 | } else { 47 | etContent.setText(imUser.getNickname()); 48 | } 49 | 50 | etContent.setSelection(etContent.getText().length()); 51 | new Handler().postDelayed(new Runnable() { 52 | public void run() { 53 | inputMethodManager.showSoftInput(etContent, 0); 54 | } 55 | }, 200); 56 | } 57 | 58 | public void onClick(View v) { 59 | if (v.getId() == R.id.tvTitleRight) { 60 | String temp = etContent.getText().toString().trim(); 61 | if (TextUtils.isEmpty(temp)) { 62 | Toast.makeText(getContext().getApplicationContext(), R.string.hint_input_user_name, Toast.LENGTH_SHORT).show(); 63 | return; 64 | } 65 | final IMUser user = UserManager.getUser(); 66 | if (user == null) { 67 | getActivity().onBackPressed(); 68 | return; 69 | } 70 | final String userName = temp.length() > 10 ? temp.substring(0, 10) : temp;//用户名限制10个字长 71 | inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); 72 | String oldUserName = user.getNickname(); 73 | if (!userName.equals(oldUserName)) { 74 | //更新用户名 75 | UserManager.updateUserInfo(user.getId(), userName, null, new MobIMCallback() { 76 | public void onSuccess(Boolean aBoolean) { 77 | MobSDK.setUser(user.getId(), userName, user.getAvatar(), null);//更新IM用户信息 78 | 79 | Intent data = new Intent(); 80 | data.putExtra("name", userName); 81 | getActivity().setResult(Activity.RESULT_OK, data); 82 | getActivity().onBackPressed(); 83 | } 84 | 85 | public void onError(int code, String message) { 86 | getActivity().onBackPressed(); 87 | } 88 | }); 89 | } else { 90 | getActivity().onBackPressed(); 91 | } 92 | } else if (v.getId() == R.id.tvTitleLeft) { 93 | getActivity().onBackPressed(); 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/GroupCreateActivity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.support.annotation.Nullable; 8 | import android.text.TextUtils; 9 | import android.view.View; 10 | import android.view.inputmethod.InputMethodManager; 11 | import android.widget.EditText; 12 | import android.widget.TextView; 13 | 14 | import com.mob.demo.mobim.BaseActivity; 15 | import com.mob.demo.mobim.R; 16 | 17 | public class GroupCreateActivity extends BaseActivity implements View.OnClickListener { 18 | private InputMethodManager inputMethodManager; 19 | private EditText etName; 20 | private EditText etProfile; 21 | private String defUid; 22 | 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 26 | 27 | setContentView(R.layout.activity_group_create); 28 | defUid = getIntent().getStringExtra("defuid"); 29 | TextView tvTitle = (TextView) findViewById(R.id.tvTitle); 30 | etName = (EditText) findViewById(R.id.etName); 31 | etProfile = (EditText) findViewById(R.id.etProfile); 32 | 33 | tvTitle.setText(R.string.txt_create_group); 34 | findViewById(R.id.ivTitleLeft).setOnClickListener(this); 35 | findViewById(R.id.btnInvite).setOnClickListener(this); 36 | } 37 | 38 | public void onClick(View v) { 39 | if (v.getId() == R.id.btnInvite) { 40 | String groupName = etName.getText().toString().trim(); 41 | inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); 42 | String profile = etProfile.getText().toString().trim(); 43 | if (groupName.length() > 10) { 44 | //群名称最多10 45 | groupName = groupName.substring(0, 10); 46 | } 47 | if (profile.length() > 140) { 48 | //简介最多140 49 | profile = profile.substring(0, 140); 50 | } 51 | 52 | Intent intent = new Intent(GroupCreateActivity.this, GroupAddUserActivity.class); 53 | if (!TextUtils.isEmpty(groupName)) { 54 | intent.putExtra("name", groupName); 55 | } 56 | intent.putExtra("profile", profile); 57 | if (defUid != null) { 58 | intent.putExtra("defuid", defUid); 59 | } 60 | 61 | startActivityForResult(intent, 1001); 62 | } else { 63 | inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); 64 | onBackPressed(); 65 | } 66 | } 67 | 68 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 69 | super.onActivityResult(requestCode, resultCode, data); 70 | if (resultCode == Activity.RESULT_OK && requestCode == 1001) { 71 | setResult(RESULT_OK); 72 | onBackPressed(); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/ReminderListActivity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.annotation.Nullable; 7 | import android.view.View; 8 | import android.widget.AdapterView; 9 | import android.widget.ImageView; 10 | import android.widget.ListView; 11 | import android.widget.TextView; 12 | 13 | import com.mob.demo.mobim.BaseActivity; 14 | import com.mob.demo.mobim.R; 15 | import com.mob.demo.mobim.component.QuickAdapter; 16 | import com.mob.demo.mobim.component.ViewHolder; 17 | import com.mob.demo.mobim.utils.LoadImageUtils; 18 | import com.mob.demo.mobim.utils.Utils; 19 | import com.mob.imsdk.MobIMCallback; 20 | import com.mob.imsdk.MobIM; 21 | import com.mob.imsdk.model.IMReminder; 22 | 23 | import java.util.List; 24 | 25 | public class ReminderListActivity extends BaseActivity { 26 | private QuickAdapter adapter; 27 | 28 | protected void onCreate(@Nullable Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.fragment_black_list); 31 | TextView tvTitle = (TextView) findViewById(R.id.tvTitle); 32 | final View pbLoading = findViewById(R.id.pbLoading); 33 | final ListView listView = (ListView) findViewById(R.id.listView); 34 | 35 | findViewById(R.id.ivTitleLeft).setOnClickListener(new View.OnClickListener() { 36 | public void onClick(View v) { 37 | onBackPressed(); 38 | } 39 | }); 40 | 41 | tvTitle.setText(R.string.txt_reminder); 42 | 43 | listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 44 | public void onItemClick(AdapterView parent, View view, int position, long id) { 45 | IMReminder item = adapter.getItem(position); 46 | if (item == null) { 47 | return; 48 | } 49 | //清除未读消息标记 50 | item.setUnreadMsgCount(0); 51 | adapter.notifyDataSetChanged(); 52 | ReminderDetailsActivity.gotoReminderDetailsPageForResult(ReminderListActivity.this, item, 1001); 53 | } 54 | }); 55 | 56 | pbLoading.setVisibility(View.VISIBLE); 57 | MobIM.getChatManager().getReminderList(new MobIMCallback>() { 58 | public void onSuccess(List list) { 59 | adapter = new QuickAdapter(ReminderListActivity.this, R.layout.list_reminder_list_item, list) { 60 | protected void initViews(ViewHolder viewHolder, int position, IMReminder item) { 61 | TextView tvName = viewHolder.getView(R.id.tvName); 62 | TextView tvDot = viewHolder.getView(R.id.tvDot); 63 | ImageView ivAvatar = viewHolder.getView(R.id.ivAvatar); 64 | tvDot.setVisibility(View.GONE); 65 | if (item != null) { 66 | tvName.setText(item.getName()); 67 | if (item.getUnreadMsgCount() > 0) { 68 | tvDot.setEnabled(!item.isDisturb()); 69 | tvDot.setVisibility(View.VISIBLE); 70 | tvDot.setText(String.valueOf(item.getUnreadMsgCount())); 71 | } 72 | LoadImageUtils.showAvatar(ReminderListActivity.this, ivAvatar, item.getAvatar(), R.drawable.ic_default_reminder); 73 | } else { 74 | tvName.setText(""); 75 | LoadImageUtils.showAvatar(ReminderListActivity.this, ivAvatar, null, R.drawable.ic_default_reminder); 76 | } 77 | } 78 | }; 79 | 80 | listView.setAdapter(adapter); 81 | pbLoading.setVisibility(View.GONE); 82 | } 83 | 84 | public void onError(int code, String message) { 85 | Utils.showErrorToast(code); 86 | pbLoading.setVisibility(View.GONE); 87 | } 88 | }); 89 | } 90 | 91 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 92 | super.onActivityResult(requestCode, resultCode, data); 93 | if (resultCode != Activity.RESULT_OK) { 94 | return; 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/ui/UpdateUserInfoActivity.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.ui; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.annotation.Nullable; 7 | import android.support.v4.app.Fragment; 8 | 9 | import com.mob.demo.mobim.BaseActivity; 10 | import com.mob.demo.mobim.R; 11 | 12 | public class UpdateUserInfoActivity extends BaseActivity { 13 | private final static int FRAGMENTUPDATEUSERAVATAR = 1; 14 | private final static int FRAGMENTUPDATEUSERNAME = 2; 15 | private final static int FRAGMENTBLACKLIST = 3; 16 | private final static String TAGFRAGMENTID = "fragment_id"; 17 | 18 | protected void onCreate(@Nullable Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_frame); 21 | 22 | Intent intent = getIntent(); 23 | if (intent != null) { 24 | int fragmentId = intent.getIntExtra(TAGFRAGMENTID, 0); 25 | Fragment fragment = null; 26 | switch (fragmentId) { 27 | case FRAGMENTUPDATEUSERAVATAR: { 28 | fragment = new FragmentUpdateUserAvatar(); 29 | } break; 30 | case FRAGMENTUPDATEUSERNAME: { 31 | fragment = new FragmentUpdateUserName(); 32 | } break; 33 | case FRAGMENTBLACKLIST: { 34 | fragment = new FragmentBlackList(); 35 | } break; 36 | } 37 | if (fragment != null) { 38 | getSupportFragmentManager().beginTransaction().replace(R.id.flContainer, fragment).commit(); 39 | } 40 | } 41 | } 42 | 43 | public static void gotoUpdateUserAvatarPage(Fragment fragment, int requestCode) { 44 | Intent intent = new Intent(fragment.getContext(), UpdateUserInfoActivity.class); 45 | intent.putExtra(TAGFRAGMENTID, FRAGMENTUPDATEUSERAVATAR); 46 | fragment.startActivityForResult(intent, requestCode); 47 | } 48 | 49 | public static void gotoUpdateUserInfoPage(Fragment fragment, int requestCode) { 50 | Intent intent = new Intent(fragment.getContext(), UpdateUserInfoActivity.class); 51 | intent.putExtra(TAGFRAGMENTID, FRAGMENTUPDATEUSERNAME); 52 | fragment.startActivityForResult(intent, requestCode); 53 | } 54 | 55 | public static void gotoBlackListPage(Context context) { 56 | Intent intent = new Intent(context, UpdateUserInfoActivity.class); 57 | intent.putExtra(TAGFRAGMENTID, FRAGMENTBLACKLIST); 58 | context.startActivity(intent); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/utils/FileUtil.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.utils; 2 | 3 | import android.os.Environment; 4 | 5 | import java.io.File; 6 | import java.io.FileOutputStream; 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | import java.io.OutputStream; 10 | 11 | public class FileUtil { 12 | private String sdpath; 13 | 14 | public FileUtil() { 15 | 16 | } 17 | 18 | public String getSdpath() { 19 | return sdpath; 20 | } 21 | 22 | public FileUtil(String SDPATH) { 23 | //得到外部存储设备的目录(/SDCARD) 24 | SDPATH = Environment.getExternalStorageDirectory() + "/"; 25 | } 26 | 27 | /** 28 | * 在SD卡上创建文件 29 | * 30 | * @param fileName 31 | * @return 32 | * @throws java.io.IOException 33 | */ 34 | public File createSDFile(String fileName) throws IOException { 35 | File file = new File(sdpath + fileName); 36 | file.createNewFile(); 37 | return file; 38 | } 39 | 40 | /** 41 | * 在SD卡上创建目录 42 | * 43 | * @param dirName 目录名字 44 | * @return 文件目录 45 | */ 46 | public File createDir(String dirName) { 47 | File dir = new File(sdpath + dirName); 48 | dir.mkdir(); 49 | return dir; 50 | } 51 | 52 | /** 53 | * 判断文件是否存在 54 | * 55 | * @param fileName 56 | * @return 57 | */ 58 | public boolean isFileExist(String fileName) { 59 | File file = new File(sdpath + fileName); 60 | return file.exists(); 61 | } 62 | 63 | public File write2SDFromInput(String path, String fileName, InputStream input) { 64 | File file = null; 65 | OutputStream output = null; 66 | 67 | try { 68 | createDir(path); 69 | try { 70 | file = createSDFile(path + fileName); 71 | } catch (Exception ex) { 72 | //ex.printStackTrace(); 73 | file = new File(path + "/" + fileName); 74 | Utils.showLog("", " path is >>> " + path + "/" + fileName); 75 | //file.mkdir(); 76 | String dir = file.getParent(); 77 | Utils.showLog("", " dir is >>> " + dir); 78 | new File(dir).mkdirs(); 79 | //file.mkdirs(); 80 | file.createNewFile(); 81 | } 82 | 83 | output = new FileOutputStream(file); 84 | byte[] buffer = new byte[4 * 1024]; 85 | int num = 0; 86 | while ((num = input.read(buffer)) != -1) { 87 | output.write(buffer, 0, num); 88 | } 89 | output.flush(); 90 | } catch (IOException e) { 91 | e.printStackTrace(); 92 | } finally { 93 | try { 94 | if (output != null) { 95 | output.close(); 96 | } 97 | } catch (IOException e) { 98 | e.printStackTrace(); 99 | } 100 | } 101 | return file; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Sample/app/src/main/java/com/mob/demo/mobim/utils/RecyclingBitmapDrawable.java: -------------------------------------------------------------------------------- 1 | package com.mob.demo.mobim.utils; 2 | 3 | import android.content.res.Resources; 4 | import android.graphics.Bitmap; 5 | import android.graphics.drawable.BitmapDrawable; 6 | 7 | public class RecyclingBitmapDrawable extends BitmapDrawable { 8 | static final String TAG = "CountingBitmapDrawable"; 9 | 10 | private int cacheRefCount = 0; 11 | private int displayRefCount = 0; 12 | 13 | private boolean hasBeenDisplayed; 14 | 15 | public RecyclingBitmapDrawable(Resources res, Bitmap bitmap) { 16 | super(res, bitmap); 17 | } 18 | 19 | /** 20 | * Notify the drawable that the displayed state has changed. Internally a 21 | * count is kept so that the drawable knows when it is no longer being 22 | * displayed. 23 | * 24 | * @param isDisplayed - Whether the drawable is being displayed or not 25 | */ 26 | public void setIsDisplayed(boolean isDisplayed) { 27 | // BEGIN_INCLUDE(set_is_displayed) 28 | synchronized (this) { 29 | if (isDisplayed) { 30 | displayRefCount++; 31 | hasBeenDisplayed = true; 32 | } else { 33 | displayRefCount--; 34 | } 35 | } 36 | 37 | // Check to see if recycle() can be called 38 | checkState(); 39 | // END_INCLUDE(set_is_displayed) 40 | } 41 | 42 | /** 43 | * Notify the drawable that the cache state has changed. Internally a count 44 | * is kept so that the drawable knows when it is no longer being cached. 45 | * 46 | * @param isCached - Whether the drawable is being cached or not 47 | */ 48 | public void setIsCached(boolean isCached) { 49 | // BEGIN_INCLUDE(set_is_cached) 50 | synchronized (this) { 51 | if (isCached) { 52 | cacheRefCount++; 53 | } else { 54 | cacheRefCount--; 55 | } 56 | } 57 | 58 | // Check to see if recycle() can be called 59 | checkState(); 60 | // END_INCLUDE(set_is_cached) 61 | } 62 | 63 | private synchronized void checkState() { 64 | // BEGIN_INCLUDE(check_state) 65 | // If the drawable cache and display ref counts = 0, and this drawable 66 | // has been displayed, then recycle 67 | if (cacheRefCount <= 0 && displayRefCount <= 0 && hasBeenDisplayed 68 | && hasValidBitmap()) { 69 | // if (BuildConfig.DEBUG) { 70 | // Log.d(TAG, "No longer being used or cached so recycling. " 71 | // + toString()); 72 | // } 73 | 74 | getBitmap().recycle(); 75 | } 76 | // END_INCLUDE(check_state) 77 | } 78 | 79 | private synchronized boolean hasValidBitmap() { 80 | Bitmap bitmap = getBitmap(); 81 | return bitmap != null && !bitmap.isRecycled(); 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/anim/anim_pop.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/color/group_join_txt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/color/tab_txt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/actionbar_camera_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/actionbar_camera_icon.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/addcamera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/addcamera.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/addfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/addfile.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/addpic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/addpic.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/arrow.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/attach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/attach.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/audio.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/audio_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/audio_send.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/back.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/chat_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/chat_add.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/chat_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/chat_remove.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ckb_false.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ckb_false.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ckb_true.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ckb_true.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/default_play_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/default_play_icon.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_1.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_10.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_11.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_12.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_13.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_14.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_15.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_16.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_17.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_18.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_19.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_2.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_20.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_21.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_22.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_23.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_24.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_25.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_26.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_27.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_28.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_29.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_3.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_30.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_31.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_32.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_33.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_34.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_35.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_4.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_5.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_6.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_7.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_8.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_9.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_bye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_bye.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_coldsweat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_coldsweat.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_daze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_daze.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_envelop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_envelop.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_fade.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_haughty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_haughty.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_lovely.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_lovely.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_mmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_mmd.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_no.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_ok.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_pingpang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_pingpang.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_pity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_pity.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_rain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_rain.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_rightcar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_rightcar.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_rightgroan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_rightgroan.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_righttaiji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_righttaiji.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_seduce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_seduce.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_shake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_shake.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_shit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_shit.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_sword.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_titter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_titter.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ee_vomit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ee_vomit.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/emoj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/emoj.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/empty_photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/empty_photo.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/face1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/face1.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/face2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/face2.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/face3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/face3.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/face4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/face4.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/face5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/face5.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/file.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_add.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_add_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_add_user.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_arrow_right.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_back.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_default_reminder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_default_reminder.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_default_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_default_user.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_group.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_select.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/ic_select_ed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/ic_select_ed.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/info_people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/info_people.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/keybord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/keybord.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/msg_back.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/msg_back.9.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/msg_from.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/msg_from.9.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playrevaudio1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playrevaudio1.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playrevaudio2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playrevaudio2.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playrevaudio3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playrevaudio3.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playsendaudio1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playsendaudio1.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playsendaudio2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playsendaudio2.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/playsendaudio3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/playsendaudio3.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/recorder_volume1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/recorder_volume1.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/recorder_volume2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/recorder_volume2.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/recorder_volume3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/recorder_volume3.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/recorder_volume4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/recorder_volume4.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/recorder_volume5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/recorder_volume5.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/speak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/speak.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_contacts_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_contacts_n.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_contacts_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_contacts_p.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_conversation_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_conversation_n.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_conversation_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_conversation_p.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_mine_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_mine_n.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/tab_mine_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/tab_mine_p.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/titlebar_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/titlebar_bg.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable-xhdpi/warn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MobClub/MobIM-for-Android/b05c91e0113e60ac7b8fd251e13a8aa2d599f685/Sample/app/src/main/res/drawable-xhdpi/warn.png -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/anim_playrevaudio.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/anim_playsendaudio.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/bg_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/bg_recordview.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/bg_touchspeak.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/btn_green_raduis_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/btn_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/circle_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/circle_dot.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/circle_uncheck.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/ckb_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/divider_contacts.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/gray_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/gray_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/green_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 14 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/green_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/input_title_bar_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/mob_photogrid_list_selector.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/round_white_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/selector_contacts_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/selector_dialog_i_known.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/selector_dialog_no.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/selector_dialog_yes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/tab_contacts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/tab_conversation.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/tab_mine.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/drawable/track.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/layout/activity_frame.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Sample/app/src/main/res/layout/activity_group_add_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 13 | 14 | 24 | 25 | 35 | 36 |