Full Code of YiChat/android_YiChat_Lite for AI

master 13e0915862e0 cached
319 files
1.2 MB
289.5k tokens
1898 symbols
1 requests
Download .txt
Showing preview only (1,348K chars total). Download the full file or copy to clipboard to get everything.
Repository: YiChat/android_YiChat_Lite
Branch: master
Commit: 13e0915862e0
Files: 319
Total size: 1.2 MB

Directory structure:
gitextract_zpgm32r8/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── htmessage_open.jar
│   │   ├── zbardecoder.jar
│   │   └── zxing.jar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── htmessage/
│           │           └── yichatopen/
│           │               ├── HTApp.java
│           │               ├── HTClientHelper.java
│           │               ├── HTConstant.java
│           │               ├── IMAction.java
│           │               ├── activity/
│           │               │   ├── BaseActivity.java
│           │               │   ├── BasePresenter.java
│           │               │   ├── BaseView.java
│           │               │   ├── ScanCaptureActivity.java
│           │               │   ├── SettingsActivity.java
│           │               │   ├── ShowBigImageActivity.java
│           │               │   ├── SplashActivity.java
│           │               │   ├── addfriends/
│           │               │   │   ├── add/
│           │               │   │   │   ├── end/
│           │               │   │   │   │   └── AddFriendsFinalActivity.java
│           │               │   │   │   ├── next/
│           │               │   │   │   │   ├── AddFriendNextBasePrestener.java
│           │               │   │   │   │   ├── AddFriendNextFragment.java
│           │               │   │   │   │   ├── AddFriendNextPrestener.java
│           │               │   │   │   │   ├── AddFriendNextView.java
│           │               │   │   │   │   └── AddFriendsNextActivity.java
│           │               │   │   │   └── pre/
│           │               │   │   │       └── AddFriendsPreActivity.java
│           │               │   │   └── newfriend/
│           │               │   │       ├── NewFriendBasePresenter.java
│           │               │   │       ├── NewFriendFragment.java
│           │               │   │       ├── NewFriendPrestener.java
│           │               │   │       ├── NewFriendView.java
│           │               │   │       ├── NewFriendsActivity.java
│           │               │   │       └── NewFriendsAdapter.java
│           │               │   ├── chat/
│           │               │   │   ├── ChatActivity.java
│           │               │   │   ├── ChatAdapter.java
│           │               │   │   ├── ChatContract.java
│           │               │   │   ├── ChatFragment.java
│           │               │   │   ├── ChatPresenter.java
│           │               │   │   ├── activity/
│           │               │   │   │   ├── ChatSettingActivity.java
│           │               │   │   │   ├── ChooseContactActivity.java
│           │               │   │   │   └── ChooseContactAdapter.java
│           │               │   │   └── weight/
│           │               │   │       ├── ChatExtendMenu.java
│           │               │   │       ├── ChatInputView.java
│           │               │   │       ├── VoicePlayClickListener.java
│           │               │   │       ├── VoiceRecorder.java
│           │               │   │       ├── VoiceRecorderView.java
│           │               │   │       ├── emoji/
│           │               │   │       │   ├── DefaultEmojiconDatas.java
│           │               │   │       │   ├── EmojiFragment.java
│           │               │   │       │   ├── Emojicon.java
│           │               │   │       │   ├── EmojiconGridAdapter.java
│           │               │   │       │   └── SmileUtils.java
│           │               │   │       └── loadmore/
│           │               │   │           ├── DensityUtil.java
│           │               │   │           ├── Pacman.java
│           │               │   │           ├── ProgressView.java
│           │               │   │           ├── ProgressViewController.java
│           │               │   │           ├── PullToLoadMoreListView.java
│           │               │   │           └── RefreshHeader.java
│           │               │   ├── country/
│           │               │   │   ├── CharacterParserUtil.java
│           │               │   │   ├── CountryCodeUtil.java
│           │               │   │   ├── CountryComparator.java
│           │               │   │   ├── CountryModel.java
│           │               │   │   ├── CountrySortAdapter.java
│           │               │   │   ├── CountrySortModel.java
│           │               │   │   ├── CountrySortToken.java
│           │               │   │   ├── GetCountryNameSort.java
│           │               │   │   └── SideBar.java
│           │               │   ├── login/
│           │               │   │   ├── LoginActivity.java
│           │               │   │   ├── LoginContract.java
│           │               │   │   ├── LoginFragment.java
│           │               │   │   └── LoginPresenter.java
│           │               │   ├── main/
│           │               │   │   ├── MainActivity.java
│           │               │   │   ├── MainBasePrester.java
│           │               │   │   ├── MainPrestener.java
│           │               │   │   ├── MainView.java
│           │               │   │   ├── contacts/
│           │               │   │   │   ├── BaseContactsPresenter.java
│           │               │   │   │   ├── ContactsAdapter.java
│           │               │   │   │   ├── ContactsPresenter.java
│           │               │   │   │   ├── ContactsView.java
│           │               │   │   │   ├── FragmentContacts.java
│           │               │   │   │   └── Sidebar.java
│           │               │   │   ├── conversation/
│           │               │   │   │   ├── BaseConversationPresenter.java
│           │               │   │   │   ├── ConversationAdapter.java
│           │               │   │   │   ├── ConversationFragment.java
│           │               │   │   │   ├── ConversationPresenter.java
│           │               │   │   │   └── ConversationView.java
│           │               │   │   ├── details/
│           │               │   │   │   ├── UserDetailesFragment.java
│           │               │   │   │   ├── UserDetailsActivity.java
│           │               │   │   │   ├── UserDetailsBasePrester.java
│           │               │   │   │   ├── UserDetailsPrester.java
│           │               │   │   │   └── UserDetailsView.java
│           │               │   │   ├── find/
│           │               │   │   │   ├── FragmentFind.java
│           │               │   │   │   └── recentlypeople/
│           │               │   │   │       ├── PeopleRecentlyActivity.java
│           │               │   │   │       ├── PeopleRecentlyAdapter.java
│           │               │   │   │       ├── PeopleRecentlyBasePrestener.java
│           │               │   │   │       ├── PeopleRecentlyFragment.java
│           │               │   │   │       ├── PeopleRecentlyPrestener.java
│           │               │   │   │       └── PeopleRecentlyView.java
│           │               │   │   ├── password/
│           │               │   │   │   ├── PasswordBasePrester.java
│           │               │   │   │   ├── PasswordPrester.java
│           │               │   │   │   ├── PasswordResetActivity.java
│           │               │   │   │   ├── PasswordResetFragment.java
│           │               │   │   │   └── PasswordView.java
│           │               │   │   ├── profile/
│           │               │   │   │   ├── FragmentProfile.java
│           │               │   │   │   └── info/
│           │               │   │   │       ├── profile/
│           │               │   │   │       │   ├── ProfileActivity.java
│           │               │   │   │       │   ├── ProfileBasePrester.java
│           │               │   │   │       │   ├── ProfileFragment.java
│           │               │   │   │       │   ├── ProfilePrester.java
│           │               │   │   │       │   └── ProfileView.java
│           │               │   │   │       └── update/
│           │               │   │   │           ├── ProfileUpdateActivity.java
│           │               │   │   │           ├── ProfileUpdateFragment.java
│           │               │   │   │           ├── UpdateProfileBasePrester.java
│           │               │   │   │           ├── UpdateProfilePrestener.java
│           │               │   │   │           └── UpdateProfileView.java
│           │               │   │   ├── qrcode/
│           │               │   │   │   ├── QrCodeActivity.java
│           │               │   │   │   ├── QrCodeBasePrester.java
│           │               │   │   │   ├── QrCodeFragment.java
│           │               │   │   │   ├── QrCodePrester.java
│           │               │   │   │   └── QrCodeView.java
│           │               │   │   └── region/
│           │               │   │       ├── RegionActivity.java
│           │               │   │       ├── RegionBasePrestener.java
│           │               │   │       ├── RegionFragment.java
│           │               │   │       ├── RegionPresenter.java
│           │               │   │       └── RegionView.java
│           │               │   └── register/
│           │               │       ├── RegisterActivity.java
│           │               │       ├── RegisterContract.java
│           │               │       ├── RegisterFragment.java
│           │               │       └── RegisterPresenter.java
│           │               ├── domain/
│           │               │   ├── InviteMessage.java
│           │               │   ├── InviteMessgeDao.java
│           │               │   ├── User.java
│           │               │   └── UserDao.java
│           │               ├── manager/
│           │               │   ├── ContactsManager.java
│           │               │   ├── DBManager.java
│           │               │   ├── DbOpenHelper.java
│           │               │   ├── LocalUserManager.java
│           │               │   ├── Manager.java
│           │               │   ├── MyNotification.java
│           │               │   ├── Notifier.java
│           │               │   ├── NotifierManager.java
│           │               │   ├── PreferenceManager.java
│           │               │   └── SettingsManager.java
│           │               ├── runtimepermissions/
│           │               │   ├── Permissions.java
│           │               │   ├── PermissionsManager.java
│           │               │   └── PermissionsResultAction.java
│           │               ├── utils/
│           │               │   ├── ACache.java
│           │               │   ├── CommonUtils.java
│           │               │   ├── DateUtils.java
│           │               │   ├── HTMessageUtils.java
│           │               │   ├── ImageUtils.java
│           │               │   ├── OkHttpUtils.java
│           │               │   ├── Param.java
│           │               │   ├── PathUtils.java
│           │               │   ├── UpdateLastLoginTimeUtils.java
│           │               │   └── Validator.java
│           │               └── widget/
│           │                   ├── HTAlertDialog.java
│           │                   ├── SwitchButton.java
│           │                   ├── photoview/
│           │                   │   ├── Compat.java
│           │                   │   ├── IPhotoView.java
│           │                   │   ├── PhotoView.java
│           │                   │   ├── PhotoViewAttacher.java
│           │                   │   ├── SDK16.java
│           │                   │   ├── ScrollerProxy.java
│           │                   │   └── VersionedGestureDetector.java
│           │                   ├── scan/
│           │                   │   ├── CameraConfigurationManager.java
│           │                   │   ├── CameraManager.java
│           │                   │   └── CameraPreview.java
│           │                   ├── swipyrefresh/
│           │                   │   ├── CircleImageView.java
│           │                   │   ├── MaterialProgressDrawable.java
│           │                   │   ├── SwipyRefreshLayout.java
│           │                   │   └── SwipyRefreshLayoutDirection.java
│           │                   └── zxing/
│           │                       ├── activity/
│           │                       │   ├── CaptureActivity.java
│           │                       │   └── DensityUtil.java
│           │                       ├── camera/
│           │                       │   ├── AutoFocusCallback.java
│           │                       │   ├── CameraConfigurationManager.java
│           │                       │   ├── CameraManager.java
│           │                       │   ├── FlashlightManager.java
│           │                       │   ├── PlanarYUVLuminanceSource.java
│           │                       │   └── PreviewCallback.java
│           │                       ├── decoding/
│           │                       │   ├── CaptureActivityHandler.java
│           │                       │   ├── DecodeFormatManager.java
│           │                       │   ├── DecodeHandler.java
│           │                       │   ├── DecodeThread.java
│           │                       │   ├── FinishListener.java
│           │                       │   ├── InactivityTimer.java
│           │                       │   └── Intents.java
│           │                       ├── encoding/
│           │                       │   └── EncodingHandler.java
│           │                       └── view/
│           │                           ├── ViewfinderResultPointCallback.java
│           │                           └── ViewfinderView.java
│           └── res/
│               ├── anim/
│               │   ├── fade_in.xml
│               │   ├── fade_out.xml
│               │   ├── head_in.xml
│               │   ├── head_out.xml
│               │   ├── hold.xml
│               │   ├── loading_animation.xml
│               │   ├── push_bottom_in.xml
│               │   ├── push_bottom_out.xml
│               │   ├── push_top_in.xml
│               │   ├── push_top_in2.xml
│               │   ├── push_top_out.xml
│               │   ├── push_top_out2.xml
│               │   ├── slide_in_from_left.xml
│               │   ├── slide_in_from_right.xml
│               │   ├── slide_out_to_left.xml
│               │   ├── slide_out_to_right.xml
│               │   ├── voice_from_icon.xml
│               │   └── voice_to_icon.xml
│               ├── color/
│               │   ├── login_btn_text_color.xml
│               │   └── main_botton_text_color.xml
│               ├── drawable/
│               │   ├── bg_btn_gray.xml
│               │   ├── bg_btn_green.xml
│               │   ├── bg_dialog.xml
│               │   ├── bg_et.xml
│               │   ├── btn_bottom_selector.xml
│               │   ├── btn_more_type_msg.xml
│               │   ├── chat_error_item_bg.xml
│               │   ├── chat_image_selector.xml
│               │   ├── chat_press_speak_btn.xml
│               │   ├── chat_takepic_selector.xml
│               │   ├── chatfrom_bg.xml
│               │   ├── chatting_setmode_keyboard_btn.xml
│               │   ├── chatting_setmode_voice_btn.xml
│               │   ├── chatto_bg.xml
│               │   ├── divider_horizontal.xml
│               │   ├── divider_vertical.xml
│               │   ├── dot_emoji.xml
│               │   ├── edit_text_bg.xml
│               │   ├── emoji_bottom_bg.xml
│               │   ├── item_pre_videocall_selector.xml
│               │   ├── list_item_bg_gray.xml
│               │   ├── list_item_bg_white.xml
│               │   ├── msg_state_failed_resend.xml
│               │   ├── progressbar_white.xml
│               │   ├── recording_hint_bg.xml
│               │   ├── recording_text_hint_bg.xml
│               │   ├── register_phone_bg.xml
│               │   ├── sidebar_background_pressed.xml
│               │   ├── sign_bg.xml
│               │   ├── tab_chat_bg.xml
│               │   ├── tab_contact_list_bg.xml
│               │   ├── tab_find_bg.xml
│               │   ├── tab_profile_bg.xml
│               │   ├── timestampe_bg.xml
│               │   ├── top_bar_back.xml
│               │   └── topbar_back.xml
│               ├── layout/
│               │   ├── activity_addfriends_final.xml
│               │   ├── activity_addfriends_next.xml
│               │   ├── activity_addfriends_pre.xml
│               │   ├── activity_base.xml
│               │   ├── activity_base_input.xml
│               │   ├── activity_base_main.xml
│               │   ├── activity_chat_setting_single.xml
│               │   ├── activity_check_people.xml
│               │   ├── activity_new_friends.xml
│               │   ├── activity_people_recently.xml
│               │   ├── activity_psw_reset.xml
│               │   ├── activity_qrcode_generate.xml
│               │   ├── activity_region.xml
│               │   ├── activity_show_big_image.xml
│               │   ├── activity_splash.xml
│               │   ├── activity_update_info.xml
│               │   ├── activity_userinfo.xml
│               │   ├── chat_menu_item.xml
│               │   ├── chat_neterror_item.xml
│               │   ├── coogame_country_item.xml
│               │   ├── dialog_alert.xml
│               │   ├── emoji_gridview.xml
│               │   ├── fragment_chat.xml
│               │   ├── fragment_contactlist.xml
│               │   ├── fragment_conversation_settings.xml
│               │   ├── fragment_emoji.xml
│               │   ├── fragment_find.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_login.xml
│               │   ├── fragment_profile.xml
│               │   ├── fragment_profile_info.xml
│               │   ├── fragment_register.xml
│               │   ├── item_contact_list.xml
│               │   ├── item_contact_list_footer.xml
│               │   ├── item_contact_list_header.xml
│               │   ├── item_conversation_single.xml
│               │   ├── item_dialog_gridview.xml
│               │   ├── item_diaolog_gridview.xml
│               │   ├── item_newfriend_msg.xml
│               │   ├── item_people_recently.xml
│               │   ├── item_region.xml
│               │   ├── latout_pre_videocall_item.xml
│               │   ├── layout_alert_dialog_delete.xml
│               │   ├── layout_pup.xml
│               │   ├── layout_title_bar.xml
│               │   ├── loading_dialog.xml
│               │   ├── row_big_expression.xml
│               │   ├── row_expression.xml
│               │   ├── row_received_message.xml
│               │   ├── row_received_picture.xml
│               │   ├── row_received_voice.xml
│               │   ├── row_sent_message.xml
│               │   ├── row_sent_picture.xml
│               │   ├── row_sent_voice.xml
│               │   ├── widget_input_view.xml
│               │   ├── widget_main_button.xml
│               │   ├── widget_switch_button.xml
│               │   ├── widget_voice_recorder.xml
│               │   └── widget_zbar_scan_capture.xml
│               ├── menu/
│               │   └── menu_main.xml
│               ├── values/
│               │   ├── arrays.xml
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               ├── values-hdpi/
│               │   └── dimens.xml
│               └── values-v21/
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.ap_

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/

# Gradle files
.gradle/
build/
.idea

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# Intellij
*.iml
# Keystore files
*.jks
gotye.keystore



================================================
FILE: README.md
================================================
# Android 项目配置#
    public class HTConstant {
    //IM服务器相关
    public static final String HOST_IM = "xxx.xxx.xxx.xxx";//示例ip: 119.125.523.153 此IP不可用
    //api服务器
    public static final String HOST_API = "http://xxx.xxx.xxx.xxx/api/";//示例ip: 119.125.523.153 此IP不可用
    //阿里云OSS信息配置
    public static final String endpoint = "oss-cn-hangzhou.aliyuncs.com";
    public static final String accessKeyId = "xxxxxxxx";
    public static final String accessKeySecret = "xxxxxxxxxxxx";
    .....
    }


----------
# 相关工程 #
----------
#最具诚意的开源IM系统 YiChat#
1. github地址:[https://github.com/YiChat](https://github.com/YiChat)
2. 开源中国地址:[https://git.oschina.net/zhangfeng_tech](https://git.oschina.net/zhangfeng_tech)
##本项目的开源内容##
###已开源的所有源码:###
1. IM服务器(负责即时通讯消息)-直接部署,无需修改参数
2. api服务器(非IM模块相关的其他业务逻辑)-修改一处参数,详见工程下文档
3. android客户端-配置参数,连接自己的服务器ip.详见工程文档

###待开源的工程源码:###

- iOS客户端:前面三个工程的github star数超过3000马上开源

##这个开源项目的意义在于##
1. 拥有自己的IM服务器,不再受制于第三方通讯云的限制.
2. 提供了一个完善优化的客户端源码,具体参见体验包:
    
 - Android:[https://www.pgyer.com/YiChatLite](https://www.pgyer.com/YiChatLite)
 - iOS:[https://www.pgyer.com/9sVQ](https://www.pgyer.com/9sVQ)

##QQ:84543217 (技术相关请提交Issus,商务合作可联系QQ)


================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        applicationId "com.htmessage.yichatopen"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        ndk {
            abiFilter 'armeabi-v7a' // 例如:abiFilter 'armeabi, x86'
        }
        sourceSets {
            main {
                jniLibs.srcDir 'libs'

            }
            instrumentTest.setRoot('tests')
            debug.setRoot('build-types/debug')
            release.setRoot('build-types/release')
        }
        lintOptions {
            abortOnError false
        }

        aaptOptions{
            cruncherEnabled=false
            useNewCruncher=false
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}

ext {
    smackVersion = '4.1.9'
}
dependencies {
    compile 'com.android.support:multidex:1.0.1'
    compile fileTree(include: '*.jar' , dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.tencent.bugly:crashreport:2.2.0'
    //
    compile 'com.android.support:design:25.0.1'
    compile 'com.android.support:cardview-v7:25.0.1'
    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.1@aar'
     compile 'com.github.promeg:tinypinyin:1.0.0'
     compile 'com.squareup.okhttp3:okhttp:3.3.1'
    compile "org.igniterealtime.smack:smack-android-extensions:$smackVersion"
    compile "org.igniterealtime.smack:smack-experimental:$smackVersion"
    compile "org.igniterealtime.smack:smack-tcp:$smackVersion"
    compile "org.igniterealtime.smack:smack-legacy:$smackVersion"
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.1.6'
    compile 'com.android.support:support-v4:25.0.0'
      compile 'com.alibaba:fastjson:1.2.24'
    compile 'com.alibaba:fastjson:1.1.56.android'
    compile 'top.zibin:Luban:1.0.9'
    //图片裁剪库
    compile 'com.soundcloud.android:android-crop:1.0.1@aar'
    //图片处理库和毛玻璃特效
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'jp.wasabeef:glide-transformations:2.0.1'
    compile 'com.google.android.gms:play-services-appindexing:8.4.0'
    compile 'com.mabeijianxi:small-video-record:1.2.0'
    //视频播放器
    compile 'fm.jiecao:jiecaovideoplayer:5.5.4'
}


================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\Administrator\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.htmessage.yichatopen">

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="25"
        tools:overrideLibrary="com.htmessage.sdk" />



    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- To auto-complete the email text field in the login form with the user's emails -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <!-- SDK2.1新增获取用户位置信息 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission
        android:name="android.permission.WRITE_APN_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- To auto-complete the email text field in the login form with the user's emails -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <application
        android:name="com.htmessage.yichatopen.HTApp"
        android:allowBackup="true"
        android:icon="@drawable/app_logo"
        android:label="@string/app_name"
        android:persistent="true"
        >


        <activity
            android:name=".activity.main.MainActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustPan"/>

         <activity
            android:name="com.htmessage.yichatopen.activity.SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
             >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

         <activity
            android:name=".activity.login.LoginActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

         <activity
            android:name=".activity.register.RegisterActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>


         <activity
            android:name=".activity.chat.ChatActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="stateVisible|adjustResize"/>
        <activity
            android:name=".activity.chat.activity.ChatSettingActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

         <activity
            android:name=".activity.main.profile.info.profile.ProfileActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

         <activity
            android:name=".activity.main.profile.info.update.ProfileUpdateActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

        <activity
            android:name="com.htmessage.yichatopen.activity.SettingsActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name=".activity.addfriends.add.pre.AddFriendsPreActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name=".activity.addfriends.add.next.AddFriendsNextActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name=".activity.addfriends.add.end.AddFriendsFinalActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

        <activity
            android:name="com.htmessage.yichatopen.activity.main.details.UserDetailsActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name=".activity.addfriends.newfriend.NewFriendsActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name="com.htmessage.yichatopen.activity.ScanCaptureActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name="com.htmessage.yichatopen.activity.main.qrcode.QrCodeActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>
        <activity
            android:name="com.htmessage.yichatopen.activity.ShowBigImageActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="adjustResize"/>

        <activity
            android:name="com.soundcloud.android.crop.CropImageActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide" />

         <activity
            android:name=".activity.main.password.PasswordResetActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="stateVisible|adjustResize"/>


         <activity
            android:name=".activity.main.find.recentlypeople.PeopleRecentlyActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="stateAlwaysHidden"/>

         <activity
            android:name="com.htmessage.yichatopen.activity.main.region.RegionActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="stateAlwaysHidden"/>


         <activity
            android:name=".activity.chat.activity.ChooseContactActivity"
            android:screenOrientation="portrait"
            android:theme="@style/horizontal_slide"
            android:windowSoftInputMode="stateAlwaysHidden"/>

          <activity android:name="mabeijianxi.camera.MediaRecorderActivity" />


        <service
            android:name="com.htmessage.sdk.service.AwakeService"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
            android:process=":push">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>

        <service
            android:name="com.htmessage.sdk.service.KeepAliveService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":push">
        </service>

        <service
            android:name="com.htmessage.sdk.service.MessageService"
            android:exported="true" />
        <service
            android:name="com.htmessage.sdk.service.RemoteService"
            android:exported="true"
            android:process=":push" />

        <receiver android:name="com.htmessage.sdk.receiver.NetworkStateReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.htmessage.sdk.receiver.SystemReceiver"
            android:exported="true"
            android:process=":push">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.SCREEN_ON" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>


    </application>

</manifest>


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/HTApp.java
================================================
package com.htmessage.yichatopen;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.multidex.MultiDex;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.manager.MyNotification;
import com.htmessage.yichatopen.manager.LocalUserManager;
import com.htmessage.yichatopen.manager.Manager;
import com.tencent.bugly.crashreport.CrashReport;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class HTApp extends Application {
    private static Context applicationContext;
    private static HTApp instance;
    private JSONObject userJson = null;
     private List<Activity> activities = new ArrayList<>();
    public static boolean isCalling = false;

    @Override
    public void onCreate() {
        //sdk采用双进程守护,因此不要在守护进程中初始Application
        int pid = android.os.Process.myPid();
        String processAppName = getAppName(pid, this);
        if (processAppName == null || !processAppName.equalsIgnoreCase(this.getPackageName())) {
            return;
        }
        super.onCreate();
        applicationContext = this;
        instance = this;
        MyNotification.init(applicationContext);
        LocalUserManager.init(applicationContext);
         if (getUserJson() != null) {
            Manager.initManagerList(applicationContext);
        }
        //异常上报
        CrashReport.initCrashReport(applicationContext, "a7b4566fd9", false);
        HTClientHelper.init(applicationContext);
    }

    public static Context getContext() {
        return applicationContext;
    }




    public static HTApp getInstance() {
        return instance;
    }

    public String getUsername() {
        String username = null;
        if (getUserJson() != null) {
            username = getUserJson().getString(HTConstant.JSON_KEY_HXID);
        }
        return username;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    public void setUserJson(JSONObject userJson) {
        this.userJson = userJson;
        if (userJson != null) {
            Manager.initManagerList(applicationContext);
        }
        LocalUserManager.getInstance().setUserJson(userJson);
    }

    public JSONObject getUserJson() {
        if (userJson == null) {
            userJson = LocalUserManager.getInstance().getUserJson();
        }
        return userJson;
    }






    public void saveActivity(Activity activity) {
        if (activity != null) {
            activities.add(activity);
        }

    }

    public void finishActivities() {
        for (Activity activity : activities) {
            if (activity != null && !activity.isFinishing()) {
                activity.finish();
            }
        }

    }



    /**
     * check the application process name if process name is not qualified, then we think it is a service process and we will not init SDK
     *
     * @param pID
     * @return
     */
    private static String getAppName(int pID, Context appContext) {
        String processName = null;
        ActivityManager am = (ActivityManager) appContext.getSystemService(Context.ACTIVITY_SERVICE);
        List l = am.getRunningAppProcesses();
        Iterator i = l.iterator();
        PackageManager pm = appContext.getPackageManager();
        while (i.hasNext()) {
            ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
            try {
                if (info.pid == pID) {
                    CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
                    processName = info.processName;
                    return processName;
                }
            } catch (Exception e) {
            }
        }
        return processName;
    }

    /**
     * 得到自定义的progressDialog
     *
     * @param context
     * @param msg
     * @return
     */
    public Dialog createLoadingDialog(Context context, String msg) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.loading_dialog, null);// 得到加载view
        LinearLayout layout = (LinearLayout) v.findViewById(R.id.dialog_view);// 加载布局
        // main.xml中的ImageView
        ImageView spaceshipImage = (ImageView) v.findViewById(R.id.img);
        TextView tipTextView = (TextView) v.findViewById(R.id.tipTextView);// 提示文字
        // 加载动画
        Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(
                context, R.anim.loading_animation);
        // 使用ImageView显示动画
        spaceshipImage.startAnimation(hyperspaceJumpAnimation);
        tipTextView.setText(msg);// 设置加载信息
        Dialog loadingDialog = new Dialog(context, R.style.loading_dialog);// 创建自定义样式dialog
        loadingDialog.setCancelable(false);// 不可以用“返回键”取消
        loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));// 设置布局
      
        return loadingDialog;
    }

    public String getDirFilePath() {
        File file = new File(HTConstant.DIR_AVATAR);
        if (!file.exists()) {
            file.getParentFile().mkdirs();
            file.mkdir();
        }
        return file.getAbsolutePath() + File.separator;
    }



}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/HTClientHelper.java
================================================
package com.htmessage.yichatopen;

import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.sdk.client.HTOptions;
import com.htmessage.sdk.manager.HTChatManager;
import com.htmessage.yichatopen.activity.main.MainActivity;
import com.htmessage.yichatopen.activity.chat.ChatActivity;

import com.htmessage.yichatopen.manager.MyNotification;
import com.htmessage.yichatopen.domain.InviteMessage;
import com.htmessage.yichatopen.domain.InviteMessgeDao;
import com.htmessage.yichatopen.domain.User;
import com.htmessage.yichatopen.manager.ContactsManager;
import com.htmessage.yichatopen.manager.NotifierManager;
import com.htmessage.sdk.ChatType;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.listener.HTConnectionListener;
import com.htmessage.sdk.model.CallMessage;
import com.htmessage.sdk.model.CmdMessage;
import com.htmessage.sdk.model.HTMessage;
import com.htmessage.yichatopen.utils.CommonUtils;
import com.htmessage.yichatopen.utils.HTMessageUtils;

import java.util.List;

/**
 * Created by huangfangyi on 2017/3/3.
 * qq 84543217
 */

public class HTClientHelper {
    private NotifierManager notifierManager;
    private static Context applicationContext;

    private static HTClientHelper htClientHelper;

    public static void init(Context context) {
        htClientHelper = new HTClientHelper(context);
    }

    public HTClientHelper(Context context) {
        this.applicationContext = context;
        HTOptions options=new HTOptions(); //IM相关配置
        options.setHost(HTConstant.HOST_IM); //IP地址
        options.setOssInfo(HTConstant.endpoint,HTConstant.bucket,HTConstant.accessKeyId,HTConstant.accessKeySecret);//阿里云OSS相关
        options.setSinglePointUrl(HTConstant.DEVICE_URL_UPDATE,HTConstant.DEVICE_URL_GET);//设置单APP端登录
        options.setDebug(false); //是否打印log false不打印
        options.setKeepAlive(false); //是否开启保活  false 不开启
        HTClient.init(applicationContext,options);
        HTClient.getInstance().setMessageLisenter(messageLisenter);
        HTClient.getInstance().addConnectionListener(htConnectionListener);
        notifierManager = new NotifierManager(applicationContext);
    }

    public static HTClientHelper getInstance() {

        if (htClientHelper == null) {
            throw new RuntimeException("please init first!");
        }
        return htClientHelper;
    }

    private HTConnectionListener htConnectionListener = new HTConnectionListener() {
        @Override
        public void onConnected() {

            //   Toast.makeText(applicationContext,"连上啦",Toast.LENGTH_SHORT).show();
            notifyConnection(true);
        }

        @Override
        public void onDisconnected() {
            notifyConnection(false);
            // Toast.makeText(applicationContext,"断连啦",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onConflict() {
            // Toast.makeText(applicationContext,"被踢啦",Toast.LENGTH_SHORT).show();
            notifyConflict();
        }
    };
    private HTClient.MessageLisenter messageLisenter = new HTClient.MessageLisenter() {
        @Override
        public void onHTMessage(HTMessage htMessage) {
            handleHTMessage(htMessage);
        }

        @Override
        public void onCMDMessgae(CmdMessage cmdMessage) {
            handleCmdMessage(cmdMessage);
        }

        @Override
        public void onCallMessgae(CallMessage callMessage) {
             //lite版没有音视频消息
        }
    };
    private void handleHTMessage(HTMessage htMessage){
        Intent intent=new Intent(IMAction.ACTION_NEW_MESSAGE);
        intent.putExtra("message",htMessage);
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent);
        if (ChatActivity.activityInstance != null && htMessage.getUsername().equals(ChatActivity.activityInstance.getToChatUsername())) {
        } else {
            MyNotification.getInstance().onNewMessage(htMessage);
        }
        notifyHTMessage();
    }


    private void handleCmdMessage(CmdMessage cmdMessage) {
        InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(applicationContext);
        String data = cmdMessage.getBody();
        if (data != null) {
            JSONObject dataJSON = JSONObject.parseObject(data);
            if (dataJSON != null && dataJSON.containsKey("action")) {

                int action = dataJSON.getInteger("action");
                if (action == 1000) {
                    //收到好友申请的请求
                    List<InviteMessage> msgs = inviteMessgeDao.getMessagesList();
                    for (InviteMessage inviteMessage : msgs) {
                        if ( inviteMessage.getFrom().equals(cmdMessage.getFrom())) {
                            inviteMessgeDao.deleteMessage(cmdMessage.getFrom());
                        }
                    }
                    InviteMessage msg = new InviteMessage();
                    msg.setFrom(cmdMessage.getFrom());
                    msg.setTime(System.currentTimeMillis());
                    msg.setReason(dataJSON.getJSONObject("data").toJSONString());
                    // set invitation status
                    msg.setStatus(InviteMessage.Status.BEINVITEED);
                    notifyNewInviteMessage(msg,null);
                } else if (action == 1001) {
                    //收到好友同意的透传消息
                    List<InviteMessage> msgs = inviteMessgeDao.getMessagesList();
                    for (InviteMessage inviteMessage : msgs) {
                        if (inviteMessage.getFrom().equals(cmdMessage.getFrom())) {
                            inviteMessgeDao.deleteMessage(cmdMessage.getFrom());

                        }
                    }
                    // save invitation as message
                    InviteMessage msg = new InviteMessage();
                    msg.setFrom(cmdMessage.getFrom());
                    msg.setReason(dataJSON.getJSONObject("data").toJSONString());
                    msg.setTime(System.currentTimeMillis());
                    //   Log.d(TAG, message.getFrom() + "accept your request");
                    msg.setStatus(InviteMessage.Status.BEAGREED);
                    notifyNewInviteMessage(msg,dataJSON.getJSONObject("data"));
                } else if (action == 1002) {
                    //收到好友拒绝的透传消息
                    //Lite版没有拒绝好友申请的处理
                } else if (action == 1003) {
                    //收到删除好友的透传消息
                    //发送广播
                    if (HTApp.getInstance().getUsername().equals(cmdMessage.getTo())){
                        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(new Intent(IMAction.CMD_DELETE_FRIEND).putExtra(HTConstant.JSON_KEY_HXID, cmdMessage.getFrom()));
                    }
                } else if (action == 6000) {//收到撤回消息的透传
                    String msgId = dataJSON.getString("msgId");
                    String chatTo = cmdMessage.getTo();
                    if (cmdMessage.getChatType() == ChatType.singleChat) {
                        chatTo = cmdMessage.getFrom();
                    }
                    HTMessage htMessage = HTClient.getInstance().messageManager().getMssage(chatTo, msgId);
                    HTMessageUtils.creatWithDrowMsg(htMessage);
                    LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(new Intent(IMAction.ACTION_MESSAGE_WITHDROW).putExtra("msgId", msgId));
                }
            }
        }
    }




    /**
     * user has logged into another device
     */
    protected void notifyConflict() {
        Intent intent = new Intent(applicationContext, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(IMAction.ACTION_CONFLICT, true);
        applicationContext.startActivity(intent);
    }

    /**
     * user has logged into another device
     */
    protected void notifyConnection(boolean isConnected) {
        Intent intent = new Intent(IMAction.ACTION_CONNECTION_CHANAGED);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("state", isConnected);
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent);
    }

    /**
     * save and notify invitation message
     *
     * @param msg
     */
    private void notifyNewInviteMessage(final InviteMessage msg, final JSONObject jsonObject) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                InviteMessgeDao inviteMessgeDao = new InviteMessgeDao(applicationContext);
                inviteMessgeDao.saveMessage(msg);
                inviteMessgeDao.saveUnreadMessageCount(1);
                LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(new Intent(IMAction.ACTION_INVITE_MESSAGE));
                notifierManager.getNotifier().vibrateAndPlayTone(null);

                if(jsonObject!=null){
                     User user = CommonUtils.Json2User(jsonObject);
                    ContactsManager.getInstance().saveContact(user);
                    LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(new Intent(IMAction.ACTION_CONTACT_CHANAGED));
                }
            }
        }).start();
    }

    /**
     * save and notify invitation message
     */
    private void notifyHTMessage() {
        notifierManager.getNotifier().vibrateAndPlayTone(null);
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/HTConstant.java
================================================
package com.htmessage.yichatopen;

import android.os.Environment;

/**
 * Created by ustc on 2016/6/27.
 */
public class HTConstant {
//    IM服务器相关
    public static final String HOST_IM = "xxx.xxx.xxx.xxx";//示例ip: 119.125.523.153 此IP不可用
    //api服务器
    public static final String HOST_API = "http://xxx.xxx.xxx.xxx/api/";//示例ip: 119.125.523.153 此IP不可用
    //阿里云OSS信息配置
    public static final String endpoint = "oss-cn-hangzhou.aliyuncs.com";
    public static final String accessKeyId = "xxxxxxxx";
    public static final String accessKeySecret = "xxxxxxxxxxxx";
    public static final String bucket = "xxxxxxxxxx";
    public static final String baseOssUrl = "http://"+ bucket+"."+endpoint+"/";

    //登记设备id,实现单点登陆
    public static final  String DEVICE_URL_UPDATE = HOST_API+"updateDeviceId.php";
    public static final  String DEVICE_URL_GET = HOST_API+"getDeviceId.php";
    //查询更新
    public static final String URL_CHECK_UPDATE = HOST_API+"version.php";

    //应用层使用到的api接口
    public static final String URL_AVATAR= HOST_API + "upload/";
    public static final String URL_REGISTER = HOST_API + "register";//注册
    public static final String URL_LOGIN = HOST_API + "login";//登录
     public static final String URL_FriendList = HOST_API + "fetchFriends";//获取好友列表
    public static final String URL_Search_User = HOST_API + "searchUser";//查询好友
    public static final String URL_Get_UserInfo = HOST_API + "getUserInfo";//获取详情
    public static final String URL_UPDATE = HOST_API + "update";//更新
    public static final String URL_RESETPASSWORD = HOST_API + "resetPassword";//更新密码
    public static final String URL_ADD_FRIEND=HOST_API + "addFriend"; //添加好友
    public static final String URL_DELETE_FRIEND=HOST_API + "removeFriend";//删除好友
    public static final String URL_ADD_BLACKLIST=HOST_API +"addBlackList";//添加黑名单
    public static final String URL_GET_RECENTLY_PEOPLE= HOST_API + "getRecentlyUser";//获取最近上线的人
    public static final String URL_SEND_LOCAL_LOGIN_TIME= HOST_API + "updateLocalTimestamp";//获取最近上线的人


    // 缩略图处理---等高宽-请查看阿里云官方文档oss图片处理文档
    public static final String baseImgUrl_set = "?x-oss-process=image/resize,m_fill,h_300,w_300";
    //jsonobject常用key值

    public static final String JSON_KEY_NICK ="nick";
    public static final String JSON_KEY_HXID ="userId";
    public static final String JSON_KEY_FXID ="fxid";
    public static final String JSON_KEY_SEX ="sex";
    public static final String JSON_KEY_AVATAR ="avatar";
    public static final String JSON_KEY_CITY ="city";
    public static final String JSON_KEY_PASSWORD ="password";
    public static final String JSON_KEY_PROVINCE ="province";
    public static final String JSON_KEY_TEL ="tel";
    public static final String JSON_KEY_SIGN ="sign";
    public static final String JSON_KEY_ROLE ="role";

    public static final String JSON_KEY_SESSION ="session";
    //添加好友的原因
    public static final String CMD_ADD_REASON="ADD_REASON";

    //进入用户详情页传递json字符串
    public static final String KEY_USER_INFO="userInfo";
    //修改用户资料的广播
    public static final String KEY_CHANGE_TYPE="type";
    //开源地址
    public static final String GITHUBURL = "https://github.com/YiChat";
    public static final String OSCHINAURL = "http://git.oschina.net/zhangfeng_tech";
    //Pro版本体验
    public static final String YICHATPROURL = "https://www.pgyer.com/yichat_android";
    public static final String DIR_AVATAR = Environment.getExternalStorageDirectory().toString()+"/yiChat/";

}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/IMAction.java
================================================
package com.htmessage.yichatopen;

/**
 * Created by huangfangyi on 2017/2/10.
 * qq 84543217
 */

public class IMAction {
    public static final String ACTION_INVITE_MESSAGE="action_invite_message";
    public static final String ACTION_NEW_MESSAGE="action_new_message";
    public static final String ACTION_REMOVED_FROM_GROUP="action_removed_from_group";
   public static final String ACTION_CONTACT_CHANAGED = "action_contact_changed";
    public static final String ACTION_CONFLICT = "action_conflict";
    public static final String ACTION_CONNECTION_CHANAGED="action_connection_changed";
    //消息撤回
    public static final String ACTION_MESSAGE_WITHDROW="action_message_withdrow";
    //转发消息
    public static final String ACTION_MESSAGE_FORWORD="action_message_forword";
    //清空消息
    public static final String ACTION_MESSAGE_EMPTY="ACTION_MESSAGE_EMPTY";
    //删除好友通知
    public static final String CMD_DELETE_FRIEND ="DELETE_FRIEND";
    //资料更新的通知
    public static final String ACTION_UPDATE_INFO ="ACTION_UPDATE_INFO";
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/BaseActivity.java
================================================
package com.htmessage.yichatopen.activity;

import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;

public class BaseActivity extends AppCompatActivity {
     public String TAG=this.getClass().getName().toString();
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        HTApp.getInstance().saveActivity(this);
    }




    public void back(View view) {
        finish();
    }


    public void setTitle(int title){
        TextView textView= (TextView) this.findViewById(R.id.tv_title);
//        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
//        layoutParams.addRule();
//        imageView.setLayoutParams(layoutParams);



        if(textView!=null){
            textView.setText(title);
        }

    }
    public void  setTitleCenter(){
        TextView textView= (TextView) this.findViewById(R.id.tv_title);
        textView.setGravity(Gravity.CENTER);
    }
    public void setTitle(String title){
        TextView textView= (TextView) this.findViewById(R.id.tv_title);
        if(textView!=null){
            textView.setText(title);
        }
    }

    public void hideBackView(){
        ImageView iv_back= (ImageView) this.findViewById(R.id.iv_back);
        View view=this.findViewById(R.id.view_temp);
        if(iv_back!=null&&view!=null){
            iv_back.setVisibility(View.GONE);
            view.setVisibility(View.GONE);
        }

    }


    public void showRightView(int res,View.OnClickListener onClickListener){
        ImageView ivRight= (ImageView) this.findViewById(R.id.iv_right);
        if(ivRight!=null ){
            ivRight.setImageResource(res);
            ivRight.setVisibility(View.VISIBLE);
            if(onClickListener!=null){
                ivRight.setOnClickListener(onClickListener);
            }
        }
    }
    public void showRightTextView(int res,View.OnClickListener onClickListener){
        TextView ivRight= (TextView) this.findViewById(R.id.btn_rtc);
        if(ivRight!=null ){
            ivRight.setText(res);
            ivRight.setVisibility(View.VISIBLE);
            if(onClickListener!=null){
                ivRight.setOnClickListener(onClickListener);
            }
        }
    }
    public void showRightTextView(String res,View.OnClickListener onClickListener){
        TextView ivRight= (TextView) this.findViewById(R.id.btn_rtc);
        if(ivRight!=null ){
            ivRight.setText(res);
            ivRight.setVisibility(View.VISIBLE);
            if(onClickListener!=null){
                ivRight.setOnClickListener(onClickListener);
            }
        }
    }
    protected boolean isCompatible(int apiLevel) {
        return Build.VERSION.SDK_INT >= apiLevel;
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/BasePresenter.java
================================================
package com.htmessage.yichatopen.activity;

/**
 * Created by huangfangyi on 2017/6/21.
 * qq 84543217
 */

public interface BasePresenter  {
    void start();
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/BaseView.java
================================================
package com.htmessage.yichatopen.activity;

import android.app.Activity;
import android.content.Context;

/**
 * Created by huangfangyi on 2017/6/21.
 * qq 84543217
 */

public interface BaseView<T> {
    void setPresenter(T presenter);
    Context getBaseContext();
    Activity getBaseActivity();
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/ScanCaptureActivity.java
================================================
package com.htmessage.yichatopen.activity;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.activity.main.details.UserDetailsActivity;
import com.htmessage.yichatopen.widget.scan.CameraManager;
import com.htmessage.yichatopen.widget.scan.CameraPreview;

import net.sourceforge.zbar.Config;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;

import java.io.IOException;
import java.lang.reflect.Field;

public class ScanCaptureActivity extends BaseActivity {
    private Camera mCamera;
    private CameraPreview mPreview;
    private Handler autoFocusHandler;
    private CameraManager mCameraManager;

    private TextView scanResult;
    private FrameLayout scanPreview;
    private Button scanRestart;
    private RelativeLayout scanContainer;
    private RelativeLayout scanCropView;
    private ImageView scanLine;
    private TextView tv_title;
    private Rect mCropRect = null;
    private boolean barcodeScanned = false;
    private boolean previewing = true;
    private ImageScanner mImageScanner = null;

    static {
        System.loadLibrary("iconv");
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_zbar_scan_capture);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        findViewById();
        addEvents();
        initViews();
    }

    private void findViewById() {
        scanPreview = (FrameLayout) findViewById(R.id.capture_preview);
        scanResult = (TextView) findViewById(R.id.capture_scan_result);
        scanRestart = (Button) findViewById(R.id.capture_restart_scan);
        scanContainer = (RelativeLayout) findViewById(R.id.capture_container);
        scanCropView = (RelativeLayout) findViewById(R.id.capture_crop_view);
        scanLine = (ImageView) findViewById(R.id.capture_scan_line);
        tv_title = (TextView) findViewById(R.id.tv_title);
        tv_title.setText(R.string.scan_title);
    }

    private void addEvents() {
        scanRestart.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if (barcodeScanned) {
                    barcodeScanned = false;
                    scanResult.setText(R.string.Scanning);
                    mCamera.setPreviewCallback(previewCb);
                    mCamera.startPreview();
                    previewing = true;
                    mCamera.autoFocus(autoFocusCB);
                }
            }
        });
    }

    private void initViews() {
        mImageScanner = new ImageScanner();
        mImageScanner.setConfig(0, Config.X_DENSITY, 3);
        mImageScanner.setConfig(0, Config.Y_DENSITY, 3);

        autoFocusHandler = new Handler();
        mCameraManager = new CameraManager(this);
        try {
            mCameraManager.openDriver();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 调整扫描框大小,自适应屏幕
        Display display = this.getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        int height = display.getHeight();

        RelativeLayout.LayoutParams linearParams = (RelativeLayout.LayoutParams) scanCropView
                .getLayoutParams();
        linearParams.height = (int) (width * 0.8);
        linearParams.width = (int) (width * 0.8);
        scanCropView.setLayoutParams(linearParams);
        // **

        mCamera = mCameraManager.getCamera();
        mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
        scanPreview.addView(mPreview);

        TranslateAnimation animation = new TranslateAnimation(
                Animation.RELATIVE_TO_PARENT, 0.0f,
                Animation.RELATIVE_TO_PARENT, 0.0f,
                Animation.RELATIVE_TO_PARENT, 0.0f,
                Animation.RELATIVE_TO_PARENT, 0.85f);
        animation.setDuration(5000);
        animation.setRepeatCount(-1);
        animation.setRepeatMode(Animation.REVERSE);
        scanLine.startAnimation(animation);
    }

    public void onPause() {
        super.onPause();
        releaseCamera();
    }

    private void releaseCamera() {
        if (mCamera != null) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }

    private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing)
                mCamera.autoFocus(autoFocusCB);
        }
    };

    PreviewCallback previewCb = new PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
            Size size = camera.getParameters().getPreviewSize();

            // 这里需要将获取的data翻转一下,因为相机默认拿的的横屏的数据
            byte[] rotatedData = new byte[data.length];
            for (int y = 0; y < size.height; y++) {
                for (int x = 0; x < size.width; x++)
                    rotatedData[x * size.height + size.height - y - 1] = data[x
                            + y * size.width];
            }

            // 宽高也要调整
            int tmp = size.width;
            size.width = size.height;
            size.height = tmp;

            initCrop();

            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(rotatedData);
            barcode.setCrop(mCropRect.left, mCropRect.top, mCropRect.width(),
                    mCropRect.height());

            int result = mImageScanner.scanImage(barcode);
            String resultStr = null;

            if (result != 0) {
                SymbolSet syms = mImageScanner.getResults();
                for (Symbol sym : syms) {
                    resultStr = sym.getData();
                }
            }

            if (!TextUtils.isEmpty(resultStr)) {
                previewing = false;
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();
                releaseCamera();
                barcodeScanned = true;
               if (resultStr.contains(":")) {
                    String userType= resultStr
                            .substring(0, resultStr.indexOf(":"));
                    String value = resultStr.substring(resultStr.indexOf(":") + 1);
                    System.out.println("type----------->>>>" + userType);
                    System.out.println("value----------->>>>" + value);
                    if (userType.equals("userInfo")) {
                        JSONObject object = JSONObject.parseObject(value);//.putExtra(HTConstant.JSON_KEY_HXID, object.getString(HTConstant.JSON_KEY_HXID))
                        startActivity(new Intent(ScanCaptureActivity.this, UserDetailsActivity.class).putExtra(HTConstant.KEY_USER_INFO,object.toJSONString()));
                    } else {
                        Toast.makeText(getApplicationContext(), R.string.code_is_not_invlide, Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), R.string.code_is_not_invlide, Toast.LENGTH_SHORT).show();
                }
                finish();
            }
        }
    };

    // Mimic continuous auto-focusing
    AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera camera) {
            autoFocusHandler.postDelayed(doAutoFocus, 1000);
        }
    };

    /**
     * 初始化截取的矩形区域
     */
    private void initCrop() {
        int cameraWidth = mCameraManager.getCameraResolution().y;
        int cameraHeight = mCameraManager.getCameraResolution().x;

        /** 获取布局中扫描框的位置信息 */
        int[] location = new int[2];
        scanCropView.getLocationInWindow(location);

        int cropLeft = location[0];
        int cropTop = location[1] - getStatusBarHeight();

        int cropWidth = scanCropView.getWidth();
        int cropHeight = scanCropView.getHeight();

        /** 获取布局容器的宽高 */
        int containerWidth = scanContainer.getWidth();
        int containerHeight = scanContainer.getHeight();

        /** 计算最终截取的矩形的左上角顶点x坐标 */
        int x = cropLeft * cameraWidth / containerWidth;
        /** 计算最终截取的矩形的左上角顶点y坐标 */
        int y = cropTop * cameraHeight / containerHeight;

        /** 计算最终截取的矩形的宽度 */
        int width = cropWidth * cameraWidth / containerWidth;
        /** 计算最终截取的矩形的高度 */
        int height = cropHeight * cameraHeight / containerHeight;

        /** 生成最终的截取的矩形 */
        mCropRect = new Rect(x, y, width + x, height + y);
    }

    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/SettingsActivity.java
================================================
package com.htmessage.yichatopen.activity;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.manager.SettingsManager;
import com.htmessage.yichatopen.activity.login.LoginActivity;
import com.htmessage.yichatopen.activity.main.password.PasswordResetActivity;
import com.htmessage.yichatopen.widget.SwitchButton;
import com.htmessage.yichatopen.utils.OkHttpUtils;
import com.htmessage.yichatopen.utils.Param;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.yichatopen.widget.HTAlertDialog;

import java.util.ArrayList;
import java.util.List;


/**
 * Created by huangfangyi on 2016/7/4.\
 * QQ:84543217
 */
public class SettingsActivity extends BaseActivity implements View.OnClickListener {
    /**
     * new message notification
     */
    private RelativeLayout rl_switch_notification;
    /**
     * sound
     */
    private RelativeLayout rl_switch_sound;
    /**
     * vibration
     */
    private RelativeLayout rl_switch_vibrate;
    /**
     * speaker
     */
    private RelativeLayout rl_switch_speaker;


    /**
     * line between sound and vibration
     */
    private TextView textview1, textview2;

    private LinearLayout blacklistContainer;

    private LinearLayout userProfileContainer;

    /**
     * logout
     */
    private RelativeLayout rl_logout;

    private RelativeLayout rl_switch_chatroom_leave;

    private RelativeLayout rl_switch_delete_msg_when_exit_group;
    private RelativeLayout rl_switch_auto_accept_group_invitation;
    private RelativeLayout rl_switch_adaptive_video_encode, rl_keep_live, re_resetpassword;

    private RelativeLayout rl_update, rl_about_us;//检查更新

    /**
     * Diagnose
     */
    private LinearLayout llDiagnose, llChange, ll_numal_set;
    private View view_devider;
    /**
     * display name for APNs
     */
    private LinearLayout pushNick, ll_new_msg;

    private SwitchButton notifiSwitch;
    private SwitchButton soundSwitch;
    private SwitchButton vibrateSwitch;
    private SwitchButton speakerSwitch;
    private SwitchButton ownerLeaveSwitch;
    private SwitchButton switch_delete_msg_when_exit_group;
    private SwitchButton switch_auto_accept_group_invitation;
    private SwitchButton switch_adaptive_video_encode;
    private SettingsManager settingsModel;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.fragment_conversation_settings);
        initView();
        initData();
        setListener();
    }

    private void setListener() {
        blacklistContainer.setOnClickListener(this);
        userProfileContainer.setOnClickListener(this);
        rl_switch_notification.setOnClickListener(this);
        rl_switch_sound.setOnClickListener(this);
        rl_switch_vibrate.setOnClickListener(this);
        rl_switch_speaker.setOnClickListener(this);
        rl_logout.setOnClickListener(this);
        llDiagnose.setOnClickListener(this);
        pushNick.setOnClickListener(this);
        rl_switch_chatroom_leave.setOnClickListener(this);
        rl_switch_delete_msg_when_exit_group.setOnClickListener(this);
        rl_switch_auto_accept_group_invitation.setOnClickListener(this);
        rl_switch_adaptive_video_encode.setOnClickListener(this);
        rl_update.setOnClickListener(this);
        rl_keep_live.setOnClickListener(this);
        re_resetpassword.setOnClickListener(this);
        rl_about_us.setOnClickListener(this);
        ll_new_msg.setOnClickListener(this);
        llChange.setOnClickListener(this);
    }

    private void initData() {
        settingsModel = SettingsManager.getInstance();

        // the vibrate and sound notification are allowed or not?
        if (settingsModel.getSettingMsgNotification()) {
            notifiSwitch.openSwitch();
            rl_switch_sound.setVisibility(View.VISIBLE);
            rl_switch_vibrate.setVisibility(View.VISIBLE);
            textview1.setVisibility(View.VISIBLE);
            textview2.setVisibility(View.VISIBLE);
        } else {
            notifiSwitch.closeSwitch();
            rl_switch_sound.setVisibility(View.GONE);
            rl_switch_vibrate.setVisibility(View.GONE);
            textview1.setVisibility(View.GONE);
            textview2.setVisibility(View.GONE);
        }

        // sound notification is switched on or not?
        if (settingsModel.getSettingMsgSound()) {
            soundSwitch.openSwitch();
        } else {
            soundSwitch.closeSwitch();
        }

        // vibrate notification is switched on or not?
        if (settingsModel.getSettingMsgVibrate()) {
            vibrateSwitch.openSwitch();
        } else {
            vibrateSwitch.closeSwitch();
        }

        // the speaker is switched on or not?
        if (settingsModel.getSettingMsgSpeaker()) {
            speakerSwitch.openSwitch();
        } else {
            speakerSwitch.closeSwitch();
        }

        // if allow owner leave
        if (settingsModel.isChatroomOwnerLeaveAllowed()) {
            ownerLeaveSwitch.openSwitch();
        } else {
            ownerLeaveSwitch.closeSwitch();
        }

        // delete messages when exit group?
        if (settingsModel.isDeleteMessagesAsExitGroup()) {
            switch_delete_msg_when_exit_group.openSwitch();
        } else {
            switch_delete_msg_when_exit_group.closeSwitch();
        }

        if (settingsModel.isAutoAcceptGroupInvitation()) {
            switch_auto_accept_group_invitation.openSwitch();
        } else {
            switch_auto_accept_group_invitation.closeSwitch();
        }

    }

    private void initView() {
        rl_switch_notification = (RelativeLayout) findViewById(R.id.rl_switch_notification);
        rl_switch_sound = (RelativeLayout) findViewById(R.id.rl_switch_sound);
        rl_switch_vibrate = (RelativeLayout) findViewById(R.id.rl_switch_vibrate);
        rl_switch_speaker = (RelativeLayout) findViewById(R.id.rl_switch_speaker);
        rl_switch_chatroom_leave = (RelativeLayout) findViewById(R.id.rl_switch_chatroom_owner_leave);
        rl_switch_delete_msg_when_exit_group = (RelativeLayout) findViewById(R.id.rl_switch_delete_msg_when_exit_group);
        rl_switch_auto_accept_group_invitation = (RelativeLayout) findViewById(R.id.rl_switch_auto_accept_group_invitation);
        rl_switch_adaptive_video_encode = (RelativeLayout) findViewById(R.id.rl_switch_adaptive_video_encode);
        rl_update = (RelativeLayout) findViewById(R.id.rl_update);//rl_keep_live,re_resetpassword
        rl_keep_live = (RelativeLayout) findViewById(R.id.rl_keep_live);
        re_resetpassword = (RelativeLayout) findViewById(R.id.re_resetpassword);
        rl_about_us = (RelativeLayout) findViewById(R.id.rl_about_us);

        notifiSwitch = (SwitchButton) findViewById(R.id.switch_notification);
        soundSwitch = (SwitchButton) findViewById(R.id.switch_sound);
        vibrateSwitch = (SwitchButton) findViewById(R.id.switch_vibrate);
        speakerSwitch = (SwitchButton) findViewById(R.id.switch_speaker);
        ownerLeaveSwitch = (SwitchButton) findViewById(R.id.switch_owner_leave);
        switch_delete_msg_when_exit_group = (SwitchButton) findViewById(R.id.switch_delete_msg_when_exit_group);
        switch_auto_accept_group_invitation = (SwitchButton) findViewById(R.id.switch_auto_accept_group_invitation);
        switch_adaptive_video_encode = (SwitchButton) findViewById(R.id.switch_adaptive_video_encode);
        llChange = (LinearLayout) findViewById(R.id.ll_change);
        ll_new_msg = (LinearLayout) findViewById(R.id.ll_new_msg);
        ll_numal_set = (LinearLayout) findViewById(R.id.ll_numal_set);
        rl_logout = (RelativeLayout) findViewById(R.id.rl_logout);

        textview1 = (TextView) findViewById(R.id.textview1);
        textview2 = (TextView) findViewById(R.id.textview2);

        blacklistContainer = (LinearLayout) findViewById(R.id.ll_black_list);
        userProfileContainer = (LinearLayout) findViewById(R.id.ll_user_profile);
        llDiagnose = (LinearLayout) findViewById(R.id.ll_diagnose);
        pushNick = (LinearLayout) findViewById(R.id.ll_set_push_nick);
        view_devider = findViewById(R.id.view_devider);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ll_change: //新消息设置
                if (ll_new_msg.getVisibility() == View.GONE) {
                    ll_new_msg.setVisibility(View.VISIBLE);
                    view_devider.setVisibility(View.GONE);
                } else {
                    ll_new_msg.setVisibility(View.GONE);
                    view_devider.setVisibility(View.VISIBLE);
                }
                break;
            case R.id.rl_switch_notification:
                if (notifiSwitch.isSwitchOpen()) {
                    notifiSwitch.closeSwitch();
                    rl_switch_sound.setVisibility(View.GONE);
                    rl_switch_vibrate.setVisibility(View.GONE);
                    textview1.setVisibility(View.GONE);
                    textview2.setVisibility(View.GONE);
                    settingsModel.setSettingMsgNotification(false);
                } else {
                    notifiSwitch.openSwitch();
                    rl_switch_sound.setVisibility(View.VISIBLE);
                    rl_switch_vibrate.setVisibility(View.VISIBLE);
                    textview1.setVisibility(View.VISIBLE);
                    textview2.setVisibility(View.VISIBLE);
                    settingsModel.setSettingMsgNotification(true);
                }
                break;
            case R.id.rl_switch_sound:
                if (soundSwitch.isSwitchOpen()) {
                    soundSwitch.closeSwitch();
                    settingsModel.setSettingMsgSound(false);
                } else {
                    soundSwitch.openSwitch();
                    settingsModel.setSettingMsgSound(true);
                }
                break;
            case R.id.rl_switch_vibrate:
                if (vibrateSwitch.isSwitchOpen()) {
                    vibrateSwitch.closeSwitch();
                    settingsModel.setSettingMsgVibrate(false);
                } else {
                    vibrateSwitch.openSwitch();
                    settingsModel.setSettingMsgVibrate(true);
                }
                break;
            case R.id.rl_switch_speaker:
                if (speakerSwitch.isSwitchOpen()) {
                    speakerSwitch.closeSwitch();
                    settingsModel.setSettingMsgSpeaker(false);
                } else {
                    speakerSwitch.openSwitch();
                    settingsModel.setSettingMsgSpeaker(true);
                }
                break;
            case R.id.rl_switch_chatroom_owner_leave:
                if (ownerLeaveSwitch.isSwitchOpen()) {
                    ownerLeaveSwitch.closeSwitch();
                    settingsModel.allowChatroomOwnerLeave(false);

                } else {
                    ownerLeaveSwitch.openSwitch();
                    settingsModel.allowChatroomOwnerLeave(true);
                }
                break;
            case R.id.rl_switch_delete_msg_when_exit_group:
                if (switch_delete_msg_when_exit_group.isSwitchOpen()) {
                    switch_delete_msg_when_exit_group.closeSwitch();
                    settingsModel.setDeleteMessagesAsExitGroup(false);
                } else {
                    switch_delete_msg_when_exit_group.openSwitch();
                    settingsModel.setDeleteMessagesAsExitGroup(true);
                }
                break;
            case R.id.rl_switch_auto_accept_group_invitation:
                if (switch_auto_accept_group_invitation.isSwitchOpen()) {
                    switch_auto_accept_group_invitation.closeSwitch();
                    settingsModel.setAutoAcceptGroupInvitation(false);
                } else {
                    switch_auto_accept_group_invitation.openSwitch();
                    settingsModel.setAutoAcceptGroupInvitation(true);
                }
                break;
            case R.id.rl_switch_adaptive_video_encode:
                if (switch_adaptive_video_encode.isSwitchOpen()) {
                    switch_adaptive_video_encode.closeSwitch();
                    settingsModel.setAdaptiveVideoEncode(false);
                } else {
                    switch_adaptive_video_encode.openSwitch();
                    settingsModel.setAdaptiveVideoEncode(true);
                }
                break;
            case R.id.rl_logout:
//                logout();
                logOutDialog();
                break;
            case R.id.ll_black_list:
                // startActivity(new Intent(SettingsActivity.this, BlacklistActivity.class));
                break;
            case R.id.ll_diagnose:
                //    startActivity(new Intent(SettingsActivity.this, DiagnoseActivity.class));
                break;
            case R.id.ll_set_push_nick:
                //   startActivity(new Intent(SettingsActivity.this, OfflinePushNickActivity.class));
                break;
            case R.id.ll_user_profile:
//                startActivity(new Intent(SettingsActivity.this, UserProfileActivity.class).putExtra("setting", true)
//                        .putExtra("username", EMClient.getInstance().getCurrentUser()));
                break;
            case R.id.rl_update: //检查更新
                getAppUpdate();
                break;
            //rl_keep_live,re_resetpassword
            case R.id.re_resetpassword: //重置密码
                startActivity(new Intent(SettingsActivity.this, PasswordResetActivity.class).putExtra("isReset", true));
                break;
            case R.id.rl_keep_live: //后台保活
                Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
                startActivity(intent);
                break;
            case R.id.rl_about_us:
                break;
            default:
                break;
        }

    }

    private void logOutDialog() {
        HTAlertDialog dialog = new HTAlertDialog(this, null, new String[]{getString(R.string.exit_this_user), getString(R.string.close_app)});
        dialog.init(new HTAlertDialog.OnItemClickListner() {
            @Override
            public void onClick(int position) {
                switch (position) {
                    case 0:
                        logout();
                        break;
                    case 1:
                        HTApp.getInstance().finishActivities();
                        //杀死该应用进程
                        android.os.Process.killProcess(android.os.Process.myPid());
                        System.exit(0);
                        break;
                }
            }
        });
    }


    void logout() {
        final ProgressDialog pd = new ProgressDialog(SettingsActivity.this);
        String st = getResources().getString(R.string.Are_logged_out);
        pd.setMessage(st);
        pd.setCanceledOnTouchOutside(false);
        pd.show();

        HTClient.getInstance().logout(new HTClient.HTCallBack() {
            @Override
            public void onSuccess() {
                pd.dismiss();
                HTApp.getInstance().setUserJson(null);
                HTApp.getInstance().finishActivities();

                startActivity(new Intent(SettingsActivity.this, LoginActivity.class));
                finish();

            }

            @Override
            public void onError() {
                pd.dismiss();
                Toast.makeText(getApplicationContext(), R.string.logout_failed, Toast.LENGTH_SHORT).show();
            }
        });


//        HTClientManager.getInstance().logout(new HTClientManager.LogoutCallBack() {
//            @Override
//            public void onSuccess() {
//
//                HTApp.getInstance().finishActivities();
//                runOnUiThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        pd.dismiss();
//                        startActivity(new Intent(SettingsActivity.this, LoginActivity.class));
//                        finish();
//                    }
//                });
//
//            }
//
//            @Override
//            public void onFailure(String errorMessage) {
//
//            }
//        });
//
//
    }

    public void back(View view) {
        finish();
    }

    /**
     * 获取VersionCode
     *
     * @return 当前应用的VersionCode
     */
    public String getVersionCode() {
        try {
            PackageManager manager = getPackageManager();
            PackageInfo info = manager.getPackageInfo(getPackageName(), 0);
            String version = String.valueOf(info.versionCode);
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private void getAppUpdate() {
        final ProgressDialog dialog = new ProgressDialog(SettingsActivity.this);
        dialog.setMessage(getString(R.string.are_checking_update));
        dialog.show();
        final String version = getVersionCode();
        List<Param> params = new ArrayList<>();
        params.add(new Param("system", "0"));
        new OkHttpUtils(SettingsActivity.this).post(params, HTConstant.URL_CHECK_UPDATE, new OkHttpUtils.HttpCallBack() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                if (jsonObject != null) {
                    String serviceVersion = jsonObject.getString("newVersion");
                    String url = jsonObject.getString("url");
                    String info = jsonObject.getString("info");
                    String statue = jsonObject.getString("statue");
                    if (!version.equals(serviceVersion) && (Integer.valueOf(version) < Integer.valueOf(serviceVersion))) {
                        showUpdateDialog(SettingsActivity.this, getString(R.string.has_update), info, url);
                    } else {
                        Toast.makeText(SettingsActivity.this, R.string.just_new_version, Toast.LENGTH_SHORT).show();
                    }
                }
                dialog.dismiss();
            }

            @Override
            public void onFailure(String errorMsg) {
                dialog.dismiss();
            }
        });
    }

    private void showUpdateDialog(final Context context, String title, String message, final String url) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        View dialogView = View.inflate(context, R.layout.layout_alert_dialog_delete, null);
        TextView tv_delete_people = (TextView) dialogView.findViewById(R.id.tv_delete_people);
        TextView tv_delete_title = (TextView) dialogView.findViewById(R.id.tv_delete_title);
        TextView tv_cancle = (TextView) dialogView.findViewById(R.id.tv_cancle);
        TextView tv_ok = (TextView) dialogView.findViewById(R.id.tv_ok);
        tv_delete_title.setText(title);
        tv_delete_people.setText(message);
        tv_cancle.setText(R.string.update_later);
        tv_ok.setText(R.string.update_now);
        builder.setView(dialogView);
        final AlertDialog dialog = builder.show();
//        dialog.setCancelable(false);//点击屏幕外不取消  返回键也没用
//        dialog.setCanceledOnTouchOutside(false); //点击屏幕外取消,返回键有用
        tv_cancle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        tv_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                Uri uri = Uri.parse(url);
                intent.setData(uri);
                SettingsActivity.this.startActivity(intent);
            }
        });
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/ShowBigImageActivity.java
================================================
/**
 * Copyright (C) 2016 Hyphenate Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.htmessage.yichatopen.activity;

import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;


import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.widget.photoview.PhotoView;

import java.io.File;

/**
 * download and show original image
 * 
 */
public class ShowBigImageActivity extends  BaseActivity {

	private PhotoView image;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		setContentView(R.layout.activity_show_big_image);
		super.onCreate(savedInstanceState);
        String localPath=this.getIntent().getStringExtra("localPath");
		Uri uri=Uri.fromFile(new File(localPath));
		image = (PhotoView) findViewById(R.id.image);
//		image.setImageURI(uri);
		Glide.with(ShowBigImageActivity.this).load(uri.getPath()).diskCacheStrategy(DiskCacheStrategy.ALL).error(R.drawable.default_image).into(image);
		image.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
	}


	@Override
	public void onBackPressed() {
		setResult(RESULT_OK);
		finish();
	}
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/SplashActivity.java
================================================
package com.htmessage.yichatopen.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.RelativeLayout;
import com.htmessage.yichatopen.R;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.yichatopen.activity.login.LoginActivity;
import com.htmessage.yichatopen.activity.main.MainActivity;
import com.htmessage.yichatopen.utils.UpdateLastLoginTimeUtils;

/**
 * 开屏页
 *
 */
public class SplashActivity extends  Activity {
    //继承Activity是为动画启动前无白屏卡顿
	@Override
	protected void onCreate(Bundle arg0) {
 		super.onCreate(arg0);
		setContentView(R.layout.activity_splash);
		RelativeLayout rootLayout = (RelativeLayout) findViewById(R.id.splash_root);
		AlphaAnimation animation = new AlphaAnimation(0.5f, 1.0f);
		animation.setDuration(2000);
		rootLayout.startAnimation(animation);
		animation.setAnimationListener(new Animation.AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {

			}

			@Override
			public void onAnimationEnd(Animation animation) {
				if (HTClient.getInstance().isLogined()) {
					//上传最近登录时间
					UpdateLastLoginTimeUtils.sendLocalTimeToService(SplashActivity.this);
			    	Intent intent=new Intent(SplashActivity.this, MainActivity.class);
 					startActivity(intent);
					finish();
				}else {
					startActivity(new Intent(SplashActivity.this, LoginActivity.class));
					finish();
				}
			}

			@Override
			public void onAnimationRepeat(Animation animation) {

			}
		});
	}
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/end/AddFriendsFinalActivity.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.end;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.text.Selection;
import android.text.Spannable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Toast;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.BaseActivity;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.sdk.ChatType;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.manager.HTChatManager;
import com.htmessage.sdk.model.CmdMessage;

import java.util.UUID;
public class AddFriendsFinalActivity extends BaseActivity {
     private   ProgressDialog progressDialog;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addfriends_final);
        String userInfo = getIntent().getStringExtra(HTConstant.KEY_USER_INFO);
        JSONObject jsonObject = null;
        try {
            jsonObject = JSONObject.parseObject(userInfo);
        } catch (JSONException e) {
        }
        if (jsonObject == null) {
            finish();
            return;
        }
        initView(jsonObject);

    }


    private void initView(final JSONObject jsonObject) {
        final EditText etReason = (EditText) this.findViewById(R.id.et_reason);
        etReason.setText(getString(R.string.i_am)+HTApp.getInstance().getUserJson().getString(HTConstant.JSON_KEY_NICK));
        if (etReason.getText() instanceof Spannable) {
            Spannable spanText = (Spannable)etReason.getText();
            Selection.setSelection(spanText, etReason.getText().length());
        }
        findViewById(R.id.tv_send).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                addContact(jsonObject.getString(HTConstant.JSON_KEY_HXID), etReason.getText().toString().trim());
            }

        });
    }

    /**
     * 添加contact
     *
     * @param
     */
    public void addContact(final String hxid, String reason) {
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage(getResources().getString(R.string.Is_sending_a_request));
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
        JSONObject userJson = HTApp.getInstance().getUserJson();
        JSONObject data = new JSONObject();
        data.put("ADD_REASON", reason);
        data.put("userId", userJson.getString("userId"));
        data.put("nick",userJson.getString("nick"));
        data.put("avatar", userJson.getString("avatar"));
        data.put("role",userJson.getString(HTConstant.JSON_KEY_ROLE));
        data.put("teamId",userJson.getString("teamId"));
        JSONObject bodyJson = new JSONObject();
        bodyJson.put("action", 1000);
        bodyJson.put("data", data);

        CmdMessage customMessage = new CmdMessage();
        customMessage.setBody(bodyJson.toJSONString());
        customMessage.setFrom(HTApp.getInstance().getUsername());
        customMessage.setTime(System.currentTimeMillis());
        customMessage.setTo(hxid);
         customMessage.setMsgId( UUID.randomUUID().toString());
        customMessage.setChatType(ChatType.singleChat);
        HTClient.getInstance().chatManager().sendCmdMessage(customMessage, new HTChatManager.HTMessageCallBack() {
            @Override
            public void onProgress() {

            }

            @Override
            public void onSuccess() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (progressDialog != null) {
                            progressDialog.dismiss();
                        }
                        Toast.makeText(AddFriendsFinalActivity.this,
                                R.string.send_successful, Toast.LENGTH_SHORT)
                                .show();
                        finish();
                    }
                });
            }

            @Override
            public void onFailure() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (progressDialog != null) {
                            progressDialog.dismiss();
                        }
                        Toast.makeText(AddFriendsFinalActivity.this,
                                getResources().getString( R.string.Request_add_buddy_failure), Toast.LENGTH_SHORT)
                                .show();
                        finish();
                    }
                });
            }
        });
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextBasePrestener.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.next;

import com.htmessage.yichatopen.activity.BasePresenter;

/**
 * 项目名称:HTOpen
 * 类描述:AddFriendNextBasePrestener 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/7 17:22
 * 邮箱:814326663@qq.com
 */
public interface AddFriendNextBasePrestener  extends BasePresenter {
    void searchUser();
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextFragment.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.next;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.main.details.UserDetailsActivity;
import com.htmessage.yichatopen.HTConstant;

/**
 * 项目名称:HTOpen
 * 类描述:AddFriendNextFragment 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/7 17:33
 * 邮箱:814326663@qq.com
 */
public class AddFriendNextFragment extends Fragment implements AddFriendNextView ,TextWatcher,View.OnClickListener{
    private RelativeLayout re_search;
    private TextView tv_search;
    private EditText et_search;
    private AddFriendNextPrestener prestener;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View nextView = inflater.inflate(R.layout.activity_addfriends_next, container, false);
        initView(nextView);
        setListener();
        return nextView;
    }

    private void initView(View nextView) {
        re_search = (RelativeLayout) nextView.findViewById(R.id.re_search);
        tv_search = (TextView) nextView.findViewById(R.id.tv_search);
        et_search = (EditText) nextView.findViewById(R.id.et_search);
    }

    private void setListener() {
        et_search.addTextChangedListener(this);
        re_search.setOnClickListener(this);
    }

    @Override
    public String getInputString() {
        return et_search.getText().toString().trim();
    }

    @Override
    public void onSearchSuccess(JSONObject object) {
        getBaseActivity().startActivity(new Intent(getBaseActivity(), UserDetailsActivity.class).putExtra(HTConstant.KEY_USER_INFO,object.toJSONString()));
    }

    @Override
    public void onSearchFailed(String error) {
        Toast.makeText(getBaseContext(), error,
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void setPresenter(AddFriendNextPrestener presenter) {
        this.prestener = presenter;
    }

    @Override
    public Context getBaseContext() {
        return getContext();
    }

    @Override
    public Activity getBaseActivity() {
        return getActivity();
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (s.length() > 0) {
            re_search.setVisibility(View.VISIBLE);
            tv_search.setText(et_search.getText().toString().trim());
        } else {
            re_search.setVisibility(View.GONE);
            tv_search.setText("");
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    public void back(View view) {
        getBaseActivity().finish();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.re_search:
                prestener.searchUser();
                break;
        }
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextPrestener.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.next;

import android.app.ProgressDialog;
import android.text.TextUtils;
import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.utils.OkHttpUtils;
import com.htmessage.yichatopen.utils.Param;
import java.util.ArrayList;
import java.util.List;

/**
 * 项目名称:HTOpen
 * 类描述:AddFriendNextPrestener 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/7 17:23
 * 邮箱:814326663@qq.com
 */
public class AddFriendNextPrestener implements AddFriendNextBasePrestener {
    private AddFriendNextView nextView;

    public AddFriendNextPrestener(AddFriendNextView nextView) {
        this.nextView = nextView;
        this.nextView.setPresenter(this);
    }

    @Override
    public void searchUser() {
        if (TextUtils.isEmpty(nextView.getInputString())){
            return;
        }
        final ProgressDialog dialog = new ProgressDialog(nextView.getBaseContext());
        dialog.setMessage(nextView.getBaseContext().getString(R.string.are_finding_contact));
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();
        List<Param> paramList=new ArrayList<>();
        paramList.add(new Param("userId", nextView.getInputString()));
        new OkHttpUtils(nextView.getBaseContext()).post(paramList, HTConstant.URL_Search_User, new OkHttpUtils.HttpCallBack() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                dialog.dismiss();
                int code = jsonObject.getInteger("code");
                if (code == 1) {
                    JSONObject json = jsonObject.getJSONObject("user");
                    nextView.onSearchSuccess(json);
                } else if (code == -1) {
                    nextView.onSearchFailed(nextView.getBaseContext().getString(R.string.User_does_not_exis));
                } else if (code == 0) {
                    nextView.onSearchFailed(nextView.getBaseContext().getString(R.string.server_is_busy_try_again));
                } else {
                    nextView.onSearchFailed(nextView.getBaseContext().getString(R.string.server_is_busy_try_again));
                }
            }

            @Override
            public void onFailure(String errorMsg) {
                nextView.onSearchFailed(errorMsg);
            }
        });
    }

    @Override
    public void start() {

    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextView.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.next;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.activity.BaseView;

/**
 * 项目名称:HTOpen
 * 类描述:AddFriendNextView 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/7 17:24
 * 邮箱:814326663@qq.com
 */
public interface AddFriendNextView extends BaseView<AddFriendNextPrestener>{
    String getInputString();
    void onSearchSuccess(JSONObject object);
    void onSearchFailed(String error);
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendsNextActivity.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.next;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.BaseActivity;


public class AddFriendsNextActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_input);
        AddFriendNextFragment fragment = (AddFriendNextFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
        if (fragment == null){
            fragment = new AddFriendNextFragment();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.add(R.id.contentFrame,fragment);
            transaction.commit();
        }
        new AddFriendNextPrestener(fragment);
    }
}

================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/pre/AddFriendsPreActivity.java
================================================
package com.htmessage.yichatopen.activity.addfriends.add.pre;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.alibaba.fastjson.JSONObject;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.BaseActivity;
import com.htmessage.yichatopen.activity.main.qrcode.QrCodeActivity;
import com.htmessage.yichatopen.activity.ScanCaptureActivity;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.activity.addfriends.add.next.AddFriendsNextActivity;

public class AddFriendsPreActivity extends BaseActivity implements OnClickListener{
    private TextView tv_search,tv_fxid;
    private RelativeLayout rl_leida,rl_jianqun,rl_sacn,rl_lianxiren,rl_ggh;
    private ImageView iv_scode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addfriends_pre);
        initUI();
        setOnClick();
    }

    private void initUI() {
        tv_search = (TextView) findViewById(R.id.tv_search);
        tv_fxid = (TextView) findViewById(R.id.tv_fxid);
        rl_leida = (RelativeLayout) findViewById(R.id.rl_leida);
        rl_jianqun = (RelativeLayout) findViewById(R.id.rl_jianqun);
        rl_sacn = (RelativeLayout) findViewById(R.id.rl_sacn);
        rl_lianxiren = (RelativeLayout) findViewById(R.id.rl_lianxiren);
        rl_ggh = (RelativeLayout) findViewById(R.id.rl_ggh);
        iv_scode = (ImageView) findViewById(R.id.iv_scode);

        JSONObject userJson = HTApp.getInstance().getUserJson();
        if (userJson!=null){
            String fxid = userJson.getString(HTConstant.JSON_KEY_FXID);
            if (!TextUtils.isEmpty(fxid)){
                tv_fxid.setText(getString(R.string.me_yichat_number)+fxid);
            }else{
                tv_fxid.setText(getString(R.string.me_yichat_number)+getString(R.string.not_set));
            }
        }
    }
    private void setOnClick() {
        tv_search.setOnClickListener(this);
        rl_leida.setOnClickListener(this);
        rl_jianqun.setOnClickListener(this);
        rl_sacn.setOnClickListener(this);
        rl_lianxiren.setOnClickListener(this);
        rl_ggh.setOnClickListener(this);
        iv_scode.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.tv_search:
                startActivity(new Intent(AddFriendsPreActivity.this,AddFriendsNextActivity.class));
                break;
            case R.id.rl_leida:
//                startActivity(new Intent(AddFriendsPreActivity.this,RadarActivity.class));
                break;
            case R.id.rl_jianqun:

                break;
            case R.id.rl_sacn:
                startActivity(new Intent(AddFriendsPreActivity.this,ScanCaptureActivity.class));
                break;
            case R.id.rl_lianxiren:

                break;
            case R.id.rl_ggh:

                break;
            case R.id.iv_scode:
                startActivity(new Intent(AddFriendsPreActivity.this,QrCodeActivity.class));
                break;
        }
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendBasePresenter.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import android.content.Context;
import com.htmessage.yichatopen.domain.InviteMessage;
import com.htmessage.yichatopen.activity.BasePresenter;
import java.util.List;

/**
 * 项目名称:yichat0504
 * 类描述:NewFriendBasePresenter 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/4 9:40
 * 邮箱:814326663@qq.com
 */
public interface NewFriendBasePresenter extends BasePresenter{
    List<InviteMessage> getAllInviteMessage();
    void registerRecivier();
    void startActivity(Context context, Class clazz);
    void saveUnreadMessageCount(int count);
    void refresh();
    void onDestory();
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendFragment.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.addfriends.add.next.AddFriendsNextActivity;
import com.htmessage.yichatopen.activity.addfriends.add.pre.AddFriendsPreActivity;

/**
 * 项目名称:yichat0504
 * 类描述:NewFriendFragment 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/4 17:17
 * 邮箱:814326663@qq.com
 */
public class NewFriendFragment extends Fragment implements NewFriendView,View.OnClickListener{
    private ListView listView;
    private TextView et_search, tv_add;
    private NewFriendsAdapter adapter;
    private NewFriendPrestener friendPrestener;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View friendView = inflater.inflate(R.layout.activity_new_friends, container, false);
        initView(friendView);
        initData();
        setListener();
        return friendView;
    }

    private void initData() {
        friendPrestener.registerRecivier();
//         设置adapter
        adapter = new NewFriendsAdapter(getBaseContext(),friendPrestener.getAllInviteMessage());
        listView.setAdapter(adapter);
        friendPrestener.saveUnreadMessageCount(0);
    }

    private void initView(View view) {
        listView = (ListView) view.findViewById(R.id.listview);
        et_search = (TextView) view.findViewById(R.id.et_search);
        tv_add = (TextView) view.findViewById(R.id.tv_add);
    }

    private void setListener() {
        et_search.setOnClickListener(this);
        tv_add.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.et_search:
                friendPrestener.startActivity(getBaseActivity(),
                        AddFriendsNextActivity.class);
                break;
            case R.id.tv_add:
                friendPrestener.startActivity(getBaseActivity(),
                        AddFriendsPreActivity.class);
                break;
        }
    }

    @Override
    public void refresh() {
        friendPrestener.refresh();
        adapter.notifyDataSetChanged();
        friendPrestener.saveUnreadMessageCount(0);
    }

    @Override
    public void setPresenter(NewFriendPrestener presenter) {
        this.friendPrestener = presenter;
    }

    @Override
    public Context getBaseContext() {
        return getContext();
    }

    @Override
    public Activity getBaseActivity() {
        return getActivity();
    }

    @Override
    public void onDestroy() {
        friendPrestener.onDestory();
        super.onDestroy();
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendPrestener.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;

import com.htmessage.yichatopen.IMAction;
import com.htmessage.yichatopen.domain.InviteMessage;
import com.htmessage.yichatopen.domain.InviteMessgeDao;
import java.util.List;

/**
 * 项目名称:yichat0504
 * 类描述:NewFriendPrestener 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/4 9:48
 * 邮箱:814326663@qq.com
 */
public class NewFriendPrestener implements NewFriendBasePresenter {
    private NewFriendView newFriendView;
    private InviteMessgeDao dao;
    private NewFriendRecivier friendRecivier;
    private List<InviteMessage> allInviteMessage;

    public NewFriendPrestener(NewFriendView newFriendView) {
        this.newFriendView = newFriendView;
        this.newFriendView.setPresenter(this);
        dao = new InviteMessgeDao(newFriendView.getBaseContext());
        allInviteMessage = dao.getMessagesList();
    }

    @Override
    public List<InviteMessage> getAllInviteMessage() {
        return allInviteMessage;
    }

    @Override
    public void registerRecivier() {
        friendRecivier = new NewFriendRecivier();
        IntentFilter intent = new IntentFilter(IMAction.ACTION_INVITE_MESSAGE);
        LocalBroadcastManager.getInstance(newFriendView.getBaseContext()).registerReceiver(friendRecivier, intent);
    }

    @Override
    public void startActivity(Context context, Class clazz) {
        newFriendView.getBaseActivity().startActivity(new Intent(context, clazz));
    }

    private void unRegisterRecivier() {
        if (friendRecivier != null) {
            LocalBroadcastManager.getInstance(newFriendView.getBaseContext()).unregisterReceiver(friendRecivier);
        }
    }

    @Override
    public void saveUnreadMessageCount(int count) {
        dao.saveUnreadMessageCount(count);
    }

    @Override
    public void refresh() {
        allInviteMessage.clear();
        if (dao == null){
            dao = new InviteMessgeDao(newFriendView.getBaseContext());
        }
        allInviteMessage.addAll(dao.getMessagesList());
    }

    @Override
    public void onDestory() {
        unRegisterRecivier();
        newFriendView = null;
    }


    @Override
    public void start() {

    }
    private class NewFriendRecivier extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (IMAction.ACTION_INVITE_MESSAGE.equals(intent.getAction())) {
                newFriendView.refresh();
            }
        }
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendView.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import com.htmessage.yichatopen.activity.BaseView;

/**
 * 项目名称:yichat0504
 * 类描述:NewFriendView 描述:
 * 创建人:songlijie
 * 创建时间:2017/7/4 9:49
 * 邮箱:814326663@qq.com
 */
public interface NewFriendView extends BaseView<NewFriendPrestener> {
        void refresh();
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsActivity.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.addfriends.add.next.AddFriendsNextActivity;
import com.htmessage.yichatopen.activity.BaseActivity;

/**
 * 申请与通知
 */
public class NewFriendsActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        setTitle(R.string.new_friend);
        NewFriendFragment newFriendFragment =
                (NewFriendFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
        if (newFriendFragment == null) {
            // Create the fragment
            newFriendFragment =new  NewFriendFragment();
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.add(R.id.contentFrame, newFriendFragment);
            transaction.commit();
        }
        final NewFriendPrestener presenter=new NewFriendPrestener(newFriendFragment);
        showRightView(R.drawable.add_icon, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(NewFriendsActivity.this,
                        AddFriendsNextActivity.class));
            }
        });
    }

    public void back(View v) {
        setResult(Activity.RESULT_OK);
        finish();
    }

    @Override
    public void onBackPressed() {
        setResult(Activity.RESULT_OK);
        finish();
        super.onBackPressed();
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsAdapter.java
================================================
package com.htmessage.yichatopen.activity.addfriends.newfriend;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.IMAction;
import com.htmessage.yichatopen.activity.main.details.UserDetailsActivity;
import com.htmessage.yichatopen.manager.ContactsManager;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.domain.InviteMessgeDao;
import com.htmessage.yichatopen.domain.User;
import com.htmessage.yichatopen.domain.UserDao;
import com.htmessage.yichatopen.domain.InviteMessage;
import com.htmessage.yichatopen.domain.InviteMessage.Status;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.utils.CommonUtils;
import com.htmessage.yichatopen.utils.OkHttpUtils;
import com.htmessage.yichatopen.utils.Param;
import com.htmessage.sdk.ChatType;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.manager.HTChatManager;
import com.htmessage.sdk.model.CmdMessage;
import com.htmessage.yichatopen.widget.HTAlertDialog;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class NewFriendsAdapter extends BaseAdapter {
    private Context context;
    private List<InviteMessage> msgs;
    private InviteMessgeDao messgeDao;
    int total = 0;

    public NewFriendsAdapter(Context _context, List<InviteMessage> msgs) {
        this.context = _context;
        this.msgs = msgs;
        messgeDao = new InviteMessgeDao(context);
        total = msgs.size();
    }

    @Override
    public int getCount() {
        return msgs.size();
    }

    @Override
    public InviteMessage getItem(int position) {
        return msgs.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.item_newfriend_msg, null);

        }
        ViewHolder holder = (ViewHolder) convertView.getTag();
        if (holder == null) {
            holder = new ViewHolder();
            holder.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar);
            holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            holder.tv_reason = (TextView) convertView.findViewById(R.id.tv_reason);
            holder.tv_added = (TextView) convertView.findViewById(R.id.tv_added);
            holder.btn_add = (Button) convertView.findViewById(R.id.btn_add);
            holder.rl_item_add = (RelativeLayout) convertView.findViewById(R.id.rl_item_add);
            convertView.setTag(holder);
        }


//        final InviteMessage msg = getItem(total - 1 - position);
        final InviteMessage msg = getItem(position);
//        String reason = context.getString(R.string.request_add_friend);
        String reason = context.getString(R.string.Reasons);
        String nick = msg.getFrom();
        JSONObject userInfo = null;
        try {
            userInfo = JSONObject.parseObject(msg.getReason());
            Log.d("slj", "----获取好友信息:" + userInfo.toJSONString());
            if (userInfo != null) {
                nick = userInfo.getString("nick");
                String avatar = userInfo.getString("avatar");
                if (!TextUtils.isEmpty(avatar)) {
                    if (!avatar.contains("http")) {
                        avatar = HTConstant.URL_AVATAR + avatar;
                    }
                }
                Glide.with(context).load(avatar).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.default_avatar).into(holder.iv_avatar);
                //TODO  在申请消息的jsonobject里面是传有申请理由的,后续开发者可以按照需求处理这个申请理由
                String reasonTemp = userInfo.getString(HTConstant.CMD_ADD_REASON);
                if (!TextUtils.isEmpty(reasonTemp)) {
                    reason = reason + reasonTemp;
                } else {
                    reason = context.getString(R.string.Request_to_add_you_as_a_friend);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        holder.tv_name.setText(nick);
        holder.tv_reason.setText(reason);
        if (msg.getStatus() == InviteMessage.Status.AGREED) {
            holder.tv_added.setVisibility(View.VISIBLE);
            holder.btn_add.setVisibility(View.GONE);
        } else if (msg.getStatus() == InviteMessage.Status.REFUSED) {
            holder.tv_added.setText(context.getString(R.string.Refused));
            holder.tv_added.setVisibility(View.VISIBLE);
            holder.btn_add.setVisibility(View.GONE);
        } else if (msg.getStatus() == InviteMessage.Status.BEREFUSED) {
            holder.tv_added.setText(context.getString(R.string.has_rejected));
            holder.tv_reason.setText(context.getString(R.string.already_rejected));
            holder.tv_added.setVisibility(View.VISIBLE);
            holder.btn_add.setVisibility(View.GONE);
        } else if (msg.getStatus() == InviteMessage.Status.BEAGREED) {
            holder.tv_reason.setText(context.getString(R.string.Has_agreed_to_your_friend_request));
            holder.tv_added.setVisibility(View.VISIBLE);
            holder.btn_add.setVisibility(View.GONE);
        } else {
            holder.tv_added.setVisibility(View.GONE);
            holder.btn_add.setVisibility(View.VISIBLE);
            holder.btn_add.setTag(msg);
            final ViewHolder finalHolder = holder;
            final JSONObject finalUserInfo = userInfo;
            if (finalUserInfo != null) {
                holder.btn_add.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        acceptInvitation(finalHolder.btn_add, msg, finalHolder.tv_added, finalUserInfo);
                    }

                });
            }
        }
        holder.rl_item_add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String from = msg.getFrom();
                context.startActivity(new Intent(context, UserDetailsActivity.class).putExtra(HTConstant.JSON_KEY_HXID,from));
            }
        });
        holder.rl_item_add.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                deleteInviteMessge(msg);
                return true;
            }
        });
        return convertView;
    }

    private static class ViewHolder {
        ImageView iv_avatar;
        TextView tv_name;
        TextView tv_reason;
        TextView tv_added;
        Button btn_add;
        RelativeLayout rl_item_add;
    }

    /**
     * 同意好友请求
     *
     * @param button
     * @param
     */
    private void acceptInvitation(final Button button, final InviteMessage msg,
                                  final TextView textview, final JSONObject userInfo) {
        final ProgressDialog pd = new ProgressDialog(context);
        pd.setMessage(context.getString(R.string.Are_agree_with));
        pd.setCanceledOnTouchOutside(false);
        pd.show();
        List<Param> params = new ArrayList<>();
        params.add(new Param("userId", msg.getFrom()));
        new OkHttpUtils(context).post(params, HTConstant.URL_ADD_FRIEND, new OkHttpUtils.HttpCallBack() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                int code = jsonObject.getInteger("code");
                switch (code){
                    case 1:
                        User user = CommonUtils.Json2User(userInfo);
                        // 存入内存
                        ContactsManager.getInstance().getContactList().put(user.getUsername(), user);
                        // 存入db
                        UserDao dao = new UserDao(context);
                        dao.saveContact(user);
                        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(IMAction.ACTION_CONTACT_CHANAGED));
                        sendCmdAgreeMsg(button, msg, textview, pd);
                        break;
                    default:
                        pd.dismiss();
                        Toast.makeText(context,
                                context.getString(R.string.add_friend_failed), Toast.LENGTH_SHORT)
                                .show();
                        break;
                }
            }

            @Override
            public void onFailure(String errorMsg) {
                pd.dismiss();
            }
        });
    }


    private void sendCmdAgreeMsg(final Button button, final InviteMessage msg,
                                 final TextView textview, final ProgressDialog pd) {
        JSONObject userJson = HTApp.getInstance().getUserJson();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("action", 1001);
        JSONObject data = new JSONObject();
        data.put("userId", userJson.getString("userId"));
        data.put("nick", userJson.getString("nick"));
        data.put("avatar",userJson.getString("avatar"));
        data.put("role",userJson.getString(HTConstant.JSON_KEY_ROLE));
        data.put("teamId",userJson.getString("teamId"));
        jsonObject.put("data", data);
        CmdMessage customMessage = new CmdMessage();
        customMessage.setMsgId(UUID.randomUUID().toString());
        customMessage.setFrom(HTApp.getInstance().getUsername());
        customMessage.setTime(System.currentTimeMillis());
        customMessage.setTo(msg.getFrom());
        customMessage.setBody(jsonObject.toJSONString());
        customMessage.setChatType(ChatType.singleChat);
        HTClient.getInstance().chatManager().sendCmdMessage(customMessage, new HTChatManager.HTMessageCallBack() {
            @Override
            public void onProgress() {

            }

            @Override
            public void onSuccess() {
                ((Activity)context).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (pd != null) {
                            pd.dismiss();
                        }
                        Toast.makeText(context, context.getString(R.string.add_friend_success), Toast.LENGTH_SHORT)
                                .show();
                    }
                });

            }

            @Override
            public void onFailure() {
                ((Activity)context).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (pd != null) {
                            pd.dismiss();
                        }
                        Toast.makeText(context,
                              context.getString(R.string.add_friend_failed), Toast.LENGTH_SHORT)
                                .show();
                    }
                });

            }
        });

        textview.setVisibility(View.VISIBLE);
        button.setEnabled(false);
        button.setVisibility(View.GONE);
        msg.setStatus(Status.AGREED);
        // 更新db
        ContentValues values = new ContentValues();
        values.put(InviteMessgeDao.COLUMN_NAME_STATUS, msg
                .getStatus().ordinal());
        messgeDao.updateMessage(msg.getId(), values);

    }

    /**
     * 删除透传消息
     * @param msg
     */
    private void deleteInviteMessge(final InviteMessage msg){
        HTAlertDialog dialog = new HTAlertDialog(context,null,new String[]{context.getString(R.string.delete)});
        dialog.init(new HTAlertDialog.OnItemClickListner() {
            @Override
            public void onClick(int position) {
                switch (position){
                    case 0:
                        msgs.remove(msg);
                        messgeDao.deleteMessage(msg.getFrom());
                        notifyDataSetChanged();
                        break;
                }
            }
        });
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatActivity.java
================================================
package com.htmessage.yichatopen.activity.chat;

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.htmessage.sdk.utils.MessageUtils;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.BaseActivity;
import com.htmessage.yichatopen.manager.MyNotification;
import com.htmessage.yichatopen.domain.User;
import com.htmessage.yichatopen.manager.ContactsManager;
import com.htmessage.yichatopen.activity.chat.activity.ChatSettingActivity;
import com.htmessage.yichatopen.activity.main.MainActivity;
import java.util.List;

/**
 *
 */
public class ChatActivity extends BaseActivity {
    public static ChatActivity activityInstance;
    private ChatFragment chatFragment;
    public String toChatUsername;
    public int chatType;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.activity_base);
        activityInstance = this;
        toChatUsername = getIntent().getExtras().getString("userId");
        chatType = getIntent().getExtras().getInt("chatType", MessageUtils.CHAT_SINGLE);
        if (chatType == MessageUtils.CHAT_SINGLE) {
            User user = ContactsManager.getInstance().getContactList().get(toChatUsername);
            setTitle(user.getNick());
            showRightView(R.drawable.icon_setting_single, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(ChatActivity.this, ChatSettingActivity.class).putExtra("userId", toChatUsername));
                }
            });

        }
        chatFragment = new ChatFragment();
        chatFragment.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().add(R.id.contentFrame, chatFragment).commit();
        MyNotification.getInstance().cancel(Integer.parseInt(toChatUsername));
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        activityInstance = null;
    }

    @Override
    protected void onNewIntent(Intent intent) {

        String username = intent.getStringExtra("userId");
        if (toChatUsername.equals(username))
            super.onNewIntent(intent);
        else {
            finish();
            startActivity(intent);
        }

    }

    @Override
    public void onBackPressed() {
        chatFragment.onBackPressed();
        if (isSingleActivity(this)) {
            Intent intent = new Intent(this, MainActivity.class);
            startActivity(intent);
        }
    }


    public boolean isSingleActivity(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List list = activityManager.getRunningTasks(1);
        return ((ActivityManager.RunningTaskInfo) list.get(0)).numRunning == 1;
    }

    public String getToChatUsername() {
        return toChatUsername;
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatAdapter.java
================================================
package com.htmessage.yichatopen.activity.chat;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.AnimationDrawable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.main.details.UserDetailsActivity;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.activity.chat.weight.VoicePlayClickListener;
import com.htmessage.yichatopen.activity.chat.weight.emoji.SmileUtils;
import com.htmessage.yichatopen.utils.ACache;
import com.htmessage.yichatopen.utils.OkHttpUtils;
import com.htmessage.yichatopen.utils.DateUtils;
 import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.model.HTMessageBody;
import com.htmessage.sdk.model.HTMessageImageBody;
import com.htmessage.sdk.model.HTMessageTextBody;
import com.htmessage.sdk.model.HTMessageVoiceBody;
import com.htmessage.sdk.utils.MessageUtils;
import com.htmessage.sdk.model.HTMessage;
import com.htmessage.yichatopen.utils.PathUtils;
import com.htmessage.yichatopen.utils.ImageUtils;
import com.htmessage.yichatopen.activity.ShowBigImageActivity;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * Created by huangfangyi on 2016/11/24.
 * qq 84543217
 */

public class ChatAdapter extends BaseAdapter {
    private List<HTMessage> msgs;
    private Activity context;
    private LayoutInflater inflater;
    private static final int MESSAGE_TEXT_RECEIVED = 0;
    private static final int MESSAGE_TEXT_SEND = 1;
    private static final int MESSAGE_IMAGE_RECEIVED = 2;
    private static final int MESSAGE_IMAGE_SEND = 3;
    private static final int MESSAGE_VOICE_RECEIVED = 4;
    private static final int MESSAGE_VOICE_SEND = 5;

    private String chatTo;
    private int chatType;
    private List<HTMessage> imageMsgs = new ArrayList<>();
    private ChatFragment fragment;
    public ChatAdapter(List<HTMessage> msgs, ChatFragment fragment, String chatTo, int chatType) {
        this.msgs = msgs;
        this.context = fragment.getActivity();
        this.fragment=fragment;
        inflater = LayoutInflater.from(context);
        this.chatTo = chatTo;
        this.chatType = chatType;
        imageMsgs.clear();
        for (int i = 0; i < msgs.size(); i++) {
            HTMessage emMessage = msgs.get(i);
            if (emMessage.getType() == HTMessage.Type.IMAGE) {
                imageMsgs.add(emMessage);
            }
        }

    }

    @Override
    public int getCount() {
        return msgs.size();
    }

    @Override
    public HTMessage getItem(int position) {
        return msgs.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        HTMessage message = getItem(position);
        return getItemViewType(message);

    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        for (int i = 0; i < msgs.size(); i++) {
            HTMessage emMessage = msgs.get(i);
            if (emMessage.getType() == HTMessage.Type.IMAGE) {
                if (!imageMsgs.contains(emMessage)) {
                    imageMsgs.add(emMessage);
                }
            }
        }

    }

    @Override
    public int getViewTypeCount() {
        return 14;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HTMessage message = getItem(position);
        int viewType = getItemViewType(position);
        if (convertView == null) {
            convertView = getViewByType(viewType, parent);
        }
        ChatViewHolder holder = (ChatViewHolder) convertView.getTag();
        if (holder == null) {
            holder = new ChatViewHolder();
            handleViewAndHolder(viewType, convertView, holder, message);
        }
        handleData(holder, viewType, message, position);

        return convertView;
    }


    private int getItemViewType(HTMessage htMessage) {
        HTMessage.Type type = htMessage.getType();
        if (type == HTMessage.Type.TEXT) {
            return htMessage.getDirect() == HTMessage.Direct.RECEIVE ? MESSAGE_TEXT_RECEIVED : MESSAGE_TEXT_SEND;
        } else if (type == HTMessage.Type.IMAGE) {
            return htMessage.getDirect() == HTMessage.Direct.RECEIVE ? MESSAGE_IMAGE_RECEIVED : MESSAGE_IMAGE_SEND;
        } else if (type == HTMessage.Type.VOICE) {
            return htMessage.getDirect() == HTMessage.Direct.RECEIVE ? MESSAGE_VOICE_RECEIVED : MESSAGE_VOICE_SEND;
        }
        return 0;

    }


    private View getViewByType(int viewType, ViewGroup parent) {
        switch (viewType) {
            case MESSAGE_TEXT_RECEIVED:
                return inflater.inflate(R.layout.row_received_message, parent, false);
            case MESSAGE_IMAGE_RECEIVED:
                return inflater.inflate(R.layout.row_received_picture, parent, false);
            case MESSAGE_VOICE_RECEIVED:
                return inflater.inflate(R.layout.row_received_voice, parent, false);
            case MESSAGE_TEXT_SEND:
                return inflater.inflate(R.layout.row_sent_message, parent, false);
            case MESSAGE_IMAGE_SEND:
                return inflater.inflate(R.layout.row_sent_picture, parent, false);
            case MESSAGE_VOICE_SEND:
                return inflater.inflate(R.layout.row_sent_voice, parent, false);
            default:
                return inflater.inflate(R.layout.row_sent_message, parent, false);
        }
    }


    private void handleViewAndHolder(int viewType, View convertView, ChatViewHolder holder, final HTMessage htMessage) {
        holder.reBubble = (RelativeLayout) convertView.findViewById(R.id.bubble);
        holder.reBubble.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });
        holder.ivAvatar = (ImageView) convertView.findViewById(R.id.iv_userhead);
        holder.timeStamp = (TextView) convertView.findViewById(R.id.timestamp);
        holder.tv_ack_msg = (TextView) convertView.findViewById(R.id.tv_ack_msg);
        holder.tv_delivered = (TextView) convertView.findViewById(R.id.tv_delivered);
        if (htMessage.getDirect() == HTMessage.Direct.RECEIVE) {
            //接收消息,可以显示成员名称
            holder.tvNick = (TextView) convertView.findViewById(R.id.tv_userid);
        } else {
            holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progress_bar);
            holder.ivMsgStatus = (ImageView) convertView.findViewById(R.id.msg_status);
        }

        if (htMessage.getType() == HTMessage.Type.TEXT) {
            holder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent);
        }
        if (viewType == MESSAGE_IMAGE_SEND || viewType == MESSAGE_IMAGE_RECEIVED) {
            holder.ivContent = (ImageView) convertView.findViewById(R.id.image);
        }
        if (viewType == MESSAGE_VOICE_SEND || viewType == MESSAGE_VOICE_RECEIVED) {
            holder.tvDuration = (TextView) convertView.findViewById(R.id.tv_length);
            holder.ivVoice = (ImageView) convertView.findViewById(R.id.iv_voice);
            if (viewType == MESSAGE_VOICE_RECEIVED) {
                holder.ivUnread = (ImageView) convertView.findViewById(R.id.iv_unread_voice);
            }
        }
        if (htMessage.getType() == HTMessage.Type.TEXT) {
            holder.reMain = (RelativeLayout) convertView.findViewById(R.id.re_main);
        }
        holder.ivAvatar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JSONObject jsonObject = htMessage.getAttributes();
                if (jsonObject!=null){
                    context.startActivity(new Intent(context, UserDetailsActivity.class).putExtra(HTConstant.KEY_USER_INFO,jsonObject.toJSONString()));
                }
            }
        });
        convertView.setTag(holder);

    }


    private void handleData(ChatViewHolder holder, int viewType, final HTMessage message, int position) {

        if (message.getDirect() == HTMessage.Direct.SEND && message.getStatus() == HTMessage.Status.FAIL) {
            holder.ivMsgStatus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showReSendDialog(message);
                }
            });
        }
        HTMessageBody htMessageBody = message.getBody();
        if (htMessageBody == null) {
            return;
        }
        if (position == 0) {
            holder.timeStamp.setText(DateUtils.getTimestampString(new Date(message
                    .getTime())));
            holder.timeStamp.setVisibility(View.VISIBLE);
        } else {
            // 两条消息时间离得如果稍长,显示时间
            if (DateUtils.isCloseEnough(message.getTime(), getItem(position - 1).getTime())) {
                holder.timeStamp.setVisibility(View.GONE);
            } else {
                holder.timeStamp.setText(DateUtils.getTimestampString(new Date(
                        message.getTime())));
                holder.timeStamp.setVisibility(View.VISIBLE);
            }
        }

        if (chatType == MessageUtils.CHAT_GROUP && message.getDirect() == HTMessage.Direct.RECEIVE) {
            holder.tvNick.setVisibility(View.VISIBLE);

        } else if (chatType == MessageUtils.CHAT_SINGLE && message.getDirect() == HTMessage.Direct.RECEIVE) {
            holder.tvNick.setVisibility(View.GONE);
        }
        String avatar = message.getStringAttribute(HTConstant.JSON_KEY_AVATAR);
        if (message.getDirect() == HTMessage.Direct.SEND){
            if (message.getFrom().equals(HTApp.getInstance().getUsername())){
                JSONObject userJson = HTApp.getInstance().getUserJson();
                if (userJson.containsKey(HTConstant.JSON_KEY_AVATAR)){
                    avatar = userJson.getString(HTConstant.JSON_KEY_AVATAR);
                }
            }
        }
        Glide.with(context).load(avatar).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.default_avatar).into(holder.ivAvatar);
        HTMessage.Status status = message.getStatus();
        if (message.getDirect() == HTMessage.Direct.SEND) {
            if (status == HTMessage.Status.CREATE) {
                holder.progressBar.setVisibility(View.VISIBLE);
            } else {
                holder.progressBar.setVisibility(View.GONE);
            }
            if (status == HTMessage.Status.FAIL) {
                holder.ivMsgStatus.setVisibility(View.VISIBLE);
            } else {
                holder.ivMsgStatus.setVisibility(View.GONE);
            }
//            if (status == HTMessage.Status.SUCCESS){
//                holder.tv_delivered.setVisibility(View.VISIBLE);
//            } else {
//                holder.tv_delivered.setVisibility(View.INVISIBLE);
//            }
        }
        if (message.getType() == HTMessage.Type.TEXT) {
            int action = message.getIntAttribute("action", 0);
             if (action == 3000) {

            } else if (action == 6001) {
                holder.timeStamp.setVisibility(View.VISIBLE);
                holder.reMain.setVisibility(View.GONE);
                holder.timeStamp.setText(((HTMessageTextBody) htMessageBody).getContent());
            } else {
                holder.reMain.setVisibility(View.VISIBLE);
                holder.tvContent.setText(SmileUtils.getSmiledText(context, ((HTMessageTextBody) htMessageBody).getContent()),
                        TextView.BufferType.SPANNABLE);
            }
        }
        if (message.getType() == HTMessage.Type.IMAGE) {
            showImageView(message, holder, true, false);
        } else if (message.getType() == HTMessage.Type.VOICE) {
            showVoiceView(message, holder);
        }
    }

    private void showImageView(final HTMessage htMessage, ChatViewHolder holder, boolean isReSize, boolean isLocMsg) {
        if (!isReSize) {
            holder.ivContent.setImageResource(R.drawable.ht_location);
        } else {
            holder.ivContent.setImageResource(R.drawable.default_image);
        }
        String localPath = null;
        if (!isLocMsg) {
            HTMessageImageBody htMessageImageBody = (HTMessageImageBody) htMessage.getBody();
            localPath = htMessageImageBody.getLocalPath();
        }
        if (!TextUtils.isEmpty(localPath)) {
            Bitmap bitmap = ACache.get(context.getApplicationContext()).getAsBitmap(htMessage.getMsgId());
            if (bitmap == null) {
                Log.d("bitmap3---->", "null");
                if (new File(localPath).exists()) {
                    bitmap = ImageUtils.decodeScaleImage(localPath);
                    if (bitmap != null) {
                        ACache.get(context.getApplicationContext()).put(htMessage.getMsgId(), bitmap);
                        holder.ivContent.setImageBitmap(bitmap);
                    }
                } else {
                    downLoadImageFromServer(htMessage, holder.ivContent, isReSize, isLocMsg);
                }

            } else {
                holder.ivContent.setImageBitmap(bitmap);
            }
        } else {
            downLoadImageFromServer(htMessage, holder.ivContent, isReSize, isLocMsg);
        }


        final String finalLocalPath = localPath;
        holder.reBubble.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (finalLocalPath == null || !new File(finalLocalPath).exists()) {
                    downLoadBigImageAndOpen(htMessage);
                } else {
                    context.startActivity(new Intent(context, ShowBigImageActivity.class).putExtra("localPath", finalLocalPath));
                }
            }
        });
    }


    private void downLoadImageFromServer(final HTMessage htMessage, final ImageView imageView, boolean isReSize, final boolean isLocMsg) {
        //下载缩略图,显示并且保存至缓存.
        String remotePath = null;
        String fileName = null;
        if (!isLocMsg) {
            HTMessageImageBody htMessageImageBody = (HTMessageImageBody) htMessage.getBody();
            remotePath = htMessageImageBody.getRemotePath();
            fileName = htMessageImageBody.getFileName();
        }
        if (!TextUtils.isEmpty(remotePath)) {
            if (isReSize) {
                remotePath = remotePath + HTConstant.baseImgUrl_set;

            }

            PathUtils pathUtils = new PathUtils(chatTo, context);

            final String filePath = pathUtils.getImagePath().getAbsolutePath() + "/mini" + fileName;
            new OkHttpUtils(context).loadFile(remotePath, filePath, new OkHttpUtils.DownloadCallBack() {
                @Override
                public void onSuccess() {
                    if (new File(filePath).exists()) {

                        final Bitmap bitmap = ImageUtils.decodeScaleImage(filePath);
                        if (!isLocMsg) {

                            HTMessageImageBody htMessageImageBody = (HTMessageImageBody) htMessage.getBody();
                            htMessageImageBody.setLocalPath(filePath);
                            htMessage.setBody(htMessageImageBody);
                        }
                        HTClient.getInstance().messageManager().saveMessage(htMessage, false);
                        ACache.get(context.getApplicationContext()).put(htMessage.getMsgId(), bitmap);

                        ((Activity) context).runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                imageView.setImageBitmap(bitmap);
                            }
                        });
                    }
                }

                @Override
                public void onFailure(String message) {

                }
            });
        }
    }

    private void downLoadBigImageAndOpen(final HTMessage htMessage) {
        final HTMessageImageBody htMessageImageBody = (HTMessageImageBody) htMessage.getBody();

        String remotePath = htMessageImageBody.getRemotePath();
        String fileName = htMessageImageBody.getFileName();
        if (TextUtils.isEmpty(remotePath) || TextUtils.isEmpty(fileName)) {
            return;
        }
        final Dialog progressDialog = HTApp.getInstance().createLoadingDialog(context, context.getString(R.string.loading));
        progressDialog.show();
        PathUtils pathUtils = new PathUtils(chatTo, context);
        final String filePath = pathUtils.getImagePath().getAbsolutePath() + "/" + fileName;
        new OkHttpUtils(context).loadFile(remotePath, filePath, new OkHttpUtils.DownloadCallBack() {
            @Override
            public void onSuccess() {
                (context).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressDialog.dismiss();
                    }
                });
                if (new File(filePath).exists()) {
                    final Bitmap bitmap = ImageUtils.decodeScaleImage(filePath);
                    ACache.get(context.getApplicationContext()).put(htMessage.getMsgId(), bitmap);
                    htMessageImageBody.setLocalPath(filePath);
                    htMessage.setBody(htMessageImageBody);
                    (context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            notifyDataSetChanged();
                        }
                    });
                    HTClient.getInstance().messageManager().saveMessage(htMessage, false);
                    context.startActivity(new Intent(context, ShowBigImageActivity.class).putExtra("localPath", filePath));
                }
            }

            @Override
            public void onFailure(String message) {
                (context).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressDialog.dismiss();
                    }
                });
            }
        });
    }


    private void showVoiceView(final HTMessage htMessage, final ChatViewHolder holder) {
        HTMessageVoiceBody htMessageVoiceBody = (HTMessageVoiceBody) htMessage.getBody();

        if (htMessageVoiceBody == null) {
            return;
        }
        int len = htMessageVoiceBody.getAudioDuration();

        if (len > 0) {
            holder.tvDuration.setText(len + "\"");
            holder.tvDuration.setVisibility(View.VISIBLE);
        } else {
            holder.tvDuration.setVisibility(View.INVISIBLE);
        }
        if (VoicePlayClickListener.playMsgId != null
                && VoicePlayClickListener.playMsgId.equals(htMessage.getMsgId()) && VoicePlayClickListener.isPlaying) {
            AnimationDrawable voiceAnimation;
            if (htMessage.getDirect() == HTMessage.Direct.RECEIVE) {
                holder.ivVoice.setImageResource(R.anim.voice_from_icon);
            } else {
                holder.ivVoice.setImageResource(R.anim.voice_to_icon);
            }
            voiceAnimation = (AnimationDrawable) holder.ivVoice.getDrawable();
            voiceAnimation.start();
        } else {
            if (htMessage.getDirect() == HTMessage.Direct.RECEIVE) {
                holder.ivVoice.setImageResource(R.drawable.chatfrom_voice_playing);
            } else {
                holder.ivVoice.setImageResource(R.drawable.chatto_voice_playing);
            }
        }

        if (htMessage.getDirect() == HTMessage.Direct.RECEIVE) {
            if (htMessage.getStatus() == HTMessage.Status.SUCCESS) {
                holder.ivUnread.setVisibility(View.INVISIBLE);
            } else {
                holder.ivUnread.setVisibility(View.VISIBLE);
            }
        }

        holder.reBubble.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new VoicePlayClickListener(htMessage, chatTo, holder.ivVoice, holder.ivUnread, ChatAdapter.this, (context)).onClick(holder.reBubble);
            }
        });
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
            holder.reBubble.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {

                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    if (VoicePlayClickListener.currentPlayListener != null && VoicePlayClickListener.isPlaying) {
                        VoicePlayClickListener.currentPlayListener.stopPlayVoice();
                    }
                }
            });
        }
    }

    public static class ChatViewHolder {

        public RelativeLayout reMain;
        public RelativeLayout reBubble;

        public ImageView ivAvatar;
        public TextView tvNick;
        public TextView timeStamp;
        public ImageView ivMsgStatus;
        //文本消息,位置消息,文件消息
        public TextView tvContent;
        //图片消息,视频消息,位置消息,文件消息
        public ImageView ivContent;
        //语音消息
        public TextView tvDuration;
        public ImageView ivUnread;
        public ImageView ivVoice;
        //发送消息
        public ProgressBar progressBar;
        //已读显示
        public TextView tv_ack_msg;
        //送达显示
        public TextView tv_delivered;
    }

    /**
     * 重新发送消息
     *
     * @param htMessage
     */
    private void showReSendDialog(final HTMessage htMessage) {
        AlertDialog.Builder buidler = new AlertDialog.Builder(context);
        View view = View.inflate(context, R.layout.item_diaolog_gridview, null);
        TextView tv_forward = (TextView) view.findViewById(R.id.tv_forward);
        TextView textView = (TextView) view.findViewById(R.id.textView);
        TextView tv_ok = (TextView) view.findViewById(R.id.tv_ok);
        TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
        final ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        imageView.setVisibility(View.GONE);
        tv_forward.setText(R.string.prompt);
        textView.setText(R.string.resend_text);
        buidler.setView(view);
        final AlertDialog dialog = buidler.show();
        tv_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                msgs.remove(htMessage);
                notifyDataSetChanged();
                HTClient.getInstance().messageManager().deleteMessage(htMessage.getUsername(), htMessage.getMsgId());
                htMessage.setLocalTime(System.currentTimeMillis());
                htMessage.setStatus(HTMessage.Status.CREATE);
                fragment.sendMessage(htMessage);
            }
        });
        tv_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }


}




 


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatContract.java
================================================
package com.htmessage.yichatopen.activity.chat;

import com.htmessage.yichatopen.activity.BasePresenter;
import com.htmessage.yichatopen.activity.BaseView;

/**
 * Created by dell on 2017/7/1.
 */

public interface ChatContract {

    interface  View extends BaseView<Presenter>{
       //长按消息体出现的dialog
       void showItemDialog();
        //标题栏
        void showTitle(String title);
        //隐藏输入法
        void hideKeyboard();
        //显示输入法
        void showKeyboard();
        //显示录音UI
        void showSpeakerMode();
        //显示输入文字状态
        void showInputMode();
        //显示更多消息类型
        void showExtendMenuItem();
        //显示表情UI
        void showEmojiView();
    }

    interface Presenter extends BasePresenter{


    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatFragment.java
================================================
package com.htmessage.yichatopen.activity.chat;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.sdk.ChatType;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.manager.HTChatManager;
import com.htmessage.sdk.model.CmdMessage;
import com.htmessage.sdk.model.HTMessage;
import com.htmessage.sdk.model.HTMessageImageBody;
import com.htmessage.sdk.model.HTMessageVoiceBody;
import com.htmessage.sdk.utils.MessageUtils;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.IMAction;

import com.htmessage.yichatopen.activity.chat.weight.emoji.Emojicon;
import com.htmessage.yichatopen.activity.chat.weight.ChatInputView;
import com.htmessage.yichatopen.activity.chat.weight.loadmore.PullToLoadMoreListView;
import com.htmessage.yichatopen.utils.ACache;
import com.htmessage.yichatopen.utils.HTMessageUtils;
import com.htmessage.yichatopen.utils.PathUtils;
import com.htmessage.yichatopen.activity.chat.weight.ChatExtendMenu;
import com.htmessage.yichatopen.widget.HTAlertDialog;
import com.htmessage.yichatopen.activity.chat.weight.VoiceRecorderView;
import com.htmessage.yichatopen.utils.CommonUtils;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;


public class ChatFragment extends Fragment {

    private static final int REQUEST_CODE_CAMERA = 2;
    private static final int REQUEST_CODE_LOCAL = 3;
    /**
     * params to fragment
     */
    private Bundle fragmentArgs;
    private int chatType;
    private String toChatUsername;
    private File cameraFile;
    private ListView listView;
    static final int ITEM_TAKE_PICTURE = 1;
    static final int ITEM_PICTURE = 2;

    private int[] itemStrings = {R.string.attach_take_pic, R.string.attach_picture};
    private int[] itemdrawables = {R.drawable.chat_takepic_selector, R.drawable.chat_image_selector};
    private int[] itemIds = {ITEM_TAKE_PICTURE, ITEM_PICTURE};
    private MyItemClickListener extendMenuItemClickListener;

    private List<HTMessage> htMessages;
    private ChatAdapter adapter;
    private PullToLoadMoreListView pullToLoadMoreListView;
    private ChatInputView chatInputView;
    private MyInputViewLisenter inputViewLisenter;
    private VoiceRecorderView voiceRecorderView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_chat, container, false);
        voiceRecorderView = (VoiceRecorderView) root.findViewById(R.id.voice_recorder);
        pullToLoadMoreListView = (PullToLoadMoreListView) root.findViewById(R.id.list);
        pullToLoadMoreListView.setOnRefreshListener(new PullToLoadMoreListView.OnRefreshListener() {

            @Override
            public void onPullDownLoadMore() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        HTMessage message = getLastMessage();
                        if (message != null) {
                            List<HTMessage> htMessages = HTClient.getInstance().messageManager().loadMoreMsgFromDB(toChatUsername, message.getTime(), 20);
                            if (htMessages.size() == 0) {
                                Toast.makeText(getActivity(), R.string.not_more_msg, Toast.LENGTH_SHORT).show();

                            } else {
                                Collections.reverse(htMessages);
                                htMessages.addAll(0, htMessages);
                                adapter.notifyDataSetChanged();

                            }
                        } else {
                            Toast.makeText(getActivity(), R.string.not_more_msg, Toast.LENGTH_SHORT).show();

                        }

                        pullToLoadMoreListView.onRefreshComplete();

                    }
                }, 1000);
            }
        });

        listView = pullToLoadMoreListView.getListView();
        extendMenuItemClickListener = new MyItemClickListener();
        chatInputView = (ChatInputView) root.findViewById(R.id.inputView);
        inputViewLisenter = new MyInputViewLisenter();
        chatInputView.initView(getActivity(), pullToLoadMoreListView, inputViewLisenter, getExtendMenuItem());
        listView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                chatInputView.hideSoftInput();
                chatInputView.interceptBackPress();

                return false;
            }
        });
        return root;
    }

    private JSONObject extJSON = new JSONObject();

    private boolean isHolder = false;
    private MyBroadcastReciver myBroadcastReciver;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        extJSON.put(HTConstant.JSON_KEY_HXID, HTApp.getInstance().getUserJson().getString(HTConstant.JSON_KEY_HXID));
        extJSON.put(HTConstant.JSON_KEY_NICK, HTApp.getInstance().getUserJson().getString(HTConstant.JSON_KEY_NICK));
        String avatar = HTApp.getInstance().getUserJson().getString(HTConstant.JSON_KEY_AVATAR);
        if (!TextUtils.isEmpty(avatar)) {
            if (!avatar.contains("http:")) {
                avatar = HTConstant.URL_AVATAR + avatar;
            }
        }
        extJSON.put(HTConstant.JSON_KEY_AVATAR, avatar);
        fragmentArgs = getArguments();
        chatType = fragmentArgs.getInt("chatType", MessageUtils.CHAT_SINGLE);
        toChatUsername = fragmentArgs.getString("userId");
        super.onActivityCreated(savedInstanceState);
        setUpView();
        myBroadcastReciver = new MyBroadcastReciver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(IMAction.ACTION_MESSAGE_WITHDROW);
        intentFilter.addAction(IMAction.ACTION_MESSAGE_FORWORD);
        intentFilter.addAction(IMAction.ACTION_NEW_MESSAGE);
        intentFilter.addAction(IMAction.ACTION_MESSAGE_EMPTY);
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(myBroadcastReciver, intentFilter);
    }


    private void setUpView() {
        getAllMessage();
        adapter = new ChatAdapter(htMessages, this, toChatUsername, chatType);
        listView.setAdapter(adapter);
        listView.setSelection(listView.getCount() - 1);
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                HTMessage htMessage = adapter.getItem(i);
                if (htMessage != null) {
                    showMsgDialog(htMessage, i);
                }

                return true;
            }
        });


    }

    private void getAllMessage() {
        htMessages = HTClient.getInstance().messageManager().getMessageList(toChatUsername);
        HTClient.getInstance().conversationManager().markAllMessageRead(toChatUsername);
    }

    private class MyInputViewLisenter implements ChatInputView.InputViewLisenter {

        @Override
        public boolean onPressToSpeakBtnTouch(View v, MotionEvent event) {
            return voiceRecorderView.onPressToSpeakBtnTouch(v, event, new VoiceRecorderView.EaseVoiceRecorderCallback() {

                @Override
                public void onVoiceRecordComplete(String voiceFilePath, int voiceTimeLength) {
                    //Log.d("voiceFilePath--->", voiceFilePath);
                    sendVoiceMessage(voiceFilePath, voiceTimeLength);
                }
            });
        }

        @Override
        public void onBigExpressionClicked(Emojicon emojicon) {

        }

        @Override
        public void onSendButtonClicked(String content) {
            sendTextMessage(content);
        }

        @Override
        public boolean onEditTextLongClick() {
            String myCopy = ACache.get(getActivity()).getAsString("myCopy");
            if (!TextUtils.isEmpty(myCopy)) {
                JSONObject jsonObject = JSONObject.parseObject(myCopy);
                String msgId = jsonObject.getString("msgId");
                String imagePath = jsonObject.getString("imagePath");
                HTMessage emMessage = getCopyMessage(msgId);
                if (emMessage == null) {
                    return true;
                }
                showCopyContent(jsonObject.getString("copyType"), jsonObject.getString("localPath"), emMessage, imagePath);
                return true;
            }
            return false;
        }

        @Override
        public void onEditTextUp() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    listView.smoothScrollToPosition(listView.getCount() - 1);
                }
            }, 400);
        }
    }

    private HTMessage getCopyMessage(String msgId) {
        for (HTMessage htMessage : htMessages) {
            if (htMessage.getMsgId().equals(msgId)) {
                return htMessage;
            }
        }
        return null;
    }

    private HTMessage getLastMessage() {
        if (htMessages != null && htMessages.size() != 0) {
            return adapter.getItem(0);
        }
        return null;
    }

    private ChatExtendMenu getExtendMenuItem() {

        ChatExtendMenu chatExtendMenu = new ChatExtendMenu(getContext());
        //use the menu in base class
        for (int i = 0; i < itemStrings.length; i++) {
            chatExtendMenu.registerMenuItem(itemStrings[i], itemdrawables[i], itemIds[i], extendMenuItemClickListener);
        }
        chatExtendMenu.init();
        return chatExtendMenu;
    }


    /**
     * handle the click event for extend menu
     */
    class MyItemClickListener implements ChatExtendMenu.EaseChatExtendMenuItemClickListener {

        @Override
        public void onClick(int itemId, View view) {

            switch (itemId) {
                case ITEM_TAKE_PICTURE:
                    selectPicFromCamera();
                    isHolder = true;
                    break;
                case ITEM_PICTURE:
                    selectPicFromLocal();
                    isHolder = true;
                    break;

                default:
                    break;
            }
        }

    }


    @Override
    public void onStop() {
        if (!isHolder) {
            ChatActivity.activityInstance = null;
        }
        super.onStop();
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        isHolder = false;
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == REQUEST_CODE_CAMERA) { // capture new image
                if (cameraFile != null && cameraFile.exists())
                    sendImageMessage(cameraFile.getAbsolutePath());
            } else if (requestCode == REQUEST_CODE_LOCAL) { // send local image
                if (data != null) {
                    Uri selectedImage = data.getData();
                    if (selectedImage != null) {
                        sendPicByUri(selectedImage);
                    }
                }
            }
        }
    }

    private void showMsgDialog(final HTMessage message, final int i) {

        HTAlertDialog fxAlertDialog = new HTAlertDialog(getActivity(), null, new String[]{getActivity().getString(R.string.delete), getActivity().getString(R.string.copy), getActivity().getString(R.string.forward)});
        if (message.getDirect() == HTMessage.Direct.SEND) {
            fxAlertDialog = new HTAlertDialog(getActivity(), null, new String[]{getActivity().getString(R.string.delete), getActivity().getString(R.string.copy), getActivity().getString(R.string.forward), getActivity().getString(R.string.reback)});
        }
        fxAlertDialog.init(new HTAlertDialog.OnItemClickListner() {
            @Override
            public void onClick(int position) {
                if (position == 0) { //删除
                    HTClient.getInstance().messageManager().deleteMessage(toChatUsername, message.getMsgId());
                    htMessages.remove(message);
                    adapter.notifyDataSetChanged();
                } else if (position == 1) { //复制
                    HTMessageUtils.getCopyMsg(getActivity(), message, toChatUsername);
                } else if (position == 2) {//转发
                    HTMessageUtils.getForWordMessage(getActivity(), message, toChatUsername, extJSON);
                } else if (position == 3) {//撤回
                    long msgTime = message.getTime();
                    long nowTime = System.currentTimeMillis();
                    if ((nowTime - msgTime) / (1000 * 60) < 2) {
                        final ProgressDialog progressDialog = new ProgressDialog(getActivity());
                        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        progressDialog.setMessage(getString(R.string.rebacking));
                        progressDialog.setCanceledOnTouchOutside(false);
                        progressDialog.show();
                        CmdMessage cmdMessage = new CmdMessage();
                        cmdMessage.setTo(toChatUsername);
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("action", 6000);
                        jsonObject.put("msgId", message.getMsgId());
                        cmdMessage.setBody(jsonObject.toString());
                        if (chatType == MessageUtils.CHAT_GROUP) {
                            cmdMessage.setChatType(ChatType.groupChat);
                        }
                        HTClient.getInstance().chatManager().sendCmdMessage(cmdMessage, new HTChatManager.HTMessageCallBack() {
                            @Override
                            public void onProgress() {

                            }

                            @Override
                            public void onSuccess() {
                                HTClient.getInstance().messageManager().deleteMessage(toChatUsername, message.getMsgId());
                                getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        progressDialog.dismiss();
                                        HTMessage htMessage = HTMessageUtils.creatWithDrowMsg(message);
                                        htMessages.set(i, htMessage);
                                        adapter.notifyDataSetChanged();
                                    }
                                });

                            }

                            @Override
                            public void onFailure() {
                                getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        progressDialog.dismiss();
                                        Toast.makeText(getActivity(), R.string.reback_failed, Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        });

                    } else {
                        Toast.makeText(getActivity(), R.string.reback_not_more_than_30, Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        HTClient.getInstance().conversationManager().markAllMessageRead(toChatUsername);
        ChatActivity.activityInstance = (ChatActivity) getActivity();
    }


    public void onBackPressed() {
        if (!chatInputView.interceptBackPress()) {
            getActivity().finish();
        }
    }

    @Override
    public void onPause() {
        if (chatInputView != null) {
            chatInputView.hideSoftInput();
            chatInputView.interceptBackPress();
        }
        super.onPause();
    }

    private void sendTextMessage(final String content) {
        HTMessage htMessage = HTMessage.createTextSendMessage(toChatUsername, content);
        sendMessage(htMessage);
    }

    public void sendMessage(final HTMessage htMessage) {
        htMessage.setAttributes(extJSON.toJSONString());
        if (chatType == MessageUtils.CHAT_GROUP) {
            htMessage.setChatType(ChatType.groupChat);
        }
        HTClient.getInstance().chatManager().sendMessage(htMessage, new HTChatManager.HTMessageCallBack() {
            @Override
            public void onProgress() {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        htMessages.add(htMessage);
                        adapter.notifyDataSetChanged();
                        if (htMessages.size() > 0) {
                            listView.setSelection(listView.getCount() - 1);
                        }
                    }
                });
            }

            @Override
            public void onSuccess() {
                htMessage.setStatus(HTMessage.Status.SUCCESS);
                HTClient.getInstance().messageManager().saveMessage(htMessage, false);
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                        if (htMessages.size() > 0) {
                            listView.setSelection(listView.getCount() - 1);
                        }
                    }
                });

            }

            @Override
            public void onFailure() {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        htMessage.setStatus(HTMessage.Status.FAIL);
                        HTClient.getInstance().messageManager().saveMessage(htMessage, false);
                        adapter.notifyDataSetChanged();
                        if (htMessages.size() > 0) {
                            listView.setSelection(listView.getCount() - 1);
                        }
                    }
                });
            }

        });


    }


    private void sendVoiceMessage(String filePath, int length) {
        HTMessage htMessage = HTMessage.createVoiceSendMessage(toChatUsername, filePath, length);
        sendMessage(htMessage);
    }


    /**
     * 读取图片属性:旋转的角度
     *
     * @param path 图片绝对路径
     * @return degree旋转的角度
     */
    public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return degree;
        }
        return degree;
    }

    /**
     * 旋转图片,使图片保持正确的方向。
     *
     * @param bitmap  原始图片
     * @param degrees 原始图片的角度
     * @return Bitmap 旋转后的图片
     */
    public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
        if (degrees == 0 || null == bitmap) {
            return bitmap;
        }
        Matrix matrix = new Matrix();
        matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
        Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        if (null != bitmap) {
            bitmap.recycle();
        }
        return bmp;
    }

    private void sendImageMessage(String imagePath) {

        Bitmap bmp = BitmapFactory.decodeFile(imagePath);
        Bitmap bitmap = rotateBitmap(bmp, readPictureDegree(imagePath));
        String size = bitmap.getWidth() + "," + bitmap.getHeight();
        Log.d("size---->", size);
        HTMessage htMessage = HTMessage.createImageSendMessage(toChatUsername, imagePath, size);
        sendMessage(htMessage);
    }

    //===================================================================================


    /**
     * send image
     *
     * @param selectedImage
     */
    private void sendPicByUri(Uri selectedImage) {
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            cursor = null;

            if (picturePath == null || picturePath.equals("null")) {
                Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;
            }
            sendImageMessage(picturePath);
        } else {
            File file = new File(selectedImage.getPath());
            if (!file.exists()) {
                Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;

            }
            sendImageMessage(file.getAbsolutePath());
        }

    }

    /**
     * capture new image
     */
    private void selectPicFromCamera() {
        if (!CommonUtils.isSdcardExist()) {
            Toast.makeText(getActivity(), R.string.sd_card_does_not_exist, Toast.LENGTH_SHORT).show();
            return;
        }

        cameraFile = new File(new PathUtils(toChatUsername, getContext()).getImagePath() + "/" + HTApp.getInstance().getUsername()
                + System.currentTimeMillis() + ".jpg");
        //   cameraFile.getParentFile().mkdirs();
        startActivityForResult(
                new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)),
                REQUEST_CODE_CAMERA);
    }

    /**
     * select local image
     */
    private void selectPicFromLocal() {
        Intent intent;
        if (Build.VERSION.SDK_INT < 19) {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
        } else {
            intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        }
        startActivityForResult(intent, REQUEST_CODE_LOCAL);
    }


    @Override
    public void onDestroy() {

        if (myBroadcastReciver != null) {
            LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(myBroadcastReciver);
        }
        super.onDestroy();
    }


    /**
     * 复制
     *
     * @param copyType
     * @param localPath
     * @param message1
     * @param imagePath
     */
    private void showCopyContent(final String copyType, final String localPath, final HTMessage message1, String imagePath) {
        AlertDialog.Builder buidler = new AlertDialog.Builder(getActivity());
        View view = View.inflate(getActivity(), R.layout.item_dialog_gridview, null);
        TextView tv_forward = (TextView) view.findViewById(R.id.tv_forward);
        TextView textView = (TextView) view.findViewById(R.id.textView);
        TextView tv_ok = (TextView) view.findViewById(R.id.tv_ok);
        TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
        final ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        imageView.setVisibility(View.GONE);
        tv_forward.setText(R.string.copy);
        textView.setText(R.string.really_copy_and_send);
        buidler.setView(view);
        if ("image".equals(copyType) && imagePath != null) {
            imageView.setVisibility(View.VISIBLE);
            Glide.with(getActivity()).load(imagePath).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
        }
        final AlertDialog dialog = buidler.show();
        tv_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                switch (copyType) {
                    case "text":
                        sendTextMessage(localPath);
                        break;
                    case "voice":
                        HTMessageVoiceBody voiceBody = (HTMessageVoiceBody) message1.getBody();
                        HTMessage voiceMSg = HTMessage.createVoiceSendMessage(toChatUsername, localPath, voiceBody.getAudioDuration());
                        sendMessage(voiceMSg);
                        break;
                    case "image":
                        HTMessageImageBody imageBody = (HTMessageImageBody) message1.getBody();
                        HTMessage message = HTMessage.createImageSendMessage(toChatUsername, localPath, imageBody.getSize());
                        sendMessage(message);
                        break;
                }
            }
        });
        tv_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

    }

    /**
     * 撤回消息
     *
     * @param msgId
     */
    private void onMessageWithdrow(String msgId) {
        for (int i = 0; i < htMessages.size(); i++) {
            HTMessage htMessage = htMessages.get(i);
            if (htMessage.getMsgId().equals(msgId)) {
                HTMessage message = HTMessageUtils.creatWithDrowMsg(htMessage);
                htMessages.set(i, message);
                adapter.notifyDataSetChanged();
            }
        }
    }

    private class MyBroadcastReciver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(IMAction.ACTION_MESSAGE_WITHDROW)) {
                String msgId = intent.getStringExtra("msgId");
                onMessageWithdrow(msgId);
            } else if (intent.getAction().equals(IMAction.ACTION_MESSAGE_FORWORD)) {
                HTMessage message = intent.getParcelableExtra("message");
                if (message.getTo().equals(toChatUsername)) {
                    if (!htMessages.contains(message)) {
                        htMessages.add(message);
                    }
                    adapter.notifyDataSetChanged();
                    if (htMessages.size() > 0) {
                        listView.setSelection(listView.getCount() - 1);
                    }
                }
            } else if (intent.getAction().equals(IMAction.ACTION_NEW_MESSAGE)) {
                HTMessage message = intent.getParcelableExtra("message");
                if ((message.getChatType() == ChatType.singleChat) && (message.getFrom().equals(toChatUsername)) || ((message.getChatType() == ChatType.groupChat) && (message.getTo().equals(toChatUsername)))) {
                    if (!htMessages.contains(message)) {
                        htMessages.add(message);
                    }
                    adapter.notifyDataSetChanged();
                    if (htMessages.size() > 0) {
                        listView.setSelection(listView.getCount() - 1);
                    }
                    HTClient.getInstance().conversationManager().markAllMessageRead(toChatUsername);
                }
            } else if (IMAction.ACTION_MESSAGE_EMPTY.equals(intent.getAction())) {
                htMessages.clear();
                adapter.notifyDataSetChanged();
            }
        }
    }
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatPresenter.java
================================================
package com.htmessage.yichatopen.activity.chat;

/**
 * Created by dell on 2017/7/1.
 */

public class ChatPresenter    {
}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChatSettingActivity.java
================================================
package com.htmessage.yichatopen.activity.chat.activity;

import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.IMAction;
import com.htmessage.yichatopen.HTApp;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.activity.BaseActivity;
import com.htmessage.yichatopen.activity.main.details.UserDetailsActivity;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.domain.User;
import com.htmessage.yichatopen.manager.ContactsManager;
import com.htmessage.sdk.client.HTClient;


public class ChatSettingActivity extends BaseActivity implements
        OnClickListener {
    // 、置顶
    private RelativeLayout rl_switch_chattotop;
    private RelativeLayout rl_switch_block_groupmsg;
    private RelativeLayout re_clear;

    // 状态变化
    private ImageView iv_switch_chattotop;
    private ImageView iv_switch_unchattotop;
    private ImageView iv_switch_block_groupmsg;
    private ImageView iv_switch_unblock_groupmsg;

    private String userId;
    private Dialog progressDialog;
    public static ChatSettingActivity instance;
    private User user;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_setting_single);
        instance = this;
        // 获取传过来的userId
        userId = getIntent().getStringExtra("userId");
        user= ContactsManager.getInstance().getContactList().get(userId);
        // 资料错误则不显示
        if (user == null) {
            finish();
            return;
        }
        initView();
        initData();

    }

    private void initView() {

        rl_switch_chattotop = (RelativeLayout) findViewById(R.id.rl_switch_chattotop);
        rl_switch_block_groupmsg = (RelativeLayout) findViewById(R.id.rl_switch_block_groupmsg);
        re_clear = (RelativeLayout) findViewById(R.id.re_clear);

        iv_switch_chattotop = (ImageView) findViewById(R.id.iv_switch_chattotop);
        iv_switch_unchattotop = (ImageView) findViewById(R.id.iv_switch_unchattotop);
        iv_switch_block_groupmsg = (ImageView) findViewById(R.id.iv_switch_block_groupmsg);
        iv_switch_unblock_groupmsg = (ImageView) findViewById(R.id.iv_switch_unblock_groupmsg);

//        // 初始化置顶和免打扰的状态
//        if (!blackList.contains(userId)) {
//            iv_switch_block_groupmsg.setVisibility(View.INVISIBLE);
//            iv_switch_unblock_groupmsg.setVisibility(View.VISIBLE);
//
//        } else {
//            iv_switch_block_groupmsg.setVisibility(View.VISIBLE);
//            iv_switch_unblock_groupmsg.setVisibility(View.INVISIBLE);
//        }


    }

    private void initData() {

        rl_switch_chattotop.setOnClickListener(this);
        rl_switch_block_groupmsg.setOnClickListener(this);
        re_clear.setOnClickListener(this);

        ImageView ivAvatar= (ImageView) this.findViewById(R.id.iv_avatar);
        TextView tvNick = (TextView) this.findViewById(R.id.tv_username);
        tvNick.setText(user.getNick());
        String avatarUrl =user.getAvatar();
//        String avatarUrl = HTConstant.URL_AVATAR + userJson.getString(HTConstant.JSON_KEY_AVATAR);
        if(!TextUtils.isEmpty(avatarUrl)){
            if (!avatarUrl.contains("http:")){
                avatarUrl = HTConstant.URL_AVATAR+avatarUrl;
            }
        }
        Glide.with(this).load( avatarUrl).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.default_avatar).into(ivAvatar);

        ivAvatar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                startActivity(new Intent(ChatSettingActivity.this,
                        UserDetailsActivity.class).putExtra(HTConstant.KEY_USER_INFO, user.getUserInfo()));
            }
        });
        ImageView ivAdd = (ImageView) this.findViewById(R.id.iv_avatar2);
        ivAdd.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }

        });

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.rl_switch_block_groupmsg: // 设置免打扰
            progressDialog = HTApp.getInstance().createLoadingDialog(this,"正在设置免打扰...");
            progressDialog.show();
            if (iv_switch_block_groupmsg.getVisibility() == View.VISIBLE) {
                new Handler().postDelayed(new Runnable() {

                    public void run() {
                        removeOutBlacklist(userId);
                        progressDialog.dismiss();

                    }

                }, 2000);

            } else {
                moveToBlacklist(userId);
            }
            break;

        case R.id.re_clear: // 清空聊天记录
            progressDialog = HTApp.getInstance().createLoadingDialog(this,"正在清空聊天记录...");
            progressDialog.show();
             new Handler().postDelayed(new Runnable() {

                public void run() {
                    HTClient.getInstance().conversationManager().deleteConversationAndMessage(userId);
                    LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(IMAction.ACTION_MESSAGE_EMPTY).putExtra("id", userId));
                    progressDialog.dismiss();

                }

            }, 2000);

            break;

        case R.id.rl_switch_chattotop:
//            // 当前状态是已经置顶,点击后取消置顶
//            if (iv_switch_chattotop.getVisibility() == View.VISIBLE) {
//
//                iv_switch_chattotop.setVisibility(View.INVISIBLE);
//                iv_switch_unchattotop.setVisibility(View.VISIBLE);
//
//                if (topMap.containsKey(userId)) {
//
//                    topMap.remove(userId);
//                    TopUserDao topUserDao = new TopUserDao(
//                            ChatSettingSingleActivity.this);
//
//                    topUserDao.deleteTopUser(userId);
//
//                }
//
//            } else {
//
//                // 当前状态是未置顶点击后置顶
//
//                iv_switch_chattotop.setVisibility(View.VISIBLE);
//                iv_switch_unchattotop.setVisibility(View.INVISIBLE);
//
//                if (!topMap.containsKey(userId)) {
//                    TopUser topUser = new TopUser();
//                    topUser.setTime(System.currentTimeMillis());
//                    // 1---表示是群组0----个人
//                    topUser.setType(0);
//                    topUser.setUserName(userId);
//                    Map<String, TopUser> map = new HashMap<String, TopUser>();
//                    map.put(userId, topUser);
//                    topMap.putAll(map);
//                    TopUserDao topUserDao = new TopUserDao(
//                            ChatSettingSingleActivity.this);
//                    topUserDao.saveTopUser(topUser);
//
//                }
//
//            }

            break;

        default:
            break;
        }

    }


    /**
     * 把user移入到免打扰
     */
    private void moveToBlacklist(final String username) {
//
//        new Thread(new Runnable() {
//            public void run() {
//                try {
//                    // 加入到黑名单
//                    EMClient.getInstance().contactManager().addUserToBlackList(username,
//                            false);
//                    runOnUiThread(new Runnable() {
//                        public void run() {
//                            progressDialog.dismiss();
//                            iv_switch_block_groupmsg
//                                    .setVisibility(View.VISIBLE);
//                            iv_switch_unblock_groupmsg
//                                    .setVisibility(View.INVISIBLE);
//
//                        }
//                    });
//                }  catch (final HyphenateException e) {
//                    runOnUiThread(new Runnable() {
//                        public void run() {
//                            progressDialog.dismiss();
//                            Toast.makeText(getApplicationContext(),
//                                    "设置失败,原因:" + e.toString(),
//                                    Toast.LENGTH_SHORT).show();
//                        }
//                    });
//                    e.printStackTrace();
//                }
//            }
//        }).start();

    }

    /**
     * 移出免打扰
     * 
     * @param tobeRemoveUser
     */
    private void removeOutBlacklist(final String tobeRemoveUser) {

//        try {
//
//            // 移出黑民单
//            EMClient.getInstance().contactManager().removeUserFromBlackList(tobeRemoveUser);
//            iv_switch_block_groupmsg.setVisibility(View.INVISIBLE);
//            iv_switch_unblock_groupmsg.setVisibility(View.VISIBLE);
//        }   catch (HyphenateException e) {
//            runOnUiThread(new Runnable() {
//                public void run() {
//
//                    Toast.makeText(getApplicationContext(), "设置失败",
//                            Toast.LENGTH_SHORT).show();
//                }
//            });
//            e.printStackTrace();
//        }
    }


}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactActivity.java
================================================
package com.htmessage.yichatopen.activity.chat.activity;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.IMAction;
import com.htmessage.yichatopen.activity.BaseActivity;
import com.htmessage.yichatopen.HTConstant;
import com.htmessage.yichatopen.domain.User;
import com.htmessage.yichatopen.manager.ContactsManager;
import com.htmessage.yichatopen.utils.CommonUtils;
import com.htmessage.yichatopen.utils.OkHttpUtils;
import com.htmessage.yichatopen.utils.Param;
import com.htmessage.sdk.ChatType;
import com.htmessage.sdk.client.HTClient;
import com.htmessage.sdk.manager.HTChatManager;
import com.htmessage.sdk.model.HTMessage;
import com.htmessage.sdk.model.HTMessageImageBody;
import com.htmessage.sdk.model.HTMessageVoiceBody;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 项目名称:yichat
 * 类描述:CheckPeopleActivity 描述: 选择转发人员
 * 创建人:songlijie
 * 创建时间:2017/3/18 17:04
 * 邮箱:814326663@qq.com
 */
public class ChooseContactActivity extends BaseActivity implements AdapterView.OnItemClickListener, View.OnClickListener {
    private ArrayList<User> users = new ArrayList<>();
    private ArrayList<User> friends = new ArrayList<>();
    private TextView tv_group_check, tv_title;
    private ListView list;
    private ChooseContactAdapter adAdapter;
    private String forwordType;
    private String localUrl,obj,exobj;
    private HTMessage message1;
    private JSONObject object,extJSON;
    private String imagePath,msgId,toChatUsername;
    private Button btn_rtc;
    private List<HTMessage> msgList;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.activity_check_people);
        getData();
        initView();
        initData();
        setListener();
    }

    private void initData() {
        btn_rtc.setVisibility(View.VISIBLE);
        btn_rtc.setText(R.string.str_send);
        msgList = HTClient.getInstance().messageManager().getMessageList(toChatUsername);
        extJSON = JSONObject.parseObject(exobj);
        message1 = getCopyMessage(msgId);
        getContacts();
        adAdapter = new ChooseContactAdapter(ChooseContactActivity.this, friends);
        list.setAdapter(adAdapter);
    }

    private void getData() {
        obj = getIntent().getStringExtra("obj");
        object = JSONObject.parseObject(obj);
        imagePath = object.getString("imagePath");
        forwordType = object.getString("forwordType");
        localUrl = object.getString("localPath");
        msgId = object.getString("msgId");
        toChatUsername =object.getString("toChatUsername");
        exobj =object.getString("exobj");
        getContacts();
    }

    private void getContacts() {
        friends.clear();
        // 获取本地好友列表
        Map<String, User> users = ContactsManager.getInstance().getContactList();
        Iterator<Map.Entry<String, User>> iterator = users.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, User> entry = iterator.next();

                friends.add(entry.getValue());
        }
        // 对list进行排序
        Collections.sort(friends, new PinyinComparator() {});
    }

    private void initView() {
        tv_group_check = (TextView) findViewById(R.id.tv_group_check);
        tv_title = (TextView) findViewById(R.id.tv_title);
        list = (ListView) findViewById(R.id.list);
        btn_rtc = (Button) findViewById(R.id.btn_rtc);
    }

    private void setListener() {
        tv_group_check.setOnClickListener(this);
        list.setOnItemClickListener(this);
        btn_rtc.setOnClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
        checkBox.toggle();
        ChooseContactAdapter.getIsSelected().put(position, checkBox.isChecked());//将CheckBox的选中状况记录下来
        // 调整选定条目
        if (checkBox.isChecked() == true) {
            users.add(adAdapter.getItem(position));
        } else {
            users.remove(adAdapter.getItem(position));
        }
    }


    public void getContactsInServer() {
        if (!HTClient.getInstance().isLogined()) {
            return;
        }
        List<Param> params = new ArrayList<Param>();
       new OkHttpUtils(this).post(params, HTConstant.URL_FriendList, new OkHttpUtils.HttpCallBack() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                int code = jsonObject.getIntValue("code");
                switch (code) {
                    case 1:
                        JSONArray friends = jsonObject.getJSONArray("user");
                        if (friends != null || friends.size() != 0) {
                            List<User> users = new ArrayList<User>();
                            for (int i = 0; i < friends.size(); i++) {
                                JSONObject friend = friends.getJSONObject(i);
                                User user = CommonUtils.Json2User(friend);
                                users.add(user);
                            }
                            ContactsManager.getInstance().saveContactList(users);
                        }
                        break;
                }
            }

            @Override
            public void onFailure(String errorMsg) {

            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_rtc:
                if (users.size() == 0 || users == null) {
                    Toast.makeText(ChooseContactActivity.this, R.string.please_check_contant, Toast.LENGTH_SHORT).show();
                    return;
                }
                showMessageFarWordDialog(users, forwordType, localUrl);
                break;
        }
    }

    private void showMessageFarWordDialog(final ArrayList<User> users, final String forwordType, final String localUrl) {
        AlertDialog.Builder buidler = new AlertDialog.Builder(this);
        View view = View.inflate(this, R.layout.item_dialog_gridview, null);
        TextView tv_forward = (TextView) view.findViewById(R.id.tv_forward);
        TextView textView = (TextView) view.findViewById(R.id.textView);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        TextView tv_ok = (TextView) view.findViewById(R.id.tv_ok);
        TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
        textView.setText(R.string.forword_always);
        if ("image".equals(forwordType) && localUrl != null) {
            imageView.setVisibility(View.VISIBLE);
            Glide.with(this).load(imagePath).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
        }

        tv_forward.setText(getString(R.string.forword_people).replace("1", String.valueOf(users.size())));
        buidler.setView(view);
        final AlertDialog dialog = buidler.show();
        tv_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                for (int i = 0; i < users.size(); i++) {
                    User easeUser = users.get(i);
                    switch (forwordType) {
                        case "text":
                            HTMessage textMessage= HTMessage.createTextSendMessage(easeUser.getUsername(),localUrl);
                            sendMessage(textMessage);
                            break;
                        case "voice":
                            HTMessageVoiceBody voiceBody = (HTMessageVoiceBody) message1.getBody();
                            HTMessage voiceMSg = HTMessage.createVoiceSendMessage(easeUser.getUsername(), localUrl, voiceBody.getAudioDuration());
                            sendMessage(voiceMSg);
                            break;
                        case "image":
                            HTMessageImageBody imageBody = (HTMessageImageBody) message1.getBody();
                            HTMessage message = HTMessage.createImageSendMessage(easeUser.getUsername(), localUrl, imageBody.getSize());
                            sendMessage(message);
                            break;
                    }
                }
            }
        });
        tv_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }

    private void sendMessage(final HTMessage htMessage){
        htMessage.setAttributes(extJSON.toJSONString());
        htMessage.setChatType(ChatType.singleChat);
        HTClient.getInstance().chatManager().sendMessage(htMessage, new HTChatManager.HTMessageCallBack() {
            @Override
            public void onProgress() {
            }

            @Override
            public void onSuccess() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        htMessage.setStatus(HTMessage.Status.SUCCESS);
                        HTClient.getInstance().messageManager().saveMessage(htMessage,false);
                        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(IMAction.ACTION_MESSAGE_FORWORD).putExtra("message",htMessage));
                    }
                });
            }

            @Override
            public void onFailure() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        htMessage.setStatus(HTMessage.Status.FAIL);
                        HTClient.getInstance().messageManager().saveMessage(htMessage,false);
                        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(IMAction.ACTION_MESSAGE_FORWORD).putExtra("message",htMessage));
                    }
                });
            }
        });
        finish();
    }
    @Override
    protected void onResume() {
        super.onResume();
        friends.clear();
        getContacts();
        if (adAdapter!=null){
            adAdapter.notifyDataSetChanged();
        }
    }


    private HTMessage getCopyMessage(String msgId) {
        for (HTMessage htMessage : msgList) {
            if (htMessage.getMsgId().equals(msgId)) {
                return htMessage;
            }
        }
        return null;
    }
    public class PinyinComparator implements Comparator<User> {

        @SuppressLint("DefaultLocale")
        @Override
        public int compare(User o1, User o2) {
            String py1 = o1.getInitialLetter();
            String py2 = o2.getInitialLetter();
            if (py1.equals(py2)) {
                return o1.getNick().compareTo(o2.getNick());
            } else {
                if ("#".equals(py1)) {
                    return 1;
                } else if ("#".equals(py2)) {
                    return -1;
                }
                return py1.compareTo(py2);
            }
        }

        private boolean isEmpty(String str) {
            return "".equals(str.trim());
        }
    }

}


================================================
FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactAdapter.java
================================================
package com.htmessage.yichatopen.activity.chat.activity;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.htmessage.yichatopen.R;
import com.htmessage.yichatopen.domain.User;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * 项目名称:yichat
 * 类描述:PeopleCheckAdapter 描述: 选择转发人员的适配器
 * 创建人:songlijie
 * 创建时间:2017/3/18 17:27
 * 邮箱:814326663@qq.com
 */
public class ChooseContactAdapter extends BaseAdapter {

    private Context mContext;
    private ArrayList<User> beans = new ArrayList<>();

    // 用来控制CheckBox的选中状况
    private static HashMap<Integer, Boolean> isSelected;

    public ChooseContactAdapter(Context mContext, ArrayList<User> beans) {
        this.mContext = mContext;
        this.beans = beans;
        isSelected = new HashMap<Integer, Boolean>();
        initDate();
    }
    @Override
    public int getCount() {
        return beans.size();
    }
    // 初始化isSelected的数据
    private void initDate() {
        for (int i = 0; i < beans.size(); i++) {
            getIsSelected().put(i, false);
        }
    }

    @Override
    public User getItem(int position) {
        return beans.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null){
            convertView = View.inflate(mContext, R.layout.latout_pre_videocall_item,null);
            holder = new ViewHolder();
            holder.iv_game_avatar = (ImageView) convertView.findViewById(R.id.iv_game_avatar);
            holder.tv_username = (TextView) convertView.findViewById(R.id.tv_username);
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        User gameBean = beans.get(position);
        holder.tv_username.setText(gameBean.getNick());
        Glide.with(mContext).load(gameBean.getAvatar()).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.default_avatar).error(R.drawable.default_avatar).into(holder.iv_game_avatar);
        // 根据isSelected来设置checkbox的选中状况
        holder.checkbox.setChecked(getIsSelected().get(position));
        return co
Download .txt
gitextract_zpgm32r8/

├── .gitignore
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── htmessage_open.jar
│   │   ├── zbardecoder.jar
│   │   └── zxing.jar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── com/
│           │       └── htmessage/
│           │           └── yichatopen/
│           │               ├── HTApp.java
│           │               ├── HTClientHelper.java
│           │               ├── HTConstant.java
│           │               ├── IMAction.java
│           │               ├── activity/
│           │               │   ├── BaseActivity.java
│           │               │   ├── BasePresenter.java
│           │               │   ├── BaseView.java
│           │               │   ├── ScanCaptureActivity.java
│           │               │   ├── SettingsActivity.java
│           │               │   ├── ShowBigImageActivity.java
│           │               │   ├── SplashActivity.java
│           │               │   ├── addfriends/
│           │               │   │   ├── add/
│           │               │   │   │   ├── end/
│           │               │   │   │   │   └── AddFriendsFinalActivity.java
│           │               │   │   │   ├── next/
│           │               │   │   │   │   ├── AddFriendNextBasePrestener.java
│           │               │   │   │   │   ├── AddFriendNextFragment.java
│           │               │   │   │   │   ├── AddFriendNextPrestener.java
│           │               │   │   │   │   ├── AddFriendNextView.java
│           │               │   │   │   │   └── AddFriendsNextActivity.java
│           │               │   │   │   └── pre/
│           │               │   │   │       └── AddFriendsPreActivity.java
│           │               │   │   └── newfriend/
│           │               │   │       ├── NewFriendBasePresenter.java
│           │               │   │       ├── NewFriendFragment.java
│           │               │   │       ├── NewFriendPrestener.java
│           │               │   │       ├── NewFriendView.java
│           │               │   │       ├── NewFriendsActivity.java
│           │               │   │       └── NewFriendsAdapter.java
│           │               │   ├── chat/
│           │               │   │   ├── ChatActivity.java
│           │               │   │   ├── ChatAdapter.java
│           │               │   │   ├── ChatContract.java
│           │               │   │   ├── ChatFragment.java
│           │               │   │   ├── ChatPresenter.java
│           │               │   │   ├── activity/
│           │               │   │   │   ├── ChatSettingActivity.java
│           │               │   │   │   ├── ChooseContactActivity.java
│           │               │   │   │   └── ChooseContactAdapter.java
│           │               │   │   └── weight/
│           │               │   │       ├── ChatExtendMenu.java
│           │               │   │       ├── ChatInputView.java
│           │               │   │       ├── VoicePlayClickListener.java
│           │               │   │       ├── VoiceRecorder.java
│           │               │   │       ├── VoiceRecorderView.java
│           │               │   │       ├── emoji/
│           │               │   │       │   ├── DefaultEmojiconDatas.java
│           │               │   │       │   ├── EmojiFragment.java
│           │               │   │       │   ├── Emojicon.java
│           │               │   │       │   ├── EmojiconGridAdapter.java
│           │               │   │       │   └── SmileUtils.java
│           │               │   │       └── loadmore/
│           │               │   │           ├── DensityUtil.java
│           │               │   │           ├── Pacman.java
│           │               │   │           ├── ProgressView.java
│           │               │   │           ├── ProgressViewController.java
│           │               │   │           ├── PullToLoadMoreListView.java
│           │               │   │           └── RefreshHeader.java
│           │               │   ├── country/
│           │               │   │   ├── CharacterParserUtil.java
│           │               │   │   ├── CountryCodeUtil.java
│           │               │   │   ├── CountryComparator.java
│           │               │   │   ├── CountryModel.java
│           │               │   │   ├── CountrySortAdapter.java
│           │               │   │   ├── CountrySortModel.java
│           │               │   │   ├── CountrySortToken.java
│           │               │   │   ├── GetCountryNameSort.java
│           │               │   │   └── SideBar.java
│           │               │   ├── login/
│           │               │   │   ├── LoginActivity.java
│           │               │   │   ├── LoginContract.java
│           │               │   │   ├── LoginFragment.java
│           │               │   │   └── LoginPresenter.java
│           │               │   ├── main/
│           │               │   │   ├── MainActivity.java
│           │               │   │   ├── MainBasePrester.java
│           │               │   │   ├── MainPrestener.java
│           │               │   │   ├── MainView.java
│           │               │   │   ├── contacts/
│           │               │   │   │   ├── BaseContactsPresenter.java
│           │               │   │   │   ├── ContactsAdapter.java
│           │               │   │   │   ├── ContactsPresenter.java
│           │               │   │   │   ├── ContactsView.java
│           │               │   │   │   ├── FragmentContacts.java
│           │               │   │   │   └── Sidebar.java
│           │               │   │   ├── conversation/
│           │               │   │   │   ├── BaseConversationPresenter.java
│           │               │   │   │   ├── ConversationAdapter.java
│           │               │   │   │   ├── ConversationFragment.java
│           │               │   │   │   ├── ConversationPresenter.java
│           │               │   │   │   └── ConversationView.java
│           │               │   │   ├── details/
│           │               │   │   │   ├── UserDetailesFragment.java
│           │               │   │   │   ├── UserDetailsActivity.java
│           │               │   │   │   ├── UserDetailsBasePrester.java
│           │               │   │   │   ├── UserDetailsPrester.java
│           │               │   │   │   └── UserDetailsView.java
│           │               │   │   ├── find/
│           │               │   │   │   ├── FragmentFind.java
│           │               │   │   │   └── recentlypeople/
│           │               │   │   │       ├── PeopleRecentlyActivity.java
│           │               │   │   │       ├── PeopleRecentlyAdapter.java
│           │               │   │   │       ├── PeopleRecentlyBasePrestener.java
│           │               │   │   │       ├── PeopleRecentlyFragment.java
│           │               │   │   │       ├── PeopleRecentlyPrestener.java
│           │               │   │   │       └── PeopleRecentlyView.java
│           │               │   │   ├── password/
│           │               │   │   │   ├── PasswordBasePrester.java
│           │               │   │   │   ├── PasswordPrester.java
│           │               │   │   │   ├── PasswordResetActivity.java
│           │               │   │   │   ├── PasswordResetFragment.java
│           │               │   │   │   └── PasswordView.java
│           │               │   │   ├── profile/
│           │               │   │   │   ├── FragmentProfile.java
│           │               │   │   │   └── info/
│           │               │   │   │       ├── profile/
│           │               │   │   │       │   ├── ProfileActivity.java
│           │               │   │   │       │   ├── ProfileBasePrester.java
│           │               │   │   │       │   ├── ProfileFragment.java
│           │               │   │   │       │   ├── ProfilePrester.java
│           │               │   │   │       │   └── ProfileView.java
│           │               │   │   │       └── update/
│           │               │   │   │           ├── ProfileUpdateActivity.java
│           │               │   │   │           ├── ProfileUpdateFragment.java
│           │               │   │   │           ├── UpdateProfileBasePrester.java
│           │               │   │   │           ├── UpdateProfilePrestener.java
│           │               │   │   │           └── UpdateProfileView.java
│           │               │   │   ├── qrcode/
│           │               │   │   │   ├── QrCodeActivity.java
│           │               │   │   │   ├── QrCodeBasePrester.java
│           │               │   │   │   ├── QrCodeFragment.java
│           │               │   │   │   ├── QrCodePrester.java
│           │               │   │   │   └── QrCodeView.java
│           │               │   │   └── region/
│           │               │   │       ├── RegionActivity.java
│           │               │   │       ├── RegionBasePrestener.java
│           │               │   │       ├── RegionFragment.java
│           │               │   │       ├── RegionPresenter.java
│           │               │   │       └── RegionView.java
│           │               │   └── register/
│           │               │       ├── RegisterActivity.java
│           │               │       ├── RegisterContract.java
│           │               │       ├── RegisterFragment.java
│           │               │       └── RegisterPresenter.java
│           │               ├── domain/
│           │               │   ├── InviteMessage.java
│           │               │   ├── InviteMessgeDao.java
│           │               │   ├── User.java
│           │               │   └── UserDao.java
│           │               ├── manager/
│           │               │   ├── ContactsManager.java
│           │               │   ├── DBManager.java
│           │               │   ├── DbOpenHelper.java
│           │               │   ├── LocalUserManager.java
│           │               │   ├── Manager.java
│           │               │   ├── MyNotification.java
│           │               │   ├── Notifier.java
│           │               │   ├── NotifierManager.java
│           │               │   ├── PreferenceManager.java
│           │               │   └── SettingsManager.java
│           │               ├── runtimepermissions/
│           │               │   ├── Permissions.java
│           │               │   ├── PermissionsManager.java
│           │               │   └── PermissionsResultAction.java
│           │               ├── utils/
│           │               │   ├── ACache.java
│           │               │   ├── CommonUtils.java
│           │               │   ├── DateUtils.java
│           │               │   ├── HTMessageUtils.java
│           │               │   ├── ImageUtils.java
│           │               │   ├── OkHttpUtils.java
│           │               │   ├── Param.java
│           │               │   ├── PathUtils.java
│           │               │   ├── UpdateLastLoginTimeUtils.java
│           │               │   └── Validator.java
│           │               └── widget/
│           │                   ├── HTAlertDialog.java
│           │                   ├── SwitchButton.java
│           │                   ├── photoview/
│           │                   │   ├── Compat.java
│           │                   │   ├── IPhotoView.java
│           │                   │   ├── PhotoView.java
│           │                   │   ├── PhotoViewAttacher.java
│           │                   │   ├── SDK16.java
│           │                   │   ├── ScrollerProxy.java
│           │                   │   └── VersionedGestureDetector.java
│           │                   ├── scan/
│           │                   │   ├── CameraConfigurationManager.java
│           │                   │   ├── CameraManager.java
│           │                   │   └── CameraPreview.java
│           │                   ├── swipyrefresh/
│           │                   │   ├── CircleImageView.java
│           │                   │   ├── MaterialProgressDrawable.java
│           │                   │   ├── SwipyRefreshLayout.java
│           │                   │   └── SwipyRefreshLayoutDirection.java
│           │                   └── zxing/
│           │                       ├── activity/
│           │                       │   ├── CaptureActivity.java
│           │                       │   └── DensityUtil.java
│           │                       ├── camera/
│           │                       │   ├── AutoFocusCallback.java
│           │                       │   ├── CameraConfigurationManager.java
│           │                       │   ├── CameraManager.java
│           │                       │   ├── FlashlightManager.java
│           │                       │   ├── PlanarYUVLuminanceSource.java
│           │                       │   └── PreviewCallback.java
│           │                       ├── decoding/
│           │                       │   ├── CaptureActivityHandler.java
│           │                       │   ├── DecodeFormatManager.java
│           │                       │   ├── DecodeHandler.java
│           │                       │   ├── DecodeThread.java
│           │                       │   ├── FinishListener.java
│           │                       │   ├── InactivityTimer.java
│           │                       │   └── Intents.java
│           │                       ├── encoding/
│           │                       │   └── EncodingHandler.java
│           │                       └── view/
│           │                           ├── ViewfinderResultPointCallback.java
│           │                           └── ViewfinderView.java
│           └── res/
│               ├── anim/
│               │   ├── fade_in.xml
│               │   ├── fade_out.xml
│               │   ├── head_in.xml
│               │   ├── head_out.xml
│               │   ├── hold.xml
│               │   ├── loading_animation.xml
│               │   ├── push_bottom_in.xml
│               │   ├── push_bottom_out.xml
│               │   ├── push_top_in.xml
│               │   ├── push_top_in2.xml
│               │   ├── push_top_out.xml
│               │   ├── push_top_out2.xml
│               │   ├── slide_in_from_left.xml
│               │   ├── slide_in_from_right.xml
│               │   ├── slide_out_to_left.xml
│               │   ├── slide_out_to_right.xml
│               │   ├── voice_from_icon.xml
│               │   └── voice_to_icon.xml
│               ├── color/
│               │   ├── login_btn_text_color.xml
│               │   └── main_botton_text_color.xml
│               ├── drawable/
│               │   ├── bg_btn_gray.xml
│               │   ├── bg_btn_green.xml
│               │   ├── bg_dialog.xml
│               │   ├── bg_et.xml
│               │   ├── btn_bottom_selector.xml
│               │   ├── btn_more_type_msg.xml
│               │   ├── chat_error_item_bg.xml
│               │   ├── chat_image_selector.xml
│               │   ├── chat_press_speak_btn.xml
│               │   ├── chat_takepic_selector.xml
│               │   ├── chatfrom_bg.xml
│               │   ├── chatting_setmode_keyboard_btn.xml
│               │   ├── chatting_setmode_voice_btn.xml
│               │   ├── chatto_bg.xml
│               │   ├── divider_horizontal.xml
│               │   ├── divider_vertical.xml
│               │   ├── dot_emoji.xml
│               │   ├── edit_text_bg.xml
│               │   ├── emoji_bottom_bg.xml
│               │   ├── item_pre_videocall_selector.xml
│               │   ├── list_item_bg_gray.xml
│               │   ├── list_item_bg_white.xml
│               │   ├── msg_state_failed_resend.xml
│               │   ├── progressbar_white.xml
│               │   ├── recording_hint_bg.xml
│               │   ├── recording_text_hint_bg.xml
│               │   ├── register_phone_bg.xml
│               │   ├── sidebar_background_pressed.xml
│               │   ├── sign_bg.xml
│               │   ├── tab_chat_bg.xml
│               │   ├── tab_contact_list_bg.xml
│               │   ├── tab_find_bg.xml
│               │   ├── tab_profile_bg.xml
│               │   ├── timestampe_bg.xml
│               │   ├── top_bar_back.xml
│               │   └── topbar_back.xml
│               ├── layout/
│               │   ├── activity_addfriends_final.xml
│               │   ├── activity_addfriends_next.xml
│               │   ├── activity_addfriends_pre.xml
│               │   ├── activity_base.xml
│               │   ├── activity_base_input.xml
│               │   ├── activity_base_main.xml
│               │   ├── activity_chat_setting_single.xml
│               │   ├── activity_check_people.xml
│               │   ├── activity_new_friends.xml
│               │   ├── activity_people_recently.xml
│               │   ├── activity_psw_reset.xml
│               │   ├── activity_qrcode_generate.xml
│               │   ├── activity_region.xml
│               │   ├── activity_show_big_image.xml
│               │   ├── activity_splash.xml
│               │   ├── activity_update_info.xml
│               │   ├── activity_userinfo.xml
│               │   ├── chat_menu_item.xml
│               │   ├── chat_neterror_item.xml
│               │   ├── coogame_country_item.xml
│               │   ├── dialog_alert.xml
│               │   ├── emoji_gridview.xml
│               │   ├── fragment_chat.xml
│               │   ├── fragment_contactlist.xml
│               │   ├── fragment_conversation_settings.xml
│               │   ├── fragment_emoji.xml
│               │   ├── fragment_find.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_login.xml
│               │   ├── fragment_profile.xml
│               │   ├── fragment_profile_info.xml
│               │   ├── fragment_register.xml
│               │   ├── item_contact_list.xml
│               │   ├── item_contact_list_footer.xml
│               │   ├── item_contact_list_header.xml
│               │   ├── item_conversation_single.xml
│               │   ├── item_dialog_gridview.xml
│               │   ├── item_diaolog_gridview.xml
│               │   ├── item_newfriend_msg.xml
│               │   ├── item_people_recently.xml
│               │   ├── item_region.xml
│               │   ├── latout_pre_videocall_item.xml
│               │   ├── layout_alert_dialog_delete.xml
│               │   ├── layout_pup.xml
│               │   ├── layout_title_bar.xml
│               │   ├── loading_dialog.xml
│               │   ├── row_big_expression.xml
│               │   ├── row_expression.xml
│               │   ├── row_received_message.xml
│               │   ├── row_received_picture.xml
│               │   ├── row_received_voice.xml
│               │   ├── row_sent_message.xml
│               │   ├── row_sent_picture.xml
│               │   ├── row_sent_voice.xml
│               │   ├── widget_input_view.xml
│               │   ├── widget_main_button.xml
│               │   ├── widget_switch_button.xml
│               │   ├── widget_voice_recorder.xml
│               │   └── widget_zbar_scan_capture.xml
│               ├── menu/
│               │   └── menu_main.xml
│               ├── values/
│               │   ├── arrays.xml
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               ├── values-hdpi/
│               │   └── dimens.xml
│               └── values-v21/
│                   └── styles.xml
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Download .txt
SYMBOL INDEX (1898 symbols across 179 files)

FILE: app/src/main/java/com/htmessage/yichatopen/HTApp.java
  class HTApp (line 30) | public class HTApp extends Application {
    method onCreate (line 37) | @Override
    method getContext (line 58) | public static Context getContext() {
    method getInstance (line 65) | public static HTApp getInstance() {
    method getUsername (line 69) | public String getUsername() {
    method attachBaseContext (line 77) | @Override
    method setUserJson (line 83) | public void setUserJson(JSONObject userJson) {
    method getUserJson (line 91) | public JSONObject getUserJson() {
    method saveActivity (line 103) | public void saveActivity(Activity activity) {
    method finishActivities (line 110) | public void finishActivities() {
    method getAppName (line 127) | private static String getAppName(int pID, Context appContext) {
    method createLoadingDialog (line 154) | public Dialog createLoadingDialog(Context context, String msg) {
    method getDirFilePath (line 176) | public String getDirFilePath() {

FILE: app/src/main/java/com/htmessage/yichatopen/HTClientHelper.java
  class HTClientHelper (line 36) | public class HTClientHelper {
    method init (line 42) | public static void init(Context context) {
    method HTClientHelper (line 46) | public HTClientHelper(Context context) {
    method getInstance (line 60) | public static HTClientHelper getInstance() {
    method onConnected (line 69) | @Override
    method onDisconnected (line 76) | @Override
    method onConflict (line 82) | @Override
    method onHTMessage (line 89) | @Override
    method onCMDMessgae (line 94) | @Override
    method onCallMessgae (line 99) | @Override
    method handleHTMessage (line 104) | private void handleHTMessage(HTMessage htMessage){
    method handleCmdMessage (line 116) | private void handleCmdMessage(CmdMessage cmdMessage) {
    method notifyConflict (line 185) | protected void notifyConflict() {
    method notifyConnection (line 195) | protected void notifyConnection(boolean isConnected) {
    method notifyNewInviteMessage (line 207) | private void notifyNewInviteMessage(final InviteMessage msg, final JSO...
    method notifyHTMessage (line 229) | private void notifyHTMessage() {

FILE: app/src/main/java/com/htmessage/yichatopen/HTConstant.java
  class HTConstant (line 8) | public class HTConstant {

FILE: app/src/main/java/com/htmessage/yichatopen/IMAction.java
  class IMAction (line 8) | public class IMAction {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/BaseActivity.java
  class BaseActivity (line 15) | public class BaseActivity extends AppCompatActivity {
    method onCreate (line 17) | @Override
    method back (line 26) | public void back(View view) {
    method setTitle (line 31) | public void setTitle(int title){
    method setTitleCenter (line 44) | public void  setTitleCenter(){
    method setTitle (line 48) | public void setTitle(String title){
    method hideBackView (line 55) | public void hideBackView(){
    method showRightView (line 66) | public void showRightView(int res,View.OnClickListener onClickListener){
    method showRightTextView (line 76) | public void showRightTextView(int res,View.OnClickListener onClickList...
    method showRightTextView (line 86) | public void showRightTextView(String res,View.OnClickListener onClickL...
    method isCompatible (line 96) | protected boolean isCompatible(int apiLevel) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/BasePresenter.java
  type BasePresenter (line 8) | public interface BasePresenter  {
    method start (line 9) | void start();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/BaseView.java
  type BaseView (line 11) | public interface BaseView<T> {
    method setPresenter (line 12) | void setPresenter(T presenter);
    method getBaseContext (line 13) | Context getBaseContext();
    method getBaseActivity (line 14) | Activity getBaseActivity();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/ScanCaptureActivity.java
  class ScanCaptureActivity (line 41) | public class ScanCaptureActivity extends BaseActivity {
    method onCreate (line 63) | public void onCreate(Bundle savedInstanceState) {
    method findViewById (line 72) | private void findViewById() {
    method addEvents (line 83) | private void addEvents() {
    method initViews (line 98) | private void initViews() {
    method onPause (line 138) | public void onPause() {
    method releaseCamera (line 143) | private void releaseCamera() {
    method run (line 153) | public void run() {
    method onPreviewFrame (line 160) | public void onPreviewFrame(byte[] data, Camera camera) {
    method onAutoFocus (line 221) | public void onAutoFocus(boolean success, Camera camera) {
    method initCrop (line 229) | private void initCrop() {
    method getStatusBarHeight (line 261) | private int getStatusBarHeight() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/SettingsActivity.java
  class SettingsActivity (line 39) | public class SettingsActivity extends BaseActivity implements View.OnCli...
    method onCreate (line 100) | @Override
    method setListener (line 109) | private void setListener() {
    method initData (line 131) | private void initData() {
    method initView (line 192) | private void initView() {
    method onClick (line 229) | @Override
    method logOutDialog (line 358) | private void logOutDialog() {
    method logout (line 379) | void logout() {
    method back (line 431) | public void back(View view) {
    method getVersionCode (line 440) | public String getVersionCode() {
    method getAppUpdate (line 452) | private void getAppUpdate() {
    method showUpdateDialog (line 483) | private void showUpdateDialog(final Context context, String title, Str...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/ShowBigImageActivity.java
  class ShowBigImageActivity (line 33) | public class ShowBigImageActivity extends  BaseActivity {
    method onCreate (line 36) | @Override
    method onBackPressed (line 54) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/SplashActivity.java
  class SplashActivity (line 19) | public class SplashActivity extends  Activity {
    method onCreate (line 21) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/end/AddFriendsFinalActivity.java
  class AddFriendsFinalActivity (line 24) | public class AddFriendsFinalActivity extends BaseActivity {
    method onCreate (line 26) | protected void onCreate(Bundle savedInstanceState) {
    method initView (line 44) | private void initView(final JSONObject jsonObject) {
    method addContact (line 66) | public void addContact(final String hxid, String reason) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextBasePrestener.java
  type AddFriendNextBasePrestener (line 12) | public interface AddFriendNextBasePrestener  extends BasePresenter {
    method searchUser (line 13) | void searchUser();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextFragment.java
  class AddFriendNextFragment (line 31) | public class AddFriendNextFragment extends Fragment implements AddFriend...
    method onCreateView (line 37) | @Nullable
    method initView (line 46) | private void initView(View nextView) {
    method setListener (line 52) | private void setListener() {
    method getInputString (line 57) | @Override
    method onSearchSuccess (line 62) | @Override
    method onSearchFailed (line 67) | @Override
    method setPresenter (line 73) | @Override
    method getBaseContext (line 78) | @Override
    method getBaseActivity (line 83) | @Override
    method beforeTextChanged (line 88) | @Override
    method onTextChanged (line 93) | @Override
    method afterTextChanged (line 104) | @Override
    method back (line 109) | public void back(View view) {
    method onClick (line 113) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextPrestener.java
  class AddFriendNextPrestener (line 20) | public class AddFriendNextPrestener implements AddFriendNextBasePrestener {
    method AddFriendNextPrestener (line 23) | public AddFriendNextPrestener(AddFriendNextView nextView) {
    method searchUser (line 28) | @Override
    method start (line 63) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextView.java
  type AddFriendNextView (line 13) | public interface AddFriendNextView extends BaseView<AddFriendNextPresten...
    method getInputString (line 14) | String getInputString();
    method onSearchSuccess (line 15) | void onSearchSuccess(JSONObject object);
    method onSearchFailed (line 16) | void onSearchFailed(String error);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendsNextActivity.java
  class AddFriendsNextActivity (line 9) | public class AddFriendsNextActivity extends BaseActivity {
    method onCreate (line 10) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/pre/AddFriendsPreActivity.java
  class AddFriendsPreActivity (line 21) | public class AddFriendsPreActivity extends BaseActivity implements OnCli...
    method onCreate (line 26) | @Override
    method initUI (line 34) | private void initUI() {
    method setOnClick (line 54) | private void setOnClick() {
    method onClick (line 64) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendBasePresenter.java
  type NewFriendBasePresenter (line 15) | public interface NewFriendBasePresenter extends BasePresenter{
    method getAllInviteMessage (line 16) | List<InviteMessage> getAllInviteMessage();
    method registerRecivier (line 17) | void registerRecivier();
    method startActivity (line 18) | void startActivity(Context context, Class clazz);
    method saveUnreadMessageCount (line 19) | void saveUnreadMessageCount(int count);
    method refresh (line 20) | void refresh();
    method onDestory (line 21) | void onDestory();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendFragment.java
  class NewFriendFragment (line 25) | public class NewFriendFragment extends Fragment implements NewFriendView...
    method onCreateView (line 31) | @Nullable
    method initData (line 41) | private void initData() {
    method initView (line 49) | private void initView(View view) {
    method setListener (line 55) | private void setListener() {
    method onClick (line 59) | @Override
    method refresh (line 73) | @Override
    method setPresenter (line 80) | @Override
    method getBaseContext (line 85) | @Override
    method getBaseActivity (line 90) | @Override
    method onDestroy (line 95) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendPrestener.java
  class NewFriendPrestener (line 21) | public class NewFriendPrestener implements NewFriendBasePresenter {
    method NewFriendPrestener (line 27) | public NewFriendPrestener(NewFriendView newFriendView) {
    method getAllInviteMessage (line 34) | @Override
    method registerRecivier (line 39) | @Override
    method startActivity (line 46) | @Override
    method unRegisterRecivier (line 51) | private void unRegisterRecivier() {
    method saveUnreadMessageCount (line 57) | @Override
    method refresh (line 62) | @Override
    method onDestory (line 71) | @Override
    method start (line 78) | @Override
    class NewFriendRecivier (line 82) | private class NewFriendRecivier extends BroadcastReceiver {
      method onReceive (line 84) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendView.java
  type NewFriendView (line 12) | public interface NewFriendView extends BaseView<NewFriendPrestener> {
    method refresh (line 13) | void refresh();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsActivity.java
  class NewFriendsActivity (line 15) | public class NewFriendsActivity extends BaseActivity {
    method onCreate (line 17) | @Override
    method back (line 41) | public void back(View v) {
    method onBackPressed (line 46) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsAdapter.java
  class NewFriendsAdapter (line 47) | public class NewFriendsAdapter extends BaseAdapter {
    method NewFriendsAdapter (line 53) | public NewFriendsAdapter(Context _context, List<InviteMessage> msgs) {
    method getCount (line 60) | @Override
    method getItem (line 65) | @Override
    method getItemId (line 70) | @Override
    method getView (line 76) | @Override
    class ViewHolder (line 175) | private static class ViewHolder {
    method acceptInvitation (line 190) | private void acceptInvitation(final Button button, final InviteMessage...
    method sendCmdAgreeMsg (line 230) | private void sendCmdAgreeMsg(final Button button, final InviteMessage ...
    method deleteInviteMessge (line 303) | private void deleteInviteMessge(final InviteMessage msg){

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatActivity.java
  class ChatActivity (line 21) | public class ChatActivity extends BaseActivity {
    method onCreate (line 27) | @Override
    method onDestroy (line 52) | @Override
    method onNewIntent (line 58) | @Override
    method onBackPressed (line 71) | @Override
    method isSingleActivity (line 81) | public boolean isSingleActivity(Context context) {
    method getToChatUsername (line 87) | public String getToChatUsername() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatAdapter.java
  class ChatAdapter (line 52) | public class ChatAdapter extends BaseAdapter {
    method ChatAdapter (line 67) | public ChatAdapter(List<HTMessage> msgs, ChatFragment fragment, String...
    method getCount (line 84) | @Override
    method getItem (line 89) | @Override
    method getItemId (line 94) | @Override
    method getItemViewType (line 99) | @Override
    method notifyDataSetChanged (line 106) | @Override
    method getViewTypeCount (line 120) | @Override
    method getView (line 125) | @Override
    method getItemViewType (line 143) | private int getItemViewType(HTMessage htMessage) {
    method getViewByType (line 157) | private View getViewByType(int viewType, ViewGroup parent) {
    method handleViewAndHolder (line 177) | private void handleViewAndHolder(int viewType, View convertView, ChatV...
    method handleData (line 227) | private void handleData(ChatViewHolder holder, int viewType, final HTM...
    method showImageView (line 311) | private void showImageView(final HTMessage htMessage, ChatViewHolder h...
    method downLoadImageFromServer (line 358) | private void downLoadImageFromServer(final HTMessage htMessage, final ...
    method downLoadBigImageAndOpen (line 408) | private void downLoadBigImageAndOpen(final HTMessage htMessage) {
    method showVoiceView (line 458) | private void showVoiceView(final HTMessage htMessage, final ChatViewHo...
    class ChatViewHolder (line 521) | public static class ChatViewHolder {
    method showReSendDialog (line 551) | private void showReSendDialog(final HTMessage htMessage) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatContract.java
  type ChatContract (line 10) | public interface ChatContract {
    type View (line 12) | interface  View extends BaseView<Presenter>{
      method showItemDialog (line 14) | void showItemDialog();
      method showTitle (line 16) | void showTitle(String title);
      method hideKeyboard (line 18) | void hideKeyboard();
      method showKeyboard (line 20) | void showKeyboard();
      method showSpeakerMode (line 22) | void showSpeakerMode();
      method showInputMode (line 24) | void showInputMode();
      method showExtendMenuItem (line 26) | void showExtendMenuItem();
      method showEmojiView (line 28) | void showEmojiView();
    type Presenter (line 31) | interface Presenter extends BasePresenter{

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatFragment.java
  class ChatFragment (line 68) | public class ChatFragment extends Fragment {
    method onCreateView (line 95) | @Override
    method onActivityCreated (line 156) | @Override
    method setUpView (line 182) | private void setUpView() {
    method getAllMessage (line 202) | private void getAllMessage() {
    class MyInputViewLisenter (line 207) | private class MyInputViewLisenter implements ChatInputView.InputViewLi...
      method onPressToSpeakBtnTouch (line 209) | @Override
      method onBigExpressionClicked (line 221) | @Override
      method onSendButtonClicked (line 226) | @Override
      method onEditTextLongClick (line 231) | @Override
      method onEditTextUp (line 248) | @Override
    method getCopyMessage (line 259) | private HTMessage getCopyMessage(String msgId) {
    method getLastMessage (line 268) | private HTMessage getLastMessage() {
    method getExtendMenuItem (line 275) | private ChatExtendMenu getExtendMenuItem() {
    class MyItemClickListener (line 290) | class MyItemClickListener implements ChatExtendMenu.EaseChatExtendMenu...
      method onClick (line 292) | @Override
    method onStop (line 313) | @Override
    method onActivityResult (line 322) | @Override
    method showMsgDialog (line 341) | private void showMsgDialog(final HTMessage message, final int i) {
    method onResume (line 417) | @Override
    method onBackPressed (line 425) | public void onBackPressed() {
    method onPause (line 431) | @Override
    method sendTextMessage (line 440) | private void sendTextMessage(final String content) {
    method sendMessage (line 445) | public void sendMessage(final HTMessage htMessage) {
    method sendVoiceMessage (line 502) | private void sendVoiceMessage(String filePath, int length) {
    method readPictureDegree (line 514) | public static int readPictureDegree(String path) {
    method rotateBitmap (line 544) | public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
    method sendImageMessage (line 557) | private void sendImageMessage(String imagePath) {
    method sendPicByUri (line 575) | private void sendPicByUri(Uri selectedImage) {
    method selectPicFromCamera (line 609) | private void selectPicFromCamera() {
    method selectPicFromLocal (line 626) | private void selectPicFromLocal() {
    method onDestroy (line 638) | @Override
    method showCopyContent (line 656) | private void showCopyContent(final String copyType, final String local...
    method onMessageWithdrow (line 708) | private void onMessageWithdrow(String msgId) {
    class MyBroadcastReciver (line 719) | private class MyBroadcastReciver extends BroadcastReceiver {
      method onReceive (line 721) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatPresenter.java
  class ChatPresenter (line 7) | public class ChatPresenter    {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChatSettingActivity.java
  class ChatSettingActivity (line 27) | public class ChatSettingActivity extends BaseActivity implements
    method onCreate (line 44) | @Override
    method initView (line 62) | private void initView() {
    method initData (line 86) | private void initData() {
    method onClick (line 125) | @Override
    method moveToBlacklist (line 216) | private void moveToBlacklist(final String username) {
    method removeOutBlacklist (line 255) | private void removeOutBlacklist(final String tobeRemoveUser) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactActivity.java
  class ChooseContactActivity (line 50) | public class ChooseContactActivity extends BaseActivity implements Adapt...
    method onCreate (line 64) | @Override
    method initData (line 74) | private void initData() {
    method getData (line 85) | private void getData() {
    method getContacts (line 97) | private void getContacts() {
    method initView (line 111) | private void initView() {
    method setListener (line 118) | private void setListener() {
    method onItemClick (line 124) | @Override
    method getContactsInServer (line 138) | public void getContactsInServer() {
    method onClick (line 170) | @Override
    method showMessageFarWordDialog (line 183) | private void showMessageFarWordDialog(final ArrayList<User> users, fin...
    method sendMessage (line 233) | private void sendMessage(final HTMessage htMessage){
    method onResume (line 267) | @Override
    method getCopyMessage (line 278) | private HTMessage getCopyMessage(String msgId) {
    class PinyinComparator (line 286) | public class PinyinComparator implements Comparator<User> {
      method compare (line 288) | @SuppressLint("DefaultLocale")
      method isEmpty (line 305) | private boolean isEmpty(String str) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactAdapter.java
  class ChooseContactAdapter (line 26) | public class ChooseContactAdapter extends BaseAdapter {
    method ChooseContactAdapter (line 34) | public ChooseContactAdapter(Context mContext, ArrayList<User> beans) {
    method getCount (line 40) | @Override
    method initDate (line 45) | private void initDate() {
    method getItem (line 51) | @Override
    method getItemId (line 56) | @Override
    method getView (line 61) | @Override
    class ViewHolder (line 82) | public static class ViewHolder{
    method getIsSelected (line 87) | public static HashMap<Integer, Boolean> getIsSelected() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/ChatExtendMenu.java
  class ChatExtendMenu (line 27) | public class ChatExtendMenu extends GridView{
    method ChatExtendMenu (line 32) | public ChatExtendMenu(Context context, AttributeSet attrs, int defStyl...
    method ChatExtendMenu (line 36) | public ChatExtendMenu(Context context, AttributeSet attrs) {
    method ChatExtendMenu (line 41) | public ChatExtendMenu(Context context) {
    method init (line 46) | private void init(Context context, AttributeSet attrs){
    method init (line 61) | public void init(){
    method registerMenuItem (line 77) | public void registerMenuItem(String name, int drawableRes, int itemId,...
    method registerMenuItem (line 98) | public void registerMenuItem(int nameRes, int drawableRes, int itemId,...
    class ItemAdapter (line 103) | private class ItemAdapter extends ArrayAdapter<ChatMenuItemModel>{
      method ItemAdapter (line 107) | public ItemAdapter(Context context, List<ChatMenuItemModel> objects) {
      method getView (line 112) | @Override
    type EaseChatExtendMenuItemClickListener (line 137) | public interface EaseChatExtendMenuItemClickListener{
      method onClick (line 138) | void onClick(int itemId, View view);
    class ChatMenuItemModel (line 142) | class ChatMenuItemModel{
    class ChatMenuItem (line 149) | class ChatMenuItem extends LinearLayout {
      method ChatMenuItem (line 153) | public ChatMenuItem(Context context, AttributeSet attrs, int defStyl...
      method ChatMenuItem (line 157) | public ChatMenuItem(Context context, AttributeSet attrs) {
      method ChatMenuItem (line 162) | public ChatMenuItem(Context context) {
      method init (line 167) | private void init(Context context, AttributeSet attrs) {
      method setImage (line 173) | public void setImage(int resid) {
      method setText (line 177) | public void setText(int resid) {
      method setText (line 181) | public void setText(String text) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/ChatInputView.java
  class ChatInputView (line 50) | public class ChatInputView extends LinearLayout implements View.OnClickL...
    method ChatInputView (line 90) | public ChatInputView(Context context) {
    method ChatInputView (line 95) | public ChatInputView(Context context, @Nullable AttributeSet attrs) {
    method ChatInputView (line 100) | public ChatInputView(Context context, @Nullable AttributeSet attrs, in...
    method showEmotionLayout (line 105) | private void showEmotionLayout() {
    method init (line 117) | public void init(Context context) {
    method initView (line 124) | public void initView(Activity activity, View aboveView, InputViewLisen...
    method interceptBackPress (line 200) | public boolean interceptBackPress() {
    method setListener (line 214) | private void setListener() {
    method hideSoftInput (line 330) | public void hideSoftInput() {
    method hideEmotionLayout (line 335) | private void hideEmotionLayout(boolean showSoftInput) {
    method unlockContentHeightDelayed (line 344) | private void unlockContentHeightDelayed() {
    method showSoftInput (line 353) | private void showSoftInput() {
    method lockContentHeight (line 364) | private void lockContentHeight() {
    method onClick (line 370) | @Override
    method isSoftInputShown (line 466) | private boolean isSoftInputShown() {
    method showVoiceRecordingView (line 470) | private void showVoiceRecordingView() {
    method setEmojiMode (line 476) | private void setEmojiMode() {
    method setExtendMode (line 481) | private void setExtendMode() {
    method showInputView (line 487) | private void showInputView() {
    method initEmojiView (line 492) | private void initEmojiView(Context context) {
    method editTextDelete (line 555) | private void editTextDelete(EditText editText) {
    method editTextAddEmoji (line 563) | private void editTextAddEmoji(Emojicon emojicon) {
    method getSupportSoftInputHeight (line 575) | private int getSupportSoftInputHeight() {
    method getSoftButtonsBarHeight (line 593) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    type InputViewLisenter (line 608) | public interface InputViewLisenter {
      method onPressToSpeakBtnTouch (line 610) | boolean onPressToSpeakBtnTouch(View v, MotionEvent event);
      method onBigExpressionClicked (line 612) | void onBigExpressionClicked(Emojicon emojicon);
      method onSendButtonClicked (line 614) | void onSendButtonClicked(String content);
      method onEditTextLongClick (line 616) | boolean onEditTextLongClick();
      method onEditTextUp (line 618) | void onEditTextUp();
    method ininExtendView (line 622) | private void ininExtendView() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoicePlayClickListener.java
  class VoicePlayClickListener (line 30) | public class VoicePlayClickListener implements View.OnClickListener {
    method VoicePlayClickListener (line 47) | public VoicePlayClickListener(HTMessage message, String chatTo, ImageV...
    method stopPlayVoice (line 58) | public void stopPlayVoice() {
    method playVoice (line 75) | public void playVoice(String filePath) {
    method showAnimation (line 133) | private void showAnimation() {
    method onClick (line 144) | @Override
    method downLoadVoiceFileFromServer (line 213) | private void downLoadVoiceFileFromServer(final HTMessage htMessage) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoiceRecorder.java
  class VoiceRecorder (line 18) | public class VoiceRecorder {
    method VoiceRecorder (line 31) | public VoiceRecorder(Handler handler) {
    method startRecording (line 38) | public String startRecording(Context appContext) {
    method discardRecording (line 98) | public void discardRecording() {
    method stopRecoding (line 113) | public int stopRecoding() {
    method finalize (line 134) | protected void finalize() throws Throwable {
    method getVoiceFileName (line 141) | private String getVoiceFileName(String uid) {
    method isRecording (line 147) | public boolean isRecording() {
    method getVoiceFilePath (line 152) | public String getVoiceFilePath() {
    method getVoiceFileName (line 156) | public String getVoiceFileName() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoiceRecorderView.java
  class VoiceRecorderView (line 26) | public class VoiceRecorderView extends RelativeLayout {
    method handleMessage (line 37) | @Override
    method VoiceRecorderView (line 44) | public VoiceRecorderView(Context context) {
    method VoiceRecorderView (line 49) | public VoiceRecorderView(Context context, AttributeSet attrs) {
    method VoiceRecorderView (line 54) | public VoiceRecorderView(Context context, AttributeSet attrs, int defS...
    method init (line 59) | private void init(Context context) {
    method onPressToSpeakBtnTouch (line 98) | public boolean onPressToSpeakBtnTouch(View v, MotionEvent event, EaseV...
    class MyCountDownTimer (line 166) | public class MyCountDownTimer extends CountDownTimer {
      method MyCountDownTimer (line 173) | public MyCountDownTimer(long millisInFuture, long countDownInterval,...
      method onFinish (line 181) | @Override
      method onTick (line 209) | @Override
    type EaseVoiceRecorderCallback (line 220) | public interface EaseVoiceRecorderCallback {
      method onVoiceRecordComplete (line 227) | void onVoiceRecordComplete(String voiceFilePath, int voiceTimeLength);
    method startRecording (line 230) | public void startRecording() {
    method showReleaseToCancelHint (line 253) | public void showReleaseToCancelHint() {
    method showMoveUpToCancelHint (line 258) | public void showMoveUpToCancelHint() {
    method discardRecording (line 263) | public void discardRecording() {
    method stopRecoding (line 276) | public int stopRecoding() {
    method getVoiceFilePath (line 283) | public String getVoiceFilePath() {
    method getVoiceFileName (line 287) | public String getVoiceFileName() {
    method isRecording (line 291) | public boolean isRecording() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/DefaultEmojiconDatas.java
  class DefaultEmojiconDatas (line 6) | public class DefaultEmojiconDatas {
    method createData (line 89) | private static Emojicon[] createData(){
    method getData (line 97) | public static Emojicon[] getData(){

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/EmojiFragment.java
  class EmojiFragment (line 26) | public class EmojiFragment extends Fragment {
    method EmojiFragment (line 35) | public EmojiFragment(List<Emojicon> emojicons, int emojiconColumns, in...
    method onCreateView (line 42) | @Nullable
    method onActivityCreated (line 51) | @Override
    method getViews (line 94) | private List<View> getViews() {
    type OnEmojiListener (line 148) | public interface OnEmojiListener{
      method onDeleteImageClicked (line 149) | void onDeleteImageClicked();
      method onExpressionClicked (line 150) | void onExpressionClicked(Emojicon emojicon);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/Emojicon.java
  class Emojicon (line 3) | public class Emojicon {
    method Emojicon (line 4) | public Emojicon(){
    method Emojicon (line 12) | public Emojicon(int icon, String emojiText){
    method Emojicon (line 24) | public Emojicon(int icon, String emojiText, Type type){
    method getIcon (line 76) | public int getIcon() {
    method setIcon (line 85) | public void setIcon(int icon) {
    method getBigIcon (line 94) | public int getBigIcon() {
    method setBigIcon (line 103) | public void setBigIcon(int dynamicIcon) {
    method getEmojiText (line 112) | public String getEmojiText() {
    method setEmojiText (line 121) | public void setEmojiText(String emojiText) {
    method getName (line 129) | public String getName() {
    method setName (line 137) | public void setName(String name) {
    method getType (line 145) | public Type getType() {
    method setType (line 154) | public void setType(Type type) {
    method getIconPath (line 163) | public String getIconPath() {
    method setIconPath (line 172) | public void setIconPath(String iconPath) {
    method getBigIconPath (line 181) | public String getBigIconPath() {
    method setBigIconPath (line 190) | public void setBigIconPath(String bigIconPath) {
    method getIdentityCode (line 198) | public String getIdentityCode() {
    method setIdentityCode (line 206) | public void setIdentityCode(String identityCode) {
    method newEmojiText (line 210) | public static final String newEmojiText(int codePoint) {
    type Type (line 220) | public enum Type{

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/EmojiconGridAdapter.java
  class EmojiconGridAdapter (line 17) | public class EmojiconGridAdapter extends ArrayAdapter<Emojicon>{
    method EmojiconGridAdapter (line 22) | public EmojiconGridAdapter(Context context, int textViewResourceId, Li...
    method getView (line 27) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/SmileUtils.java
  class SmileUtils (line 33) | public class SmileUtils {
    method addPattern (line 94) | public static void addPattern(String emojiText, Object icon){
    method addSmiles (line 105) | public static boolean addSmiles(Context context, Spannable spannable) {
    method getSmiledText (line 156) | public static Spannable getSmiledText(Context context, CharSequence te...
    method containsKey (line 162) | public static boolean containsKey(String key){
    method getSmilesSize (line 175) | public static int getSmilesSize(){

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/DensityUtil.java
  class DensityUtil (line 19) | public class DensityUtil {
    method dip2px (line 21) | public static int dip2px(Context context, float dpValue) {
    method px2dip (line 27) | public static int px2dip(Context context, float pxValue) {
    method getScreenDensity (line 32) | public static float getScreenDensity(Context context) {
    method getStatusBarHeight (line 36) | public static int getStatusBarHeight(Context ctx) {
    method getScreenHeightWithoutTitlebar (line 66) | public static int getScreenHeightWithoutTitlebar(Context ctx) {
    method getScreenWidthAndHeight (line 71) | public static int[] getScreenWidthAndHeight(Context ctx) {
    method addOnSoftKeyBoardVisibleListener (line 86) | public static void addOnSoftKeyBoardVisibleListener(final Activity act...
    method getEllipsisedText (line 113) | public static String getEllipsisedText(TextView textView) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/Pacman.java
  class Pacman (line 16) | public class Pacman extends ProgressViewController {
    method draw (line 24) | @Override
    method drawPacman (line 30) | private void drawPacman(Canvas canvas, Paint paint){
    method drawCircle (line 54) | private void drawCircle(Canvas canvas, Paint paint) {
    method createAnimation (line 60) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/ProgressView.java
  class ProgressView (line 16) | public class ProgressView extends View {
    method ProgressView (line 30) | public ProgressView(Context context) {
    method ProgressView (line 35) | public ProgressView(Context context, AttributeSet attrs) {
    method ProgressView (line 40) | public ProgressView(Context context, AttributeSet attrs, int defStyleA...
    method ProgressView (line 46) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    method init (line 52) | private void init(AttributeSet attrs, int defStyle) {
    method setStyleColor (line 60) | public void setStyleColor(int color){
    method applyIndicator (line 66) | private void applyIndicator(){
    method onMeasure (line 71) | @Override
    method measureDimension (line 78) | private int measureDimension(int defaultSize,int measureSpec){
    method onDraw (line 92) | @Override
    method onLayout (line 98) | @Override
    method setVisibility (line 107) | @Override
    method onDetachedFromWindow (line 119) | @Override
    method onAttachedToWindow (line 125) | @Override
    method drawIndicator (line 131) | void drawIndicator(Canvas canvas){
    method applyAnimation (line 135) | void applyAnimation(){
    method dp2px (line 139) | private int dp2px(int dpValue) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/ProgressViewController.java
  class ProgressViewController (line 13) | public abstract class ProgressViewController {
    method setTarget (line 21) | public void setTarget(View target){
    method getTarget (line 25) | public View getTarget(){
    method getWidth (line 30) | public int getWidth(){
    method getHeight (line 34) | public int getHeight(){
    method postInvalidate (line 38) | public void postInvalidate(){
    method draw (line 47) | public abstract void draw(Canvas canvas, Paint paint);
    method createAnimation (line 52) | public abstract List<Animator> createAnimation();
    method initAnimation (line 54) | public void initAnimation(){
    method setAnimationStatus (line 65) | public void setAnimationStatus(AnimStatus animStatus){
    type AnimStatus (line 94) | public enum AnimStatus{

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/PullToLoadMoreListView.java
  class PullToLoadMoreListView (line 20) | public class PullToLoadMoreListView extends FrameLayout {
    method PullToLoadMoreListView (line 46) | public PullToLoadMoreListView(Context context) {
    method PullToLoadMoreListView (line 50) | public PullToLoadMoreListView(Context context, AttributeSet attrs) {
    method PullToLoadMoreListView (line 54) | public PullToLoadMoreListView(Context context, AttributeSet attrs, int...
    method getListView (line 58) | public ListView getListView(){
    method init (line 61) | private void init(Context context, AttributeSet attrs, int defStyleAtt...
    method addHeaderView (line 68) | private void addHeaderView(Context context){
    method addListView (line 73) | private void addListView(Context context, AttributeSet attrs){
    method onMeasure (line 77) | @Override
    method canChildScrollUp (line 86) | private boolean canChildScrollUp() {
    method onInterceptTouchEvent (line 92) | @Override
    method onTouchEvent (line 113) | @Override
    method upToMiddleAnim (line 159) | private void upToMiddleAnim(){
    method upToTopAnim (line 206) | private void upToTopAnim(){
    method completeBackToTop (line 252) | private void completeBackToTop(){
    method onRefreshComplete (line 260) | public void onRefreshComplete(){
    method setOnRefreshListener (line 268) | public void setOnRefreshListener(OnRefreshListener listener){
    type OnRefreshListener (line 271) | public interface OnRefreshListener{
      method onPullDownLoadMore (line 272) | void onPullDownLoadMore();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/RefreshHeader.java
  class RefreshHeader (line 20) | public class RefreshHeader extends LinearLayout {
    method RefreshHeader (line 35) | public RefreshHeader(Context context) {
    method RefreshHeader (line 39) | public RefreshHeader(Context context, AttributeSet attrs) {
    method RefreshHeader (line 43) | public RefreshHeader(Context context, AttributeSet attrs, int defStyle...
    method getHeaderHeight (line 48) | public float getHeaderHeight() {
    method init (line 52) | private void init(Context context, AttributeSet attrs, int defStyleAtt...
    method updateRefreshStatus (line 105) | public void updateRefreshStatus(int status) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CharacterParserUtil.java
  class CharacterParserUtil (line 12) | public class CharacterParserUtil {
    method getInstance (line 93) | public static CharacterParserUtil getInstance() {
    method getResource (line 97) | public String getResource() {
    method setResource (line 101) | public void setResource(String resource) {
    method getChsAscii (line 111) | private int getChsAscii(String chs) {
    method convert (line 138) | public String convert(String str) {
    method getSelling (line 160) | public String getSelling(String chs) {
    method getSpelling (line 178) | public String getSpelling() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountryCodeUtil.java
  class CountryCodeUtil (line 18) | public class CountryCodeUtil {
    method getCountryList (line 22) | public static List<CountrySortModel> getCountryList(Context context, b...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountryComparator.java
  class CountryComparator (line 15) | public class CountryComparator implements Comparator<CountrySortModel> {
    method compare (line 17) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountryModel.java
  class CountryModel (line 14) | public class CountryModel {
    method CountryModel (line 29) | public CountryModel(String countryName, String countryNumber, String c...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortAdapter.java
  class CountrySortAdapter (line 31) | public class CountrySortAdapter extends BaseAdapter implements SectionIn...
    method CountrySortAdapter (line 45) | public CountrySortAdapter(Context mContext, List<CountrySortModel> lis...
    method getCount (line 54) | @Override
    method getItem (line 59) | @Override
    method getItemId (line 64) | @Override
    method getView (line 69) | @Override
    method getPositionForSection (line 102) | @Override
    method getSectionForPosition (line 119) | @Override
    method getSections (line 124) | @Override
    method updateListView (line 134) | public void updateListView(List<CountrySortModel> list) {
    class ViewHolder (line 143) | public static class ViewHolder {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortModel.java
  class CountrySortModel (line 12) | public class CountrySortModel extends CountryModel {
    method CountrySortModel (line 18) | public CountrySortModel(String name, String number, String countrySort...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortToken.java
  class CountrySortToken (line 12) | public class CountrySortToken

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/GetCountryNameSort.java
  class GetCountryNameSort (line 26) | public class GetCountryNameSort {
    method getSortLetter (line 38) | public String getSortLetter(String name) {
    method getSortLetterBySortKey (line 60) | public String getSortLetterBySortKey(String sortKey) {
    method search (line 81) | public List<CountrySortModel> search(String str, List<CountrySortModel...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/country/SideBar.java
  class SideBar (line 28) | public class SideBar extends View {
    method setTextView (line 44) | public void setTextView(TextView mTextDialog) {
    method SideBar (line 48) | public SideBar(Context context, AttributeSet attrs, int defStyle) {
    method SideBar (line 52) | public SideBar(Context context, AttributeSet attrs) {
    method SideBar (line 56) | public SideBar(Context context) {
    method onDraw (line 60) | @Override
    method dispatchTouchEvent (line 90) | @Override
    method setOnTouchingLetterChangedListener (line 136) | public void setOnTouchingLetterChangedListener(
    type OnTouchingLetterChangedListener (line 146) | public interface OnTouchingLetterChangedListener {
      method onTouchingLetterChanged (line 147) | public void onTouchingLetterChanged(String s);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/login/LoginActivity.java
  class LoginActivity (line 16) | public class LoginActivity extends BaseActivity {
    method onCreate (line 20) | @Override
    method requestPermissions (line 47) | @TargetApi(23)
    method onRequestPermissionsResult (line 59) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/login/LoginContract.java
  type LoginContract (line 15) | public interface LoginContract {
    type View (line 17) | interface View extends BaseView<Presenter> {
      method showDialog (line 19) | void showDialog();
      method cancelDialog (line 21) | void cancelDialog();
      method getUsername (line 23) | String getUsername();
      method getPassword (line 25) | String getPassword();
      method setButtonEnable (line 27) | void setButtonEnable();
      method setButtonDisabel (line 29) | void setButtonDisabel();
      method showToast (line 31) | void showToast(int toastMsg);
      method getCountryName (line 33) | String getCountryName();
      method getCountryCode (line 35) | String getCountryCode();
      method getBaseActivity (line 37) | Activity getBaseActivity();
      method getBaseContext (line 39) | Context getBaseContext();
    type Presenter (line 44) | interface Presenter extends BasePresenter {
      method requestServer (line 46) | void requestServer(String username, String password);
      method chooseCuntry (line 48) | void chooseCuntry(Context context, TextView tvCountryName, TextView ...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/login/LoginFragment.java
  class LoginFragment (line 32) | public class LoginFragment extends Fragment implements LoginContract.Vie...
    method onCreate (line 40) | @Override
    method onCreateView (line 46) | @Nullable
    method setLisenter (line 63) | private void setLisenter() {
    method setPresenter (line 78) | @Override
    method showDialog (line 85) | @Override
    method cancelDialog (line 91) | @Override
    method getUsername (line 98) | @Override
    method getPassword (line 103) | @Override
    method setButtonEnable (line 108) | @Override
    method setButtonDisabel (line 114) | @Override
    method showToast (line 120) | @Override
    method getCountryName (line 129) | @Override
    method getCountryCode (line 134) | @Override
    method getBaseActivity (line 140) | @Override
    method getBaseContext (line 145) | @Override
    method onClick (line 150) | @Override
    class TextChange (line 187) | private class TextChange implements TextWatcher {
      method afterTextChanged (line 189) | @Override
      method beforeTextChanged (line 194) | @Override
      method onTextChanged (line 200) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/login/LoginPresenter.java
  class LoginPresenter (line 31) | public class LoginPresenter implements LoginContract.Presenter {
    method LoginPresenter (line 33) | public LoginPresenter(LoginContract.View loginView){
    method requestServer (line 39) | @Override
    method chooseCuntry (line 84) | @Override
    method loginIm (line 94) | private void loginIm(final JSONObject userJson) {
    method start (line 149) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/MainActivity.java
  class MainActivity (line 48) | public class MainActivity extends BaseActivity implements MainView {
    method onCreate (line 66) | @Override
    method onCreateOptionsMenu (line 117) | @Override
    method onPrepareOptionsPanel (line 125) | @Override
    method initViews (line 143) | private void initViews() {
    method onStart (line 169) | @Override
    method onDestroy (line 175) | @Override
    method getBottomView (line 191) | private View getBottomView(final int index, int drawableRes) {
    method setPresenter (line 218) | @Override
    method getBaseActivity (line 223) | @Override
    method showConflicDialog (line 228) | @Override
    method showUpdateDialog (line 265) | @Override
    method onUnReadMsgs (line 317) | @Override
    method onNewIntent (line 333) | @Override
    method onKeyDown (line 342) | @Override
    method onRequestPermissionsResult (line 352) | @Override
    method logout (line 359) | private void logout() {
    method requestPermissions (line 380) | @TargetApi(23)
    method showInvitionCount (line 396) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/MainBasePrester.java
  type MainBasePrester (line 10) | public interface MainBasePrester extends BasePresenter {
    method checkVersion (line 13) | void checkVersion();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/MainPrestener.java
  class MainPrestener (line 26) | public class MainPrestener implements MainBasePrester {
    method MainPrestener (line 31) | public MainPrestener(MainView _mainView){
    method start (line 37) | @Override
    method getVersionCode (line 63) | public String getVersionCode() {
    method checkVersion (line 78) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/MainView.java
  type MainView (line 12) | public interface MainView extends BaseView<MainPrestener>,ConversationFr...
    method showConflicDialog (line 14) | void showConflicDialog();
    method showUpdateDialog (line 16) | void showUpdateDialog( String message,String url,String isForce);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/BaseContactsPresenter.java
  type BaseContactsPresenter (line 13) | public interface BaseContactsPresenter extends BasePresenter{
    method getContactsListInDb (line 14) | List<User> getContactsListInDb();
    method deleteContacts (line 15) | void deleteContacts(String userId);
    method moveUserToBlack (line 16) | void moveUserToBlack(String userId);
    method sortList (line 17) | List<User> sortList(  List<User> users);
    method refreshContactsInServer (line 18) | void refreshContactsInServer();
    method getInvitionCount (line 19) | int getInvitionCount();
    method getContactsCount (line 20) | int getContactsCount();
    method clearInvitionCount (line 21) | void clearInvitionCount();
    method refreshContactsInLocal (line 22) | void refreshContactsInLocal();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsAdapter.java
  class ContactsAdapter (line 25) | public class ContactsAdapter extends BaseAdapter implements SectionIndex...
    method ContactsAdapter (line 29) | public ContactsAdapter(Context context, List<User> data) {
    method getCount (line 34) | @Override
    method getItem (line 39) | @Override
    method getItemId (line 44) | @Override
    method getView (line 49) | @Override
    method getSections (line 88) | @Override
    method getPositionForSection (line 115) | public int getPositionForSection(int section) {
    method getSectionForPosition (line 119) | public int getSectionForPosition(int position) {
    class ViewHolder (line 123) | private class ViewHolder {
    method getPreHeaderLeeter (line 128) | private String getPreHeaderLeeter(int position) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsPresenter.java
  class ContactsPresenter (line 36) | public class ContactsPresenter implements BaseContactsPresenter {
    method ContactsPresenter (line 43) | public ContactsPresenter (ContactsView view){
    method getContactsListInDb (line 51) | @Override
    method deleteContacts (line 57) | @Override
    method moveUserToBlack (line 66) | @Override
    method deleteContactOnBroast (line 94) | public void deleteContactOnBroast(String id) {
    method deleteContact (line 111) | private void deleteContact(final User user) {
    method sendDeleteCmd (line 147) | private void sendDeleteCmd(User user) {
    method sortList (line 187) | @Override
    class PinyinComparator (line 193) | public class PinyinComparator implements Comparator<User> {
      method compare (line 195) | @Override
    method refreshContactsInServer (line 214) | @Override
    method getInvitionCount (line 249) | @Override
    method getContactsCount (line 256) | @Override
    method clearInvitionCount (line 261) | @Override
    method refreshContactsInLocal (line 267) | @Override
    method start (line 275) | @Override
    method showMoveToBlackDialog (line 284) | private void showMoveToBlackDialog(final String userId) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsView.java
  type ContactsView (line 11) | public interface ContactsView extends BaseView<ContactsPresenter> {
    method showItemDialog (line 12) | void showItemDialog(User user);
    method showSiderBar (line 13) | void showSiderBar();
    method showInvitionCount (line 14) | void showInvitionCount(int count);
    method showContactsCount (line 15) | void showContactsCount(int count);
    method refresh (line 16) | void refresh();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/FragmentContacts.java
  class FragmentContacts (line 44) | public class FragmentContacts extends Fragment implements View.OnClickLi...
    type ContactsListener (line 52) | public interface ContactsListener {
      method showInvitionCount (line 53) | void showInvitionCount(int count);
    method onAttach (line 58) | @Override
    method onCreateView (line 67) | @Override
    method onActivityCreated (line 92) | @Override
    method onClick (line 124) | @Override
    method setPresenter (line 142) | @Override
    method getBaseContext (line 147) | @Override
    method getBaseActivity (line 152) | @Override
    method showItemDialog (line 157) | @Override
    method showSiderBar (line 177) | @Override
    method showInvitionCount (line 183) | @Override
    method showContactsCount (line 195) | @Override
    method refresh (line 201) | @Override
    class MyBroadcastReceiver (line 207) | private class MyBroadcastReceiver extends BroadcastReceiver {
      method onReceive (line 208) | @Override
    method registerBroadReciever (line 225) | private void registerBroadReciever() {
    method onDestroy (line 234) | @Override
    method onActivityResult (line 245) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/Sidebar.java
  class Sidebar (line 32) | public class Sidebar extends View{
    method setListView (line 39) | public void setListView(ListView listView){
    method Sidebar (line 44) | public Sidebar(Context context, AttributeSet attrs) {
    method init (line 52) | private void init(){
    method onDraw (line 61) | @Override
    method sectionForPoint (line 71) | private int sectionForPoint(float y) {
    method setHeaderTextAndscroll (line 82) | private void setHeaderTextAndscroll(MotionEvent event){
    method onTouchEvent (line 107) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/BaseConversationPresenter.java
  type BaseConversationPresenter (line 14) | public interface BaseConversationPresenter extends BasePresenter
    method getAllConversations (line 16) | List<HTConversation> getAllConversations();
    method deleteConversation (line 17) | void deleteConversation(HTConversation conversation);
    method setTopConversation (line 18) | void setTopConversation(HTConversation conversation);
    method cancelTopConversation (line 19) | void cancelTopConversation(HTConversation conversation);
    method refreshConversations (line 20) | void refreshConversations();
    method onNewMsgReceived (line 21) | void onNewMsgReceived(HTMessage htmessage);
    method getUnreadMsgCount (line 22) | int getUnreadMsgCount();
    method markAllMessageRead (line 23) | void markAllMessageRead(HTConversation conversation);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationAdapter.java
  class ConversationAdapter (line 27) | public class ConversationAdapter extends BaseAdapter {
    method ConversationAdapter (line 31) | public ConversationAdapter(Context context, List<HTConversation> htCon...
    method getCount (line 36) | @Override
    method getItem (line 41) | @Override
    method getItemId (line 47) | @Override
    method getView (line 52) | @Override
    class ViewHolder (line 111) | private static class ViewHolder {
    method getContent (line 139) | private String getContent(HTMessage message) {
    method getStrng (line 225) | String getStrng(Context context, int resId) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationFragment.java
  class ConversationFragment (line 29) | public class ConversationFragment extends Fragment implements Conversati...
    method onCreateView (line 40) | @Override
    method setPresenter (line 50) | @Override
    method getBaseContext (line 55) | @Override
    method getBaseActivity (line 60) | @Override
    method showItemDialog (line 65) | @Override
    method refresh (line 89) | @Override
    type NewMeesageListener (line 96) | public interface NewMeesageListener {
      method onUnReadMsgs (line 98) | void onUnReadMsgs(int count);
    method onAttach (line 101) | @Override
    method onUnreadMsgChange (line 111) | private void onUnreadMsgChange() {
    method onActivityCreated (line 115) | @Override
    method onReceive (line 145) | @Override
    method registerConnectionBroadCast (line 170) | private void registerConnectionBroadCast() {
    method onDestroy (line 181) | @Override
    method onResume (line 187) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationPresenter.java
  class ConversationPresenter (line 16) | public class ConversationPresenter implements BaseConversationPresenter {
    method ConversationPresenter (line 21) | public ConversationPresenter(ConversationView view) {
    method start (line 29) | @Override
    method getAllConversations (line 34) | @Override
    method deleteConversation (line 40) | @Override
    method setTopConversation (line 47) | @Override
    method cancelTopConversation (line 54) | @Override
    method refreshConversations (line 60) | @Override
    method onNewMsgReceived (line 66) | @Override
    method getUnreadMsgCount (line 71) | @Override
    method markAllMessageRead (line 82) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationView.java
  type ConversationView (line 11) | public interface ConversationView extends BaseView<ConversationPresenter>{
    method showItemDialog (line 13) | void showItemDialog(HTConversation htConversation);
    method refresh (line 14) | void refresh();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailesFragment.java
  class UserDetailesFragment (line 36) | public class UserDetailesFragment extends Fragment implements UserDetail...
    method onCreate (line 45) | @Override
    method onCreateView (line 53) | @Nullable
    method getData (line 63) | private void getData() {
    method setLstenter (line 80) | private void setLstenter() {
    method initView (line 85) | private void initView(View infoView) {
    method onRefreshSuccess (line 100) | @Override
    method onRefreshFailed (line 105) | @Override
    method getFxid (line 110) | @Override
    method getUserJson (line 115) | @Override
    method showDialog (line 122) | @Override
    method hintDialog (line 129) | @Override
    method showUi (line 136) | @Override
    method setPresenter (line 203) | @Override
    method getBaseContext (line 208) | @Override
    method getBaseActivity (line 213) | @Override
    method onClick (line 218) | @Override
    method onDestroy (line 230) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsActivity.java
  class UserDetailsActivity (line 12) | public class UserDetailsActivity extends BaseActivity {
    method onCreate (line 21) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsBasePrester.java
  type UserDetailsBasePrester (line 13) | public interface UserDetailsBasePrester extends BasePresenter {
    method onDestory (line 14) | void onDestory();
    method refreshInfo (line 15) | void refreshInfo(String userId, boolean backTask);
    method isMe (line 16) | boolean isMe(String userId);
    method isFriend (line 17) | boolean isFriend(String userId);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsPrester.java
  class UserDetailsPrester (line 22) | public class UserDetailsPrester implements UserDetailsBasePrester {
    method UserDetailsPrester (line 26) | public UserDetailsPrester(UserDetailsView detailsView) {
    method onDestory (line 31) | @Override
    method refreshInfo (line 36) | @Override
    method isMe (line 78) | @Override
    method isFriend (line 83) | @Override
    method start (line 88) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsView.java
  type UserDetailsView (line 13) | public interface UserDetailsView extends BaseView<UserDetailsPrester> {
    method onRefreshSuccess (line 14) | void onRefreshSuccess(String msg);
    method onRefreshFailed (line 15) | void onRefreshFailed(String error);
    method getFxid (line 16) | String getFxid();
    method getUserJson (line 17) | JSONObject getUserJson();
    method showDialog (line 18) | void showDialog();
    method hintDialog (line 19) | void hintDialog();
    method showUi (line 20) | void showUi(JSONObject object);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/FragmentFind.java
  class FragmentFind (line 15) | public class FragmentFind extends Fragment implements View.OnClickListen...
    method onCreateView (line 18) | @Override
    method onActivityCreated (line 24) | @Override
    method setListener (line 35) | private void setListener() {
    method initData (line 42) | private void initData() {
    method initView (line 46) | private void initView() {
    method onClick (line 55) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyActivity.java
  class PeopleRecentlyActivity (line 16) | public class PeopleRecentlyActivity extends BaseActivity {
    method onCreate (line 18) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyAdapter.java
  class PeopleRecentlyAdapter (line 29) | public class PeopleRecentlyAdapter extends BaseAdapter {
    method PeopleRecentlyAdapter (line 33) | public PeopleRecentlyAdapter(Context context, List<JSONObject> peoples) {
    method getCount (line 38) | @Override
    method getItem (line 43) | @Override
    method getItemId (line 48) | @Override
    method getView (line 53) | @Override
    class ViewHolder (line 105) | private class ViewHolder {
      method ViewHolder (line 110) | public ViewHolder(View view) {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyBasePrestener.java
  type PeopleRecentlyBasePrestener (line 13) | public interface PeopleRecentlyBasePrestener extends BasePresenter {
    method requestData (line 14) | void requestData(int page,int pageSize,boolean loadMore);
    method onListClickListener (line 15) | void onListClickListener(JSONObject object);
    method onDestory (line 16) | void onDestory();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyFragment.java
  class PeopleRecentlyFragment (line 31) | public class PeopleRecentlyFragment extends Fragment implements PeopleRe...
    method onCreate (line 39) | @Override
    method onCreateView (line 45) | @Nullable
    method setListener (line 55) | private void setListener() {
    method initData (line 60) | private void initData() {
    method initView (line 66) | private void initView(View timeview) {
    method showLoadingDialog (line 71) | @Override
    method hideLoadingDialog (line 78) | @Override
    method onRequestSuccess (line 86) | @Override
    method onRequestFailed (line 94) | @Override
    method setPresenter (line 100) | @Override
    method getBaseContext (line 105) | @Override
    method getBaseActivity (line 110) | @Override
    method onItemClick (line 115) | @Override
    method onRefresh (line 121) | @Override
    method onLoad (line 128) | @Override
    method onDestroy (line 134) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyPrestener.java
  class PeopleRecentlyPrestener (line 24) | public class PeopleRecentlyPrestener implements PeopleRecentlyBasePreste...
    method PeopleRecentlyPrestener (line 27) | public PeopleRecentlyPrestener(PeopleRecentlyView timeView) {
    method requestData (line 32) | @Override
    method onListClickListener (line 78) | @Override
    method onDestory (line 83) | @Override
    method start (line 88) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyView.java
  type PeopleRecentlyView (line 15) | public interface PeopleRecentlyView extends BaseView<PeopleRecentlyPrest...
    method showLoadingDialog (line 16) | void showLoadingDialog();
    method hideLoadingDialog (line 17) | void hideLoadingDialog();
    method onRequestSuccess (line 18) | void onRequestSuccess(List<JSONObject> peoples);
    method onRequestFailed (line 19) | void onRequestFailed(String errorMsg);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordBasePrester.java
  type PasswordBasePrester (line 12) | public interface PasswordBasePrester  extends BasePresenter {
    method sendSMSCode (line 13) | void sendSMSCode(String mobile,String countryName,String countryCode);
    method resetPassword (line 14) | void resetPassword(String cacheCode,String smsCode,String password,Str...

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordPrester.java
  class PasswordPrester (line 28) | public class PasswordPrester implements PasswordBasePrester {
    method PasswordPrester (line 32) | public PasswordPrester(PasswordView passwordView) {
    method sendSMSCode (line 37) | @Override
    method resetPassword (line 55) | @Override
    method logOut (line 110) | private void logOut(boolean isReset) {
    method start (line 143) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordResetActivity.java
  class PasswordResetActivity (line 13) | public class PasswordResetActivity extends BaseActivity{
    method onCreate (line 14) | @Override
    method initView (line 22) | private void initView() {
    method getData (line 33) | private void getData() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordResetFragment.java
  class PasswordResetFragment (line 31) | public class PasswordResetFragment extends Fragment implements PasswordV...
    method onCreateView (line 42) | @Nullable
    method setListener (line 53) | private void setListener() {
    method initData (line 61) | private void initData() {
    method initView (line 79) | private void initView(View pswView) {
    method getData (line 94) | private void getData() {
    method onClick (line 98) | @Override
    method getCountryName (line 114) | @Override
    method getCountryCode (line 119) | @Override
    method getCacheCode (line 124) | @Override
    method getSMSCode (line 129) | @Override
    method getIsReset (line 134) | @Override
    method getMobile (line 139) | @Override
    method getPwd (line 144) | @Override
    method getConfimPwd (line 149) | @Override
    method clearCacheCode (line 154) | @Override
    method onSendSMSCodeSuccess (line 159) | @Override
    method onSendSMSCodeFailed (line 168) | @Override
    method onResetSuccess (line 173) | @Override
    method onResetFailed (line 178) | @Override
    method startTimeDown (line 183) | @Override
    method finishTimeDown (line 188) | @Override
    method onLogOutFailed (line 194) | @Override
    method setPresenter (line 199) | @Override
    method getBaseContext (line 204) | @Override
    method getBaseActivity (line 209) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordView.java
  type PasswordView (line 12) | public interface PasswordView extends BaseView<PasswordPrester>{
    method getCountryName (line 13) | String getCountryName();
    method getCountryCode (line 14) | String getCountryCode();
    method getCacheCode (line 15) | String getCacheCode();
    method getSMSCode (line 16) | String getSMSCode();
    method getIsReset (line 17) | boolean getIsReset();
    method getMobile (line 18) | String getMobile();
    method getPwd (line 19) | String getPwd();
    method getConfimPwd (line 20) | String getConfimPwd();
    method clearCacheCode (line 21) | void clearCacheCode();
    method onSendSMSCodeSuccess (line 22) | void onSendSMSCodeSuccess(String msg);
    method onSendSMSCodeFailed (line 23) | void onSendSMSCodeFailed(String error);
    method onResetSuccess (line 24) | void onResetSuccess(String msg);
    method onResetFailed (line 25) | void onResetFailed(String error);
    method startTimeDown (line 26) | void startTimeDown();
    method finishTimeDown (line 27) | void finishTimeDown();
    method onLogOutFailed (line 28) | void onLogOutFailed(String msg);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/FragmentProfile.java
  class FragmentProfile (line 29) | public class FragmentProfile extends Fragment implements View.OnClickLis...
    method onCreateView (line 35) | @Override
    method onActivityCreated (line 41) | @Override
    method getData (line 49) | private void getData() {
    method initView (line 56) | private void initView(JSONObject jsonObject) {
    method setListener (line 73) | private void setListener() {
    method onClick (line 85) | @Override
    method toStartBrowser (line 114) | private void toStartBrowser(String url) {
    class InfoChangedListener (line 124) | private class InfoChangedListener extends BroadcastReceiver {
      method onReceive (line 126) | @Override
    method onDestroy (line 144) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileActivity.java
  class ProfileActivity (line 10) | public class ProfileActivity extends BaseActivity {
    method onCreate (line 12) | @Override
    method onActivityResult (line 27) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileBasePrester.java
  type ProfileBasePrester (line 14) | public interface ProfileBasePrester  extends BasePresenter {
    method resgisteRecivier (line 15) | void resgisteRecivier();
    method showPhotoDialog (line 16) | void showPhotoDialog();
    method showSexDialog (line 17) | void showSexDialog();
    method result (line 18) | void result(int requestCode, int resultCode, Intent intent);
    method onDestory (line 19) | void onDestory();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileFragment.java
  class ProfileFragment (line 34) | public class ProfileFragment extends Fragment implements ProfileView, Vi...
    method onCreateView (line 46) | @Nullable
    method setListener (line 56) | private void setListener() {
    method initData (line 67) | private void initData() {
    method initView (line 120) | private void initView(View view) {
    method onClick (line 137) | @Override
    method onNickUpdate (line 172) | @Override
    method onSexUpdate (line 177) | @Override
    method onSignUpdate (line 182) | @Override
    method onAvatarUpdate (line 187) | @Override
    method onRegionUpdate (line 192) | @Override
    method onFxidUpdate (line 197) | @Override
    method onUpdateSuccess (line 202) | @Override
    method onUpdateFailed (line 207) | @Override
    method getUserJson (line 212) | @Override
    method setPresenter (line 217) | @Override
    method getBaseContext (line 222) | @Override
    method getBaseActivity (line 227) | @Override
    method onDestroy (line 232) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfilePrester.java
  class ProfilePrester (line 43) | public class ProfilePrester implements ProfileBasePrester {
    method ProfilePrester (line 54) | public ProfilePrester(ProfileView profileView) {
    method resgisteRecivier (line 61) | @Override
    method updateInfo (line 68) | private void updateInfo(final String key, final String value) {
    method updateRegion (line 111) | private void updateRegion(final String province,final String city) {
    method updateAvatar (line 146) | private void updateAvatar(final String key,final String value){
    method UpLoadAvator (line 181) | private void UpLoadAvator(final String filePath, final String key, fin...
    method showPhotoDialog (line 214) | @Override
    method showSexDialog (line 238) | @Override
    method result (line 257) | @Override
    method unRegisterReciver (line 285) | private void unRegisterReciver(){
    method onDestory (line 290) | @Override
    method start (line 296) | @Override
    class InfoChangedListener (line 302) | private class InfoChangedListener extends BroadcastReceiver {
      method onReceive (line 304) | @Override
    method beginCrop (line 321) | private void beginCrop(Uri source) {
    method getNowTime (line 326) | private String getNowTime() {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileView.java
  type ProfileView (line 13) | public interface ProfileView extends BaseView<ProfilePrester>{
    method onNickUpdate (line 14) | void onNickUpdate(String nick,boolean isHang);
    method onSexUpdate (line 15) | void onSexUpdate(int sex,boolean isHang);
    method onSignUpdate (line 16) | void onSignUpdate(String sign,boolean isHang);
    method onAvatarUpdate (line 17) | void onAvatarUpdate(String avatar,boolean isHang);
    method onRegionUpdate (line 18) | void onRegionUpdate(String region,boolean isHang);
    method onFxidUpdate (line 19) | void onFxidUpdate(String fxid,boolean isHang);
    method onUpdateSuccess (line 20) | void onUpdateSuccess(String msg);
    method onUpdateFailed (line 21) | void onUpdateFailed(String error);
    method getUserJson (line 22) | JSONObject getUserJson();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/ProfileUpdateActivity.java
  class ProfileUpdateActivity (line 14) | public class ProfileUpdateActivity extends BaseActivity {
    method onCreate (line 21) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/ProfileUpdateFragment.java
  class ProfileUpdateFragment (line 24) | public class ProfileUpdateFragment extends Fragment implements UpdatePro...
    method onCreateView (line 33) | @Nullable
    method setListener (line 44) | private void setListener() {
    method initData (line 48) | private void initData() {
    method initView (line 57) | private void initView(View updateView) {
    method getData (line 63) | private void getData() {
    method getDefultString (line 68) | @Override
    method getType (line 73) | @Override
    method getInputString (line 78) | @Override
    method onUpdateSuccess (line 83) | @Override
    method onUpdateFailed (line 89) | @Override
    method setPresenter (line 94) | @Override
    method getBaseContext (line 99) | @Override
    method getBaseActivity (line 104) | @Override
    method onClick (line 108) | @Override
    method onDestroy (line 117) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfileBasePrester.java
  type UpdateProfileBasePrester (line 12) | public interface UpdateProfileBasePrester  extends BasePresenter {
    method update (line 13) | void update();
    method updateInfo (line 14) | void updateInfo(String key,String value,String defaultStr);
    method getTitle (line 15) | String getTitle(int type);
    method getKey (line 16) | String getKey(int type);
    method onDestory (line 17) | void onDestory();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfilePrestener.java
  class UpdateProfilePrestener (line 25) | public class UpdateProfilePrestener implements UpdateProfileBasePrester {
    method UpdateProfilePrestener (line 31) | public UpdateProfilePrestener(UpdateProfileView updateProfileView) {
    method update (line 36) | @Override
    method updateInfo (line 41) | @Override
    method getTitle (line 85) | @Override
    method getKey (line 102) | @Override
    method onDestory (line 120) | @Override
    method start (line 125) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfileView.java
  type UpdateProfileView (line 12) | public interface UpdateProfileView extends BaseView<UpdateProfilePresten...
    method getDefultString (line 13) | String getDefultString();
    method getType (line 14) | int getType();
    method getInputString (line 15) | String getInputString();
    method onUpdateSuccess (line 16) | void onUpdateSuccess(String msg);
    method onUpdateFailed (line 17) | void onUpdateFailed(String msg);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeActivity.java
  class QrCodeActivity (line 10) | public class QrCodeActivity extends BaseActivity {
    method onCreate (line 12) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeBasePrester.java
  type QrCodeBasePrester (line 13) | public interface QrCodeBasePrester  extends BasePresenter {
    method onDestory (line 14) | void onDestory();
    method CreateQrCode (line 15) | void CreateQrCode();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeFragment.java
  class QrCodeFragment (line 25) | public class QrCodeFragment extends Fragment implements QrCodeView {
    method onCreateView (line 29) | @Nullable
    method getData (line 38) | private void getData() {
    method initView (line 42) | private void initView(View view) {
    method showQrCode (line 46) | @Override
    method showError (line 51) | @Override
    method setPresenter (line 56) | @Override
    method getBaseContext (line 61) | @Override
    method getBaseActivity (line 66) | @Override
    method onDestroy (line 71) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodePrester.java
  class QrCodePrester (line 22) | public class QrCodePrester implements QrCodeBasePrester {
    method QrCodePrester (line 27) | public QrCodePrester(QrCodeView codeView) {
    method onDestory (line 32) | @Override
    method CreateQrCode (line 37) | @Override
    method start (line 60) | @Override
    method bitMatrix2Bitmap (line 67) | private Bitmap bitMatrix2Bitmap(BitMatrix matrix) {
    method generateQRCode (line 86) | private Bitmap generateQRCode(String content) throws WriterException {

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeView.java
  type QrCodeView (line 15) | public interface QrCodeView extends BaseView<QrCodePrester> {
    method showQrCode (line 16) | void showQrCode(Bitmap bitmap);
    method showError (line 17) | void showError(String error);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionActivity.java
  class RegionActivity (line 9) | public class RegionActivity extends BaseActivity {
    method onCreate (line 11) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionBasePrestener.java
  type RegionBasePrestener (line 15) | public interface RegionBasePrestener extends BasePresenter {
    method getProvinceList (line 16) | List<String> getProvinceList();
    method getCityList (line 17) | List<String> getCityList(int position);
    method onDestory (line 18) | void onDestory();

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionFragment.java
  class RegionFragment (line 29) | public class RegionFragment extends Fragment implements RegionView{
    method onCreateView (line 39) | @Nullable
    method setListener (line 49) | private void setListener() {
    method initData (line 64) | private void initData() {
    method initView (line 71) | private void initView(View regionView) {
    method showCityList (line 76) | @Override
    method showProvince (line 82) | @Override
    method showCity (line 87) | @Override
    method setPresenter (line 96) | @Override
    method getBaseContext (line 101) | @Override
    method getBaseActivity (line 106) | @Override
    class RegionAdapter (line 112) | private class RegionAdapter extends BaseAdapter {
      method RegionAdapter (line 116) | public RegionAdapter(Context _context, List<String> data) {
      method setData (line 122) | public void setData(List<String> _data) {
      method getCount (line 126) | @Override
      method getItem (line 131) | @Override
      method getItemId (line 136) | @Override
      method getView (line 141) | @Override
    class ViewHolder (line 159) | static class ViewHolder {
    method onDestroy (line 163) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionPresenter.java
  class RegionPresenter (line 16) | public class RegionPresenter implements RegionBasePrestener {
    method RegionPresenter (line 43) | public RegionPresenter(RegionView regionView) {
    method getProvinceList (line 48) | @Override
    method getCityList (line 54) | @Override
    method onDestory (line 60) | @Override
    method start (line 65) | @Override
    method onItemClickListener (line 69) | public void onItemClickListener(int position,int type){

FILE: app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionView.java
  type RegionView (line 15) | public interface RegionView extends BaseView<RegionPresenter> {
    method showCityList (line 16) | void showCityList(List<String> cityList);
    method showProvince (line 17) | void showProvince(String province);
    method showCity (line 18) | void showCity(String city);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterActivity.java
  class RegisterActivity (line 16) | public class RegisterActivity extends BaseActivity   {
    method onCreate (line 18) | @Override
    method onActivityResult (line 36) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterContract.java
  type RegisterContract (line 14) | public interface RegisterContract {
    type View (line 18) | public interface View extends BaseView<Presenter>{
      method showAvatar (line 19) | void showAvatar(String imagePath);
      method showDialog (line 20) | void showDialog();
      method cancelDialog (line 21) | void cancelDialog();
      method showPassword (line 22) | void showPassword();
      method hidePassword (line 23) | void hidePassword();
      method enableButton (line 24) | void enableButton();
      method disableButton (line 25) | void disableButton();
      method showToast (line 26) | void showToast(int msgRes);
      method getOriginImagePath (line 27) | String getOriginImagePath();
      method getBaseActivity (line 28) | Activity getBaseActivity();
    type Presenter (line 33) | public interface Presenter extends BasePresenter{
      method registerInServer (line 35) | void registerInServer(String nickName,String mobile,String password);
      method result (line 36) | void result(int requsetCode, int resultCode, Intent intent);

FILE: app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterFragment.java
  class RegisterFragment (line 49) | public class RegisterFragment extends Fragment implements View.OnClickLi...
    method onCreate (line 62) | @Override
    method onCreateView (line 68) | @Nullable
    method initView (line 89) | private void initView() {
    method setLisenter (line 97) | private void setLisenter() {
    method setPresenter (line 113) | @Override
    method getBaseContext (line 118) | @Override
    method showAvatar (line 123) | @Override
    method showDialog (line 129) | @Override
    method cancelDialog (line 135) | @Override
    method showPassword (line 142) | @Override
    method editTextEnd (line 152) | private void editTextEnd() {
    method hidePassword (line 160) | @Override
    method enableButton (line 169) | @Override
    method disableButton (line 174) | @Override
    method showToast (line 180) | @Override
    method getOriginImagePath (line 185) | @Override
    method getBaseActivity (line 190) | @Override
    class TextChange (line 197) | class TextChange implements TextWatcher {
      method afterTextChanged (line 199) | @Override
      method beforeTextChanged (line 204) | @Override
      method onTextChanged (line 210) | @Override
    method onClick (line 229) | @Override
    method getAvatarName (line 277) | private String getAvatarName() {
    method showCamera (line 283) | private void showCamera() {
    method checkPermission (line 315) | private boolean checkPermission(String permissionName) {
    method onRequestPermissionsResult (line 332) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterPresenter.java
  class RegisterPresenter (line 32) | public class RegisterPresenter implements RegisterContract.Presenter {
    method RegisterPresenter (line 36) | public RegisterPresenter(RegisterContract.View view) {
    method start (line 41) | @Override
    method registerInServer (line 46) | @Override
    method register (line 57) | private void register(String usernick, String password, String usertel...
    method uploadAvatar (line 130) | private void uploadAvatar(final String usernick, final String password...
    method result (line 165) | @Override
    method beginCrop (line 198) | private void beginCrop(Uri inputUri) {

FILE: app/src/main/java/com/htmessage/yichatopen/domain/InviteMessage.java
  class InviteMessage (line 3) | public class InviteMessage {
    method getFrom (line 10) | public String getFrom() {
    method setFrom (line 14) | public void setFrom(String from) {
    method getTime (line 18) | public long getTime() {
    method setTime (line 22) | public void setTime(long time) {
    method getReason (line 27) | public String getReason() {
    method setReason (line 31) | public void setReason(String reason) {
    method getStatus (line 35) | public Status getStatus() {
    method setStatus (line 39) | public void setStatus(Status status) {
    method getId (line 43) | public int getId() {
    method setId (line 47) | public void setId(int id) {
    type Status (line 52) | public enum Status {

FILE: app/src/main/java/com/htmessage/yichatopen/domain/InviteMessgeDao.java
  class InviteMessgeDao (line 23) | public class InviteMessgeDao {
    method InviteMessgeDao (line 39) | public InviteMessgeDao(Context context){
    method saveMessage (line 47) | public Integer saveMessage(InviteMessage message){
    method updateMessage (line 56) | public void updateMessage(int msgId,ContentValues values){
    method getMessagesList (line 64) | public List<InviteMessage> getMessagesList(){
    method deleteMessage (line 68) | public void deleteMessage(String from){
    method getUnreadMessagesCount (line 72) | public int getUnreadMessagesCount(){
    method saveUnreadMessageCount (line 76) | public void saveUnreadMessageCount(int count){

FILE: app/src/main/java/com/htmessage/yichatopen/domain/User.java
  class User (line 25) | @SuppressLint("ParcelCreator")
    method getUsername (line 33) | public String getUsername() {
    method setUsername (line 37) | public void setUsername(String username) {
    method getNick (line 50) | public String getNick() {
    method setNick (line 54) | public void setNick(String nick) {
    method User (line 58) | public User(String username){
    method getInitialLetter (line 62) | public String getInitialLetter() {
    method setInitialLetter (line 69) | public void setInitialLetter(String initialLetter) {
    method getAvatar (line 74) | public String getAvatar() {
    method setAvatar (line 83) | public void setAvatar(String avatar) {
    method getUserInfo (line 86) | public String getUserInfo(){
    method setUserInfo (line 91) | public void setUserInfo(String userInfo){
    method hashCode (line 95) | @Override
    method equals (line 100) | @Override
    method toString (line 108) | @Override
    method describeContents (line 113) | @Override
    method writeToParcel (line 118) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/domain/UserDao.java
  class UserDao (line 24) | public class UserDao {
    method UserDao (line 40) | public UserDao(Context context) {
    method saveContactList (line 48) | public void saveContactList(List<User> contactList) {
    method getContactList (line 57) | public Map<String, User> getContactList() {
    method deleteContact (line 65) | public void deleteContact(String username){
    method saveContact (line 73) | public void saveContact(User user){
    method setDisabledGroups (line 77) | public void setDisabledGroups(List<String> groups){
    method getDisabledGroups (line 81) | public List<String>  getDisabledGroups(){
    method setDisabledIds (line 85) | public void setDisabledIds(List<String> ids){
    method getDisabledIds (line 89) | public List<String> getDisabledIds(){

FILE: app/src/main/java/com/htmessage/yichatopen/manager/ContactsManager.java
  class ContactsManager (line 18) | public class ContactsManager {
    method init (line 26) | synchronized public static void init(Context context) {
    method ContactsManager (line 32) | public ContactsManager(Context context) {
    method getInstance (line 39) | public static ContactsManager getInstance(){
    method saveContactList (line 50) | public boolean saveContactList(List<User> contactList) {
    method getContactList (line 60) | public Map<String, User> getContactList() {
    method saveContact (line 68) | public void saveContact(User user){
    method initContacts (line 74) | private void  initContacts(){

FILE: app/src/main/java/com/htmessage/yichatopen/manager/DBManager.java
  class DBManager (line 21) | public class DBManager {
    method DBManager (line 25) | private DBManager() {
    method getInstance (line 29) | public static synchronized DBManager getInstance() {
    method saveContactList (line 42) | synchronized public void saveContactList(List<User> contactList) {
    method getContactList (line 67) | synchronized public Map<String, User> getContactList() {
    method deleteContact (line 97) | synchronized public void deleteContact(String username) {
    method saveContact (line 109) | synchronized public void saveContact(User user) {
    method setDisabledGroups (line 124) | public void setDisabledGroups(List<String> groups) {
    method getDisabledGroups (line 128) | public List<String> getDisabledGroups() {
    method setDisabledIds (line 132) | public void setDisabledIds(List<String> ids) {
    method getDisabledIds (line 136) | public List<String> getDisabledIds() {
    method setList (line 140) | synchronized private void setList(String column, List<String> strList) {
    method getList (line 156) | synchronized private List<String> getList(String column) {
    method saveMessage (line 191) | public synchronized Integer saveMessage(InviteMessage message) {
    method updateMessage (line 220) | synchronized public void updateMessage(int msgId, ContentValues values) {
    method getMessagesList (line 232) | synchronized public List<InviteMessage> getMessagesList() {
    method deleteMessage (line 277) | synchronized public void deleteMessage(String from) {
    method getUnreadNotifyCount (line 284) | public synchronized int getUnreadNotifyCount() {
    method setUnreadNotifyCount (line 297) | public synchronized void setUnreadNotifyCount(int count) {
    method closeDB (line 309) | synchronized public void closeDB() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/DbOpenHelper.java
  class DbOpenHelper (line 25) | public class DbOpenHelper extends SQLiteOpenHelper {
    method DbOpenHelper (line 52) | private DbOpenHelper(Context context) {
    method getInstance (line 58) | public static DbOpenHelper getInstance(Context context) {
    method getUserDatabaseName (line 65) | private static String getUserDatabaseName() {
    method onCreate (line 69) | @Override
    method onUpgrade (line 76) | @Override
    method closeDB (line 82) | public void closeDB() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/LocalUserManager.java
  class LocalUserManager (line 23) | public class LocalUserManager {
    method LocalUserManager (line 34) | private LocalUserManager(Context cxt) {
    method init (line 40) | public static synchronized void init(Context cxt) {
    method getInstance (line 52) | public synchronized static LocalUserManager getInstance() {
    method setUserJson (line 62) | public void setUserJson(JSONObject userJson) {
    method getUserJson (line 74) | public JSONObject getUserJson() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/Manager.java
  class Manager (line 10) | public class Manager {
    method initManagerList (line 12) | public static void initManagerList(Context context){

FILE: app/src/main/java/com/htmessage/yichatopen/manager/MyNotification.java
  class MyNotification (line 25) | public class MyNotification {
    method MyNotification (line 37) | public MyNotification(Context context) {
    method init (line 47) | public static void init(Context context) {
    method getInstance (line 54) | public static MyNotification getInstance() {
    method setOutGoingAndAutoCancle (line 67) | public void setOutGoingAndAutoCancle(@NonNull boolean flag) {
    method onNewMessage (line 78) | public void onNewMessage(HTMessage htMessage) {
    method cancel (line 108) | public void cancel(int id) {
    method getContent (line 114) | private String getContent(HTMessage message) {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/Notifier.java
  class Notifier (line 34) | public class Notifier {
    method Notifier (line 60) | public Notifier() {
    method init (line 69) | public Notifier init(Context context) {
    method reset (line 89) | public void reset() {
    method resetNotificationCount (line 94) | void resetNotificationCount() {
    method cancelNotificaton (line 99) | void cancelNotificaton() {
    method isAppRunningForeground (line 105) | public static boolean isAppRunningForeground(Context context) {
    method vibrateAndPlayTone (line 176) | public void vibrateAndPlayTone(String string) {
    method playSound (line 191) | private void playSound() {
    method playSoundAndVibrator (line 236) | private void playSoundAndVibrator() {
    method playVibrator (line 293) | private void playVibrator() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/NotifierManager.java
  class NotifierManager (line 10) | public class NotifierManager {
    method getInstance (line 23) | public static NotifierManager getInstance() {
    method init (line 31) | public static synchronized void init(Context context) {
    method NotifierManager (line 39) | public NotifierManager(Context context) {
    method initNotifier (line 50) | private void initNotifier() {
    method createNotifier (line 55) | protected Notifier createNotifier() {
    method getNotifier (line 59) | public Notifier getNotifier() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/PreferenceManager.java
  class PreferenceManager (line 19) | public class PreferenceManager {
    method PreferenceManager (line 46) | private PreferenceManager(Context cxt) {
    method init (line 51) | public static synchronized void init(Context cxt) {
    method getInstance (line 63) | public synchronized static PreferenceManager getInstance() {
    method setSettingMsgNotification (line 72) | public void setSettingMsgNotification(boolean paramBoolean) {
    method setActivityCount (line 79) | public void setActivityCount(String groupId, int count) {
    method getActivityCount (line 84) | public int getActivityCount(String groupId) {
    method getSettingMsgNotification (line 90) | public boolean getSettingMsgNotification() {
    method setSettingMsgSound (line 94) | public void setSettingMsgSound(boolean paramBoolean) {
    method getSettingMsgSound (line 99) | public boolean getSettingMsgSound() {
    method setSettingMsgVibrate (line 104) | public void setSettingMsgVibrate(boolean paramBoolean) {
    method getSettingMsgVibrate (line 109) | public boolean getSettingMsgVibrate() {
    method setSettingMsgSpeaker (line 113) | public void setSettingMsgSpeaker(boolean paramBoolean) {
    method getSettingMsgSpeaker (line 118) | public boolean getSettingMsgSpeaker() {
    method setSettingAllowChatroomOwnerLeave (line 122) | public void setSettingAllowChatroomOwnerLeave(boolean value) {
    method getSettingAllowChatroomOwnerLeave (line 127) | public boolean getSettingAllowChatroomOwnerLeave() {
    method setDeleteMessagesAsExitGroup (line 131) | public void setDeleteMessagesAsExitGroup(boolean value) {
    method isDeleteMessagesAsExitGroup (line 136) | public boolean isDeleteMessagesAsExitGroup() {
    method setAutoAcceptGroupInvitation (line 140) | public void setAutoAcceptGroupInvitation(boolean value) {
    method isAutoAcceptGroupInvitation (line 145) | public boolean isAutoAcceptGroupInvitation() {
    method setAdaptiveVideoEncode (line 149) | public void setAdaptiveVideoEncode(boolean value) {
    method isAdaptiveVideoEncode (line 154) | public boolean isAdaptiveVideoEncode() {
    method setGroupsSynced (line 158) | public void setGroupsSynced(boolean synced) {
    method isGroupsSynced (line 163) | public boolean isGroupsSynced() {
    method setContactSynced (line 167) | public void setContactSynced(boolean synced) {
    method isContactSynced (line 172) | public boolean isContactSynced() {
    method setBlacklistSynced (line 176) | public void setBlacklistSynced(boolean synced) {
    method isBacklistSynced (line 181) | public boolean isBacklistSynced() {
    method setCurrentUserNick (line 185) | public void setCurrentUserNick(String nick) {
    method setCurrentUserAvatar (line 190) | public void setCurrentUserAvatar(String avatar) {
    method getCurrentUserNick (line 195) | public String getCurrentUserNick() {
    method getCurrentUserAvatar (line 199) | public String getCurrentUserAvatar() {
    method setCurrentUserName (line 203) | public void setCurrentUserName(String username) {
    method getCurrentUsername (line 208) | public String getCurrentUsername() {
    method removeCurrentUserInfo (line 213) | public void removeCurrentUserInfo() {

FILE: app/src/main/java/com/htmessage/yichatopen/manager/SettingsManager.java
  class SettingsManager (line 8) | public class SettingsManager {
    method SettingsManager (line 13) | public SettingsManager(Context ctx){
    method init (line 18) | public synchronized static void init(Context context){
    method getInstance (line 25) | public static SettingsManager getInstance(){
    method setSettingMsgNotification (line 33) | public void setSettingMsgNotification(boolean paramBoolean) {
    method getSettingMsgNotification (line 38) | public boolean getSettingMsgNotification() {
    method setSettingMsgSound (line 49) | public void setSettingMsgSound(boolean paramBoolean) {
    method getSettingMsgSound (line 54) | public boolean getSettingMsgSound() {
    method setSettingMsgVibrate (line 65) | public void setSettingMsgVibrate(boolean paramBoolean) {
    method getSettingMsgVibrate (line 70) | public boolean getSettingMsgVibrate() {
    method setSettingMsgSpeaker (line 81) | public void setSettingMsgSpeaker(boolean paramBoolean) {
    method getSettingMsgSpeaker (line 86) | public boolean getSettingMsgSpeaker() {
    method allowChatroomOwnerLeave (line 99) | public void allowChatroomOwnerLeave(boolean value){
    method isChatroomOwnerLeaveAllowed (line 103) | public boolean isChatroomOwnerLeaveAllowed(){
    method setDeleteMessagesAsExitGroup (line 107) | public void setDeleteMessagesAsExitGroup(boolean value) {
    method isDeleteMessagesAsExitGroup (line 111) | public boolean isDeleteMessagesAsExitGroup() {
    method setAutoAcceptGroupInvitation (line 115) | public void setAutoAcceptGroupInvitation(boolean value) {
    method isAutoAcceptGroupInvitation (line 119) | public boolean isAutoAcceptGroupInvitation() {
    method setAdaptiveVideoEncode (line 124) | public void setAdaptiveVideoEncode(boolean value) {
    method isAdaptiveVideoEncode (line 128) | public boolean isAdaptiveVideoEncode() {
    type Key (line 132) | enum Key{

FILE: app/src/main/java/com/htmessage/yichatopen/runtimepermissions/Permissions.java
  type Permissions (line 21) | enum Permissions {

FILE: app/src/main/java/com/htmessage/yichatopen/runtimepermissions/PermissionsManager.java
  class PermissionsManager (line 39) | public class PermissionsManager {
    method getInstance (line 49) | public static PermissionsManager getInstance() {
    method PermissionsManager (line 56) | private PermissionsManager() {
    method initializePermissionsMap (line 69) | private synchronized void initializePermissionsMap() {
    method getManifestPermissions (line 89) | @NonNull
    method addPendingAction (line 121) | private synchronized void addPendingAction(@NonNull String[] permissions,
    method removePendingAction (line 138) | private synchronized void removePendingAction(@Nullable PermissionsRes...
    method hasPermission (line 160) | @SuppressWarnings("unused")
    method hasAllPermissions (line 178) | @SuppressWarnings("unused")
    method requestAllManifestPermissionsIfNecessary (line 204) | @SuppressWarnings("unused")
    method requestPermissionsIfNecessaryForResult (line 228) | @SuppressWarnings("unused")
    method requestPermissionsIfNecessaryForResult (line 264) | @SuppressWarnings("unused")
    method notifyPermissionsChange (line 300) | @SuppressWarnings("unused")
    method doPermissionWorkBeforeAndroidM (line 330) | private void doPermissionWorkBeforeAndroidM(@NonNull Activity activity,
    method getPermissionsListToRequest (line 358) | @NonNull

FILE: app/src/main/java/com/htmessage/yichatopen/runtimepermissions/PermissionsResultAction.java
  class PermissionsResultAction (line 36) | public abstract class PermissionsResultAction {
    method PermissionsResultAction (line 45) | public PermissionsResultAction() {}
    method PermissionsResultAction (line 55) | @SuppressWarnings("unused")
    method onGranted (line 64) | public abstract void onGranted();
    method onDenied (line 74) | public abstract void onDenied(String permission);
    method shouldIgnorePermissionNotFound (line 95) | @SuppressWarnings({"WeakerAccess", "SameReturnValue"})
    method onResult (line 101) | @SuppressWarnings("WeakerAccess")
    method onResult (line 123) | @SuppressWarnings("WeakerAccess")
    method registerPermissions (line 176) | @SuppressWarnings("WeakerAccess")

FILE: app/src/main/java/com/htmessage/yichatopen/utils/ACache.java
  class ACache (line 39) | public class ACache {
    method get (line 47) | public static ACache get(Context ctx) {
    method get (line 51) | public static ACache get(Context ctx, String cacheName) {
    method get (line 56) | public static ACache get(File cacheDir) {
    method get (line 60) | public static ACache get(Context ctx, long max_zise, int max_count) {
    method get (line 65) | public static ACache get(File cacheDir, long max_zise, int max_count) {
    method myPid (line 74) | private static String myPid() {
    method ACache (line 78) | private ACache(File cacheDir, long max_size, int max_count) {
    class xFileOutputStream (line 86) | class xFileOutputStream extends FileOutputStream {
      method xFileOutputStream (line 89) | public xFileOutputStream(File file) throws FileNotFoundException {
      method close (line 94) | public void close() throws IOException {
    method put (line 110) | public void put(String key, String value) {
    method put (line 138) | public void put(String key, String value, int saveTime) {
    method getAsString (line 148) | public String getAsString(String key) {
    method put (line 193) | public void put(String key, JSONObject value) {
    method put (line 204) | public void put(String key, JSONObject value, int saveTime) {
    method getAsJSONObject (line 214) | public JSONObject getAsJSONObject(String key) {
    method put (line 235) | public void put(String key, JSONArray value) {
    method put (line 246) | public void put(String key, JSONArray value, int saveTime) {
    method getAsJSONArray (line 256) | public JSONArray getAsJSONArray(String key) {
    method put (line 277) | public void put(String key, byte[] value) {
    method put (line 305) | public OutputStream put(String key) throws FileNotFoundException {
    method get (line 314) | public InputStream get(String key) throws FileNotFoundException {
    method put (line 328) | public void put(String key, byte[] value, int saveTime) {
    method getAsBinary (line 338) | public byte[] getAsBinary(String key) {
    method put (line 380) | public void put(String key, Serializable value) {
    method put (line 391) | public void put(String key, Serializable value, int saveTime) {
    method put (line 422) | public void put(String key, Object value) {
    method getAsObject (line 449) | public Object getAsObject(String key) {
    method put (line 491) | public void put(String key, Bitmap value) {
    method put (line 502) | public void put(String key, Bitmap value, int saveTime) {
    method getAsBitmap (line 512) | public Bitmap getAsBitmap(String key) {
    method put (line 529) | public void put(String key, Drawable value) {
    method put (line 540) | public void put(String key, Drawable value, int saveTime) {
    method getAsDrawable (line 550) | public Drawable getAsDrawable(String key) {
    method file (line 563) | public File file(String key) {
    method remove (line 576) | public boolean remove(String key) {
    method clear (line 583) | public void clear() {
    class ACacheManager (line 592) | public class ACacheManager {
      method ACacheManager (line 600) | private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
      method calculateCacheSizeAndCacheCount (line 612) | private void calculateCacheSizeAndCacheCount() {
      method put (line 632) | private void put(File file) {
      method get (line 655) | private File get(String key) {
      method newFile (line 664) | private File newFile(String key) {
      method remove (line 668) | private boolean remove(String key) {
      method clear (line 673) | private void clear() {
      method removeNext (line 689) | private long removeNext() {
      method calculateSize (line 719) | private long calculateSize(File file) {
    class Utils (line 729) | private static class Utils {
      method isDue (line 737) | private static boolean isDue(String str) {
      method isDue (line 747) | private static boolean isDue(byte[] data) {
      method newStringWithDateInfo (line 763) | private static String newStringWithDateInfo(int second, String strIn...
      method newByteArrayWithDateInfo (line 767) | private static byte[] newByteArrayWithDateInfo(int second, byte[] da...
      method clearDateInfo (line 775) | private static String clearDateInfo(String strInfo) {
      method clearDateInfo (line 782) | private static byte[] clearDateInfo(byte[] data) {
      method hasDateInfo (line 789) | private static boolean hasDateInfo(byte[] data) {
      method getDateInfoFromDate (line 793) | private static String[] getDateInfoFromDate(byte[] data) {
      method indexOf (line 802) | private static int indexOf(byte[] data, char c) {
      method copyOfRange (line 811) | private static byte[] copyOfRange(byte[] original, int from, int to) {
      method createDateInfo (line 822) | private static String createDateInfo(int second) {
      method Bitmap2Bytes (line 833) | private static byte[] Bitmap2Bytes(Bitmap bm) {
      method Bytes2Bimap (line 845) | private static Bitmap Bytes2Bimap(byte[] b) {
      method drawable2Bitmap (line 855) | private static Bitmap drawable2Bitmap(Drawable drawable) {
      method bitmap2Drawable (line 877) | @SuppressWarnings("deprecation")

FILE: app/src/main/java/com/htmessage/yichatopen/utils/CommonUtils.java
  class CommonUtils (line 56) | public class CommonUtils {
    method Json2User (line 59) | public static User Json2User(JSONObject userJson) {
    method isNetWorkConnected (line 67) | public static boolean isNetWorkConnected(Context context) {
    method isSdcardExist (line 84) | public static boolean isSdcardExist() {
    method getString (line 94) | static String getString(Context context, int resId){
    method getTopActivity (line 103) | public static String getTopActivity(Context context) {
    method setUserInitialLetter (line 119) | public static void setUserInitialLetter(User user) {
    method showPup (line 146) | public static void showPup(final Context context, final TextView count...

FILE: app/src/main/java/com/htmessage/yichatopen/utils/DateUtils.java
  class DateUtils (line 20) | public class DateUtils {
    method DateUtils (line 23) | public DateUtils() {
    method getTimeDifference (line 37) | public static String getTimeDifference(Context context, long starTime,...
    method getTimestampString (line 82) | public static String getTimestampString(Date var0) {
    method isCloseEnough (line 108) | public static boolean isCloseEnough(long var0, long var2) {
    method isSameDay (line 117) | private static boolean isSameDay(long var0) {
    method isYesterday (line 122) | private static boolean isYesterday(long var0) {
    method StringToDate (line 127) | public static Date StringToDate(String var0, String var1) {
    method toTime (line 140) | public static String toTime(int var0) {
    method toTimeBySecond (line 153) | public static String toTimeBySecond(int var0) {
    method getYesterdayStartAndEndTime (line 166) | public static TimeInfo getYesterdayStartAndEndTime() {
    method getTodayStartAndEndTime (line 189) | public static TimeInfo getTodayStartAndEndTime() {
    method getBeforeYesterdayStartAndEndTime (line 211) | public static TimeInfo getBeforeYesterdayStartAndEndTime() {
    method getCurrentMonthStartAndEndTime (line 234) | public static TimeInfo getCurrentMonthStartAndEndTime() {
    method getLastMonthStartAndEndTime (line 252) | public static TimeInfo getLastMonthStartAndEndTime() {
    method getStringTime (line 277) | public static String getStringTime(long time){
    method getTimestampStr (line 283) | public static String getTimestampStr() {
    class TimeInfo (line 288) | public static class TimeInfo {
      method TimeInfo (line 292) | public TimeInfo() {
      method getStartTime (line 295) | public long getStartTime() {
      method setStartTime (line 299) | public void setStartTime(long var1) {
      method getEndTime (line 303) | public long getEndTime() {
      method setEndTime (line 307) | public void setEndTime(long var1) {

FILE: app/src/main/java/com/htmessage/yichatopen/utils/HTMessageUtils.java
  class HTMessageUtils (line 32) | public class HTMessageUtils {
    method creatWithDrowMsg (line 34) | public static HTMessage creatWithDrowMsg(HTMessage htMessage) {
    method getCopyMsg (line 67) | public static void getCopyMsg(Activity context, HTMessage message, Str...
    method getFilePath (line 121) | public static void getFilePath(final Activity context, final String co...
    method showCopySendDialog (line 189) | public static void showCopySendDialog(Activity context, final String c...
    method getForWordMessage (line 211) | public static void getForWordMessage(Activity context, HTMessage messa...
    method getFilePath (line 265) | public static void getFilePath(final Activity context, final String co...
    method showForwordDialog (line 387) | private static void showForwordDialog(Activity context, final String f...
    method loadMessageFile (line 401) | public static void loadMessageFile(HTMessage htMessage, String chatTo,...
    type CallBack (line 451) | public interface CallBack {
      method error (line 452) | void error();
      method completed (line 454) | void completed(String localPath);

FILE: app/src/main/java/com/htmessage/yichatopen/utils/ImageUtils.java
  class ImageUtils (line 26) | public class ImageUtils {
    method ImageUtils (line 28) | public ImageUtils() {
    method getRoundedCornerBitmap (line 30) | public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
    method getRoundedCornerBitmap (line 34) | public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float round...
    method getVideoThumbnail (line 51) | public static Bitmap getVideoThumbnail(String videoPath, int width, in...
    method decodeScaleImage (line 63) | public static Bitmap decodeScaleImage(String var0) {
    method getScaledImage (line 82) | public static String getScaledImage(Context var0, String var1) {
    method getScaledImage (line 107) | public static String getScaledImage(Context var0, String var1, int var...
    method rotaingImageView (line 130) | public static Bitmap rotaingImageView(int var0, Bitmap var1) {
    method getThumbnailImage (line 144) | public static String getThumbnailImage(String path, int targetWidth, i...
    method decodeScaleImage (line 167) | public static Bitmap decodeScaleImage(Context context, int resId, int ...
    method calculateInSampleSize (line 185) | public static int calculateInSampleSize(BitmapFactory.Options options,...
    method getBitmapOptions (line 204) | public static BitmapFactory.Options getBitmapOptions(String pathName) {
    method readPictureDegree (line 217) | public static int readPictureDegree(String filename) {
    method rotatingImageView (line 250) | public static Bitmap rotatingImageView(int degree, Bitmap source) {
    method createWaterMaskLeftTop (line 265) | public static Bitmap createWaterMaskLeftTop(Context context, Bitmap sr...
    method createWaterMaskBitmap (line 277) | private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap waterma...
    method createWaterMaskRightBottom (line 307) | public static Bitmap createWaterMaskRightBottom(Context context, Bitma...
    method createWaterMaskRightTop (line 321) | public static Bitmap createWaterMaskRightTop(Context context, Bitmap s...
    method createWaterMaskLeftBottom (line 334) | public static Bitmap createWaterMaskLeftBottom(Context context, Bitmap...
    method createWaterMaskCenter (line 345) | public static Bitmap createWaterMaskCenter(Bitmap src, Bitmap watermar...
    method drawTextToLeftTop (line 357) | public static Bitmap drawTextToLeftTop(Context context, Bitmap bitmap,...
    method drawTextToRightBottom (line 378) | public static Bitmap drawTextToRightBottom(Context context, Bitmap bit...
    method drawTextToRightTop (line 399) | public static Bitmap drawTextToRightTop(Context context, Bitmap bitmap...
    method drawTextToLeftBottom (line 420) | public static Bitmap drawTextToLeftBottom(Context context, Bitmap bitm...
    method drawTextToCenter (line 440) | public static Bitmap drawTextToCenter(Context context, Bitmap bitmap, ...
    method drawTextToBitmap (line 462) | private static Bitmap drawTextToBitmap(Context context, Bitmap bitmap,...
    method scaleWithWH (line 485) | public static Bitmap scaleWithWH(Bitmap src, double w, double h) {
    method dp2px (line 511) | public static int dp2px(Context context, float dp) {

FILE: app/src/main/java/com/htmessage/yichatopen/utils/OkHttpUtils.java
  class OkHttpUtils (line 38) | public class OkHttpUtils {
    method handleMessage (line 46) | @Override
    method OkHttpUtils (line 73) | public OkHttpUtils(Context context) {
    method post (line 85) | public   void post(List<Param> params, String url, HttpCallBack httpCa...
    method post (line 114) | public void post(List<Param> params, List<File> files, String url, Htt...
    method startRequest (line 148) | private void startRequest(Request request) {
    type HttpCallBack (line 172) | public interface HttpCallBack {
      method onResponse (line 174) | void onResponse(JSONObject jsonObject);
      method onFailure (line 176) | void onFailure(String errorMsg);
    type DownloadCallBack (line 181) | public interface DownloadCallBack {
      method onSuccess (line 182) | void onSuccess();
      method onFailure (line 184) | void onFailure(String message);
    method guessMimeType (line 188) | private String guessMimeType(String path) {
    method loadFile (line 197) | public void loadFile(String url, final String savePath, final Download...
    type ProgressDownloadCallBack (line 228) | public interface ProgressDownloadCallBack {
      method onSuccess (line 229) | void onSuccess();
      method onProgress (line 231) | void onProgress(int progress);
      method onFailure (line 233) | void onFailure();
    method loadFileHasProgress (line 242) | public void loadFileHasProgress(String url, final String savePath, fin...

FILE: app/src/main/java/com/htmessage/yichatopen/utils/Param.java
  class Param (line 6) | public class Param {
    method Param (line 12) | public Param(String key, String value) {
    method getKey (line 18) | public String getKey() {
    method getValue (line 22) | public String getValue() {

FILE: app/src/main/java/com/htmessage/yichatopen/utils/PathUtils.java
  class PathUtils (line 20) | public class PathUtils {
    method PathUtils (line 30) | public PathUtils(String chatTo, Context context) {
    method getImagePath (line 56) | public File getImagePath() {
    method getVoicePath (line 60) | public File getVoicePath() {
    method getFilePath (line 64) | public File getFilePath() {
    method getVideoPath (line 68) | public File getVideoPath() {
    method getStorageDir (line 73) | private static File getStorageDir(Context context) {
    method generateImagePath (line 85) | private static File generateImagePath(String username, String chatTo, ...
    method generateVoicePath (line 98) | private static File generateVoicePath(String username, String chatTo, ...
    method generateFiePath (line 109) | private static File generateFiePath(String username, String chatTo, Co...
    method generateVideoPath (line 120) | private static File generateVideoPath(String username, String chatTo, ...
    method saveSendFileInDisk (line 132) | public void saveSendFileInDisk(final String filePath, final HTMessage....
    type NewFilePathCallBack (line 164) | interface NewFilePathCallBack{
      method onSuccess (line 166) | void  onSuccess(String filePath);
    method copyFile (line 175) | public void copyFile(String oldPath, String newPath,NewFilePathCallBac...

FILE: app/src/main/java/com/htmessage/yichatopen/utils/UpdateLastLoginTimeUtils.java
  class UpdateLastLoginTimeUtils (line 19) | public class UpdateLastLoginTimeUtils {
    method sendLocalTimeToService (line 21) | public static void sendLocalTimeToService(Context context){

FILE: app/src/main/java/com/htmessage/yichatopen/utils/Validator.java
  class Validator (line 11) | public class Validator {
    method isUsername (line 58) | public static boolean isUsername(String username) {
    method isPassword (line 68) | public static boolean isPassword(String password) {
    method isMobile (line 78) | public static boolean isMobile(String mobile) {
    method isEmail (line 88) | public static boolean isEmail(String email) {
    method isChinese (line 98) | public static boolean isChinese(String chinese) {
    method isIDCard (line 108) | public static boolean isIDCard(String idCard) {
    method isUrl (line 118) | public static boolean isUrl(String url) {
    method isIPAddr (line 128) | public static boolean isIPAddr(String ipAddr) {
    method main (line 132) | public static void main(String[] args) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/HTAlertDialog.java
  class HTAlertDialog (line 16) | public class HTAlertDialog {
    method HTAlertDialog (line 21) | public HTAlertDialog(Context context, String title, String[] items) {
    method init (line 26) | public void init(final OnItemClickListner onItemClickListner) {
    type OnItemClickListner (line 68) | public  interface  OnItemClickListner{
      method onClick (line 69) | void onClick(int position);

FILE: app/src/main/java/com/htmessage/yichatopen/widget/SwitchButton.java
  class SwitchButton (line 15) | public class SwitchButton extends FrameLayout{
    method SwitchButton (line 20) | public SwitchButton(Context context, AttributeSet attrs, int defStyle) {
    method SwitchButton (line 24) | public SwitchButton(Context context) {
    method SwitchButton (line 28) | public SwitchButton(Context context, AttributeSet attrs) {
    method isSwitchOpen (line 55) | public boolean isSwitchOpen(){
    method openSwitch (line 59) | public void openSwitch(){
    method closeSwitch (line 64) | public void closeSwitch(){

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/Compat.java
  class Compat (line 20) | class Compat {
    method postOnAnimation (line 24) | public static void postOnAnimation(View view, Runnable runnable) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/IPhotoView.java
  type IPhotoView (line 36) | public interface IPhotoView {
    method canZoom (line 42) | boolean canZoom();
    method getDisplayRect (line 51) | RectF getDisplayRect();
    method getMinScale (line 56) | float getMinScale();
    method getMidScale (line 61) | float getMidScale();
    method getMaxScale (line 66) | float getMaxScale();
    method getScale (line 73) | float getScale();
    method getScaleType (line 78) | ImageView.ScaleType getScaleType();
    method setAllowParentInterceptOnEdge (line 83) | void setAllowParentInterceptOnEdge(boolean allow);
    method setMinScale (line 88) | void setMinScale(float minScale);
    method setMidScale (line 93) | void setMidScale(float midScale);
    method setMaxScale (line 98) | void setMaxScale(float maxScale);
    method setOnLongClickListener (line 105) | void setOnLongClickListener(View.OnLongClickListener listener);
    method setOnMatrixChangeListener (line 113) | void setOnMatrixChangeListener(PhotoViewAttacher.OnMatrixChangedListen...
    method setOnPhotoTapListener (line 121) | void setOnPhotoTapListener(PhotoViewAttacher.OnPhotoTapListener listen...
    method setOnViewTapListener (line 129) | void setOnViewTapListener(PhotoViewAttacher.OnViewTapListener listener);
    method setScaleType (line 138) | void setScaleType(ImageView.ScaleType scaleType);
    method setZoomable (line 146) | void setZoomable(boolean zoomable);
    method zoomTo (line 155) | void zoomTo(float scale, float focalX, float focalY);

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/PhotoView.java
  class PhotoView (line 38) | public class PhotoView extends ImageView implements IPhotoView {
    method PhotoView (line 44) | public PhotoView(Context context) {
    method PhotoView (line 48) | public PhotoView(Context context, AttributeSet attr) {
    method PhotoView (line 52) | public PhotoView(Context context, AttributeSet attr, int defStyle) {
    method canZoom (line 63) | @Override
    method getDisplayRect (line 68) | @Override
    method getMinScale (line 73) | @Override
    method getMidScale (line 78) | @Override
    method getMaxScale (line 83) | @Override
    method getScale (line 88) | @Override
    method getScaleType (line 93) | @Override
    method setAllowParentInterceptOnEdge (line 98) | @Override
    method setMinScale (line 103) | @Override
    method setMidScale (line 108) | @Override
    method setMaxScale (line 113) | @Override
    method setImageDrawable (line 118) | @Override
    method setImageResource (line 127) | @Override
    method setImageURI (line 135) | @Override
    method setOnMatrixChangeListener (line 143) | @Override
    method setOnLongClickListener (line 148) | @Override
    method setOnPhotoTapListener (line 153) | @Override
    method setOnViewTapListener (line 158) | @Override
    method setScaleType (line 163) | @Override
    method setZoomable (line 172) | @Override
    method zoomTo (line 177) | @Override
    method onDetachedFromWindow (line 182) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/PhotoViewAttacher.java
  class PhotoViewAttacher (line 50) | class PhotoViewAttacher implements IPhotoView, View.OnTouchListener, Ver...
    method checkZoomLevels (line 85) | private static void checkZoomLevels(float minZoom,float maxZoom) {
    method hasDrawable (line 96) | private static boolean hasDrawable(ImageView imageView) {
    method isSupportedScaleType (line 103) | private static boolean isSupportedScaleType(final ScaleType scaleType) {
    method setImageViewScaleTypeMatrix (line 120) | private static void setImageViewScaleTypeMatrix(ImageView imageView) {
    method PhotoViewAttacher (line 161) | public PhotoViewAttacher(ImageView imageView) {
    method canZoom (line 195) | @Override
    method cleanup (line 207) | @SuppressLint("NewApi")
    method getDisplayRect (line 248) | @Override
    method getImageView (line 254) | public final ImageView getImageView() {
    method getMinScale (line 271) | @Override
    method getMaxScale (line 281) | @Override
    method getScale (line 286) | @Override
    method getScaleType (line 291) | @Override
    method onDoubleTap (line 296) | public final boolean onDoubleTap(MotionEvent ev) {
    method onDoubleTapEvent (line 316) | public final boolean onDoubleTapEvent(MotionEvent e) {
    method onDrag (line 321) | public final void onDrag(float dx, float dy) {
    method onFling (line 350) | @Override
    method onGlobalLayout (line 364) | @Override
    method onScale (line 394) | public final void onScale(float scaleFactor, float focusX, float focus...
    method onSingleTapConfirmed (line 405) | public final boolean onSingleTapConfirmed(MotionEvent e) {
    method onTouch (line 434) | @Override
    method setAllowParentInterceptOnEdge (line 478) | @Override
    method setMinScale (line 483) | @Override
    method setMaxScale (line 496) | @Override
    method setOnLongClickListener (line 503) | @Override
    method setOnMatrixChangeListener (line 508) | @Override
    method setOnPhotoTapListener (line 513) | @Override
    method setOnViewTapListener (line 518) | @Override
    method setScaleType (line 523) | @Override
    method setZoomable (line 533) | @Override
    method update (line 539) | public final void update() {
    method zoomTo (line 556) | @Override
    method getDisplayMatrix (line 565) | protected Matrix getDisplayMatrix() {
    method cancelFling (line 571) | private void cancelFling() {
    method checkAndDisplayMatrix (line 581) | private void checkAndDisplayMatrix() {
    method checkImageViewScaleType (line 586) | private void checkImageViewScaleType() {
    method checkMatrixBounds (line 601) | private void checkMatrixBounds() {
    method getDisplayRect (line 669) | private RectF getDisplayRect(Matrix matrix) {
    method getValue (line 692) | private float getValue(Matrix matrix, int whichValue) {
    method resetMatrix (line 700) | private void resetMatrix() {
    method setImageViewMatrix (line 706) | private void setImageViewMatrix(Matrix matrix) {
    method updateBaseMatrix (line 729) | private void updateBaseMatrix(Drawable d) {
    type OnMatrixChangedListener (line 795) | public static interface OnMatrixChangedListener {
      method onMatrixChanged (line 804) | void onMatrixChanged(RectF rect);
    type OnPhotoTapListener (line 813) | public static interface OnPhotoTapListener {
      method onPhotoTap (line 829) | void onPhotoTap(View view, float x, float y);
    type OnViewTapListener (line 838) | public static interface OnViewTapListener {
      method onViewTap (line 852) | void onViewTap(View view, float x, float y);
    class AnimatedZoomRunnable (line 855) | private class AnimatedZoomRunnable implements Runnable {
      method AnimatedZoomRunnable (line 865) | public AnimatedZoomRunnable(final float currentZoom, final float tar...
      method run (line 878) | public void run() {
    class FlingRunnable (line 904) | private class FlingRunnable implements Runnable {
      method FlingRunnable (line 909) | public FlingRunnable(Context context) {
      method cancelFling (line 913) | public void cancelFling() {
      method fling (line 920) | public void fling(int viewWidth, int viewHeight, int velocityX, int ...
      method run (line 957) | @Override
    method getMidScale (line 982) | @Override
    method setMidScale (line 987) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/SDK16.java
  class SDK16 (line 34) | @TargetApi(16)
    method postOnAnimation (line 37) | public static void postOnAnimation(View view, Runnable r) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/ScrollerProxy.java
  class ScrollerProxy (line 38) | abstract class ScrollerProxy {
    method getScroller (line 40) | public static ScrollerProxy getScroller(Context context) {
    method computeScrollOffset (line 48) | public abstract boolean computeScrollOffset();
    method fling (line 50) | public abstract void fling(int startX, int startY, int velocityX, int ...
    method forceFinished (line 53) | public abstract void forceFinished(boolean finished);
    method getCurrX (line 55) | public abstract int getCurrX();
    method getCurrY (line 57) | public abstract int getCurrY();
    class GingerScroller (line 59) | @TargetApi(9)
      method GingerScroller (line 64) | public GingerScroller(Context context) {
      method computeScrollOffset (line 68) | @Override
      method fling (line 73) | @Override
      method forceFinished (line 79) | @Override
      method getCurrX (line 84) | @Override
      method getCurrY (line 89) | @Override
    class PreGingerScroller (line 95) | private static class PreGingerScroller extends ScrollerProxy {
      method PreGingerScroller (line 99) | public PreGingerScroller(Context context) {
      method computeScrollOffset (line 103) | @Override
      method fling (line 108) | @Override
      method forceFinished (line 114) | @Override
      method getCurrX (line 119) | @Override
      method getCurrY (line 124) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/photoview/VersionedGestureDetector.java
  class VersionedGestureDetector (line 41) | abstract class VersionedGestureDetector {
    method newInstance (line 45) | public static VersionedGestureDetector newInstance(Context context, On...
    method onTouchEvent (line 62) | public abstract boolean onTouchEvent(MotionEvent ev);
    method isScaling (line 64) | public abstract boolean isScaling();
    type OnGestureListener (line 66) | public static interface OnGestureListener {
      method onDrag (line 67) | public void onDrag(float dx, float dy);
      method onFling (line 69) | public void onFling(float startX, float startY, float velocityX, flo...
      method onScale (line 71) | public void onScale(float scaleFactor, float focusX, float focusY);
    class CupcakeDetector (line 74) | private static class CupcakeDetector extends VersionedGestureDetector {
      method CupcakeDetector (line 81) | public CupcakeDetector(Context context) {
      method getActiveX (line 90) | float getActiveX(MotionEvent ev) {
      method getActiveY (line 94) | float getActiveY(MotionEvent ev) {
      method isScaling (line 98) | public boolean isScaling() {
      method onTouchEvent (line 102) | @Override
    class EclairDetector (line 180) | @TargetApi(5)
      method EclairDetector (line 186) | public EclairDetector(Context context) {
      method getActiveX (line 190) | @Override
      method getActiveY (line 199) | @Override
      method onTouchEvent (line 208) | @Override
    class FroyoDetector (line 238) | @TargetApi(8)
      method onScale (line 247) | @Override
      method onScaleBegin (line 253) | @Override
      method onScaleEnd (line 258) | @Override
      method FroyoDetector (line 264) | public FroyoDetector(Context context) {
      method isScaling (line 269) | @Override
      method onTouchEvent (line 274) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraConfigurationManager.java
  class CameraConfigurationManager (line 43) | public final class CameraConfigurationManager {
    method CameraConfigurationManager (line 57) | public CameraConfigurationManager(Context context) {
    method initFromCameraParameters (line 61) | public void initFromCameraParameters(Camera camera) {
    method getDisplaySize (line 86) | @SuppressWarnings("deprecation")
    method setDesiredCameraParameters (line 99) | public void setDesiredCameraParameters(Camera camera, boolean safeMode) {
    method getCameraResolution (line 128) | public Point getCameraResolution() {
    method getScreenResolution (line 132) | public Point getScreenResolution() {
    method findBestPreviewSizeValue (line 143) | private Point findBestPreviewSizeValue(Camera.Parameters parameters, P...

FILE: app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraManager.java
  class CameraManager (line 36) | public final class CameraManager {
    method CameraManager (line 45) | public CameraManager(Context context) {
    method openDriver (line 58) | public synchronized void openDriver() throws IOException {
    method isOpen (line 99) | public synchronized boolean isOpen() {
    method getCamera (line 103) | public Camera getCamera(){
    method closeDriver (line 110) | public synchronized void closeDriver() {
    method getCameraResolution (line 122) | public Point getCameraResolution() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraPreview.java
  class CameraPreview (line 19) | public class CameraPreview extends SurfaceView implements SurfaceHolder....
    method CameraPreview (line 25) | @SuppressWarnings("deprecation")
    method surfaceCreated (line 53) | public void surfaceCreated(SurfaceHolder holder) {
    method surfaceDestroyed (line 63) | public void surfaceDestroyed(SurfaceHolder holder) {
    method surfaceChanged (line 67) | public void surfaceChanged(SurfaceHolder holder, int format, int width...

FILE: app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/CircleImageView.java
  class CircleImageView (line 23) | class CircleImageView extends ImageView {
    method CircleImageView (line 36) | public CircleImageView(Context context, int color, final float radius) {
    method elevationSupported (line 64) | private boolean elevationSupported() {
    method onMeasure (line 68) | @Override
    method setAnimationListener (line 77) | public void setAnimationListener(Animation.AnimationListener listener) {
    method onAnimationStart (line 81) | @Override
    method onAnimationEnd (line 89) | @Override
    method setBackgroundColor (line 100) | @SuppressWarnings("ResourceType")
    class OvalShadow (line 109) | private class OvalShadow extends OvalShape {
      method OvalShadow (line 115) | public OvalShadow(int shadowRadius, int circleDiameter) {
      method draw (line 127) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/MaterialProgressDrawable.java
  class MaterialProgressDrawable (line 36) | class MaterialProgressDrawable extends Drawable implements Animatable {
    method MaterialProgressDrawable (line 96) | public MaterialProgressDrawable(Context context, View parent) {
    method setSizeParameters (line 107) | private void setSizeParameters(double progressCircleWidth, double prog...
    method updateSizes (line 129) | public void updateSizes(@ProgressDrawableSize int size) {
    method showArrow (line 142) | public void showArrow(boolean show) {
    method setArrowScale (line 149) | public void setArrowScale(float scale) {
    method setStartEndTrim (line 159) | public void setStartEndTrim(float startAngle, float endAngle) {
    method setProgressRotation (line 169) | public void setProgressRotation(float rotation) {
    method setBackgroundColor (line 176) | public void setBackgroundColor(int color) {
    method setColorSchemeColors (line 187) | public void setColorSchemeColors(int... colors) {
    method getIntrinsicHeight (line 192) | @Override
    method getIntrinsicWidth (line 197) | @Override
    method draw (line 202) | @Override
    method setAlpha (line 211) | @Override
    method getAlpha (line 216) | public int getAlpha() {
    method setColorFilter (line 220) | @Override
    method setRotation (line 225) | @SuppressWarnings("unused")
    method getRotation (line 231) | @SuppressWarnings("unused")
    method getOpacity (line 236) | @Override
    method isRunning (line 241) | @Override
    method start (line 254) | @Override
    method stop (line 268) | @Override
    method setupAnimators (line 277) | private void setupAnimators() {
    method invalidateDrawable (line 374) | @Override
    method scheduleDrawable (line 379) | @Override
    method unscheduleDrawable (line 384) | @Override
    class Ring (line 390) | private static class Ring {
      method Ring (line 421) | public Ring(Callback callback) {
      method setBackgroundColor (line 432) | public void setBackgroundColor(int color) {
      method setArrowDimensions (line 442) | public void setArrowDimensions(float width, float height) {
      method draw (line 450) | public void draw(Canvas c, Rect bounds) {
      method drawTriangle (line 472) | private void drawTriangle(Canvas c, float startAngle, float sweepAng...
      method setColors (line 510) | public void setColors(@NonNull int[] colors) {
      method setColorIndex (line 520) | public void setColorIndex(int index) {
      method goToNextColor (line 528) | public void goToNextColor() {
      method setColorFilter (line 532) | public void setColorFilter(ColorFilter filter) {
      method setAlpha (line 540) | public void setAlpha(int alpha) {
      method getAlpha (line 547) | public int getAlpha() {
      method setStrokeWidth (line 554) | public void setStrokeWidth(float strokeWidth) {
      method getStrokeWidth (line 560) | @SuppressWarnings("unused")
      method setStartTrim (line 565) | @SuppressWarnings("unused")
      method getStartTrim (line 571) | @SuppressWarnings("unused")
      method getStartingStartTrim (line 576) | public float getStartingStartTrim() {
      method getStartingEndTrim (line 580) | public float getStartingEndTrim() {
      method setEndTrim (line 584) | @SuppressWarnings("unused")
      method getEndTrim (line 590) | @SuppressWarnings("unused")
      method setRotation (line 595) | @SuppressWarnings("unused")
      method getRotation (line 601) | @SuppressWarnings("unused")
      method setInsets (line 606) | public void setInsets(int width, int height) {
      method getInsets (line 617) | @SuppressWarnings("unused")
      method setCenterRadius (line 626) | public void setCenterRadius(double centerRadius) {
      method getCenterRadius (line 630) | public double getCenterRadius() {
      method setShowArrow (line 637) | public void setShowArrow(boolean show) {
      method setArrowScale (line 647) | public void setArrowScale(float scale) {
      method getStartingRotation (line 657) | public float getStartingRotation() {
      method storeOriginals (line 665) | public void storeOriginals() {
      method resetOriginals (line 674) | public void resetOriginals() {
      method invalidateSelf (line 683) | private void invalidateSelf() {
    class EndCurveInterpolator (line 691) | private static class EndCurveInterpolator extends AccelerateDecelerate...
      method getInterpolation (line 692) | @Override
    class StartCurveInterpolator (line 701) | private static class StartCurveInterpolator extends AccelerateDecelera...
      method getInterpolation (line 702) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/SwipyRefreshLayout.java
  class SwipyRefreshLayout (line 52) | public class SwipyRefreshLayout extends ViewGroup {
    method onAnimationStart (line 156) | @Override
    method onAnimationRepeat (line 160) | @Override
    method onAnimationEnd (line 164) | @Override
    method setColorViewAlpha (line 197) | private void setColorViewAlpha(int targetAlpha) {
    method setSize (line 248) | public void setSize(int size) {
    method SwipyRefreshLayout (line 271) | public SwipyRefreshLayout(Context context) {
    method SwipyRefreshLayout (line 281) | @TargetApi(Build.VERSION_CODES.CUPCAKE)
    method getChildDrawingOrder (line 326) | protected int getChildDrawingOrder(int childCount, int i) {
    method createProgressView (line 341) | private void createProgressView() {
    method setOnRefreshListener (line 354) | public void setOnRefreshListener(OnRefreshListener listener) {
    method isAlphaUsedForScale (line 361) | private boolean isAlphaUsedForScale() {
    method setRefreshing (line 371) | public void setRefreshing(boolean refreshing) {
    method startScaleUpAnimation (line 390) | private void startScaleUpAnimation(AnimationListener listener) {
    method setAnimationProgress (line 417) | private void setAnimationProgress(float progress) {
    method setRefreshing (line 426) | private void setRefreshing(boolean refreshing, final boolean notify) {
    method startScaleDownAnimation (line 439) | private void startScaleDownAnimation(AnimationListener listener) {
    method startProgressAlphaStartAnimation (line 452) | @SuppressLint("NewApi") private void startProgressAlphaStartAnimation() {
    method startProgressAlphaMaxAnimation (line 456) | @SuppressLint("NewApi") private void startProgressAlphaMaxAnimation() {
    method startAlphaAnimation (line 460) | private Animation startAlphaAnimation(final int startingAlpha, final i...
    method setProgressBackgroundColor (line 487) | public void setProgressBackgroundColor(int colorRes) {
    method setColorScheme (line 495) | @Deprecated
    method setColorSchemeResources (line 507) | public void setColorSchemeResources(int... colorResIds) {
    method setColorSchemeColors (line 523) | public void setColorSchemeColors(int... colors) {
    method isRefreshing (line 532) | public boolean isRefreshing() {
    method ensureTarget (line 536) | private void ensureTarget() {
    method setDistanceToTriggerSync (line 555) | public void setDistanceToTriggerSync(int distance) {
    method onLayout (line 559) | @Override
    method onMeasure (line 584) | @Override
    method canChildScrollUp (line 626) | public boolean canChildScrollUp() {
    method canChildScrollDown (line 661) | public boolean canChildScrollDown() {
    method onInterceptTouchEvent (line 684) | @Override
    method getMotionEventY (line 771) | private float getMotionEventY(MotionEvent ev, int activePointerId) {
    method requestDisallowInterceptTouchEvent (line 779) | @Override
    method isAnimationRunning (line 784) | private boolean isAnimationRunning(Animation animation) {
    method onTouchEvent (line 788) | @SuppressLint("NewApi") @Override
    method animateOffsetToCorrectPosition (line 965) | private void animateOffsetToCorrectPosition(int from, AnimationListene...
    method animateOffsetToStartPosition (line 977) | private void animateOffsetToStartPosition(int from, AnimationListener ...
    method applyTransformation (line 995) | @Override
    method moveToStart (line 1018) | private void moveToStart(float interpolatedTime) {
    method applyTransformation (line 1026) | @Override
    method startScaleDownReturnToStartAnimation (line 1032) | @SuppressLint("NewApi") private void startScaleDownReturnToStartAnimat...
    method setTargetOffsetTopAndBottom (line 1056) | private void setTargetOffsetTopAndBottom(int offset, boolean requiresU...
    method onSecondaryPointerUp (line 1065) | private void onSecondaryPointerUp(MotionEvent ev) {
    type OnRefreshListener (line 1080) | public interface OnRefreshListener {
      method onRefresh (line 1081) | public void onRefresh(int index);
      method onLoad (line 1082) | public void onLoad(int index);
    method getDirection (line 1085) | public SwipyRefreshLayoutDirection getDirection() {
    method setDirection (line 1089) | public void setDirection(SwipyRefreshLayoutDirection direction) {
    method setRawDirection (line 1109) | private void setRawDirection(SwipyRefreshLayoutDirection direction) {
    method getFirstIndex (line 1129) | public int getFirstIndex() {
    method setFirstIndex (line 1137) | public void setFirstIndex(int firstIndex) {
    method getIndex (line 1144) | public int getIndex() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/SwipyRefreshLayoutDirection.java
  type SwipyRefreshLayoutDirection (line 8) | public enum SwipyRefreshLayoutDirection {
    method SwipyRefreshLayoutDirection (line 16) | SwipyRefreshLayoutDirection(int value) {
    method getFromInt (line 20) | public static SwipyRefreshLayoutDirection getFromInt(int value) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/activity/CaptureActivity.java
  class CaptureActivity (line 29) | public class CaptureActivity extends Activity implements Callback {
    method onCreate (line 43) | @Override
    method onResume (line 55) | @SuppressWarnings("deprecation")
    method onPause (line 81) | @Override
    method onDestroy (line 91) | @Override
    method handleDecode (line 102) | public void handleDecode(Result result, Bitmap barcode) {
    method initCamera (line 142) | private void initCamera(SurfaceHolder surfaceHolder) {
    method surfaceChanged (line 156) | @Override
    method surfaceCreated (line 162) | @Override
    method surfaceDestroyed (line 171) | @Override
    method getViewfinderView (line 177) | public ViewfinderView getViewfinderView() {
    method getHandler (line 181) | public Handler getHandler() {
    method drawViewfinder (line 185) | public void drawViewfinder() {
    method initBeepSound (line 190) | private void initBeepSound() {
    method playBeepSoundAndVibrate (line 215) | private void playBeepSoundAndVibrate() {
    method onCompletion (line 229) | public void onCompletion(MediaPlayer mediaPlayer) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/activity/DensityUtil.java
  class DensityUtil (line 10) | public class DensityUtil {
    method getDeviceInfo (line 12) | public static int[] getDeviceInfo(Context context) {
    method dip2px (line 26) | public static int dip2px(Context context, float dpValue) {
    method px2dip (line 34) | public static int px2dip(Context context, float pxValue) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/AutoFocusCallback.java
  class AutoFocusCallback (line 24) | final class AutoFocusCallback implements Camera.AutoFocusCallback {
    method setHandler (line 33) | void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
    method onAutoFocus (line 38) | public void onAutoFocus(boolean success, Camera camera) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/CameraConfigurationManager.java
  class CameraConfigurationManager (line 29) | final class CameraConfigurationManager {
    method CameraConfigurationManager (line 44) | CameraConfigurationManager(Context context) {
    method initFromCameraParameters (line 51) | @SuppressWarnings("deprecation")
    method setDesiredCameraParameters (line 71) | void setDesiredCameraParameters(Camera camera) {
    method getCameraResolution (line 83) | Point getCameraResolution() {
    method getScreenResolution (line 87) | Point getScreenResolution() {
    method getPreviewFormat (line 91) | int getPreviewFormat() {
    method getPreviewFormatString (line 95) | String getPreviewFormatString() {
    method getCameraResolution (line 99) | private static Point getCameraResolution(Camera.Parameters parameters,...
    method findBestPreviewSizeValue (line 124) | private static Point findBestPreviewSizeValue(CharSequence previewSize...
    method findBestMotZoomValue (line 166) | private static int findBestMotZoomValue(CharSequence stringValues, int...
    method setFlash (line 184) | private void setFlash(Camera.Parameters parameters) {
    method setZoom (line 199) | private void setZoom(Camera.Parameters parameters) {
    method getDesiredSharpness (line 263) | public static int getDesiredSharpness() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/CameraManager.java
  class CameraManager (line 39) | @SuppressWarnings("deprecation")
    method init (line 85) | public static void init(Context context,boolean is_top) {
    method get (line 97) | public static CameraManager get() {
    method CameraManager (line 101) | private CameraManager(Context context,boolean is_top) {
    method openDriver (line 123) | public void openDriver(SurfaceHolder holder) throws IOException {
    method closeDriver (line 150) | public void closeDriver() {
    method startPreview (line 161) | public void startPreview() {
    method stopPreview (line 171) | public void stopPreview() {
    method requestPreviewFrame (line 191) | public void requestPreviewFrame(Handler handler, int message) {
    method requestAutoFocus (line 208) | public void requestAutoFocus(Handler handler, int message) {
    method getFramingRect (line 229) | public Rect getFramingRect() {
    method getFramingRectInPreview (line 263) | public Rect getFramingRectInPreview() {
    method buildLuminanceSource (line 312) | public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int ...
    method getContext (line 337) | public Context getContext() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/FlashlightManager.java
  class FlashlightManager (line 37) | final class FlashlightManager {
    method FlashlightManager (line 53) | private FlashlightManager() {
    method enableFlashlight (line 58) | static void enableFlashlight() {
    method disableFlashlight (line 62) | static void disableFlashlight() {
    method getHardwareService (line 66) | private static Object getHardwareService() {
    method getSetFlashEnabledMethod (line 95) | private static Method getSetFlashEnabledMethod(Object iHardwareService) {
    method maybeForName (line 103) | private static Class<?> maybeForName(String name) {
    method maybeGetMethod (line 115) | private static Method maybeGetMethod(Class<?> clazz, String name, Clas...
    method invoke (line 127) | private static Object invoke(Method method, Object instance, Object......
    method setFlashlight (line 142) | private static void setFlashlight(boolean active) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/PlanarYUVLuminanceSource.java
  class PlanarYUVLuminanceSource (line 33) | public final class PlanarYUVLuminanceSource extends LuminanceSource {
    method PlanarYUVLuminanceSource (line 40) | public PlanarYUVLuminanceSource(byte[] yuvData, int dataWidth, int dat...
    method getRow (line 55) | @Override
    method getMatrix (line 69) | @Override
    method isCropSupported (line 100) | @Override
    method getDataWidth (line 105) | public int getDataWidth() {
    method getDataHeight (line 109) | public int getDataHeight() {
    method renderCroppedGreyscaleBitmap (line 113) | public Bitmap renderCroppedGreyscaleBitmap() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/PreviewCallback.java
  class PreviewCallback (line 25) | final class PreviewCallback implements Camera.PreviewCallback {
    method PreviewCallback (line 34) | PreviewCallback(CameraConfigurationManager configManager, boolean useO...
    method setHandler (line 39) | void setHandler(Handler previewHandler, int previewMessage) {
    method onPreviewFrame (line 44) | public void onPreviewFrame(byte[] data, Camera camera) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/CaptureActivityHandler.java
  class CaptureActivityHandler (line 32) | public final class CaptureActivityHandler extends Handler {
    type State (line 40) | private enum State {
    method CaptureActivityHandler (line 46) | public CaptureActivityHandler(CaptureActivity activity, Vector<Barcode...
    method handleMessage (line 58) | @Override
    method quitSynchronously (line 68) | public void quitSynchronously() {
    method restartPreviewAndDecode (line 84) | private void restartPreviewAndDecode() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeFormatManager.java
  class DecodeFormatManager (line 29) | final class DecodeFormatManager {
    method DecodeFormatManager (line 56) | private DecodeFormatManager() {}
    method parseDecodeFormats (line 58) | static Vector<BarcodeFormat> parseDecodeFormats(Intent intent) {
    method parseDecodeFormats (line 67) | static Vector<BarcodeFormat> parseDecodeFormats(Uri inputUri) {
    method parseDecodeFormats (line 75) | private static Vector<BarcodeFormat> parseDecodeFormats(Iterable<Strin...

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeHandler.java
  class DecodeHandler (line 36) | final class DecodeHandler extends Handler {
    method DecodeHandler (line 43) | DecodeHandler(CaptureActivity activity, Hashtable<DecodeHintType, Obje...
    method handleMessage (line 49) | @Override
    method decode (line 64) | private void decode(byte[] data, int width, int height) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeThread.java
  class DecodeThread (line 34) | final class DecodeThread extends Thread {
    method DecodeThread (line 42) | DecodeThread(CaptureActivity activity,
    method getHandler (line 68) | Handler getHandler() {
    method run (line 77) | @Override

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/FinishListener.java
  class FinishListener (line 26) | public final class FinishListener
    method FinishListener (line 31) | public FinishListener(Activity activityToFinish) {
    method onCancel (line 35) | public void onCancel(DialogInterface dialogInterface) {
    method onClick (line 39) | public void onClick(DialogInterface dialogInterface, int i) {
    method run (line 43) | public void run() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/InactivityTimer.java
  class InactivityTimer (line 30) | public final class InactivityTimer {
    method InactivityTimer (line 39) | public InactivityTimer(Activity activity) {
    method onActivity (line 44) | public void onActivity() {
    method cancel (line 51) | private void cancel() {
    method shutdown (line 58) | public void shutdown() {
    class DaemonThreadFactory (line 63) | private static final class DaemonThreadFactory implements ThreadFactory {
      method newThread (line 64) | public Thread newThread(Runnable runnable) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/Intents.java
  class Intents (line 23) | public final class Intents {
    method Intents (line 24) | private Intents() {
    class Scan (line 27) | public static final class Scan {
      method Scan (line 99) | private Scan() {
    class Encode (line 103) | public static final class Encode {
      method Encode (line 130) | private Encode() {
    class SearchBookContents (line 134) | public static final class SearchBookContents {
      method SearchBookContents (line 150) | private SearchBookContents() {
    class WifiConnect (line 154) | public static final class WifiConnect {
      method WifiConnect (line 175) | private WifiConnect() {
    class Share (line 180) | public static final class Share {
      method Share (line 187) | private Share() {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/encoding/EncodingHandler.java
  class EncodingHandler (line 17) | public final class EncodingHandler {
    method createQRCode (line 20) | public static Bitmap createQRCode(String str,int widthAndHeight) throw...

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/view/ViewfinderResultPointCallback.java
  class ViewfinderResultPointCallback (line 22) | public final class ViewfinderResultPointCallback implements ResultPointC...
    method ViewfinderResultPointCallback (line 26) | public ViewfinderResultPointCallback(ViewfinderView viewfinderView) {
    method foundPossibleResultPoint (line 30) | public void foundPossibleResultPoint(ResultPoint point) {

FILE: app/src/main/java/com/htmessage/yichatopen/widget/zxing/view/ViewfinderView.java
  class ViewfinderView (line 39) | public final class ViewfinderView extends View {
    method ViewfinderView (line 57) | public ViewfinderView(Context context, AttributeSet attrs) {
    method onDraw (line 72) | @Override
    method drawViewfinder (line 135) | public void drawViewfinder() {
    method drawResultBitmap (line 145) | public void drawResultBitmap(Bitmap barcode) {
    method addPossibleResultPoint (line 150) | public void addPossibleResultPoint(ResultPoint point) {
Condensed preview — 319 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,356K chars).
[
  {
    "path": ".gitignore",
    "chars": 466,
    "preview": "# Built application files\n*.apk\n*.ap_\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated file"
  },
  {
    "path": "README.md",
    "chars": 1166,
    "preview": "# Android 项目配置#\n    public class HTConstant {\n    //IM服务器相关\n    public static final String HOST_IM = \"xxx.xxx.xxx.xxx\";/"
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "chars": 2524,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.0\"\n\n    defaultC"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 679,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in C:"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 12643,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/HTApp.java",
    "chars": 5817,
    "preview": "package com.htmessage.yichatopen;\n\nimport android.app.Activity;\nimport android.app.ActivityManager;\nimport android.app.A"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/HTClientHelper.java",
    "chars": 9523,
    "preview": "package com.htmessage.yichatopen;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.support"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/HTConstant.java",
    "chars": 3474,
    "preview": "package com.htmessage.yichatopen;\n\nimport android.os.Environment;\n\n/**\n * Created by ustc on 2016/6/27.\n */\npublic class"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/IMAction.java",
    "chars": 1036,
    "preview": "package com.htmessage.yichatopen;\n\n/**\n * Created by huangfangyi on 2017/2/10.\n * qq 84543217\n */\n\npublic class IMAction"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/BaseActivity.java",
    "chars": 3081,
    "preview": "package com.htmessage.yichatopen.activity;\n\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.v7"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/BasePresenter.java",
    "chars": 162,
    "preview": "package com.htmessage.yichatopen.activity;\n\n/**\n * Created by huangfangyi on 2017/6/21.\n * qq 84543217\n */\n\npublic inter"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/BaseView.java",
    "chars": 301,
    "preview": "package com.htmessage.yichatopen.activity;\n\nimport android.app.Activity;\nimport android.content.Context;\n\n/**\n * Created"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/ScanCaptureActivity.java",
    "chars": 9860,
    "preview": "package com.htmessage.yichatopen.activity;\n\nimport android.content.Intent;\nimport android.content.pm.ActivityInfo;\nimpor"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/SettingsActivity.java",
    "chars": 20589,
    "preview": "package com.htmessage.yichatopen.activity;\n\nimport android.app.AlertDialog;\nimport android.app.ProgressDialog;\nimport an"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/ShowBigImageActivity.java",
    "chars": 1826,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/SplashActivity.java",
    "chars": 1610,
    "preview": "package com.htmessage.yichatopen.activity;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.o"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/end/AddFriendsFinalActivity.java",
    "chars": 4881,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.end;\n\nimport android.app.ProgressDialog;\nimport android.os.Bund"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextBasePrestener.java",
    "chars": 339,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.next;\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextFragment.java",
    "chars": 3471,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.next;\n\nimport android.app.Activity;\nimport android.content.Cont"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextPrestener.java",
    "chars": 2451,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.next;\n\nimport android.app.ProgressDialog;\nimport android.text.T"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendNextView.java",
    "chars": 463,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.next;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.htmes"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/next/AddFriendsNextActivity.java",
    "chars": 922,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.next;\n\nimport android.os.Bundle;\nimport android.support.v4.app."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/add/pre/AddFriendsPreActivity.java",
    "chars": 3394,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.add.pre;\n\nimport android.content.Intent;\nimport android.os.Bundle;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendBasePresenter.java",
    "chars": 635,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport android.content.Context;\nimport com.htmessage.yi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendFragment.java",
    "chars": 3007,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport android.app.Activity;\nimport android.content.Con"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendPrestener.java",
    "chars": 2681,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport android.content.BroadcastReceiver;\nimport androi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendView.java",
    "chars": 327,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport com.htmessage.yichatopen.activity.BaseView;\n\n/**"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsActivity.java",
    "chars": 1780,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport android.app.Activity;\nimport android.content.Int"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/addfriends/newfriend/NewFriendsAdapter.java",
    "chars": 12751,
    "preview": "package com.htmessage.yichatopen.activity.addfriends.newfriend;\n\nimport android.app.Activity;\nimport android.app.Progres"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatActivity.java",
    "chars": 3036,
    "preview": "package com.htmessage.yichatopen.activity.chat;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimp"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatAdapter.java",
    "chars": 23898,
    "preview": "package com.htmessage.yichatopen.activity.chat;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport and"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatContract.java",
    "chars": 739,
    "preview": "package com.htmessage.yichatopen.activity.chat;\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\nimport com.htme"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatFragment.java",
    "chars": 29523,
    "preview": "package com.htmessage.yichatopen.activity.chat;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport and"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/ChatPresenter.java",
    "chars": 124,
    "preview": "package com.htmessage.yichatopen.activity.chat;\n\n/**\n * Created by dell on 2017/7/1.\n */\n\npublic class ChatPresenter    "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChatSettingActivity.java",
    "chars": 9507,
    "preview": "package com.htmessage.yichatopen.activity.chat.activity;\n\nimport android.app.Dialog;\nimport android.content.Intent;\nimpo"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactActivity.java",
    "chars": 11907,
    "preview": "package com.htmessage.yichatopen.activity.chat.activity;\n\nimport android.annotation.SuppressLint;\nimport android.app.Ale"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/activity/ChooseContactAdapter.java",
    "chars": 2867,
    "preview": "package com.htmessage.yichatopen.activity.chat.activity;\n\nimport android.content.Context;\nimport android.view.View;\nimpo"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/ChatExtendMenu.java",
    "chars": 5432,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight;\n\nimport android.content.Context;\nimport android.content.res.Typed"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/ChatInputView.java",
    "chars": 22728,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoicePlayClickListener.java",
    "chars": 13141,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight;\n\nimport android.app.Activity;\nimport android.content.Context;\nimp"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoiceRecorder.java",
    "chars": 5120,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight;\n\nimport android.content.Context;\nimport android.media.MediaRecord"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/VoiceRecorderView.java",
    "chars": 10515,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight;\n\nimport android.content.Context;\nimport android.graphics.Color;\ni"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/DefaultEmojiconDatas.java",
    "chars": 2544,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.emoji;\n\n\nimport com.htmessage.yichatopen.R;\n\npublic class DefaultE"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/EmojiFragment.java",
    "chars": 5396,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.emoji;\n\nimport android.os.Bundle;\nimport android.support.annotatio"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/Emojicon.java",
    "chars": 4041,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.emoji;\n\npublic class Emojicon {\n    public Emojicon(){\n    }\n    \n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/EmojiconGridAdapter.java",
    "chars": 1819,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.emoji;\n\nimport android.content.Context;\nimport android.view.View;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/emoji/SmileUtils.java",
    "chars": 6272,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/DensityUtil.java",
    "chars": 4561,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.app.Activity;\nimport android.content.Con"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/Pacman.java",
    "chars": 3838,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.animation.Animator;\nimport android.anima"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/ProgressView.java",
    "chars": 4058,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.annotation.TargetApi;\nimport android.con"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/ProgressViewController.java",
    "chars": 2169,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.animation.Animator;\nimport android.graph"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/PullToLoadMoreListView.java",
    "chars": 9875,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.animation.Animator;\nimport android.anima"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/chat/weight/loadmore/RefreshHeader.java",
    "chars": 5223,
    "preview": "package com.htmessage.yichatopen.activity.chat.weight.loadmore;\n\nimport android.content.Context;\nimport android.graphics"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CharacterParserUtil.java",
    "chars": 9779,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountryCodeUtil.java",
    "chars": 1677,
    "preview": "package com.htmessage.yichatopen.activity.country;\n\nimport android.content.Context;\n\nimport com.htmessage.yichatopen.R;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountryComparator.java",
    "chars": 814,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountryModel.java",
    "chars": 1007,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortAdapter.java",
    "chars": 4093,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortModel.java",
    "chars": 636,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/CountrySortToken.java",
    "chars": 486,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/GetCountryNameSort.java",
    "chars": 3787,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/country/SideBar.java",
    "chars": 4342,
    "preview": "/*      \t\t\t\t\t\t\n * Copyright 2010 Beijing Xinwei, Inc. All rights reserved.\n * \n * History:\n * --------------------------"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/login/LoginActivity.java",
    "chars": 1968,
    "preview": "package com.htmessage.yichatopen.activity.login;\n\nimport android.annotation.TargetApi;\nimport android.os.Bundle;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/login/LoginContract.java",
    "chars": 987,
    "preview": "package com.htmessage.yichatopen.activity.login;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport an"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/login/LoginFragment.java",
    "chars": 6322,
    "preview": "package com.htmessage.yichatopen.activity.login;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/login/LoginPresenter.java",
    "chars": 5368,
    "preview": "package com.htmessage.yichatopen.activity.login;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/MainActivity.java",
    "chars": 14320,
    "preview": "package com.htmessage.yichatopen.activity.main;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimpor"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/MainBasePrester.java",
    "chars": 268,
    "preview": "package com.htmessage.yichatopen.activity.main;\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n\n/**\n * Created"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/MainPrestener.java",
    "chars": 3352,
    "preview": "package com.htmessage.yichatopen.activity.main;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport a"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/MainView.java",
    "chars": 559,
    "preview": "package com.htmessage.yichatopen.activity.main;\n\nimport com.htmessage.yichatopen.activity.BaseView;\nimport com.htmessage"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/BaseContactsPresenter.java",
    "chars": 634,
    "preview": "package com.htmessage.yichatopen.activity.main.contacts;\n\nimport com.htmessage.yichatopen.domain.User;\nimport com.htmess"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsAdapter.java",
    "chars": 4200,
    "preview": "package com.htmessage.yichatopen.activity.main.contacts;\n\nimport android.content.Context;\nimport android.util.SparseIntA"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsPresenter.java",
    "chars": 12248,
    "preview": "package com.htmessage.yichatopen.activity.main.contacts;\n\nimport android.app.AlertDialog;\nimport android.app.ProgressDia"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/ContactsView.java",
    "chars": 451,
    "preview": "package com.htmessage.yichatopen.activity.main.contacts;\n\nimport com.htmessage.yichatopen.domain.User;\nimport com.htmess"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/FragmentContacts.java",
    "chars": 8963,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n * <p>\n * Licensed under the Apache License, Version 2.0 ("
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/contacts/Sidebar.java",
    "chars": 4052,
    "preview": "/**\n * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.\n *\n * Licensed under the Apache License, Versi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/BaseConversationPresenter.java",
    "chars": 762,
    "preview": "package com.htmessage.yichatopen.activity.main.conversation;\n\nimport com.htmessage.sdk.model.HTConversation;\nimport com."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationAdapter.java",
    "chars": 7717,
    "preview": "package com.htmessage.yichatopen.activity.main.conversation;\n\nimport android.content.Context;\nimport android.view.Layout"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationFragment.java",
    "chars": 7208,
    "preview": "package com.htmessage.yichatopen.activity.main.conversation;\n\nimport android.app.Activity;\nimport android.content.Broadc"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationPresenter.java",
    "chars": 2577,
    "preview": "package com.htmessage.yichatopen.activity.main.conversation;\n\nimport android.content.Context;\n\nimport com.htmessage.sdk."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/conversation/ConversationView.java",
    "chars": 379,
    "preview": "package com.htmessage.yichatopen.activity.main.conversation;\n\nimport com.htmessage.sdk.model.HTConversation;\nimport com."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailesFragment.java",
    "chars": 8225,
    "preview": "package com.htmessage.yichatopen.activity.main.details;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsActivity.java",
    "chars": 1124,
    "preview": "package com.htmessage.yichatopen.activity.main.details;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragmen"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsBasePrester.java",
    "chars": 469,
    "preview": "package com.htmessage.yichatopen.activity.main.details;\n\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n\n/**\n "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsPrester.java",
    "chars": 2972,
    "preview": "package com.htmessage.yichatopen.activity.main.details;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.htmessage.yi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/details/UserDetailsView.java",
    "chars": 554,
    "preview": "package com.htmessage.yichatopen.activity.main.details;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.htmessage.yi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/FragmentFind.java",
    "chars": 2107,
    "preview": "package com.htmessage.yichatopen.activity.main.find;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport an"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyActivity.java",
    "chars": 1222,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport android.os.Bundle;\nimport android.support.v4"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyAdapter.java",
    "chars": 4515,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport android.content.Context;\nimport android.text"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyBasePrestener.java",
    "chars": 499,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyFragment.java",
    "chars": 3983,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport android.app.Activity;\nimport android.app.Dia"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyPrestener.java",
    "chars": 3473,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport android.content.Intent;\nimport android.util."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/find/recentlypeople/PeopleRecentlyView.java",
    "chars": 543,
    "preview": "package com.htmessage.yichatopen.activity.main.find.recentlypeople;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordBasePrester.java",
    "chars": 475,
    "preview": "package com.htmessage.yichatopen.activity.main.password;\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n\n/**\n "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordPrester.java",
    "chars": 6027,
    "preview": "package com.htmessage.yichatopen.activity.main.password;\n\nimport android.app.ProgressDialog;\nimport android.content.Inte"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordResetActivity.java",
    "chars": 1282,
    "preview": "package com.htmessage.yichatopen.activity.main.password;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragme"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordResetFragment.java",
    "chars": 6322,
    "preview": "package com.htmessage.yichatopen.activity.main.password;\n\nimport android.app.Activity;\nimport android.content.Context;\ni"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/password/PasswordView.java",
    "chars": 774,
    "preview": "package com.htmessage.yichatopen.activity.main.password;\n\nimport com.htmessage.yichatopen.activity.BaseView;\n\n/**\n * 项目名"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/FragmentProfile.java",
    "chars": 5897,
    "preview": "package com.htmessage.yichatopen.activity.main.profile;\n\nimport android.content.BroadcastReceiver;\nimport android.conten"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileActivity.java",
    "chars": 1234,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.profile;\n\nimport android.content.Intent;\nimport android.os.B"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileBasePrester.java",
    "chars": 508,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.profile;\n\nimport android.content.Intent;\n\nimport com.htmessa"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileFragment.java",
    "chars": 8343,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.profile;\n\nimport android.app.Activity;\nimport android.conten"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfilePrester.java",
    "chars": 14314,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.profile;\n\nimport android.app.Activity;\nimport android.app.Di"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/profile/ProfileView.java",
    "chars": 752,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.profile;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/ProfileUpdateActivity.java",
    "chars": 1847,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.update;\n\nimport android.os.Bundle;\nimport android.support.v4"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/ProfileUpdateFragment.java",
    "chars": 3274,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.update;\n\nimport android.app.Activity;\nimport android.content"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfileBasePrester.java",
    "chars": 482,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.update;\n\nimport com.htmessage.yichatopen.activity.BasePresen"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfilePrestener.java",
    "chars": 4808,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.update;\n\nimport android.app.Dialog;\nimport android.content.I"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/profile/info/update/UpdateProfileView.java",
    "chars": 468,
    "preview": "package com.htmessage.yichatopen.activity.main.profile.info.update;\n\nimport com.htmessage.yichatopen.activity.BaseView;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeActivity.java",
    "chars": 910,
    "preview": "package com.htmessage.yichatopen.activity.main.qrcode;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeBasePrester.java",
    "chars": 343,
    "preview": "package com.htmessage.yichatopen.activity.main.qrcode;\n\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n\n/**\n *"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeFragment.java",
    "chars": 1847,
    "preview": "package com.htmessage.yichatopen.activity.main.qrcode;\n\nimport android.app.Activity;\nimport android.content.Context;\nimp"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodePrester.java",
    "chars": 3179,
    "preview": "package com.htmessage.yichatopen.activity.main.qrcode;\n\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\ni"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/qrcode/QrCodeView.java",
    "chars": 389,
    "preview": "package com.htmessage.yichatopen.activity.main.qrcode;\n\nimport android.graphics.Bitmap;\n\nimport com.htmessage.yichatopen"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionActivity.java",
    "chars": 822,
    "preview": "package com.htmessage.yichatopen.activity.main.region;\n\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionBasePrestener.java",
    "chars": 425,
    "preview": "package com.htmessage.yichatopen.activity.main.region;\n\n\nimport com.htmessage.yichatopen.activity.BasePresenter;\n\nimport"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionFragment.java",
    "chars": 4934,
    "preview": "package com.htmessage.yichatopen.activity.main.region;\n\nimport android.app.Activity;\nimport android.content.Context;\nimp"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionPresenter.java",
    "chars": 2903,
    "preview": "package com.htmessage.yichatopen.activity.main.region;\n\nimport com.htmessage.yichatopen.R;\n\nimport java.util.ArrayList;\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/main/region/RegionView.java",
    "chars": 430,
    "preview": "package com.htmessage.yichatopen.activity.main.region;\n\n\nimport com.htmessage.yichatopen.activity.BaseView;\n\nimport java"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterActivity.java",
    "chars": 1337,
    "preview": "package com.htmessage.yichatopen.activity.register;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport and"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterContract.java",
    "chars": 1079,
    "preview": "package com.htmessage.yichatopen.activity.register;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterFragment.java",
    "chars": 11696,
    "preview": "package com.htmessage.yichatopen.activity.register;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport androi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/activity/register/RegisterPresenter.java",
    "chars": 7666,
    "preview": "package com.htmessage.yichatopen.activity.register;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/domain/InviteMessage.java",
    "chars": 811,
    "preview": "package com.htmessage.yichatopen.domain;\n\npublic class InviteMessage {\n\tprivate String from;\n\tprivate long time;\n\tprivat"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/domain/InviteMessgeDao.java",
    "chars": 2428,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/domain/User.java",
    "chars": 2593,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/domain/UserDao.java",
    "chars": 2681,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/ContactsManager.java",
    "chars": 1742,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.content.Context;\nimport android.util.Log;\n\n\nimport com.htmessa"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/DBManager.java",
    "chars": 11063,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.content.ContentValues;\nimport android.database.Cursor;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/DbOpenHelper.java",
    "chars": 3325,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n * <p/>\n * Licensed under the Apache License, Version 2.0 "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/LocalUserManager.java",
    "chars": 2649,
    "preview": "/**\n * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.\n * <p/>\n * Licensed under the Apache License, "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/Manager.java",
    "chars": 346,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.content.Context;\n\n/**\n * Created by huangfangyi on 2016/12/8.\n"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/MyNotification.java",
    "chars": 4846,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimpo"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/Notifier.java",
    "chars": 10033,
    "preview": "/************************************************************\n * * Hyphenate CONFIDENTIAL\n * __________________\n * Copyr"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/NotifierManager.java",
    "chars": 1226,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.content.Context;\n\n/**\n * Created by huangfangyi on 2016/10/12."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/PreferenceManager.java",
    "chars": 7829,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n * <p>\n * Licensed under the Apache License, Version 2.0 ("
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/manager/SettingsManager.java",
    "chars": 4213,
    "preview": "package com.htmessage.yichatopen.manager;\n\nimport android.content.Context;\n\nimport java.util.HashMap;\nimport java.util.M"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/runtimepermissions/Permissions.java",
    "chars": 814,
    "preview": "/**\n * Copyright 2015 Anthony Restaino\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not us"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/runtimepermissions/PermissionsManager.java",
    "chars": 16797,
    "preview": "/**\n * Copyright 2015 Anthony Restaino\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not us"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/runtimepermissions/PermissionsResultAction.java",
    "chars": 6857,
    "preview": "/**\n * Copyright 2015 Anthony Restaino\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not us"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/ACache.java",
    "chars": 25800,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/CommonUtils.java",
    "chars": 9583,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/DateUtils.java",
    "chars": 10006,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport com.htmessage."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/HTMessageUtils.java",
    "chars": 19619,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.app.Activity;\nimport android.app.ProgressDialog;\nimport android."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/ImageUtils.java",
    "chars": 16950,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android."
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/OkHttpUtils.java",
    "chars": 9578,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.os.Me"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/Param.java",
    "chars": 380,
    "preview": "package com.htmessage.yichatopen.utils;\n\n/**\n * Created by ustc on 2016/6/30.\n */\npublic class Param {\n\n\n    private Str"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/PathUtils.java",
    "chars": 5973,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.os.Environment;\nimport android.u"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/UpdateLastLoginTimeUtils.java",
    "chars": 1286,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport com.alibaba.fa"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/utils/Validator.java",
    "chars": 2776,
    "preview": "package com.htmessage.yichatopen.utils;\n\nimport java.util.regex.Pattern;\n\n/**\n * 校验器:利用正则表达式校验邮箱、手机号等\n * \n * @author liu"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/HTAlertDialog.java",
    "chars": 2499,
    "preview": "package com.htmessage.yichatopen.widget;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/SwitchButton.java",
    "chars": 2067,
    "preview": "package com.htmessage.yichatopen.widget;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/Compat.java",
    "chars": 1081,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/IPhotoView.java",
    "chars": 5389,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/PhotoView.java",
    "chars": 4738,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/PhotoViewAttacher.java",
    "chars": 27534,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/SDK16.java",
    "chars": 1613,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/ScrollerProxy.java",
    "chars": 3799,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/photoview/VersionedGestureDetector.java",
    "chars": 8087,
    "preview": "/**\n * Copyright (C) 2016 Hyphenate Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraConfigurationManager.java",
    "chars": 7499,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraManager.java",
    "chars": 3168,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/scan/CameraPreview.java",
    "chars": 2966,
    "preview": "/*\n * Barebones implementation of displaying camera preview.\n * \n * Created by lisah0 on 2012-02-24\n */\npackage com.htme"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/CircleImageView.java",
    "chars": 4345,
    "preview": "package com.htmessage.yichatopen.widget.swipyrefresh;\n\nimport android.content.Context;\nimport android.content.res.Resour"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/MaterialProgressDrawable.java",
    "chars": 24072,
    "preview": "package com.htmessage.yichatopen.widget.swipyrefresh;\n\n\nimport android.content.Context;\nimport android.content.res.Resou"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/SwipyRefreshLayout.java",
    "chars": 43559,
    "preview": "package com.htmessage.yichatopen.widget.swipyrefresh;\n\nimport android.annotation.SuppressLint;\nimport android.annotation"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/swipyrefresh/SwipyRefreshLayoutDirection.java",
    "chars": 527,
    "preview": "package com.htmessage.yichatopen.widget.swipyrefresh;\n\n/**\n * \n * @author xutao\n * \n */\npublic enum SwipyRefreshLayoutDi"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/activity/CaptureActivity.java",
    "chars": 6368,
    "preview": "package com.htmessage.yichatopen.widget.zxing.activity;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimp"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/activity/DensityUtil.java",
    "chars": 1092,
    "preview": "package com.htmessage.yichatopen.widget.zxing.activity;\n\nimport android.app.Activity;\nimport android.content.Context;\nim"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/AutoFocusCallback.java",
    "chars": 1696,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/CameraConfigurationManager.java",
    "chars": 9020,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/CameraManager.java",
    "chars": 11877,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/FlashlightManager.java",
    "chars": 4843,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/PlanarYUVLuminanceSource.java",
    "chars": 4095,
    "preview": "/*\n * Copyright 2009 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/camera/PreviewCallback.java",
    "chars": 1993,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/CaptureActivityHandler.java",
    "chars": 2771,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeFormatManager.java",
    "chars": 3767,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeHandler.java",
    "chars": 3517,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/DecodeThread.java",
    "chars": 2575,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/FinishListener.java",
    "chars": 1287,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/InactivityTimer.java",
    "chars": 2117,
    "preview": "/*\n * Copyright (C) 2010 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/decoding/Intents.java",
    "chars": 6182,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/encoding/EncodingHandler.java",
    "chars": 1226,
    "preview": "package com.htmessage.yichatopen.widget.zxing.encoding;\n\nimport android.graphics.Bitmap;\n\nimport com.google.zxing.Barcod"
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/view/ViewfinderResultPointCallback.java",
    "chars": 1106,
    "preview": "/*\n * Copyright (C) 2009 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/java/com/htmessage/yichatopen/widget/zxing/view/ViewfinderView.java",
    "chars": 5636,
    "preview": "/*\n * Copyright (C) 2008 ZXing authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may "
  },
  {
    "path": "app/src/main/res/anim/fade_in.xml",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:int"
  },
  {
    "path": "app/src/main/res/anim/fade_out.xml",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:int"
  },
  {
    "path": "app/src/main/res/anim/head_in.xml",
    "chars": 450,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 左上角扩大-->\n  <scale   xmlns:android=\"http://schemas.android.com/apk/res/androi"
  },
  {
    "path": "app/src/main/res/anim/head_out.xml",
    "chars": 451,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 左上角缩小 -->\n  <scale   xmlns:android=\"http://schemas.android.com/apk/res/andro"
  },
  {
    "path": "app/src/main/res/anim/hold.xml",
    "chars": 261,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       and"
  },
  {
    "path": "app/src/main/res/anim/loading_animation.xml",
    "chars": 447,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <rotate\n    "
  },
  {
    "path": "app/src/main/res/anim/push_bottom_in.xml",
    "chars": 240,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 上下滑入式 -->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n"
  },
  {
    "path": "app/src/main/res/anim/push_bottom_out.xml",
    "chars": 251,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 上下滑入式 -->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n"
  },
  {
    "path": "app/src/main/res/anim/push_top_in.xml",
    "chars": 243,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 上下滑入式 -->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n"
  },
  {
    "path": "app/src/main/res/anim/push_top_in2.xml",
    "chars": 436,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 上下滑入式 -->\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android"
  },
  {
    "path": "app/src/main/res/anim/push_top_out.xml",
    "chars": 243,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- 上下滑入式 -->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n"
  },
  {
    "path": "app/src/main/res/anim/push_top_out2.xml",
    "chars": 422,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<scale   xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        andr"
  },
  {
    "path": "app/src/main/res/anim/slide_in_from_left.xml",
    "chars": 227,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate"
  },
  {
    "path": "app/src/main/res/anim/slide_in_from_right.xml",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate"
  },
  {
    "path": "app/src/main/res/anim/slide_out_to_left.xml",
    "chars": 227,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate"
  }
]

// ... and 119 more files (download for full content)

About this extraction

This page contains the full source code of the YiChat/android_YiChat_Lite GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 319 files (1.2 MB), approximately 289.5k tokens, and a symbol index with 1898 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!