├── .gitignore ├── README-cn.md ├── README.md ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── import-summary.txt ├── leanchat-android.iml ├── leanchat ├── build.gradle ├── leanchat.iml ├── libs │ ├── baidumapapi_v3_0_0.jar │ └── locSDK_4.2.jar └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── avoscloud │ │ └── chat │ │ ├── base │ │ ├── App.java │ │ └── Constant.java │ │ ├── entity │ │ ├── AVIMUserInfoMessage.java │ │ ├── SortUser.java │ │ └── avobject │ │ │ ├── AddRequest.java │ │ │ ├── UpdateInfo.java │ │ │ └── User.java │ │ ├── service │ │ ├── AddRequestManager.java │ │ ├── CacheService.java │ │ ├── ChatManagerAdapterImpl.java │ │ ├── ColoredBitmapProvider.java │ │ ├── ConversationChangeEvent.java │ │ ├── ConversationManager.java │ │ ├── LeanchatReceiver.java │ │ ├── PreferenceMap.java │ │ ├── PushManager.java │ │ ├── UpdateService.java │ │ ├── UserService.java │ │ └── event │ │ │ ├── ContactRefreshEvent.java │ │ │ ├── FinishEvent.java │ │ │ ├── InvitationEvent.java │ │ │ └── LoginFinishEvent.java │ │ ├── ui │ │ ├── MainActivity.java │ │ ├── base_activity │ │ │ ├── BaseActivity.java │ │ │ ├── BaseFragment.java │ │ │ └── UpdateContentActivity.java │ │ ├── chat │ │ │ ├── ChatRoomActivity.java │ │ │ ├── ImageBrowserActivity.java │ │ │ └── LocationActivity.java │ │ ├── contact │ │ │ ├── ContactAddFriendActivity.java │ │ │ ├── ContactFragment.java │ │ │ ├── ContactFragmentAdapter.java │ │ │ ├── ContactNewFriendActivity.java │ │ │ └── ContactPersonInfoActivity.java │ │ ├── conversation │ │ │ ├── ConversationAddMembersActivity.java │ │ │ ├── ConversationBaseActivity.java │ │ │ ├── ConversationDetailActivity.java │ │ │ ├── ConversationEventBaseActivity.java │ │ │ ├── ConversationGroupListActivity.java │ │ │ └── ConversationRecentFragment.java │ │ ├── discover │ │ │ ├── DiscoverFragment.java │ │ │ └── DiscoverFragmentUserAdapter.java │ │ ├── entry │ │ │ ├── EntryBaseActivity.java │ │ │ ├── EntryLoginActivity.java │ │ │ ├── EntryRegisterActivity.java │ │ │ └── EntrySplashActivity.java │ │ ├── profile │ │ │ ├── ProfileFragment.java │ │ │ ├── ProfileNotifySettingActivity.java │ │ │ └── ProfileNotifySettingFragment.java │ │ └── view │ │ │ ├── BaseCheckListAdapter.java │ │ │ ├── BaseListAdapter.java │ │ │ ├── BaseListView.java │ │ │ ├── ClearEditText.java │ │ │ ├── EnLetterView.java │ │ │ ├── ExpandGridView.java │ │ │ ├── HeaderLayout.java │ │ │ ├── RefreshableView.java │ │ │ └── xlist │ │ │ ├── XListView.java │ │ │ ├── XListViewFooter.java │ │ │ └── XListViewHeader.java │ │ └── util │ │ ├── CharacterParser.java │ │ ├── Connectivity.java │ │ ├── Logger.java │ │ ├── NetAsyncTask.java │ │ ├── NotificationUtil.java │ │ ├── PathUtils.java │ │ ├── PhotoUtils.java │ │ ├── PixelUtils.java │ │ ├── RefreshTask.java │ │ ├── Refreshable.java │ │ ├── SimpleNetTask.java │ │ └── Utils.java │ ├── jniLibs │ └── armeabi │ │ ├── libBaiduMapSDK_v3_0_0.so │ │ └── liblocSDK4d.so │ └── res │ ├── anim │ ├── grow_from_bottom.xml │ ├── push_top_in2.xml │ ├── push_top_out2.xml │ └── shrink_from_top.xml │ ├── drawable-hdpi │ ├── base_horizontal_line.9.png │ ├── chat_btn_voice_normal.png │ ├── chat_item_location_default.9.png │ └── common_view_right_arrow_pic.png │ ├── drawable-xhdpi │ ├── avoscloud_feedback_dev_reply_background.9.png │ ├── avoscloud_feedback_notification.9.png │ ├── avoscloud_feedback_thread_actionbar_back.png │ ├── avoscloud_feedback_user_reply_background.9.png │ ├── base_action_bar_add_bg_normal.png │ ├── base_action_bar_add_bg_pressed.png │ ├── base_edit_input.9.png │ ├── base_horizontal_line.9.png │ ├── btn_logout_pressed.9.png │ ├── chat_location_activity_icon_geo.png │ ├── clear_edit_search_clear_normal.png │ ├── clear_edit_search_clear_pressed.png │ ├── common_input_bg.9.png │ ├── common_msg_tips.png │ ├── common_view_right_arrow_pic.png │ ├── contact_fragment_icon_msg_search.png │ ├── contact_group_icon.png │ ├── contact_new_friends_icon.png │ ├── contact_person_info_about_top_bg.9.png │ ├── contact_person_info_mid_bg.9.png │ ├── discover_lay_icn_order_artist.png │ ├── discover_lay_icn_order_artist_p.png │ ├── head.png │ ├── icon.png │ ├── login_bg.png │ ├── login_icon_account.png │ ├── login_icon_password.png │ ├── main_acvitivy_top_bar.9.png │ ├── profile_btn_logout_normal.9.png │ ├── splash_back.9.png │ ├── tabbar_chat.png │ ├── tabbar_chat_active.png │ ├── tabbar_contacts.png │ ├── tabbar_contacts_active.png │ ├── tabbar_discover.png │ ├── tabbar_discover_active.png │ ├── tabbar_me.png │ ├── tabbar_me_active.png │ └── utils_icon_info_2.png │ ├── drawable │ ├── base_action_bar_add_bg_selector.xml │ ├── btn_logout_selector.xml │ ├── btn_selector.xml │ ├── button_normal_shape.xml │ ├── clear_edittext_search_clear.xml │ ├── common_btn.xml │ ├── common_btn_normal.xml │ ├── common_btn_pressed.xml │ ├── contact_fragment_gallery_contacts_dialog_background.xml │ ├── contact_fragment_sortlistview_sidebar_background.xml │ ├── group_detail_btn.xml │ ├── nearby_order.xml │ ├── recent_message_text_color_selector.xml │ ├── recent_name_text_color_selector.xml │ └── tab_textcolor.xml │ ├── layout │ ├── chat_xlistview_footer.xml │ ├── chat_xlistview_header.xml │ ├── common_divider.xml │ ├── common_header_layout.xml │ ├── common_user_item.xml │ ├── common_view_right_arrow.xml │ ├── contact_add_friend_activity.xml │ ├── contact_add_friend_item.xml │ ├── contact_fragment.xml │ ├── contact_fragment_header_layout.xml │ ├── contact_new_friend_activity.xml │ ├── contact_person_info_activity.xml │ ├── conversation_add_members_item.xml │ ├── conversation_add_members_layout.xml │ ├── conversation_detail_activity.xml │ ├── conversation_item.xml │ ├── conversation_list_activity.xml │ ├── conversation_list_item.xml │ ├── conversation_member_item.xml │ ├── discover_fragment.xml │ ├── discover_near_people_item.xml │ ├── entry_login_activity.xml │ ├── entry_register_activity.xml │ ├── entry_splash_layout.xml │ ├── main_activity.xml │ ├── message_fragment.xml │ ├── profile_fragment.xml │ ├── profile_setting_notify_layout.xml │ ├── refreshable_view_pull_to_refresh_header.xml │ └── update_content_layout.xml │ ├── menu │ ├── chat_ativity_menu.xml │ └── update_content_menu.xml │ ├── values-sw600dp │ └── dimens.xml │ ├── values-sw720dp-land │ └── dimens.xml │ ├── values-v11 │ └── styles.xml │ ├── values-v14 │ └── styles.xml │ ├── values │ ├── bools.xml │ ├── color_standard.xml │ ├── colors.xml │ ├── dimens.xml │ ├── dimens_standard.xml │ ├── strings.xml │ ├── styles.xml │ └── styles_standard.xml │ └── xml │ └── setting_preference.xml ├── leanchatlib-demo ├── .gitignore ├── build.gradle ├── leanchatlib-demo.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── avoscloud │ │ └── leanchatlib_demo │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── avoscloud │ │ └── leanchatlib_demo │ │ ├── App.java │ │ ├── ChatRoomActivity.java │ │ ├── LoginActivity.java │ │ └── MainActivity.java │ └── res │ ├── layout │ ├── activity_login.xml │ └── activity_main.xml │ ├── menu │ ├── menu_login.xml │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── leanchatlib ├── .gitignore ├── build.gradle ├── leanchatlib.iml ├── libs │ └── prettytime-3.2.5.Final.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── avoscloud │ │ └── leanchatlib │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── avoscloud │ │ └── leanchatlib │ │ ├── activity │ │ ├── ChatActivity.java │ │ └── ChatActivityEventListener.java │ │ ├── adapter │ │ ├── ChatEmotionGridAdapter.java │ │ ├── ChatEmotionPagerAdapter.java │ │ └── ChatMessageAdapter.java │ │ ├── controller │ │ ├── AVIMTypedMessagesArrayCallback.java │ │ ├── AudioHelper.java │ │ ├── ChatManager.java │ │ ├── ChatManagerAdapter.java │ │ ├── ConversationHelper.java │ │ ├── DBHelper.java │ │ ├── EmotionHelper.java │ │ ├── MessageAgent.java │ │ ├── MessageHelper.java │ │ ├── RoomsTable.java │ │ └── SignatureFactory.java │ │ ├── model │ │ ├── ConversationType.java │ │ ├── MessageEvent.java │ │ ├── Room.java │ │ └── UserInfo.java │ │ ├── utils │ │ ├── LogUtils.java │ │ ├── PathUtils.java │ │ ├── PhotoUtils.java │ │ ├── ProviderPathUtils.java │ │ └── Utils.java │ │ └── view │ │ ├── EmotionEditText.java │ │ ├── PlayButton.java │ │ ├── RecordButton.java │ │ ├── RefreshableView.java │ │ └── ViewHolder.java │ └── res │ ├── anim │ ├── chat_anim_voice_left.xml │ └── chat_anim_voice_right.xml │ ├── drawable-xhdpi │ ├── chat_add_camera_normal.png │ ├── chat_add_camera_press.png │ ├── chat_add_location_normal.png │ ├── chat_add_location_press.png │ ├── chat_add_normal.png │ ├── chat_add_picture_normal.png │ ├── chat_add_picture_pressed.png │ ├── chat_add_pressed.png │ ├── chat_base_action_bar_true_bg_normal.png │ ├── chat_base_action_bar_true_bg_pressed.png │ ├── chat_btn_voice_normal.png │ ├── chat_common_base_header_back_btn.png │ ├── chat_common_empty_photo.9.png │ ├── chat_common_image_load_fail.png │ ├── chat_default_user_avatar.png │ ├── chat_emo_normal.png │ ├── chat_emo_pressed.png │ ├── chat_fail_resend_normal.png │ ├── chat_fail_resend_press.png │ ├── chat_icon_voice0.png │ ├── chat_icon_voice1.png │ ├── chat_icon_voice2.png │ ├── chat_icon_voice3.png │ ├── chat_icon_voice4.png │ ├── chat_icon_voice5.png │ ├── chat_item_location_default.9.png │ ├── chat_keyboard_normal.png │ ├── chat_keyboard_press.png │ ├── chat_layout_home_bg_bottombar.png │ ├── chat_left_qp.9.png │ ├── chat_login_edit_normal.9.png │ ├── chat_menu_people.png │ ├── chat_message_send_fail.png │ ├── chat_right_qp.9.png │ ├── chat_send_normal.png │ ├── chat_send_pressed.png │ ├── chat_setmode_keyboard_btn_normal.png │ ├── chat_setmode_keyboard_btn_pressed.png │ ├── chat_time_block.9.png │ ├── chat_top_voice_bg.9.png │ ├── chat_voice_bg.9.png │ ├── chat_voice_bg_pressed.9.png │ ├── chat_voice_left.png │ ├── chat_voice_left1.png │ ├── chat_voice_left2.png │ ├── chat_voice_left3.png │ ├── chat_voice_pressed.png │ ├── chat_voice_right.png │ ├── chat_voice_right1.png │ ├── chat_voice_right2.png │ ├── chat_voice_right3.png │ ├── chat_xlistview_arrow.png │ ├── emoji_angry.png │ ├── emoji_anguished.png │ ├── emoji_astonished.png │ ├── emoji_blush.png │ ├── emoji_clap.png │ ├── emoji_cold_sweat.png │ ├── emoji_confounded.png │ ├── emoji_confused.png │ ├── emoji_cry.png │ ├── emoji_disappointed.png │ ├── emoji_disappointed_relieved.png │ ├── emoji_dizzy_face.png │ ├── emoji_expressionless.png │ ├── emoji_fearful.png │ ├── emoji_flushed.png │ ├── emoji_frowning.png │ ├── emoji_grimacing.png │ ├── emoji_grin.png │ ├── emoji_grinning.png │ ├── emoji_heart_eyes.png │ ├── emoji_hushed.png │ ├── emoji_innocent.png │ ├── emoji_joy.png │ ├── emoji_kissing.png │ ├── emoji_kissing_closed_eyes.png │ ├── emoji_kissing_face.png │ ├── emoji_kissing_heart.png │ ├── emoji_kissing_smiling_eyes.png │ ├── emoji_laughing.png │ ├── emoji_mask.png │ ├── emoji_neutral_face.png │ ├── emoji_no_mouth.png │ ├── emoji_open_mouth.png │ ├── emoji_pensive.png │ ├── emoji_persevere.png │ ├── emoji_point_left.png │ ├── emoji_point_right.png │ ├── emoji_rage.png │ ├── emoji_relaxed.png │ ├── emoji_relieved.png │ ├── emoji_satisfied.png │ ├── emoji_scream.png │ ├── emoji_sleeping.png │ ├── emoji_sleepy.png │ ├── emoji_smile.png │ ├── emoji_smiley.png │ ├── emoji_smirk.png │ ├── emoji_sob.png │ ├── emoji_stuck_out_tongue.png │ ├── emoji_stuck_out_tongue_closed_eyes.png │ ├── emoji_stuck_out_tongue_winking_eye.png │ ├── emoji_sunglasses.png │ ├── emoji_sweat.png │ ├── emoji_sweat_smile.png │ ├── emoji_thumbsdown.png │ ├── emoji_thumbsup.png │ ├── emoji_tired_face.png │ ├── emoji_triumph.png │ ├── emoji_unamused.png │ ├── emoji_weary.png │ ├── emoji_wink.png │ ├── emoji_worried.png │ └── emoji_yum.png │ ├── drawable │ ├── chat_base_action_bar_true_bg_selector.xml │ ├── chat_bottom_add_camera_selector.xml │ ├── chat_bottom_add_picture_selector.xml │ ├── chat_btn_add_selector.xml │ ├── chat_btn_emo_selector.xml │ ├── chat_btn_fail_resend.xml │ ├── chat_btn_keyboard.xml │ ├── chat_btn_send_selector.xml │ ├── chat_btn_voice_selector.xml │ ├── chat_button_add_location_selector.xml │ └── chat_record_button_round_background.xml │ ├── layout │ ├── chat_bottom_add_layout.xml │ ├── chat_bottom_more_layout.xml │ ├── chat_bottom_record_layout.xml │ ├── chat_bottom_text_layout.xml │ ├── chat_client_state_view.xml │ ├── chat_common_base_header.xml │ ├── chat_common_base_header_right_btn.xml │ ├── chat_common_base_header_right_image_btn.xml │ ├── chat_emotion_gridview.xml │ ├── chat_emotion_item.xml │ ├── chat_image_brower_layout.xml │ ├── chat_item_audio.xml │ ├── chat_item_base_left.xml │ ├── chat_item_base_right.xml │ ├── chat_item_base_status.xml │ ├── chat_item_base_time.xml │ ├── chat_item_image.xml │ ├── chat_item_location.xml │ ├── chat_item_text.xml │ ├── chat_layout.xml │ ├── chat_location_activity.xml │ ├── chat_pull_to_refresh.xml │ └── chat_record_layout.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── libs ├── Java-WebSocket-1.2.0-leancloud.jar ├── android-async-http-1.4.6.jar ├── avoscloud-push-v3.1.4.jar ├── avoscloud-sdk-v3.1.4.jar ├── butterknife-6.1.0.jar ├── eventbus-2.4.0.jar ├── fastjson-1.1.37-leancloud.jar ├── httpmime-4.2.4.jar ├── support-v4-19.1.0.jar └── universal-image-loader-1.9.3.jar └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | gen 3 | *.apk 4 | lint-result.xml 5 | app/build 6 | .gradle 7 | local.properties 8 | .idea 9 | .DS_Store 10 | manifest-merger-release-report.txt 11 | gradle.properties 12 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | maven { 6 | url "http://mvn.leancloud.cn/nexus/content/repositories/releases" 7 | } 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:1.0.0' 11 | classpath 'org.robolectric:robolectric-gradle-plugin:0.14.+' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | maven { 19 | url "http://mvn.leancloud.cn/nexus/content/repositories/releases" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Apr 10 15:27:10 PDT 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip 7 | -------------------------------------------------------------------------------- /leanchat-android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /leanchat/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 21 5 | buildToolsVersion "21.1.2" 6 | 7 | defaultConfig { 8 | applicationId "com.avoscloud.chat" 9 | minSdkVersion 15 10 | targetSdkVersion 15 11 | multiDexEnabled true 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 18 | } 19 | } 20 | 21 | packagingOptions { 22 | exclude 'META-INF/LICENSE.txt' 23 | exclude 'META-INF/NOTICE.txt' 24 | } 25 | 26 | lintOptions { 27 | // set to true to turn off analysis progress reporting by lint 28 | quiet false 29 | abortOnError false 30 | } 31 | } 32 | 33 | dependencies { 34 | compile project(':leanchatlib') 35 | compile 'cn.leancloud.android:avoscloud-statistics:v3.4.5@aar' 36 | compile 'com.jakewharton:butterknife:6.1.0' 37 | compile files('libs/baidumapapi_v3_0_0.jar') 38 | compile files('libs/locSDK_4.2.jar') 39 | } 40 | -------------------------------------------------------------------------------- /leanchat/libs/baidumapapi_v3_0_0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/libs/baidumapapi_v3_0_0.jar -------------------------------------------------------------------------------- /leanchat/libs/locSDK_4.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/libs/locSDK_4.2.jar -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/base/Constant.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.base; 2 | 3 | /** 4 | * Created by lzw on 14-6-23. 5 | */ 6 | public class Constant { 7 | public static final String OBJECT_ID = "objectId"; 8 | public static final int PAGE_SIZE = 10; 9 | public static final String CREATED_AT = "createdAt"; 10 | public static final String UPDATED_AT = "updatedAt"; 11 | } 12 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/entity/AVIMUserInfoMessage.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.entity; 2 | 3 | import com.avos.avoscloud.im.v2.AVIMMessageField; 4 | import com.avos.avoscloud.im.v2.AVIMMessageType; 5 | import com.avos.avoscloud.im.v2.AVIMTypedMessage; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by lzw on 15/4/14. 11 | */ 12 | @AVIMMessageType(type = 1) 13 | public class AVIMUserInfoMessage extends AVIMTypedMessage { 14 | 15 | @AVIMMessageField(name = "_lcattrs") 16 | Map attrs; 17 | 18 | public Map getAttrs() { 19 | return attrs; 20 | } 21 | 22 | public void setAttrs(Map attrs) { 23 | this.attrs = attrs; 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/entity/SortUser.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.entity; 2 | 3 | import com.avos.avoscloud.AVUser; 4 | 5 | /** 6 | * Created by lzw on 15/1/9. 7 | */ 8 | public class SortUser { 9 | private AVUser innerUser; 10 | private String sortLetters; 11 | 12 | public AVUser getInnerUser() { 13 | return innerUser; 14 | } 15 | 16 | public void setInnerUser(AVUser innerUser) { 17 | this.innerUser = innerUser; 18 | } 19 | 20 | public String getSortLetters() { 21 | return sortLetters; 22 | } 23 | 24 | public void setSortLetters(String sortLetters) { 25 | this.sortLetters = sortLetters; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/entity/avobject/AddRequest.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.entity.avobject; 2 | 3 | import com.avos.avoscloud.AVClassName; 4 | import com.avos.avoscloud.AVObject; 5 | import com.avos.avoscloud.AVUser; 6 | 7 | /** 8 | * Created by lzw on 14-9-27. 9 | */ 10 | @AVClassName("AddRequest") 11 | public class AddRequest extends AVObject { 12 | public static final int STATUS_WAIT = 0; 13 | public static final int STATUS_DONE = 1; 14 | 15 | public static final String FROM_USER = "fromUser"; 16 | public static final String TO_USER = "toUser"; 17 | public static final String STATUS = "status"; 18 | 19 | /** 20 | * 标记接收方是否已读该消息 21 | */ 22 | public static final String IS_READ = "isRead"; 23 | 24 | public AddRequest() { 25 | } 26 | 27 | public AVUser getFromUser() { 28 | return getAVUser(FROM_USER); 29 | } 30 | 31 | public void setFromUser(AVUser fromUser) { 32 | put(FROM_USER, fromUser); 33 | } 34 | 35 | public AVUser getToUser() { 36 | return getAVUser(TO_USER); 37 | } 38 | 39 | public void setToUser(AVUser toUser) { 40 | put(TO_USER, toUser); 41 | } 42 | 43 | public int getStatus() { 44 | return getInt(STATUS); 45 | } 46 | 47 | public void setStatus(int status) { 48 | put(STATUS, status); 49 | } 50 | 51 | public boolean isRead() { 52 | return getBoolean(IS_READ); 53 | } 54 | 55 | public void setIsRead(boolean isRead) { 56 | put(IS_READ, isRead); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/entity/avobject/UpdateInfo.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.entity.avobject; 2 | 3 | import com.avos.avoscloud.AVClassName; 4 | import com.avos.avoscloud.AVObject; 5 | 6 | @AVClassName("UpdateInfo") 7 | public class UpdateInfo extends AVObject { 8 | public static final String DESC = "desc"; 9 | public static String VERSION = "version"; 10 | public static String APK_URL = "apkUrl"; 11 | 12 | public UpdateInfo() { 13 | } 14 | 15 | public int getVersion() { 16 | return getInt(VERSION); 17 | } 18 | 19 | public void setVersion(int version) { 20 | put(VERSION, version); 21 | } 22 | 23 | public String getApkUrl() { 24 | return getString(APK_URL); 25 | } 26 | 27 | public void setApkUrl(String apkUrl) { 28 | put(APK_URL, apkUrl); 29 | } 30 | 31 | public String getDesc() { 32 | return getString(DESC); 33 | } 34 | 35 | public void setDesc(String desc) { 36 | put(DESC, desc); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/entity/avobject/User.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.entity.avobject; 2 | 3 | import com.avos.avoscloud.AVFile; 4 | import com.avos.avoscloud.AVInstallation; 5 | import com.avos.avoscloud.AVUser; 6 | import com.avoscloud.leanchatlib.utils.LogUtils; 7 | 8 | public class User { 9 | public static final String USERNAME = "username"; 10 | public static final String PASSWORD = "password"; 11 | public static final String AVATAR = "avatar"; 12 | public static final String FRIENDS = "friends"; 13 | public static final String LOCATION = "location"; 14 | public static final String INSTALLATION = "installation"; 15 | 16 | 17 | public static String getCurrentUserId() { 18 | AVUser user = AVUser.getCurrentUser(); 19 | if (user != null) { 20 | return user.getObjectId(); 21 | } else { 22 | return null; 23 | } 24 | } 25 | 26 | public static String getAvatarUrl(AVUser user) { 27 | AVFile avatar = user.getAVFile(AVATAR); 28 | if (avatar != null) { 29 | return avatar.getUrl(); 30 | } else { 31 | return null; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/ConversationChangeEvent.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service; 2 | 3 | import com.avos.avoscloud.im.v2.AVIMConversation; 4 | 5 | /** 6 | * Created by lzw on 15/3/5. 7 | */ 8 | //name, member change event 9 | public class ConversationChangeEvent { 10 | private AVIMConversation conv; 11 | 12 | public ConversationChangeEvent(AVIMConversation conv) { 13 | this.conv = conv; 14 | } 15 | 16 | public AVIMConversation getConv() { 17 | return conv; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/LeanchatReceiver.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.text.TextUtils; 7 | import com.avoscloud.chat.R; 8 | import com.avoscloud.chat.service.event.InvitationEvent; 9 | import com.avoscloud.chat.ui.entry.EntrySplashActivity; 10 | import com.avoscloud.chat.util.NotificationUtil; 11 | 12 | import com.avoscloud.leanchatlib.utils.LogUtils; 13 | import org.json.JSONException; 14 | import org.json.JSONObject; 15 | 16 | import de.greenrobot.event.EventBus; 17 | 18 | /** 19 | * Created by wli on 15/7/10. 20 | */ 21 | public class LeanchatReceiver extends BroadcastReceiver { 22 | 23 | public final static String AVOS_DATA = "com.avoscloud.Data"; 24 | 25 | @Override 26 | public void onReceive(Context context, Intent intent) { 27 | String action = intent.getAction(); 28 | if (!TextUtils.isEmpty(action)) { 29 | if (action.equals(context.getString(R.string.invitation_action))) { 30 | String avosData = intent.getStringExtra(AVOS_DATA); 31 | if (!TextUtils.isEmpty(avosData)) { 32 | try { 33 | JSONObject json = new JSONObject(avosData); 34 | if (null != json) { 35 | String alertStr = json.getString(PushManager.AVOS_ALERT); 36 | NotificationUtil.showNotification(context, "LeanChat", alertStr, EntrySplashActivity.class); 37 | } 38 | } catch (JSONException e) { 39 | LogUtils.logException(e); 40 | } 41 | } 42 | } 43 | } 44 | EventBus.getDefault().post(new InvitationEvent()); 45 | } 46 | } -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/PushManager.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service; 2 | 3 | import android.content.Context; 4 | import com.avos.avoscloud.AVInstallation; 5 | import com.avos.avoscloud.AVPush; 6 | import com.avos.avoscloud.AVQuery; 7 | import com.avos.avoscloud.AVUser; 8 | import com.avos.avoscloud.PushService; 9 | import com.avoscloud.chat.ui.entry.EntrySplashActivity; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | /** 15 | * Created by lzw on 15/6/11. 16 | */ 17 | public class PushManager { 18 | public final static String AVOS_ALERT = "alert"; 19 | 20 | private final static String AVOS_PUSH_ACTION = "action"; 21 | public static final String INSTALLATION_CHANNELS = "channels"; 22 | private static PushManager pushManager; 23 | private Context context; 24 | 25 | public synchronized static PushManager getInstance() { 26 | if (pushManager == null) { 27 | pushManager = new PushManager(); 28 | } 29 | return pushManager; 30 | } 31 | 32 | public void init(Context context) { 33 | this.context = context; 34 | PushService.setDefaultPushCallback(context, EntrySplashActivity.class); 35 | subscribeCurrentUserChannel(); 36 | } 37 | 38 | private void subscribeCurrentUserChannel() { 39 | if (AVUser.getCurrentUser() != null) { 40 | PushService.subscribe(context, AVUser.getCurrentUser().getObjectId(), 41 | EntrySplashActivity.class); 42 | } 43 | } 44 | 45 | public void unsubscribeCurrentUserChannel() { 46 | if (AVUser.getCurrentUser() != null) { 47 | PushService.unsubscribe(context, AVUser.getCurrentUser().getObjectId()); 48 | } 49 | } 50 | 51 | public void pushMessage(String userId, String message, String action) { 52 | AVQuery query = AVInstallation.getQuery(); 53 | query.whereContains(INSTALLATION_CHANNELS, userId); 54 | AVPush push = new AVPush(); 55 | push.setQuery(query); 56 | 57 | Map dataMap = new HashMap(); 58 | dataMap.put(AVOS_ALERT, message); 59 | dataMap.put(AVOS_PUSH_ACTION, action); 60 | push.setData(dataMap); 61 | push.sendInBackground(); 62 | } 63 | } -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/event/ContactRefreshEvent.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service.event; 2 | 3 | /** 4 | * Created by lzw on 15/6/24. 5 | */ 6 | public class ContactRefreshEvent { 7 | } 8 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/event/FinishEvent.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service.event; 2 | 3 | /** 4 | * Created by lzw on 15/3/8. 5 | */ 6 | public class FinishEvent { 7 | } 8 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/event/InvitationEvent.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service.event; 2 | 3 | /** 4 | * Created by wli on 15/7/11. 5 | */ 6 | public class InvitationEvent { 7 | } 8 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/service/event/LoginFinishEvent.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.service.event; 2 | 3 | /** 4 | * Created by lzw on 15/4/1. 5 | */ 6 | public class LoginFinishEvent { 7 | } 8 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/base_activity/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.base_activity; 2 | 3 | import android.app.Fragment; 4 | import android.app.ProgressDialog; 5 | import android.content.Context; 6 | import android.os.Bundle; 7 | import android.widget.Toast; 8 | import com.avoscloud.chat.R; 9 | import com.avoscloud.chat.ui.view.HeaderLayout; 10 | 11 | public class BaseFragment extends Fragment { 12 | protected HeaderLayout headerLayout; 13 | protected Context ctx; 14 | 15 | @Override 16 | public void onActivityCreated(Bundle savedInstanceState) { 17 | super.onActivityCreated(savedInstanceState); 18 | ctx = getActivity(); 19 | headerLayout = (HeaderLayout) getView().findViewById(R.id.headerLayout); 20 | } 21 | 22 | protected void toast(String str) { 23 | Toast.makeText(this.getActivity(), str, Toast.LENGTH_SHORT).show(); 24 | } 25 | 26 | protected void toast(int id) { 27 | Toast.makeText(this.getActivity(), id, Toast.LENGTH_SHORT).show(); 28 | } 29 | 30 | protected boolean filterException(Exception e) { 31 | if (e != null) { 32 | toast(e.getMessage()); 33 | return false; 34 | } else { 35 | return true; 36 | } 37 | } 38 | 39 | protected ProgressDialog showSpinnerDialog() { 40 | //activity = modifyDialogContext(activity); 41 | ProgressDialog dialog = new ProgressDialog(getActivity()); 42 | dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 43 | dialog.setCancelable(true); 44 | dialog.setMessage(getString(R.string.chat_utils_hardLoading)); 45 | if (!getActivity().isFinishing()) { 46 | dialog.show(); 47 | } 48 | return dialog; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/chat/ImageBrowserActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.chat; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.widget.ImageView; 8 | import com.avoscloud.leanchatlib.R; 9 | import com.avoscloud.leanchatlib.utils.PhotoUtils; 10 | 11 | /** 12 | * Created by lzw on 14-9-21. 13 | */ 14 | public class ImageBrowserActivity extends Activity { 15 | private static final String PATH = "path"; 16 | private static final String URL = "url"; 17 | private ImageView imageView; 18 | 19 | public static void go(Context ctx, String path, String url) { 20 | Intent intent = new Intent(ctx, ImageBrowserActivity.class); 21 | intent.putExtra(PATH, path); 22 | intent.putExtra(URL, url); 23 | ctx.startActivity(intent); 24 | } 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.chat_image_brower_layout); 30 | imageView = (ImageView) findViewById(R.id.imageView); 31 | Intent intent = getIntent(); 32 | String path = intent.getStringExtra(PATH); 33 | String url = intent.getStringExtra(URL); 34 | PhotoUtils.displayImageCacheElseNetwork(imageView, path, url); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/contact/ContactFragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.contact; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.SectionIndexer; 10 | import android.widget.TextView; 11 | import com.avoscloud.chat.R; 12 | import com.avoscloud.chat.entity.SortUser; 13 | import com.avoscloud.chat.service.UserService; 14 | import com.avoscloud.chat.ui.view.BaseListAdapter; 15 | import com.avoscloud.leanchatlib.view.ViewHolder; 16 | 17 | @SuppressLint("DefaultLocale") 18 | public class ContactFragmentAdapter extends BaseListAdapter implements SectionIndexer { 19 | 20 | public ContactFragmentAdapter(Context ctx) { 21 | super(ctx); 22 | } 23 | 24 | @Override 25 | public View getView(int position, View convertView, ViewGroup parent) { 26 | if (convertView == null) { 27 | convertView = LayoutInflater.from(ctx).inflate( 28 | R.layout.common_user_item, null); 29 | } 30 | TextView alpha = ViewHolder.findViewById(convertView, R.id.alpha); 31 | TextView nameView = ViewHolder.findViewById(convertView, R.id.tv_friend_name); 32 | ImageView avatarView = ViewHolder.findViewById(convertView, R.id.img_friend_avatar); 33 | 34 | SortUser friend = datas.get(position); 35 | final String name = friend.getInnerUser().getUsername(); 36 | 37 | UserService.displayAvatar(friend.getInnerUser(), avatarView); 38 | nameView.setText(name); 39 | 40 | int section = getSectionForPosition(position); 41 | if (position == getPositionForSection(section)) { 42 | alpha.setVisibility(View.VISIBLE); 43 | alpha.setText(friend.getSortLetters()); 44 | } else { 45 | alpha.setVisibility(View.GONE); 46 | } 47 | 48 | return convertView; 49 | } 50 | 51 | public int getSectionForPosition(int position) { 52 | return datas.get(position).getSortLetters().charAt(0); 53 | } 54 | 55 | 56 | @SuppressLint("DefaultLocale") 57 | public int getPositionForSection(int section) { 58 | for (int i = 0; i < getCount(); i++) { 59 | String sortStr = datas.get(i).getSortLetters(); 60 | char firstChar = sortStr.toUpperCase().charAt(0); 61 | if (firstChar == section) { 62 | return i; 63 | } 64 | } 65 | return -1; 66 | } 67 | 68 | @Override 69 | public Object[] getSections() { 70 | return null; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/conversation/ConversationBaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.conversation; 2 | 3 | import com.avos.avoscloud.im.v2.AVIMConversation; 4 | import com.avoscloud.chat.service.CacheService; 5 | import com.avoscloud.chat.service.ConversationChangeEvent; 6 | 7 | /** 8 | * Created by lzw on 14/12/20. 9 | */ 10 | public abstract class ConversationBaseActivity extends ConversationEventBaseActivity { 11 | 12 | public static AVIMConversation conv() { 13 | return CacheService.getCurrentConversation(); 14 | } 15 | 16 | 17 | @Override 18 | public void onEvent(ConversationChangeEvent conversationChangeEvent) { 19 | if (conv() != null && conv().getConversationId(). 20 | equals(conversationChangeEvent.getConv().getConversationId())) { 21 | onConvChanged(conversationChangeEvent.getConv()); 22 | } 23 | } 24 | 25 | protected abstract void onConvChanged(AVIMConversation conv); 26 | } 27 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/conversation/ConversationEventBaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.conversation; 2 | 3 | import android.os.Bundle; 4 | import com.avoscloud.chat.service.ConversationChangeEvent; 5 | import com.avoscloud.chat.service.event.FinishEvent; 6 | import com.avoscloud.chat.ui.base_activity.BaseActivity; 7 | import de.greenrobot.event.EventBus; 8 | 9 | /** 10 | * Created by lzw on 15/3/5. 11 | */ 12 | public abstract class ConversationEventBaseActivity extends BaseActivity { 13 | private EventBus eventBus; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | eventBus = EventBus.getDefault(); 19 | eventBus.register(this); 20 | } 21 | 22 | @Override 23 | protected void onDestroy() { 24 | super.onDestroy(); 25 | eventBus.unregister(this); 26 | } 27 | 28 | abstract public void onEvent(ConversationChangeEvent conversationChangeEvent); 29 | 30 | public void onEvent(FinishEvent finishEvent) { 31 | this.finish(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/entry/EntryBaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.entry; 2 | 3 | import android.os.Bundle; 4 | import com.avoscloud.chat.service.event.LoginFinishEvent; 5 | import com.avoscloud.chat.ui.base_activity.BaseActivity; 6 | import de.greenrobot.event.EventBus; 7 | 8 | /** 9 | * Created by lzw on 14/11/20. 10 | */ 11 | public class EntryBaseActivity extends BaseActivity { 12 | private EventBus eventBus = EventBus.getDefault(); 13 | 14 | public void onEvent(LoginFinishEvent loginFinishEvent) { 15 | finish(); 16 | } 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | eventBus.register(this); 22 | } 23 | 24 | @Override 25 | protected void onDestroy() { 26 | super.onDestroy(); 27 | eventBus.unregister(this); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/entry/EntryLoginActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.entry; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.text.TextUtils; 7 | import android.view.View; 8 | import android.widget.EditText; 9 | import com.avos.avoscloud.AVException; 10 | import com.avos.avoscloud.AVUser; 11 | import com.avos.avoscloud.LogInCallback; 12 | import com.avoscloud.chat.R; 13 | import com.avoscloud.chat.service.UserService; 14 | import com.avoscloud.chat.ui.MainActivity; 15 | import com.avoscloud.chat.util.Utils; 16 | 17 | import butterknife.ButterKnife; 18 | import butterknife.InjectView; 19 | import butterknife.OnClick; 20 | 21 | 22 | public class EntryLoginActivity extends EntryBaseActivity { 23 | 24 | @InjectView(R.id.activity_login_et_username) 25 | public EditText userNameView; 26 | 27 | @InjectView(R.id.activity_login_et_password) 28 | public EditText passwordView; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | // TODO Auto-generated method stub 33 | super.onCreate(savedInstanceState); 34 | setContentView(R.layout.entry_login_activity); 35 | ButterKnife.inject(this); 36 | } 37 | 38 | @OnClick(R.id.activity_login_btn_login) 39 | public void onLoginClick(View v) { 40 | login(); 41 | } 42 | 43 | @OnClick(R.id.activity_login_btn_register) 44 | public void onRegisterClick(View v) { 45 | Intent intent = new Intent(ctx, EntryRegisterActivity.class); 46 | ctx.startActivity(intent); 47 | } 48 | 49 | private void login() { 50 | final String name = userNameView.getText().toString().trim(); 51 | final String password = passwordView.getText().toString().trim(); 52 | 53 | if (TextUtils.isEmpty(name)) { 54 | Utils.toast(R.string.username_cannot_null); 55 | return; 56 | } 57 | 58 | if (TextUtils.isEmpty(password)) { 59 | Utils.toast(R.string.password_can_not_null); 60 | return; 61 | } 62 | 63 | final ProgressDialog dialog = showSpinnerDialog(); 64 | AVUser.logInInBackground(name, password, new LogInCallback() { 65 | @Override 66 | public void done(AVUser avUser, AVException e) { 67 | dialog.dismiss(); 68 | if (filterException(e)) { 69 | UserService.updateUserLocation(); 70 | MainActivity.goMainActivityFromActivity(EntryLoginActivity.this); 71 | } 72 | } 73 | }); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/entry/EntrySplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.entry; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.os.Message; 7 | import com.avos.avoscloud.AVUser; 8 | import com.avoscloud.chat.R; 9 | import com.avoscloud.chat.service.UserService; 10 | import com.avoscloud.chat.ui.MainActivity; 11 | import com.avoscloud.chat.ui.base_activity.BaseActivity; 12 | 13 | public class EntrySplashActivity extends BaseActivity { 14 | public static final int SPLASH_DURATION = 2000; 15 | private static final int GO_MAIN_MSG = 1; 16 | private static final int GO_LOGIN_MSG = 2; 17 | 18 | private Handler handler = new Handler() { 19 | @Override 20 | public void handleMessage(Message msg) { 21 | switch (msg.what) { 22 | case GO_MAIN_MSG: 23 | MainActivity.goMainActivityFromActivity(EntrySplashActivity.this); 24 | finish(); 25 | break; 26 | case GO_LOGIN_MSG: 27 | Intent intent = new Intent(ctx, EntryLoginActivity.class); 28 | ctx.startActivity(intent); 29 | finish(); 30 | break; 31 | } 32 | } 33 | }; 34 | 35 | @Override 36 | protected void onCreate(Bundle savedInstanceState) { 37 | // TODO Auto-generated method stub 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.entry_splash_layout); 40 | if (AVUser.getCurrentUser() != null) { 41 | UserService.updateUserInfo(); 42 | handler.sendEmptyMessageDelayed(GO_MAIN_MSG, SPLASH_DURATION); 43 | } else { 44 | handler.sendEmptyMessageDelayed(GO_LOGIN_MSG, SPLASH_DURATION); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/profile/ProfileNotifySettingActivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.profile; 2 | 3 | import android.os.Bundle; 4 | import com.avoscloud.chat.R; 5 | import com.avoscloud.chat.ui.base_activity.BaseActivity; 6 | 7 | /** 8 | * Created by lzw on 14-9-24. 9 | */ 10 | public class ProfileNotifySettingActivity extends BaseActivity { 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.profile_setting_notify_layout); 16 | initActionBar(R.string.profile_notifySetting); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/profile/ProfileNotifySettingFragment.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.profile; 2 | 3 | import android.os.Bundle; 4 | import android.preference.CheckBoxPreference; 5 | import android.preference.Preference; 6 | import android.preference.PreferenceFragment; 7 | import com.avoscloud.chat.R; 8 | import com.avoscloud.chat.service.PreferenceMap; 9 | 10 | /** 11 | * Created by lzw on 14-9-24. 12 | */ 13 | public class ProfileNotifySettingFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener { 14 | public static final String NOTIFY_WHEN_NEWS = "notifyWhenNews"; 15 | public static final String VOICE_NOTIFY = "voiceNotify"; 16 | public static final String VIBRATE_NOTIFY = "vibrateNotify"; 17 | 18 | PreferenceMap preferenceMap; 19 | CheckBoxPreference notifyWhenNews, voiceNotify, vibrateNotify; 20 | 21 | @Override 22 | public void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | addPreferencesFromResource(R.xml.setting_preference); 25 | } 26 | 27 | @Override 28 | public void onActivityCreated(Bundle savedInstanceState) { 29 | super.onActivityCreated(savedInstanceState); 30 | preferenceMap = PreferenceMap.getCurUserPrefDao(getActivity()); 31 | notifyWhenNews = (CheckBoxPreference) findPreference(NOTIFY_WHEN_NEWS); 32 | voiceNotify = (CheckBoxPreference) findPreference(VOICE_NOTIFY); 33 | vibrateNotify = (CheckBoxPreference) findPreference(VIBRATE_NOTIFY); 34 | 35 | notifyWhenNews.setOnPreferenceChangeListener(this); 36 | voiceNotify.setOnPreferenceChangeListener(this); 37 | vibrateNotify.setOnPreferenceChangeListener(this); 38 | } 39 | 40 | @Override 41 | public boolean onPreferenceChange(Preference preference, Object newValue) { 42 | String key = preference.getKey(); 43 | boolean value = (Boolean) newValue; 44 | if (key.equals(NOTIFY_WHEN_NEWS)) { 45 | preferenceMap.setNotifyWhenNews(value); 46 | } else if (key.equals(VOICE_NOTIFY)) { 47 | preferenceMap.setVoiceNotify(value); 48 | } else if (key.equals(VIBRATE_NOTIFY)) { 49 | preferenceMap.setVibrateNotify(value); 50 | } 51 | return true; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/view/BaseListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.view; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /** 13 | * Created by lzw on 14-9-25. 14 | */ 15 | public class BaseListAdapter extends BaseAdapter { 16 | protected Context ctx; 17 | protected LayoutInflater inflater; 18 | protected List datas = new ArrayList(); 19 | 20 | public BaseListAdapter(Context ctx) { 21 | initWithContext(ctx); 22 | } 23 | 24 | public BaseListAdapter(Context ctx, List datas) { 25 | initWithContext(ctx); 26 | this.datas = datas; 27 | } 28 | 29 | public void initWithContext(Context ctx) { 30 | this.ctx = ctx; 31 | inflater = LayoutInflater.from(ctx); 32 | } 33 | 34 | public List getDatas() { 35 | return datas; 36 | } 37 | 38 | public void setDatas(List datas) { 39 | this.datas = datas; 40 | } 41 | 42 | public void addAll(List subDatas) { 43 | datas.addAll(subDatas); 44 | notifyDataSetChanged(); 45 | } 46 | 47 | public void add(T object) { 48 | datas.add(object); 49 | notifyDataSetChanged(); 50 | } 51 | 52 | public void remove(int position) { 53 | datas.remove(position); 54 | notifyDataSetChanged(); 55 | } 56 | 57 | @Override 58 | public int getCount() { 59 | return datas.size(); 60 | } 61 | 62 | @Override 63 | public Object getItem(int position) { 64 | return datas.get(position); 65 | } 66 | 67 | @Override 68 | public long getItemId(int position) { 69 | return position; 70 | } 71 | 72 | @Override 73 | public View getView(int position, View convertView, ViewGroup parent) { 74 | return null; 75 | } 76 | 77 | public void clear() { 78 | datas.clear(); 79 | notifyDataSetChanged(); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/ui/view/ExpandGridView.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.ui.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.GridView; 6 | 7 | public class ExpandGridView extends GridView { 8 | 9 | public ExpandGridView(Context context, AttributeSet attrs) { 10 | super(context, attrs); 11 | } 12 | 13 | public ExpandGridView(Context context) { 14 | super(context); 15 | } 16 | 17 | public ExpandGridView(Context context, AttributeSet attrs, int defStyle) { 18 | super(context, attrs, defStyle); 19 | } 20 | 21 | @Override 22 | public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 23 | int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, 24 | MeasureSpec.AT_MOST); 25 | super.onMeasure(widthMeasureSpec, expandSpec); 26 | } 27 | } -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/Connectivity.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | 7 | /** 8 | * Created by lzw on 14/11/20. 9 | */ 10 | public class Connectivity { 11 | public static NetworkInfo getNetworkInfo(Context context) { 12 | ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 13 | return cm.getActiveNetworkInfo(); 14 | } 15 | 16 | public static boolean isConnected(Context context) { 17 | NetworkInfo info = getNetworkInfo(context); 18 | return isConnected(info); 19 | } 20 | 21 | public static boolean isConnected(NetworkInfo info) { 22 | return info != null && info.isConnected(); 23 | } 24 | 25 | public static boolean isConnectedWifi(Context context) { 26 | NetworkInfo info = getNetworkInfo(context); 27 | return isConnected(info) && info.getType() == ConnectivityManager.TYPE_WIFI; 28 | } 29 | 30 | public static boolean isConnectedMobile(Context context) { 31 | NetworkInfo info = getNetworkInfo(context); 32 | return isConnected(info) && info.getType() == ConnectivityManager.TYPE_MOBILE; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/Logger.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.util.Log; 4 | 5 | public class Logger { 6 | public static final int VERBOSE = 0; 7 | public static int level = VERBOSE; 8 | public static final int INFO = 1; 9 | public static final int DEBUG = 2; 10 | public static final int WARN = 3; 11 | public static final int ERROR = 4; 12 | public static final int NONE = 5; 13 | public static String tag = "leanchat"; 14 | 15 | private static String getDebugInfo() { 16 | Throwable stack = new Throwable().fillInStackTrace(); 17 | StackTraceElement[] trace = stack.getStackTrace(); 18 | int n = 2; 19 | return trace[n].getClassName() + " " + trace[n].getMethodName() + "()" + ":" + trace[n].getLineNumber() + " "; 20 | } 21 | 22 | public static void v(String s) { 23 | if (VERBOSE >= level) { 24 | Log.v(tag, getDebugInfo() + s); 25 | } 26 | } 27 | 28 | public static void i(String s) { 29 | if (INFO >= level) { 30 | Log.i(tag, getDebugInfo() + s); 31 | } 32 | } 33 | 34 | public static void w(String s) { 35 | if (WARN >= level) { 36 | Log.w(tag, getDebugInfo() + s); 37 | } 38 | } 39 | 40 | public static void e(String s) { 41 | if (ERROR >= level) { 42 | Log.e(tag, getDebugInfo() + s); 43 | } 44 | } 45 | 46 | public static void d(String s) { 47 | if (DEBUG >= level) { 48 | Log.d(tag, getDebugInfo() + s); 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/NetAsyncTask.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.Context; 6 | import android.os.AsyncTask; 7 | import com.avoscloud.leanchatlib.utils.LogUtils; 8 | 9 | /** 10 | * Created by lzw on 14-6-7. 11 | */ 12 | public abstract class NetAsyncTask extends AsyncTask { 13 | protected Context ctx; 14 | ProgressDialog dialog; 15 | boolean openDialog = true; 16 | Exception exception; 17 | 18 | protected NetAsyncTask(Context ctx) { 19 | this.ctx = ctx; 20 | } 21 | 22 | protected NetAsyncTask(Context ctx, boolean openDialog) { 23 | this.ctx = ctx; 24 | this.openDialog = openDialog; 25 | } 26 | 27 | public NetAsyncTask setOpenDialog(boolean openDialog) { 28 | this.openDialog = openDialog; 29 | return this; 30 | } 31 | 32 | public ProgressDialog getDialog() { 33 | return dialog; 34 | } 35 | 36 | @Override 37 | protected void onPreExecute() { 38 | super.onPreExecute(); 39 | if (openDialog) { 40 | dialog = Utils.showSpinnerDialog((Activity) ctx); 41 | } 42 | } 43 | 44 | @Override 45 | protected Void doInBackground(Void... params) { 46 | try { 47 | doInBack(); 48 | } catch (Exception e) { 49 | LogUtils.logException(e); 50 | exception = e; 51 | } 52 | return null; 53 | } 54 | 55 | @Override 56 | protected void onPostExecute(Void aVoid) { 57 | super.onPostExecute(aVoid); 58 | if (openDialog) { 59 | if (dialog.isShowing()) { 60 | dialog.dismiss(); 61 | } 62 | } 63 | onPost(exception); 64 | } 65 | 66 | protected abstract void doInBack() throws Exception; 67 | 68 | protected abstract void onPost(Exception e); 69 | } 70 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/NotificationUtil.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.app.Notification; 4 | import android.app.NotificationManager; 5 | import android.app.PendingIntent; 6 | import android.content.ComponentName; 7 | import android.content.ContentResolver; 8 | import android.content.Context; 9 | import android.content.Intent; 10 | import android.net.Uri; 11 | 12 | import com.avos.avospush.notification.NotificationCompat; 13 | 14 | import java.util.Random; 15 | 16 | /** 17 | * Created by wli on 15/7/15. 18 | */ 19 | public class NotificationUtil { 20 | 21 | public static void showNotification(Context context, String title, String content, Class className) { 22 | showNotification(context, title, content, null, className); 23 | } 24 | 25 | public static void showNotification(Context context, String title, String content, String sound, Class className) { 26 | 27 | int notificationId = (new Random()).nextInt(); 28 | Intent intent = new Intent(); 29 | ComponentName cn = new ComponentName(context, className); 30 | intent.setComponent(cn); 31 | PendingIntent contentIntent = PendingIntent.getActivity(context, notificationId, intent, 0); 32 | NotificationCompat.Builder mBuilder = 33 | new NotificationCompat.Builder(context) 34 | .setSmallIcon(context.getApplicationInfo().icon) 35 | .setContentTitle(title).setAutoCancel(true).setContentIntent(contentIntent) 36 | .setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND) 37 | .setContentText(content); 38 | NotificationManager manager = 39 | (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 40 | Notification notification = mBuilder.build(); 41 | if (sound != null && sound.trim().length() > 0) { 42 | notification.sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + sound); 43 | } 44 | manager.notify(notificationId, notification); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/PathUtils.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.os.Environment; 4 | import com.avoscloud.chat.base.App; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * Created by lzw on 14-9-19. 10 | */ 11 | public class PathUtils { 12 | 13 | private static boolean isExternalStorageWritable() { 14 | String state = Environment.getExternalStorageState(); 15 | return Environment.MEDIA_MOUNTED.equals(state); 16 | } 17 | 18 | private static File getAvailableCacheDir() { 19 | if (isExternalStorageWritable()) { 20 | return App.ctx.getExternalCacheDir(); 21 | } else { 22 | return App.ctx.getCacheDir(); 23 | } 24 | } 25 | 26 | public static String checkAndMkdirs(String dir) { 27 | File file = new File(dir); 28 | if (file.exists() == false) { 29 | file.mkdirs(); 30 | } 31 | return dir; 32 | } 33 | 34 | public static String getAvatarCropPath() { 35 | return new File(getAvailableCacheDir(), "avatar_crop").getAbsolutePath(); 36 | } 37 | 38 | public static String getAvatarTmpPath() { 39 | return new File(getAvailableCacheDir(), "avatar_tmp").getAbsolutePath(); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/PixelUtils.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.content.res.Resources; 4 | 5 | /** 6 | * 像素转换工具 7 | * 8 | * @author MarkMjw 9 | */ 10 | public class PixelUtils { 11 | private static Resources resources = Resources.getSystem(); 12 | private static int desityDpi = resources.getDisplayMetrics().densityDpi; 13 | private static float scaledDensity = resources.getDisplayMetrics().scaledDensity; 14 | 15 | public static int dp2px(float value) { 16 | final float scale = desityDpi; 17 | return (int) (value * (scale / 160) + 0.5f); 18 | } 19 | 20 | public static int px2dp(float value) { 21 | final float scale = desityDpi; 22 | return (int) ((value * 160) / scale + 0.5f); 23 | } 24 | 25 | public static int sp2px(float value) { 26 | float spvalue = value * scaledDensity; 27 | return (int) (spvalue + 0.5f); 28 | } 29 | 30 | public static int px2sp(float value) { 31 | final float scale = scaledDensity; 32 | return (int) (value / scale + 0.5f); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/RefreshTask.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by lzw on 15/2/27. 7 | */ 8 | public abstract class RefreshTask extends SimpleNetTask { 9 | private Refreshable refreshable; 10 | 11 | public RefreshTask(Context cxt, Refreshable refreshable) { 12 | super(cxt); 13 | this.refreshable = refreshable; 14 | } 15 | 16 | @Override 17 | protected void onSucceed() { 18 | this.refreshable.refresh(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/Refreshable.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | /** 4 | * Created by lzw on 15/2/27. 5 | */ 6 | public interface Refreshable { 7 | void refresh(); 8 | } 9 | -------------------------------------------------------------------------------- /leanchat/src/main/java/com/avoscloud/chat/util/SimpleNetTask.java: -------------------------------------------------------------------------------- 1 | package com.avoscloud.chat.util; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by lzw on 14-9-27. 7 | */ 8 | public abstract class SimpleNetTask extends NetAsyncTask { 9 | protected SimpleNetTask(Context cxt) { 10 | super(cxt); 11 | } 12 | 13 | protected SimpleNetTask(Context cxt, boolean openDialog) { 14 | super(cxt, openDialog); 15 | } 16 | 17 | 18 | @Override 19 | protected void onPost(Exception e) { 20 | if (e != null) { 21 | e.printStackTrace(); 22 | Utils.toast(e.getMessage()); 23 | //Utils.toast(ctx, R.string.pleaseCheckNetwork); 24 | } else { 25 | onSucceed(); 26 | } 27 | } 28 | 29 | protected abstract void doInBack() throws Exception; 30 | 31 | protected abstract void onSucceed(); 32 | } 33 | -------------------------------------------------------------------------------- /leanchat/src/main/jniLibs/armeabi/libBaiduMapSDK_v3_0_0.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/jniLibs/armeabi/libBaiduMapSDK_v3_0_0.so -------------------------------------------------------------------------------- /leanchat/src/main/jniLibs/armeabi/liblocSDK4d.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/jniLibs/armeabi/liblocSDK4d.so -------------------------------------------------------------------------------- /leanchat/src/main/res/anim/grow_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /leanchat/src/main/res/anim/push_top_in2.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /leanchat/src/main/res/anim/push_top_out2.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /leanchat/src/main/res/anim/shrink_from_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-hdpi/base_horizontal_line.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-hdpi/base_horizontal_line.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-hdpi/chat_btn_voice_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-hdpi/chat_btn_voice_normal.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-hdpi/chat_item_location_default.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-hdpi/chat_item_location_default.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-hdpi/common_view_right_arrow_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-hdpi/common_view_right_arrow_pic.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_dev_reply_background.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_dev_reply_background.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_notification.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_notification.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_thread_actionbar_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_thread_actionbar_back.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_user_reply_background.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/avoscloud_feedback_user_reply_background.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/base_action_bar_add_bg_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/base_action_bar_add_bg_normal.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/base_action_bar_add_bg_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/base_action_bar_add_bg_pressed.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/base_edit_input.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/base_edit_input.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/base_horizontal_line.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/base_horizontal_line.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/btn_logout_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/btn_logout_pressed.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/chat_location_activity_icon_geo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/chat_location_activity_icon_geo.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/clear_edit_search_clear_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/clear_edit_search_clear_normal.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/clear_edit_search_clear_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/clear_edit_search_clear_pressed.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/common_input_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/common_input_bg.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/common_msg_tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/common_msg_tips.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/common_view_right_arrow_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/common_view_right_arrow_pic.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/contact_fragment_icon_msg_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/contact_fragment_icon_msg_search.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/contact_group_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/contact_group_icon.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/contact_new_friends_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/contact_new_friends_icon.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/contact_person_info_about_top_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/contact_person_info_about_top_bg.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/contact_person_info_mid_bg.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/contact_person_info_mid_bg.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/discover_lay_icn_order_artist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/discover_lay_icn_order_artist.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/discover_lay_icn_order_artist_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/discover_lay_icn_order_artist_p.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/head.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/login_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/login_bg.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/login_icon_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/login_icon_account.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/login_icon_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/login_icon_password.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/main_acvitivy_top_bar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/main_acvitivy_top_bar.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/profile_btn_logout_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/profile_btn_logout_normal.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/splash_back.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/splash_back.9.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_chat.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_chat_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_chat_active.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_contacts.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_contacts_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_contacts_active.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_discover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_discover.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_discover_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_discover_active.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_me.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/tabbar_me_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/tabbar_me_active.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable-xhdpi/utils_icon_info_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lzwjava/leanchat-android/2929877f6c688edcf4cc706d504953a89f0883ff/leanchat/src/main/res/drawable-xhdpi/utils_icon_info_2.png -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/base_action_bar_add_bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/btn_logout_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/btn_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/button_normal_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/clear_edittext_search_clear.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/common_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/common_btn_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/common_btn_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/contact_fragment_gallery_contacts_dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/contact_fragment_sortlistview_sidebar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/group_detail_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/nearby_order.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/recent_message_text_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/recent_name_text_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /leanchat/src/main/res/drawable/tab_textcolor.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/chat_xlistview_footer.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 18 | 19 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/chat_xlistview_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 18 | 19 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/common_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/common_header_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/common_user_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 21 | 22 | 28 | 29 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/common_view_right_arrow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /leanchat/src/main/res/layout/contact_add_friend_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 25 | 26 |