├── .gitignore ├── CHANGELOG.md ├── README.md ├── V4_SUPPORT.md ├── build.gradle ├── demo ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── meiqia │ │ └── meiqiasdk │ │ └── demo │ │ ├── ActivityWebView.java │ │ ├── ApiSampleActivity.java │ │ ├── App.java │ │ ├── CustomizedMQConversationActivity.java │ │ └── MainActivity.java │ └── res │ ├── drawable-xhdpi │ └── ic_arrow_back_white_24dp.png │ ├── drawable-xxhdpi │ ├── ic_arrow_back_white_24dp.png │ ├── ic_launcher.png │ └── ic_logo.png │ ├── drawable-xxxhdpi │ └── ic_arrow_back_white_24dp.png │ ├── layout │ ├── activity_developer.xml │ ├── activity_main.xml │ ├── activity_webview.xml │ └── dialog_input.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── imageloader ├── MQGlideImageLoader.java └── MQGlideImageLoader4.java ├── meiqiasdk ├── build.gradle ├── gradle.properties ├── libs │ ├── meiqia-4.1.2.jar │ └── mq_glide_image_loader3.jar ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── meiqia │ │ └── meiqiasdk │ │ ├── activity │ │ ├── MQBaseActivity.java │ │ ├── MQCollectInfoActivity.java │ │ ├── MQConversationActivity.java │ │ ├── MQInquiryFormActivity.java │ │ ├── MQMessageFormActivity.java │ │ ├── MQPhotoPickerActivity.java │ │ ├── MQPhotoPickerPreviewActivity.java │ │ ├── MQPhotoPreviewActivity.java │ │ └── MQWebViewActivity.java │ │ ├── callback │ │ ├── LeaveMessageCallback.java │ │ ├── MQActivityLifecycleCallback.java │ │ ├── MQSimpleActivityLifecyleCallback.java │ │ ├── OnClientOnlineCallback.java │ │ ├── OnDownloadFileCallback.java │ │ ├── OnEvaluateRobotAnswerCallback.java │ │ ├── OnFailureCallBack.java │ │ ├── OnFinishCallback.java │ │ ├── OnGetMessageListCallBack.java │ │ ├── OnLinkClickCallback.java │ │ ├── OnMessageSendCallback.java │ │ └── SimpleCallback.java │ │ ├── chatitem │ │ ├── MQAgentItem.java │ │ ├── MQBaseBubbleItem.java │ │ ├── MQChatFileItem.java │ │ ├── MQChatVideoItem.java │ │ ├── MQClientItem.java │ │ ├── MQClueCardItem.java │ │ ├── MQConvDividerItem.java │ │ ├── MQEvaluateItem.java │ │ ├── MQHybridItem.java │ │ ├── MQInitiativeRedirectItem.java │ │ ├── MQNoAgentItem.java │ │ ├── MQRobotItem.java │ │ ├── MQTimeItem.java │ │ └── MQTipItem.java │ │ ├── controller │ │ ├── ControllerImpl.java │ │ ├── MQController.java │ │ └── MessageReceiver.java │ │ ├── dialog │ │ ├── MQConfirmDialog.java │ │ ├── MQEvaluateDialog.java │ │ ├── MQInputDialog.java │ │ ├── MQListDialog.java │ │ └── MQLoadingDialog.java │ │ ├── imageloader │ │ ├── MQGlideImageLoader4.java │ │ ├── MQImage.java │ │ ├── MQImageLoader.java │ │ └── MQPicassoImageLoader.java │ │ ├── model │ │ ├── Agent.java │ │ ├── AgentChangeMessage.java │ │ ├── BaseMessage.java │ │ ├── ClueCardMessage.java │ │ ├── EvaluateMessage.java │ │ ├── FileMessage.java │ │ ├── HybridMessage.java │ │ ├── ImageFolderModel.java │ │ ├── InitiativeRedirectMessage.java │ │ ├── LeaveTipMessage.java │ │ ├── MessageFormInputModel.java │ │ ├── NoAgentLeaveMessage.java │ │ ├── PhotoMessage.java │ │ ├── RedirectQueueMessage.java │ │ ├── RobotMessage.java │ │ ├── TextMessage.java │ │ ├── TipMessage.java │ │ ├── VideoMessage.java │ │ └── VoiceMessage.java │ │ ├── pw │ │ ├── MQBasePopupWindow.java │ │ └── MQPhotoFolderPw.java │ │ ├── third │ │ ├── photoview │ │ │ ├── Compat.java │ │ │ ├── DefaultOnDoubleTapListener.java │ │ │ ├── IPhotoView.java │ │ │ ├── PhotoView.java │ │ │ ├── PhotoViewAttacher.java │ │ │ ├── gestures │ │ │ │ ├── CupcakeGestureDetector.java │ │ │ │ ├── EclairGestureDetector.java │ │ │ │ ├── FroyoGestureDetector.java │ │ │ │ ├── GestureDetector.java │ │ │ │ ├── OnGestureListener.java │ │ │ │ └── VersionedGestureDetector.java │ │ │ ├── log │ │ │ │ ├── LogManager.java │ │ │ │ ├── Logger.java │ │ │ │ └── LoggerDefault.java │ │ │ └── scrollerproxy │ │ │ │ ├── GingerScroller.java │ │ │ │ ├── IcsScroller.java │ │ │ │ ├── PreGingerScroller.java │ │ │ │ └── ScrollerProxy.java │ │ └── swiperefresh │ │ │ ├── CircleImageView.java │ │ │ ├── CircularProgressDrawable.java │ │ │ └── SwipeRefreshLayout.java │ │ ├── util │ │ ├── ErrorCode.java │ │ ├── HttpUtils.java │ │ ├── MQAsyncTask.java │ │ ├── MQAudioPlayerManager.java │ │ ├── MQAudioRecorderManager.java │ │ ├── MQBrowserPhotoViewAttacher.java │ │ ├── MQChatAdapter.java │ │ ├── MQConfig.java │ │ ├── MQDownloadManager.java │ │ ├── MQEmotionUtil.java │ │ ├── MQFileProvider.java │ │ ├── MQImageCaptureManager.java │ │ ├── MQIntentBuilder.java │ │ ├── MQLoadPhotoTask.java │ │ ├── MQSavePhotoTask.java │ │ ├── MQSimpleTextWatcher.java │ │ ├── MQSoundPoolManager.java │ │ ├── MQTimeUtils.java │ │ ├── MQUtils.java │ │ └── RichText.java │ │ └── widget │ │ ├── CircularProgressBar.java │ │ ├── MQBaseCustomCompositeView.java │ │ ├── MQCustomKeyboardLayout.java │ │ ├── MQEmotionKeyboardLayout.java │ │ ├── MQFAQContainer.java │ │ ├── MQHackyViewPager.java │ │ ├── MQImageView.java │ │ ├── MQMessageFormInputLayout.java │ │ ├── MQRecorderKeyboardLayout.java │ │ ├── MQRedirectQueueItem.java │ │ └── MQWarpLinearLayout.java │ └── res │ ├── anim │ ├── mq_message_form_enter.xml │ └── mq_message_form_exit.xml │ ├── color │ └── mq_selector_evaluate_button.xml │ ├── drawable-xhdpi │ ├── mq_arrow_right.png │ ├── mq_bg_edit_view.9.png │ ├── mq_bg_msg_left.9.png │ ├── mq_bg_msg_right.9.png │ ├── mq_bg_title.9.png │ ├── mq_emoji_1.png │ ├── mq_emoji_10.png │ ├── mq_emoji_11.png │ ├── mq_emoji_12.png │ ├── mq_emoji_13.png │ ├── mq_emoji_14.png │ ├── mq_emoji_15.png │ ├── mq_emoji_16.png │ ├── mq_emoji_17.png │ ├── mq_emoji_18.png │ ├── mq_emoji_19.png │ ├── mq_emoji_2.png │ ├── mq_emoji_20.png │ ├── mq_emoji_21.png │ ├── mq_emoji_22.png │ ├── mq_emoji_23.png │ ├── mq_emoji_24.png │ ├── mq_emoji_25.png │ ├── mq_emoji_26.png │ ├── mq_emoji_27.png │ ├── mq_emoji_28.png │ ├── mq_emoji_29.png │ ├── mq_emoji_3.png │ ├── mq_emoji_30.png │ ├── mq_emoji_31.png │ ├── mq_emoji_32.png │ ├── mq_emoji_33.png │ ├── mq_emoji_34.png │ ├── mq_emoji_35.png │ ├── mq_emoji_36.png │ ├── mq_emoji_4.png │ ├── mq_emoji_5.png │ ├── mq_emoji_6.png │ ├── mq_emoji_7.png │ ├── mq_emoji_8.png │ ├── mq_emoji_9.png │ ├── mq_emoji_delete.png │ ├── mq_ic_back.png │ ├── mq_ic_msg_failed.png │ ├── mq_ic_video_active.png │ ├── mq_ic_video_normal.png │ ├── mq_ic_video_play.png │ ├── mq_info_icon.png │ ├── mq_loading_1.png │ ├── mq_loading_2.png │ └── mq_loading_3.png │ ├── drawable-xxhdpi │ ├── mq_arrow_right.png │ ├── mq_checkbox_uncheck.png │ ├── mq_checkbox_unchecked.png │ ├── mq_conversation_edit_bg.9.png │ ├── mq_evaluate_bad.png │ ├── mq_evaluate_good.png │ ├── mq_evaluate_medium.png │ ├── mq_ic_add_img.png │ ├── mq_ic_angry_face.png │ ├── mq_ic_back_white.png │ ├── mq_ic_camera_active.png │ ├── mq_ic_camera_normal.png │ ├── mq_ic_cb_checked.png │ ├── mq_ic_cb_normal.png │ ├── mq_ic_delete_icon.png │ ├── mq_ic_download.png │ ├── mq_ic_download_gray.png │ ├── mq_ic_emoji_active.png │ ├── mq_ic_emoji_normal.png │ ├── mq_ic_evaluate_active.png │ ├── mq_ic_evaluate_normal.png │ ├── mq_ic_evaluate_outline.png │ ├── mq_ic_file.png │ ├── mq_ic_gallery_arrow_down.png │ ├── mq_ic_gallery_arrow_up.png │ ├── mq_ic_gallery_camera.png │ ├── mq_ic_holder_avatar.png │ ├── mq_ic_holder_dark.png │ ├── mq_ic_holder_light.png │ ├── mq_ic_holder_white.png │ ├── mq_ic_image_active.png │ ├── mq_ic_image_normal.png │ ├── mq_ic_mic_active.png │ ├── mq_ic_mic_normal.png │ ├── mq_ic_neutral_face.png │ ├── mq_ic_send_icon_grey.png │ ├── mq_ic_send_icon_white.png │ ├── mq_ic_smiling_face.png │ ├── mq_ic_video_active.png │ ├── mq_ic_video_normal.png │ ├── mq_ic_video_play.png │ ├── mq_info_icon.png │ ├── mq_radio_btn_checked.png │ ├── mq_radio_btn_uncheck.png │ ├── mq_redirect_queue_00.png │ ├── mq_redirect_queue_01.png │ ├── mq_redirect_queue_02.png │ ├── mq_redirect_queue_03.png │ ├── mq_redirect_queue_04.png │ ├── mq_redirect_queue_05.png │ ├── mq_redirect_queue_06.png │ ├── mq_redirect_queue_07.png │ ├── mq_redirect_queue_08.png │ ├── mq_redirect_queue_09.png │ ├── mq_redirect_queue_10.png │ ├── mq_redirect_queue_11.png │ ├── mq_redirect_queue_12.png │ ├── mq_redirect_queue_13.png │ ├── mq_redirect_queue_14.png │ ├── mq_redirect_queue_15.png │ ├── mq_redirect_queue_16.png │ ├── mq_redirect_queue_17.png │ ├── mq_redirect_queue_18.png │ ├── mq_redirect_queue_19.png │ ├── mq_redirect_queue_20.png │ ├── mq_redirect_queue_21.png │ ├── mq_redirect_queue_22.png │ ├── mq_redirect_queue_23.png │ ├── mq_redirect_queue_24.png │ ├── mq_redirect_queue_25.png │ ├── mq_redirect_queue_26.png │ ├── mq_redirect_queue_27.png │ ├── mq_redirect_queue_28.png │ ├── mq_redirect_queue_29.png │ ├── mq_redirect_queue_30.png │ ├── mq_redirect_queue_31.png │ ├── mq_voice_left_normal.png │ ├── mq_voice_left_playing_level1.png │ ├── mq_voice_left_playing_level2.png │ ├── mq_voice_left_playing_level3.png │ ├── mq_voice_level1.png │ ├── mq_voice_level2.png │ ├── mq_voice_level3.png │ ├── mq_voice_level4.png │ ├── mq_voice_level5.png │ ├── mq_voice_level6.png │ ├── mq_voice_level7.png │ ├── mq_voice_level8.png │ ├── mq_voice_level9.png │ ├── mq_voice_right_normal.png │ ├── mq_voice_right_playing_level1.png │ ├── mq_voice_right_playing_level2.png │ ├── mq_voice_right_playing_level3.png │ └── mq_voice_want_cancel.png │ ├── drawable │ ├── mq_anim_voice_left_playing.xml │ ├── mq_anim_voice_right_playing.xml │ ├── mq_bg_card.xml │ ├── mq_bg_card_black_outline.xml │ ├── mq_bg_card_primary.xml │ ├── mq_loading.xml │ ├── mq_rectangle_primary_16dp.xml │ ├── mq_rotate_progress_bar.xml │ ├── mq_rotate_progress_bar_photopicker.xml │ ├── mq_selector_btn_photo_send.xml │ ├── mq_selector_checkbox.xml │ ├── mq_selector_emotion_indicator.xml │ ├── mq_selector_evaluate_et.xml │ ├── mq_selector_evaluate_rb.xml │ ├── mq_selector_ic_camera.xml │ ├── mq_selector_ic_evaluate.xml │ ├── mq_selector_ic_image.xml │ ├── mq_selector_ic_video.xml │ ├── mq_selector_input_bg.xml │ ├── mq_selector_item_bottom.xml │ ├── mq_selector_item_bottom_left.xml │ ├── mq_selector_item_bottom_right.xml │ ├── mq_selector_item_center.xml │ ├── mq_selector_item_folder.xml │ ├── mq_selector_item_top.xml │ ├── mq_selector_radio_btn.xml │ ├── mq_shape_agent_status_off_duty.xml │ ├── mq_shape_agent_status_offline.xml │ ├── mq_shape_agent_status_online.xml │ ├── mq_shape_bg_rich_text.xml │ ├── mq_shape_chat_unread_circle_bg.xml │ ├── mq_shape_circle_gray_outline.xml │ ├── mq_shape_cursor.xml │ ├── mq_shape_dialog_bg.xml │ ├── mq_shape_evaluate_angry.xml │ ├── mq_shape_evaluate_neutral.xml │ ├── mq_shape_evaluate_smiling.xml │ ├── mq_shape_gray_dot.xml │ ├── mq_shape_leave_tip_gradient_line.xml │ ├── mq_shape_photo_folder_pw_bg.xml │ ├── mq_shape_send_back_normal.xml │ ├── mq_shape_send_back_pressed.xml │ └── mq_shape_send_button.xml │ ├── layout │ ├── mq_activity_collect_info.xml │ ├── mq_activity_conversation.xml │ ├── mq_activity_inquiry_form.xml │ ├── mq_activity_message_form.xml │ ├── mq_activity_photo_picker.xml │ ├── mq_activity_photo_picker_preview.xml │ ├── mq_activity_photo_preview.xml │ ├── mq_activity_webview.xml │ ├── mq_dialog_confirm.xml │ ├── mq_dialog_evaluate.xml │ ├── mq_dialog_input.xml │ ├── mq_dialog_loading.xml │ ├── mq_dialog_loading_photopicker.xml │ ├── mq_dialog_ticket_categry.xml │ ├── mq_item_action.xml │ ├── mq_item_chat_left.xml │ ├── mq_item_chat_right.xml │ ├── mq_item_chat_time.xml │ ├── mq_item_clue_card.xml │ ├── mq_item_clue_card_checkbox.xml │ ├── mq_item_clue_card_input_edit.xml │ ├── mq_item_clue_card_radio.xml │ ├── mq_item_clue_card_send.xml │ ├── mq_item_clue_card_time_picker.xml │ ├── mq_item_conv_divider.xml │ ├── mq_item_emotion_keyboard.xml │ ├── mq_item_file_layout.xml │ ├── mq_item_fill_color_action.xml │ ├── mq_item_form_checkbox.xml │ ├── mq_item_form_inquiry.xml │ ├── mq_item_form_radio_btn.xml │ ├── mq_item_form_radio_btn_left.xml │ ├── mq_item_form_type_auth_code.xml │ ├── mq_item_form_type_date.xml │ ├── mq_item_form_type_multiple_choice.xml │ ├── mq_item_form_type_single_choice.xml │ ├── mq_item_form_type_text.xml │ ├── mq_item_hybrid.xml │ ├── mq_item_msg_evaluate.xml │ ├── mq_item_msg_tip.xml │ ├── mq_item_no_agent.xml │ ├── mq_item_photo_folder.xml │ ├── mq_item_product_card.xml │ ├── mq_item_redirect_queue.xml │ ├── mq_item_rich_text.xml │ ├── mq_item_robot.xml │ ├── mq_item_robot_faq_tab.xml │ ├── mq_item_robot_menu.xml │ ├── mq_item_robot_menu_faq.xml │ ├── mq_item_square_image.xml │ ├── mq_item_text_list.xml │ ├── mq_item_useless_redirect.xml │ ├── mq_item_video_layout.xml │ ├── mq_layout_custom_keyboard.xml │ ├── mq_layout_emotion_keyboard.xml │ ├── mq_layout_form_check.xml │ ├── mq_layout_form_date.xml │ ├── mq_layout_form_input.xml │ ├── mq_layout_form_radio.xml │ ├── mq_layout_recorder_keyboard.xml │ ├── mq_net_status_top_pop_tip.xml │ ├── mq_notification_card.xml │ ├── mq_pw_photo_folder.xml │ ├── mq_request_storage_top_pop_tip.xml │ ├── mq_robot_faq_container.xml │ └── mq_top_pop_tip.xml │ ├── raw │ ├── mq_new_message.ogg │ └── mq_send_message.ogg │ ├── values-en │ └── mq_strings.xml │ ├── values-es │ └── mq_strings.xml │ ├── values-hi │ └── mq_strings.xml │ ├── values-id │ └── mq_strings.xml │ ├── values-in │ └── mq_strings.xml │ ├── values-ja │ └── mq_strings.xml │ ├── values-ko │ └── mq_strings.xml │ ├── values-ms │ └── mq_strings.xml │ ├── values-pt │ └── mq_strings.xml │ ├── values-ru │ └── mq_strings.xml │ ├── values-th │ └── mq_strings.xml │ ├── values-vi │ └── mq_strings.xml │ ├── values-zh-rTw │ └── mq_strings.xml │ ├── values │ ├── mq_attrs.xml │ ├── mq_colors.xml │ ├── mq_dimens.xml │ ├── mq_strings.xml │ ├── mq_styles.xml │ └── public.xml │ └── xml │ └── mq_file_paths.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | /*/*/bin/ 16 | /*/*/gen/ 17 | 18 | 19 | # Gradle files 20 | .gradle/ 21 | build/ 22 | /*/build/ 23 | 24 | # Local configuration file (sdk path, etc) 25 | local.properties 26 | 27 | # Proguard folder generated by Eclipse 28 | proguard/ 29 | 30 | # Log Files 31 | *.log 32 | 33 | # Eclipse project files 34 | .classpath 35 | .project 36 | .settings/ 37 | 38 | # Intellij project files 39 | *.iml 40 | *.ipr 41 | *.iws 42 | .idea/ 43 | 44 | # Mac system files 45 | .DS_Store 46 | 47 | *.keystore -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | id 'com.android.application' version '8.1.0' apply false 4 | id 'com.android.library' version '8.1.0' apply false 5 | } 6 | 7 | task clean(type: Delete) { 8 | delete rootProject.buildDir 9 | } -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdk 34 5 | 6 | defaultConfig { 7 | applicationId "com.meiqia.meiqiasdk.demo" 8 | minSdkVersion 23 9 | targetSdkVersion 34 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled true 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | debug { 19 | minifyEnabled true 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | lintOptions { 24 | checkReleaseBuilds false 25 | // Or, if you prefer, you can continue to check for errors in release builds, 26 | // but continue the build even when errors are found: 27 | abortOnError false 28 | } 29 | 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_11 32 | targetCompatibility JavaVersion.VERSION_11 33 | } 34 | namespace 'com.meiqia.meiqiasdk.demo' 35 | } 36 | 37 | dependencies { 38 | implementation 'com.github.delight-im:Android-AdvancedWebView:v3.2.1' 39 | implementation 'com.google.android.material:material:1.9.0' 40 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 41 | // implementation project(path: ':meiqiasdk') 42 | 43 | implementation 'com.meiqia:androidx:4.1.2' 44 | implementation 'com.github.bumptech.glide:glide:4.9.0' 45 | annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' 46 | } -------------------------------------------------------------------------------- /demo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -optimizationpasses 5 # 指定代码的压缩级别 2 | -dontusemixedcaseclassnames # 是否使用大小写混合 3 | -dontpreverify # 混淆时是否做预校验 4 | -verbose # 混淆时是否记录日志 5 | 6 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法 7 | 8 | -keep public class * extends android.app.Activity # 保持哪些类不被混淆 9 | -keep public class * extends android.app.Application # 保持哪些类不被混淆 10 | -keep public class * extends android.app.Service # 保持哪些类不被混淆 11 | -keep public class * extends android.content.BroadcastReceiver # 保持哪些类不被混淆 12 | -keep public class * extends android.content.ContentProvider # 保持哪些类不被混淆 13 | -keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆 14 | -keep public class * extends android.preference.Preference # 保持哪些类不被混淆 15 | -keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆 16 | 17 | -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 18 | native ; 19 | } 20 | -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 21 | public (android.content.Context, android.util.AttributeSet); 22 | } 23 | -keepclasseswithmembers class * {# 保持自定义控件类不被混淆 24 | public (android.content.Context, android.util.AttributeSet, int); 25 | } 26 | -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆 27 | public void *(android.view.View); 28 | } 29 | -keepclassmembers enum * { # 保持枚举 enum 类不被混淆 30 | public static **[] values(); 31 | public static ** valueOf(java.lang.String); 32 | } 33 | -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 34 | public static final android.os.Parcelable$Creator *; 35 | } 36 | 37 | -keepattributes Signature 38 | 39 | -dontwarn org.bouncycastle.jsse.BCSSLParameters 40 | -dontwarn org.bouncycastle.jsse.BCSSLSocket 41 | -dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider 42 | -dontwarn org.conscrypt.Conscrypt$Version 43 | -dontwarn org.conscrypt.Conscrypt 44 | -dontwarn org.conscrypt.ConscryptHostnameVerifier 45 | -dontwarn org.openjsse.javax.net.ssl.SSLParameters 46 | -dontwarn org.openjsse.javax.net.ssl.SSLSocket 47 | -dontwarn org.openjsse.net.ssl.OpenJSSE -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 31 | 32 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /demo/src/main/java/com/meiqia/meiqiasdk/demo/App.java: -------------------------------------------------------------------------------- 1 | package com.meiqia.meiqiasdk.demo; 2 | 3 | import android.app.Application; 4 | import android.widget.Toast; 5 | 6 | import com.meiqia.core.MQManager; 7 | import com.meiqia.core.callback.OnInitCallback; 8 | import com.meiqia.meiqiasdk.util.MQConfig; 9 | 10 | /** 11 | * 作者:王浩 邮件:bingoogolapple@gmail.com 12 | * 创建时间:16/5/25 下午4:28 13 | * 描述: 14 | */ 15 | public class App extends Application { 16 | 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | 21 | initMeiqiaSDK(); 22 | 23 | MQManager.setDebugMode(true); 24 | } 25 | 26 | private void initMeiqiaSDK() { 27 | MQManager.setDebugMode(true); 28 | 29 | // 替换成自己的key 30 | String meiqiaKey = "替换成自己的key"; 31 | MQConfig.init(this, meiqiaKey, new OnInitCallback() { 32 | @Override 33 | public void onSuccess(String clientId) { 34 | Toast.makeText(App.this, "init success", Toast.LENGTH_SHORT).show(); 35 | } 36 | 37 | @Override 38 | public void onFailure(int code, String message) { 39 | Toast.makeText(App.this, "int failure message = " + message, Toast.LENGTH_SHORT).show(); 40 | } 41 | }); 42 | 43 | // 可选 44 | customMeiqiaSDK(); 45 | } 46 | 47 | private void customMeiqiaSDK() { 48 | // 配置自定义信息 49 | MQConfig.ui.titleGravity = MQConfig.ui.MQTitleGravity.LEFT; 50 | MQConfig.ui.backArrowIconResId = R.drawable.ic_arrow_back_white_24dp; 51 | // MQConfig.ui.titleBackgroundResId = R.color.test_red; 52 | // MQConfig.ui.titleTextColorResId = R.color.test_blue; 53 | // MQConfig.ui.leftChatBubbleColorResId = R.color.test_green; 54 | // MQConfig.ui.leftChatTextColorResId = R.color.test_red; 55 | // MQConfig.ui.rightChatBubbleColorResId = R.color.test_red; 56 | // MQConfig.ui.rightChatTextColorResId = R.color.test_green; 57 | // MQConfig.ui.robotEvaluateTextColorResId = R.color.test_red; 58 | // MQConfig.ui.robotMenuItemTextColorResId = R.color.test_blue; 59 | // MQConfig.ui.robotMenuTipTextColorResId = R.color.test_blue; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /demo/src/main/java/com/meiqia/meiqiasdk/demo/CustomizedMQConversationActivity.java: -------------------------------------------------------------------------------- 1 | package com.meiqia.meiqiasdk.demo; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.Button; 7 | import android.widget.RelativeLayout; 8 | import android.widget.Toast; 9 | 10 | import com.meiqia.meiqiasdk.activity.MQConversationActivity; 11 | 12 | /** 13 | * 集成自 MQConversationActivity,可以动态改变其中的一些方法实现 14 | */ 15 | public class CustomizedMQConversationActivity extends MQConversationActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | // 这里可以动态添加一些 View 到布局中 21 | // eg: 右边添加一个按钮 22 | RelativeLayout titleRL = (RelativeLayout) findViewById(R.id.title_rl); 23 | Button rightBtn = new Button(this); 24 | rightBtn.setText("RightBtn"); 25 | RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 26 | params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 27 | titleRL.addView(rightBtn, params); 28 | 29 | // do something 30 | rightBtn.setOnClickListener(new View.OnClickListener() { 31 | @Override 32 | public void onClick(View v) { 33 | Toast.makeText(CustomizedMQConversationActivity.this, "RightBtn OnClick", Toast.LENGTH_SHORT).show(); 34 | } 35 | }); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /demo/src/main/java/com/meiqia/meiqiasdk/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.meiqia.meiqiasdk.demo; 2 | 3 | import android.Manifest; 4 | import android.annotation.TargetApi; 5 | import android.app.Activity; 6 | import android.content.Intent; 7 | import android.content.pm.PackageManager; 8 | import android.os.Build; 9 | import android.os.Bundle; 10 | import android.view.View; 11 | 12 | import androidx.annotation.NonNull; 13 | import androidx.core.app.ActivityCompat; 14 | import androidx.core.content.ContextCompat; 15 | 16 | import com.meiqia.meiqiasdk.activity.MQMessageFormActivity; 17 | import com.meiqia.meiqiasdk.util.MQIntentBuilder; 18 | import com.meiqia.meiqiasdk.util.MQUtils; 19 | 20 | public class MainActivity extends Activity { 21 | private static final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 1; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_main); 27 | } 28 | 29 | /** 30 | * 咨询客服 31 | * 32 | * @param v 33 | */ 34 | public void conversation(View v) { 35 | Intent intent = new MQIntentBuilder(this).build(); 36 | startActivity(intent); 37 | } 38 | 39 | /** 40 | * 开发者功能 41 | * 42 | * @param v 43 | */ 44 | public void developer(View v) { 45 | startActivity(new Intent(MainActivity.this, ApiSampleActivity.class)); 46 | } 47 | 48 | /** 49 | * 自定义 Activity 50 | * 51 | * @param view 52 | */ 53 | public void customizedConversation(View view) { 54 | Intent intent = new MQIntentBuilder(this, CustomizedMQConversationActivity.class).build(); 55 | startActivity(intent); 56 | } 57 | 58 | public void leaveMessageForm(View view) { 59 | startActivity(new Intent(this, MQMessageFormActivity.class)); 60 | } 61 | 62 | public void linkWebView(View view) { 63 | Intent intent = new Intent(MainActivity.this, ActivityWebView.class); 64 | intent.putExtra("link", "https://chatlink-new.meiqia.cn/widget/standalone.html?eid=ab6e3a7cda04cc8bff00237214c3bcc6"); 65 | startActivity(intent); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Meiqia/MeiqiaSDK-Android/30c87e8f38513175ec9a679eb1bcfd289b3d56f4/demo/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Meiqia/MeiqiaSDK-Android/30c87e8f38513175ec9a679eb1bcfd289b3d56f4/demo/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Meiqia/MeiqiaSDK-Android/30c87e8f38513175ec9a679eb1bcfd289b3d56f4/demo/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Meiqia/MeiqiaSDK-Android/30c87e8f38513175ec9a679eb1bcfd289b3d56f4/demo/src/main/res/drawable-xxhdpi/ic_logo.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Meiqia/MeiqiaSDK-Android/30c87e8f38513175ec9a679eb1bcfd289b3d56f4/demo/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 19 | 25 | 26 |