├── .gitignore ├── README.md ├── README.zh.md ├── app ├── .gitignore ├── build.gradle ├── libs │ └── PLACEHOLDER ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── io │ │ └── agora │ │ ├── framework │ │ └── PreprocessorFaceUnity.java │ │ ├── profile │ │ ├── CPUInfoUtil.java │ │ ├── CSVUtils.java │ │ ├── Constant.java │ │ ├── FPSUtil.java │ │ └── MemoryInfoUtil.java │ │ └── rtcwithfu │ │ ├── MyApplication.java │ │ ├── RtcEngineEventHandler.java │ │ ├── RtcEngineEventHandlerProxy.java │ │ ├── activities │ │ ├── FUChatActivity.java │ │ ├── MainActivity.java │ │ └── RtcBasedActivity.java │ │ └── utils │ │ └── Constants.java │ └── res │ ├── layout │ ├── activity_base.xml │ ├── activity_navigation.xml │ └── effect_option_container_layout.xml │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ ├── camera_normal.png │ └── ic_launcher.png │ ├── values-zh-rCN │ └── strings.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ └── strings.xml ├── build.gradle ├── docs ├── FUNama SDK v4.5 更新文档_edited by Soma.md ├── FUNama SDK v4.6 更新文档.md ├── FUNama SDK v4.7 更新文档.md ├── FUNama SDK v5.0 更新文档.md ├── FUNama_SDK_v4.4_更新文档.md ├── Nama API Android Reference.md ├── ar_mesh.png └── 视频美颜更新.md ├── faceunity ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── config │ │ └── blackList.json │ ├── makeup │ │ ├── chaomo.bundle │ │ ├── chuju.bundle │ │ ├── chuqiu.bundle │ │ ├── gangfeng.bundle │ │ ├── hongfeng.bundle │ │ ├── jianling.bundle │ │ ├── linjia.bundle │ │ ├── nuandong.bundle │ │ ├── oumei.bundle │ │ ├── qianzhihe.bundle │ │ ├── renyu.bundle │ │ ├── rose.bundle │ │ ├── shaonv.bundle │ │ ├── tianmei.bundle │ │ ├── wumei.bundle │ │ ├── xinggan.bundle │ │ ├── yanshimao.bundle │ │ └── ziyun.bundle │ └── sticker │ │ ├── cat_sparks.bundle │ │ ├── fashi.bundle │ │ ├── sdlr.bundle │ │ └── sdlu.bundle │ ├── java │ └── com │ │ └── faceunity │ │ └── nama │ │ ├── FUConfig.java │ │ ├── FURenderer.java │ │ ├── IFURenderer.java │ │ ├── base │ │ ├── BaseDelegate.java │ │ ├── BaseListAdapter.java │ │ └── BaseViewHolder.java │ │ ├── checkbox │ │ ├── CheckBoxCompat.java │ │ └── CheckGroup.java │ │ ├── control │ │ ├── BaseControlView.java │ │ ├── BodyBeautyControlView.java │ │ ├── FaceBeautyShapeControlView.java │ │ ├── FaceBeautySkinControlView.java │ │ ├── FilterControlView.java │ │ ├── MakeupControlView.java │ │ └── PropControlView.java │ │ ├── data │ │ ├── BodyBeautyDataFactory.java │ │ ├── FaceBeautyAndFilterDataFactory.java │ │ ├── FaceUnityDataFactory.java │ │ ├── MakeupDataFactory.java │ │ └── PropDataFactory.java │ │ ├── dialog │ │ ├── BaseDialogFragment.java │ │ ├── ConfirmDialogFragment.java │ │ └── ToastHelper.java │ │ ├── entity │ │ ├── BodyBeautyBean.java │ │ ├── FaceBeautyBean.java │ │ ├── FaceBeautyFilterBean.java │ │ ├── MakeupCombinationBean.java │ │ ├── ModelAttributeData.java │ │ └── PropBean.java │ │ ├── infe │ │ ├── AbstractBodyBeautyDataFactory.java │ │ ├── AbstractFaceBeautyDataFactory.java │ │ ├── AbstractMakeupDataFactory.java │ │ └── AbstractPropDataFactory.java │ │ ├── listener │ │ ├── FURendererListener.java │ │ ├── OnBottomAnimatorChangeListener.java │ │ └── OnMultiClickListener.java │ │ ├── repo │ │ ├── BodyBeautySource.java │ │ ├── FaceBeautySource.java │ │ ├── MakeupSource.java │ │ └── PropSource.java │ │ ├── seekbar │ │ ├── DiscreteSeekBar.java │ │ └── internal │ │ │ ├── Marker.java │ │ │ ├── PopupIndicator.java │ │ │ ├── compat │ │ │ ├── AnimatorCompat.java │ │ │ ├── SeekBarCompat.java │ │ │ └── SeekBarCompatDontCrash.java │ │ │ └── drawable │ │ │ ├── AlmostRippleDrawable.java │ │ │ ├── MarkerDrawable.java │ │ │ ├── StateDrawable.java │ │ │ ├── ThumbDrawable.java │ │ │ ├── TrackOvalDrawable.java │ │ │ └── TrackRectDrawable.java │ │ ├── ui │ │ └── FaceUnityView.java │ │ ├── utils │ │ ├── FuDeviceUtils.java │ │ └── device │ │ │ ├── DefaultScoreProvider.java │ │ │ ├── DeviceCpuUtils.java │ │ │ ├── DeviceScoreProvider.java │ │ │ ├── DeviceScoreUtils.java │ │ │ ├── MTKScoreProvider.java │ │ │ ├── MathUtils.java │ │ │ └── QualcommScoreProvider.java │ │ └── widget │ │ ├── CircleImageView.java │ │ └── TouchStateImageView.java │ └── res │ ├── color │ ├── beauty_radio_color.xml │ ├── bottom_radio_color.xml │ ├── dsb_progress_color_list.xml │ ├── dsb_ripple_color_list.xml │ ├── dsb_track_color_list.xml │ └── tv_main_color_selector.xml │ ├── drawable │ ├── bg_confirm_dialog.xml │ ├── bg_confirm_dialog_option.xml │ ├── bg_control_oval_selector.xml │ ├── bg_control_square_selector.xml │ ├── bg_popup_skin_seg.xml │ ├── bg_radio_group.xml │ ├── bg_radio_left.xml │ ├── bg_radio_left_check.xml │ ├── bg_radio_left_selector.xml │ ├── bg_radio_middle.xml │ ├── bg_radio_right.xml │ ├── bg_radio_right_check.xml │ ├── bg_radio_right_selector.xml │ ├── bg_radio_skin_seg_left.xml │ ├── bg_radio_skin_seg_left_check.xml │ ├── bg_radio_skin_seg_left_selector.xml │ ├── bg_radio_skin_seg_right.xml │ ├── bg_radio_skin_seg_right_check.xml │ ├── bg_radio_skin_seg_right_selector.xml │ ├── bg_seek_bar.xml │ ├── bg_shape_oval_theme.xml │ ├── bg_shape_rect_theme.xml │ ├── bg_toast_more.xml │ ├── icon_beauty_shape_angle_close_selector.xml │ ├── icon_beauty_shape_angle_open_selector.xml │ ├── icon_beauty_shape_brow_height_close_selector.xml │ ├── icon_beauty_shape_brow_height_open_selector.xml │ ├── icon_beauty_shape_brow_space_close_selector.xml │ ├── icon_beauty_shape_brow_space_open_selector.xml │ ├── icon_beauty_shape_brow_thick_close_selector.xml │ ├── icon_beauty_shape_brow_thick_open_selector.xml │ ├── icon_beauty_shape_cheek_bones_close_selector.xml │ ├── icon_beauty_shape_cheek_bones_open_selector.xml │ ├── icon_beauty_shape_chin_close_selector.xml │ ├── icon_beauty_shape_chin_open_selector.xml │ ├── icon_beauty_shape_distance_close_selector.xml │ ├── icon_beauty_shape_distance_open_selector.xml │ ├── icon_beauty_shape_enlarge_eye_close_selector.xml │ ├── icon_beauty_shape_enlarge_eye_open_selector.xml │ ├── icon_beauty_shape_eye_height_close_selector.xml │ ├── icon_beauty_shape_eye_height_open_selector.xml │ ├── icon_beauty_shape_eye_lid_close_selector.xml │ ├── icon_beauty_shape_eye_lid_open_selector.xml │ ├── icon_beauty_shape_face_cheekthin_close_selector.xml │ ├── icon_beauty_shape_face_cheekthin_open_selector.xml │ ├── icon_beauty_shape_face_little_close_selector.xml │ ├── icon_beauty_shape_face_little_open_selector.xml │ ├── icon_beauty_shape_face_narrow_close_selector.xml │ ├── icon_beauty_shape_face_narrow_open_selector.xml │ ├── icon_beauty_shape_face_short_close_selector.xml │ ├── icon_beauty_shape_face_short_open_selector.xml │ ├── icon_beauty_shape_face_v_close_selector.xml │ ├── icon_beauty_shape_face_v_open_selector.xml │ ├── icon_beauty_shape_forehead_close_selector.xml │ ├── icon_beauty_shape_forehead_open_selector.xml │ ├── icon_beauty_shape_lip_thick_close_selector.xml │ ├── icon_beauty_shape_lip_thick_open_selector.xml │ ├── icon_beauty_shape_lower_jaw_close_selector.xml │ ├── icon_beauty_shape_lower_jaw_open_selector.xml │ ├── icon_beauty_shape_mouth_close_selector.xml │ ├── icon_beauty_shape_mouth_open_selector.xml │ ├── icon_beauty_shape_open_eyes_close_selector.xml │ ├── icon_beauty_shape_open_eyes_open_selector.xml │ ├── icon_beauty_shape_proboscis_close_selector.xml │ ├── icon_beauty_shape_proboscis_open_selector.xml │ ├── icon_beauty_shape_round_eye_close_selector.xml │ ├── icon_beauty_shape_round_eye_open_selector.xml │ ├── icon_beauty_shape_shrinking_close_selector.xml │ ├── icon_beauty_shape_shrinking_open_selector.xml │ ├── icon_beauty_shape_smile_close_selector.xml │ ├── icon_beauty_shape_smile_open_selector.xml │ ├── icon_beauty_shape_thin_nose_close_selector.xml │ ├── icon_beauty_shape_thin_nose_open_selector.xml │ ├── icon_beauty_skin_buffing_close_selector.xml │ ├── icon_beauty_skin_buffing_open_selector.xml │ ├── icon_beauty_skin_clarity_close_selector.xml │ ├── icon_beauty_skin_clarity_open_selector.xml │ ├── icon_beauty_skin_color_close_selector.xml │ ├── icon_beauty_skin_color_open_selector.xml │ ├── icon_beauty_skin_dark_circles_close_selector.xml │ ├── icon_beauty_skin_dark_circles_open_selector.xml │ ├── icon_beauty_skin_delspot_close_selector.xml │ ├── icon_beauty_skin_delspot_open_selector.xml │ ├── icon_beauty_skin_eyes_bright_close_selector.xml │ ├── icon_beauty_skin_eyes_bright_open_selector.xml │ ├── icon_beauty_skin_face_three_close_selector.xml │ ├── icon_beauty_skin_face_three_open_selector.xml │ ├── icon_beauty_skin_red_close_selector.xml │ ├── icon_beauty_skin_red_open_selector.xml │ ├── icon_beauty_skin_sharpen_close_selector.xml │ ├── icon_beauty_skin_sharpen_open_selector.xml │ ├── icon_beauty_skin_teeth_close_selector.xml │ ├── icon_beauty_skin_teeth_open_selector.xml │ ├── icon_beauty_skin_wrinkle_close_selector.xml │ ├── icon_beauty_skin_wrinkle_open_selector.xml │ ├── icon_body_hip_close_selector.xml │ ├── icon_body_hip_open_selector.xml │ ├── icon_body_little_head_close_selector.xml │ ├── icon_body_little_head_open_selector.xml │ ├── icon_body_shoulder_close_selector.xml │ ├── icon_body_shoulder_open_selector.xml │ ├── icon_body_slimming_close_selector.xml │ ├── icon_body_slimming_open_selector.xml │ ├── icon_body_stovepipe_close_selector.xml │ ├── icon_body_stovepipe_open_selector.xml │ ├── icon_body_thin_leg_close_selector.xml │ ├── icon_body_thin_leg_open_selector.xml │ ├── icon_body_waist_close_selector.xml │ └── icon_body_waist_open_selector.xml │ ├── layout │ ├── dialog_confirm.xml │ ├── layout_body_beauty_control.xml │ ├── layout_effect_control.xml │ ├── layout_face_beauty_control.xml │ ├── layout_faceunity.xml │ ├── layout_filter_control.xml │ ├── layout_make_up_control.xml │ ├── list_item_control_image_square.xml │ ├── list_item_control_title_image_circle.xml │ └── list_item_control_title_image_square.xml │ ├── mipmap-xxhdpi │ ├── bg_live_seek_bar_light.9.png │ ├── icon_beauty_box_angle_close_checked.png │ ├── icon_beauty_box_angle_close_normal.png │ ├── icon_beauty_box_angle_open_checked.png │ ├── icon_beauty_box_angle_open_normal.png │ ├── icon_beauty_box_brow_height_close_checked.png │ ├── icon_beauty_box_brow_height_close_normal.png │ ├── icon_beauty_box_brow_height_open_checked.png │ ├── icon_beauty_box_brow_height_open_normal.png │ ├── icon_beauty_box_brow_space_close_checked.png │ ├── icon_beauty_box_brow_space_close_normal.png │ ├── icon_beauty_box_brow_space_open_checked.png │ ├── icon_beauty_box_brow_space_open_normal.png │ ├── icon_beauty_box_brow_thick_close_checked.png │ ├── icon_beauty_box_brow_thick_close_normal.png │ ├── icon_beauty_box_brow_thick_open_checked.png │ ├── icon_beauty_box_brow_thick_open_normal.png │ ├── icon_beauty_box_buffing_close_checked.png │ ├── icon_beauty_box_buffing_close_normal.png │ ├── icon_beauty_box_buffing_open_checked.png │ ├── icon_beauty_box_buffing_open_normal.png │ ├── icon_beauty_box_cheek_bones_close_checked.png │ ├── icon_beauty_box_cheek_bones_close_normal.png │ ├── icon_beauty_box_cheek_bones_open_checked.png │ ├── icon_beauty_box_cheek_bones_open_normal.png │ ├── icon_beauty_box_chin_close_checked.png │ ├── icon_beauty_box_chin_close_normal.png │ ├── icon_beauty_box_chin_open_checked.png │ ├── icon_beauty_box_chin_open_normal.png │ ├── icon_beauty_box_clarity_close_checked.png │ ├── icon_beauty_box_clarity_close_normal.png │ ├── icon_beauty_box_clarity_open_checked.png │ ├── icon_beauty_box_clarity_open_normal.png │ ├── icon_beauty_box_color_close_checked.png │ ├── icon_beauty_box_color_close_normal.png │ ├── icon_beauty_box_color_open_checked.png │ ├── icon_beauty_box_color_open_normal.png │ ├── icon_beauty_box_dark_circles_close_checked.png │ ├── icon_beauty_box_dark_circles_close_normal.png │ ├── icon_beauty_box_dark_circles_open_checked.png │ ├── icon_beauty_box_dark_circles_open_normal.png │ ├── icon_beauty_box_delspot_close_checked.png │ ├── icon_beauty_box_delspot_close_normal.png │ ├── icon_beauty_box_delspot_open_checked.png │ ├── icon_beauty_box_delspot_open_normal.png │ ├── icon_beauty_box_distance_close_checked.png │ ├── icon_beauty_box_distance_close_normal.png │ ├── icon_beauty_box_distance_open_checked.png │ ├── icon_beauty_box_distance_open_normal.png │ ├── icon_beauty_box_enlarge_eye_level_close_checked.png │ ├── icon_beauty_box_enlarge_eye_level_close_normal.png │ ├── icon_beauty_box_enlarge_eye_level_open_checked.png │ ├── icon_beauty_box_enlarge_eye_level_open_normal.png │ ├── icon_beauty_box_eye_height_close_checked.png │ ├── icon_beauty_box_eye_height_close_normal.png │ ├── icon_beauty_box_eye_height_open_checked.png │ ├── icon_beauty_box_eye_height_open_normal.png │ ├── icon_beauty_box_eye_lid_close_checked.png │ ├── icon_beauty_box_eye_lid_close_normal.png │ ├── icon_beauty_box_eye_lid_open_checked.png │ ├── icon_beauty_box_eye_lid_open_normal.png │ ├── icon_beauty_box_eyes_bright_close_checked.png │ ├── icon_beauty_box_eyes_bright_close_normal.png │ ├── icon_beauty_box_eyes_bright_open_checked.png │ ├── icon_beauty_box_eyes_bright_open_normal.png │ ├── icon_beauty_box_face_cheekthin_level_close_checked.png │ ├── icon_beauty_box_face_cheekthin_level_close_normal.png │ ├── icon_beauty_box_face_cheekthin_level_open_checked.png │ ├── icon_beauty_box_face_cheekthin_level_open_normal.png │ ├── icon_beauty_box_face_little_close_checked.png │ ├── icon_beauty_box_face_little_close_normal.png │ ├── icon_beauty_box_face_little_open_checked.png │ ├── icon_beauty_box_face_little_open_normal.png │ ├── icon_beauty_box_face_narrow_close_checked.png │ ├── icon_beauty_box_face_narrow_close_normal.png │ ├── icon_beauty_box_face_narrow_open_checked.png │ ├── icon_beauty_box_face_narrow_open_normal.png │ ├── icon_beauty_box_face_short_close_checked.png │ ├── icon_beauty_box_face_short_close_normal.png │ ├── icon_beauty_box_face_short_open_checked.png │ ├── icon_beauty_box_face_short_open_normal.png │ ├── icon_beauty_box_face_three_close_checked.png │ ├── icon_beauty_box_face_three_close_normal.png │ ├── icon_beauty_box_face_three_open_checked.png │ ├── icon_beauty_box_face_three_open_normal.png │ ├── icon_beauty_box_face_v_close_checked.png │ ├── icon_beauty_box_face_v_close_normal.png │ ├── icon_beauty_box_face_v_open_checked.png │ ├── icon_beauty_box_face_v_open_normal.png │ ├── icon_beauty_box_forehead_close_checked.png │ ├── icon_beauty_box_forehead_close_normal.png │ ├── icon_beauty_box_forehead_open_checked.png │ ├── icon_beauty_box_forehead_open_normal.png │ ├── icon_beauty_box_lip_thick_close_checked.png │ ├── icon_beauty_box_lip_thick_close_normal.png │ ├── icon_beauty_box_lip_thick_open_checked.png │ ├── icon_beauty_box_lip_thick_open_normal.png │ ├── icon_beauty_box_lower_jaw_close_checked.png │ ├── icon_beauty_box_lower_jaw_close_normal.png │ ├── icon_beauty_box_lower_jaw_open_checked.png │ ├── icon_beauty_box_lower_jaw_open_normal.png │ ├── icon_beauty_box_mouth_bones_close_normal.png │ ├── icon_beauty_box_mouth_close_checked.png │ ├── icon_beauty_box_mouth_open_checked.png │ ├── icon_beauty_box_mouth_open_normal.png │ ├── icon_beauty_box_open_eyes_close_checked.png │ ├── icon_beauty_box_open_eyes_close_normal.png │ ├── icon_beauty_box_open_eyes_open_checked.png │ ├── icon_beauty_box_open_eyes_open_normal.png │ ├── icon_beauty_box_proboscis_close_checked.png │ ├── icon_beauty_box_proboscis_close_normal.png │ ├── icon_beauty_box_proboscis_open_checked.png │ ├── icon_beauty_box_proboscis_open_normal.png │ ├── icon_beauty_box_red_close_checked.png │ ├── icon_beauty_box_red_close_normal.png │ ├── icon_beauty_box_red_open_checked.png │ ├── icon_beauty_box_red_open_normal.png │ ├── icon_beauty_box_round_eye_level_close_checked.png │ ├── icon_beauty_box_round_eye_level_close_normal.png │ ├── icon_beauty_box_round_eye_level_open_checked.png │ ├── icon_beauty_box_round_eye_level_open_normal.png │ ├── icon_beauty_box_sharpen_close_checked.png │ ├── icon_beauty_box_sharpen_close_normal.png │ ├── icon_beauty_box_sharpen_open_checked.png │ ├── icon_beauty_box_sharpen_open_normal.png │ ├── icon_beauty_box_shrinking_close_checked.png │ ├── icon_beauty_box_shrinking_close_normal.png │ ├── icon_beauty_box_shrinking_open_checked.png │ ├── icon_beauty_box_shrinking_open_normal.png │ ├── icon_beauty_box_smile_close_checked.png │ ├── icon_beauty_box_smile_close_normal.png │ ├── icon_beauty_box_smile_open_checked.png │ ├── icon_beauty_box_smile_open_normal.png │ ├── icon_beauty_box_teeth_close_checked.png │ ├── icon_beauty_box_teeth_close_normal.png │ ├── icon_beauty_box_teeth_open_checked.png │ ├── icon_beauty_box_teeth_open_normal.png │ ├── icon_beauty_box_thin_nose_close_checked.png │ ├── icon_beauty_box_thin_nose_close_normal.png │ ├── icon_beauty_box_thin_nose_open_checked.png │ ├── icon_beauty_box_thin_nose_open_normal.png │ ├── icon_beauty_box_wrinkle_close_checked.png │ ├── icon_beauty_box_wrinkle_close_normal.png │ ├── icon_beauty_box_wrinkle_open_checked.png │ ├── icon_beauty_box_wrinkle_open_normal.png │ ├── icon_beauty_face_contrast.png │ ├── icon_beauty_filter_bailiang_1.png │ ├── icon_beauty_filter_cancel.png │ ├── icon_beauty_filter_fennen_1.png │ ├── icon_beauty_filter_lengsediao_1.png │ ├── icon_beauty_filter_natural_1.png │ ├── icon_beauty_filter_texture_gray_1.png │ ├── icon_body_hip_close_checked.png │ ├── icon_body_hip_close_normal.png │ ├── icon_body_hip_open_checked.png │ ├── icon_body_hip_open_normal.png │ ├── icon_body_little_head_close_checked.png │ ├── icon_body_little_head_close_normal.png │ ├── icon_body_little_head_open_checked.png │ ├── icon_body_little_head_open_normal.png │ ├── icon_body_shoulder_close_checked.png │ ├── icon_body_shoulder_close_normal.png │ ├── icon_body_shoulder_open_checked.png │ ├── icon_body_shoulder_open_normal.png │ ├── icon_body_slimming_close_checked.png │ ├── icon_body_slimming_close_normal.png │ ├── icon_body_slimming_open_checked.png │ ├── icon_body_slimming_open_normal.png │ ├── icon_body_stovepipe_close_checked.png │ ├── icon_body_stovepipe_close_normal.png │ ├── icon_body_stovepipe_open_checked.png │ ├── icon_body_stovepipe_open_normal.png │ ├── icon_body_thin_leg_close_checked.png │ ├── icon_body_thin_leg_close_normal.png │ ├── icon_body_thin_leg_open_checked.png │ ├── icon_body_thin_leg_open_normal.png │ ├── icon_body_waist_close_checked.png │ ├── icon_body_waist_close_normal.png │ ├── icon_body_waist_open_checked.png │ ├── icon_body_waist_open_normal.png │ ├── icon_control_none.png │ ├── icon_control_recover.png │ ├── icon_live_camera_change.png │ ├── icon_makeup_combination_age.png │ ├── icon_makeup_combination_bored_cat.png │ ├── icon_makeup_combination_charming.png │ ├── icon_makeup_combination_daisy.png │ ├── icon_makeup_combination_early_autumn.png │ ├── icon_makeup_combination_girl.png │ ├── icon_makeup_combination_harbour_wind.png │ ├── icon_makeup_combination_mermaid.png │ ├── icon_makeup_combination_neighbor_girl.png │ ├── icon_makeup_combination_occident.png │ ├── icon_makeup_combination_paper_cranes.png │ ├── icon_makeup_combination_purple_rhyme.png │ ├── icon_makeup_combination_red_maple.png │ ├── icon_makeup_combination_rose.png │ ├── icon_makeup_combination_sexy.png │ ├── icon_makeup_combination_supermodel.png │ ├── icon_makeup_combination_sweet.png │ ├── icon_makeup_combination_warm_winter.png │ ├── icon_sticker_cat_sparks.png │ ├── icon_sticker_fashi.png │ ├── icon_sticker_sdlr.png │ └── icon_sticker_sdlu.png │ ├── values-1024x600 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1024x768 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1184x720 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1196x720 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1280x720 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1280x800 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1334x750 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1700x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1776x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1794x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1800x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1812x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1920x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-1920x1200 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-2160x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-2280x1080 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-2300x1440 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-2560x1440 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-2560x1600 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-800x480 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-854x480 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-960x540 │ ├── lay_x.xml │ └── lay_y.xml │ ├── values-zh-rCN │ └── strings.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | 6 | defaultConfig { 7 | applicationId "io.agora.rtcwithfu" 8 | minSdkVersion 19 9 | targetSdkVersion 28 10 | versionCode 11 11 | versionName "5.4" 12 | 13 | ndk { 14 | abiFilters "armeabi-v7a", "arm64-v8a" 15 | } 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | 25 | compileOptions { 26 | sourceCompatibility JavaVersion.VERSION_1_8 27 | targetCompatibility JavaVersion.VERSION_1_8 28 | } 29 | 30 | applicationVariants.all { variant -> 31 | variant.mergeAssetsProvider.configure { 32 | doLast { 33 | delete(fileTree(dir: outputDir, 34 | includes: ['model/ai_bgseg_green.bundle', 35 | 'model/ai_face_processor_lite.bundle', 36 | 'model/ai_hairseg.bundle', 37 | 'model/ai_hand_processor.bundle', 38 | 'model/ai_human_processor_mb_fast.bundle', 39 | 'graphics/controller_cpp.bundle', 40 | 'graphics/fuzzytoonfilter.bundle', 41 | 'graphics/tongue.bundle', 42 | 'graphics/fxaa.bundle'])) 43 | } 44 | } 45 | } 46 | 47 | } 48 | 49 | dependencies { 50 | implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') 51 | 52 | implementation 'com.android.support:support-v4:28.0.0' 53 | implementation 'com.android.support:design:28.0.0' 54 | implementation 'com.android.support.constraint:constraint-layout:2.0.4' 55 | implementation project(':faceunity') 56 | implementation 'io.agora.rtc:full-sdk:4.2.1' 57 | implementation 'com.wuyr:pathlayoutmanager:1.0.3' 58 | implementation 'org.adw.library:discrete-seekbar:1.0.1' 59 | } 60 | -------------------------------------------------------------------------------- /app/libs/PLACEHOLDER: -------------------------------------------------------------------------------- 1 | agora-rtc-sdk.jar 2 | avprocessor.aar 3 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/lirui/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/profile/Constant.java: -------------------------------------------------------------------------------- 1 | package io.agora.profile; 2 | 3 | import android.os.Build; 4 | import android.os.Environment; 5 | 6 | import java.io.File; 7 | import java.util.regex.Pattern; 8 | 9 | /** 10 | * Created by tujh on 2018/2/7. 11 | */ 12 | 13 | public class Constant { 14 | public static final String APP_NAME = "AgoraVideo"; 15 | public static final String filePath = Environment.getExternalStoragePublicDirectory("") 16 | + File.separator + "FaceUnity" + File.separator + APP_NAME + File.separator; 17 | 18 | public static final String DICMFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath(); 19 | public static final String photoFilePath; 20 | public static final String cameraFilePath; 21 | 22 | static { 23 | if (Build.FINGERPRINT.contains("Flyme") 24 | || Pattern.compile("Flyme", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find() 25 | || Build.MANUFACTURER.contains("Meizu") 26 | || Build.MANUFACTURER.contains("MeiZu")) { 27 | photoFilePath = DICMFilePath + File.separator + "Camera" + File.separator; 28 | cameraFilePath = DICMFilePath + File.separator + "Video" + File.separator; 29 | } else if (Build.FINGERPRINT.contains("vivo") 30 | || Pattern.compile("vivo", Pattern.CASE_INSENSITIVE).matcher(Build.DISPLAY).find() 31 | || Build.MANUFACTURER.contains("vivo") 32 | || Build.MANUFACTURER.contains("vivo")) { 33 | photoFilePath = cameraFilePath = Environment.getExternalStoragePublicDirectory("") + File.separator + "相机" + File.separator; 34 | } else { 35 | cameraFilePath = photoFilePath = DICMFilePath + File.separator + "Camera" + File.separator; 36 | } 37 | createFile(filePath); 38 | createFile(cameraFilePath); 39 | createFile(photoFilePath); 40 | } 41 | 42 | public static void createFile(String path) { 43 | File dir = new File(path); 44 | if (!dir.exists()) { 45 | dir.mkdirs(); 46 | } 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/profile/FPSUtil.java: -------------------------------------------------------------------------------- 1 | package io.agora.profile; 2 | 3 | /** 4 | * FPS工具类 5 | * Created by tujh on 2018/5/24. 6 | */ 7 | public class FPSUtil { 8 | private static final int NANO_IN_ONE_MILLI_SECOND = 1000000; 9 | private static final int NANO_IN_ONE_SECOND = 1000 * NANO_IN_ONE_MILLI_SECOND; 10 | 11 | private static long sLastFrameTimeStamp = 0; 12 | 13 | /** 14 | * 每帧都计算 15 | * 16 | * @return 17 | */ 18 | public static double fps() { 19 | long tmp = System.nanoTime(); 20 | double fps = ((double) NANO_IN_ONE_SECOND) / (tmp - sLastFrameTimeStamp); 21 | sLastFrameTimeStamp = tmp; 22 | // Log.e(TAG, "FPS : " + fps); 23 | return fps; 24 | } 25 | 26 | private static long mStartTime = 0; 27 | 28 | /** 29 | * 平均值 30 | * 31 | * @return 32 | */ 33 | public static double fpsAVG(int time) { 34 | long tmp = System.nanoTime(); 35 | double fps = ((double) NANO_IN_ONE_SECOND) * time / (tmp - mStartTime); 36 | mStartTime = tmp; 37 | // Log.e(TAG, "FPS : " + fps); 38 | return fps; 39 | } 40 | 41 | private long mLimitMinTime = 33333333; 42 | private long mLimitStartTime; 43 | private int mLimitFrameRate; 44 | 45 | public void setLimitMinTime(long limitMinTime) { 46 | mLimitMinTime = limitMinTime; 47 | } 48 | 49 | public void limit() { 50 | try { 51 | if (mLimitFrameRate == 0 || mLimitFrameRate > 600000) { 52 | mLimitStartTime = System.nanoTime(); 53 | mLimitFrameRate = 0; 54 | } 55 | long sleepTime = mLimitMinTime * mLimitFrameRate++ - (System.nanoTime() - mLimitStartTime); 56 | if (sleepTime > 0) { 57 | Thread.sleep(sleepTime / NANO_IN_ONE_MILLI_SECOND, (int) (sleepTime % NANO_IN_ONE_MILLI_SECOND)); 58 | } 59 | } catch (InterruptedException e) { 60 | e.printStackTrace(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/rtcwithfu/MyApplication.java: -------------------------------------------------------------------------------- 1 | package io.agora.rtcwithfu; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.faceunity.nama.FUConfig; 7 | import com.faceunity.nama.FURenderer; 8 | import com.faceunity.nama.utils.FuDeviceUtils; 9 | 10 | public class MyApplication extends Application { 11 | private RtcEngineEventHandlerProxy mRtcEventHandler; 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | FUConfig.DEVICE_LEVEL = FuDeviceUtils.judgeDeviceLevel(true); 17 | mRtcEventHandler = new RtcEngineEventHandlerProxy(); 18 | initVideoCaptureAsync(); 19 | } 20 | 21 | 22 | private void initVideoCaptureAsync() { 23 | new Thread(() -> { 24 | Context application = getApplicationContext(); 25 | FURenderer.getInstance().setup(application); 26 | }).start(); 27 | } 28 | 29 | 30 | public void addRtcHandler(RtcEngineEventHandler handler) { 31 | mRtcEventHandler.addEventHandler(handler); 32 | } 33 | 34 | public void removeRtcHandler(RtcEngineEventHandler handler) { 35 | mRtcEventHandler.removeEventHandler(handler); 36 | } 37 | 38 | public RtcEngineEventHandlerProxy getRtcEventHandler() { 39 | return mRtcEventHandler; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/rtcwithfu/RtcEngineEventHandler.java: -------------------------------------------------------------------------------- 1 | package io.agora.rtcwithfu; 2 | 3 | public interface RtcEngineEventHandler { 4 | void onJoinChannelSuccess(String channel, int uid, int elapsed); 5 | 6 | void onUserOffline(int uid, int reason); 7 | 8 | void onUserJoined(int uid, int elapsed); 9 | 10 | void onRemoteVideoStateChanged(int uid, int state, int reason, int elapsed); 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/rtcwithfu/activities/RtcBasedActivity.java: -------------------------------------------------------------------------------- 1 | package io.agora.rtcwithfu.activities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.Window; 6 | import android.view.WindowManager; 7 | 8 | import io.agora.rtc2.RtcEngine; 9 | import io.agora.rtcwithfu.MyApplication; 10 | import io.agora.rtcwithfu.RtcEngineEventHandler; 11 | 12 | public abstract class RtcBasedActivity extends AppCompatActivity implements RtcEngineEventHandler { 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | requestWindowFeature(Window.FEATURE_NO_TITLE); 17 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 18 | } 19 | 20 | @Override 21 | protected void onStart() { 22 | super.onStart(); 23 | addRtcHandler(this); 24 | } 25 | 26 | @Override 27 | protected void onStop() { 28 | super.onStop(); 29 | removeRtcHandler(this); 30 | } 31 | 32 | protected MyApplication application() { 33 | return (MyApplication) getApplication(); 34 | } 35 | 36 | private void addRtcHandler(RtcEngineEventHandler handler) { 37 | application().addRtcHandler(handler); 38 | } 39 | 40 | private void removeRtcHandler(RtcEngineEventHandler handler) { 41 | application().removeRtcHandler(handler); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/io/agora/rtcwithfu/utils/Constants.java: -------------------------------------------------------------------------------- 1 | package io.agora.rtcwithfu.utils; 2 | 3 | /** 4 | * Created by Yao Ximing on 2018/2/4. 5 | */ 6 | 7 | public class Constants { 8 | public static final String ACTION_KEY_ROOM_NAME = "ecHANEL"; 9 | public static final int UID = 0; 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_base.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 10 | 19 | 20 | 28 | 37 | 38 | 39 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 18 |