package com.yunbao.faceunity.ui; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.tabs.TabLayout; import com.yunbao.common.utils.WordUtil; import com.yunbao.faceunity.R; import com.yunbao.faceunity.adapters.ContainerRecyclerAdapter; import com.yunbao.faceunity.adapters.MenuGroupRecyclerAdapter; import com.yunbao.faceunity.data.FaceParam; import com.yunbao.faceunity.data.FaceUnityDataFactory; import com.yunbao.faceunity.entity.BaseBean; import com.yunbao.faceunity.data.FineStickerDataFactory; import com.yunbao.faceunity.entity.FunctionEnum; import com.yunbao.faceunity.entity.MakeupCustomClassBean; import com.yunbao.faceunity.entity.MenuGroupBean; import com.yunbao.faceunity.entity.net.FineStickerEntity; import com.yunbao.faceunity.entity.net.FineStickerTagEntity; import com.yunbao.faceunity.repo.AnimojiSource; import com.yunbao.faceunity.repo.BodyBeautySource; import com.yunbao.faceunity.repo.FaceBeautySource; import com.yunbao.faceunity.repo.MakeupSource; import com.yunbao.faceunity.repo.PropSource; import com.yunbao.faceunity.seekbar.DiscreteSeekBar; import com.yunbao.faceunity.utils.net.StickerDownloadHelper; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * DESC: * Created on 2021/4/26 */ public class FaceUnityView extends LinearLayout implements StickerDownloadHelper.Callback { private Context mContext; private RecyclerView menuGroup; private RecyclerView containerRecycler; private ContainerRecyclerAdapter containerAdapter; private TabLayout tabLayout; private TextView title; private LinearLayout menu2, menuDiy, reset, menu2Reset; private ImageView menu2Back, back, close; private DiscreteSeekBar seekBar; public FaceUnityView(Context context) { super(context); mContext = context; init(); } public FaceUnityView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public FaceUnityView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; init(); } private void init() { LayoutInflater.from(mContext).inflate(R.layout.layout_faceunity, this); initView(); bindBottomView(); FineStickerDataFactory.getInstance().addCallback(this); } /** * 绑定数据工厂 * * @param dataFactory FaceUnityDataFactory */ public void bindDataFactory(FaceUnityDataFactory dataFactory) { } /** * 初始化View */ private void initView() { menuGroup = findViewById(R.id.menu_group); containerRecycler = findViewById(R.id.menu2_container_view); tabLayout = findViewById(R.id.menu2_tab); title = findViewById(R.id.menu_title); menu2 = findViewById(R.id.layout_faceunity_menu2); back = findViewById(R.id.menu_back); menu2Back = findViewById(R.id.menu2_back); close = findViewById(R.id.menu_close); reset = findViewById(R.id.menu_reset); menu2Reset = findViewById(R.id.menu2_reset); menuDiy = findViewById(R.id.menu_diy); seekBar = findViewById(R.id.item_seekBar); initMenuGroup(); setContainerRecycler(new ArrayList<>()); initViewClick(); } private void initViewClick() { menu2Back.setOnClickListener(v -> goBackMainMenu()); menuDiy.setOnClickListener(v -> { changeRecyclerItemCount(5); ArrayList list = MakeupSource.buildCustomClasses(); setTab(createTabs(list)); }); } private void goBackMainMenu() { setContainerRecycler(new ArrayList<>()); title.setText("美顏特效選擇"); title.setVisibility(VISIBLE); menu2.setVisibility(GONE); menuGroup.setVisibility(VISIBLE); } /** * 底部功能菜单切换 */ private void bindBottomView() { } /** * UI菜单显示控制 * * @param index Int */ private void showFunction(int index) { } private void initMenuGroup() { MenuGroupRecyclerAdapter adapter = new MenuGroupRecyclerAdapter(mContext); menuGroup.setLayoutManager(new GridLayoutManager(mContext, 4)); List layoutItem = new ArrayList<>(); layoutItem.add(new MenuGroupBean(R.string.home_function_name_beauty, R.mipmap.ico_home_beauty)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_makeup, R.mipmap.ico_home_makeup)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_beauty_body, R.mipmap.ico_home_beauty_body)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_big_head, R.mipmap.ico_home_big_head)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_animoji, R.mipmap.ico_home_animoji)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_sticker, R.mipmap.ico_home_sticker)); layoutItem.add(new MenuGroupBean(R.string.home_function_name_fine_sticker, R.mipmap.ico_home_fine_sticker)); adapter.setList(layoutItem); adapter.setOnItemClickListener(position -> { LinkedHashMap map = new LinkedHashMap<>(); title.setVisibility(GONE); switch (position) { case 0: map.put(R.string.beauty_radio_skin_beauty, FaceParam.FACE_BEAUTY_SKIN); map.put(R.string.beauty_radio_face_shape, FaceParam.FACE_BEAUTY_SHAPE); map.put(R.string.beauty_radio_filter, FaceParam.FACE_BEAUTY_FILTER); map.put(R.string.beauty_radio_style, FaceParam.FACE_BEAUTY_STYLE); setContainerRecycler(FaceBeautySource.buildSkinParams()); break; case 1: title.setText(R.string.home_function_name_makeup); title.setVisibility(VISIBLE); menuDiy.setVisibility(VISIBLE); changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCombinations()); break; case 2: title.setText(R.string.home_function_name_beauty_body); title.setVisibility(VISIBLE); changeRecyclerItemCount(2); setContainerRecycler(BodyBeautySource.buildBodyBeauty()); break; case 3: changeRecyclerItemCount(5); setContainerRecycler(PropSource.buildPropBeans(FunctionEnum.BIG_HEAD)); break; case 4: changeRecyclerItemCount(5); map.put(R.string.animoji_filter, FaceParam.FACE_ANIMOJI); map.put(R.string.cartoon_filter, FaceParam.FACE_ANIM); setContainerRecycler(AnimojiSource.buildAnimojis()); break; case 5: changeRecyclerItemCount(5); setContainerRecycler(PropSource.buildPropBeans(FunctionEnum.STICKER)); break; case 6: List tagList = FineStickerDataFactory.getInstance().loadTagList(); if (!tagList.isEmpty()) { setTab(createTabs(tagList)); } break; } setTab(createTabs(map)); menuGroup.setVisibility(GONE); menu2.setVisibility(VISIBLE); }); menuGroup.setAdapter(adapter); } private List createTabs(Map map) { List list = new ArrayList<>(); for (Integer key : map.keySet()) { TabLayout.Tab tab = tabLayout.newTab().setText(key); tab.setTag(map.get(key)); list.add(tab); } return list; } private List createTabs(List tags) { List list = new ArrayList<>(); for (FineStickerTagEntity tag : tags) { TabLayout.Tab tab; if (WordUtil.isZh()) { tab = tabLayout.newTab().setText(tag.getTag().split("/")[0]); } else { tab = tabLayout.newTab().setText(tag.getTag().split("/")[1]); } tab.setTag(tag); list.add(tab); } return list; } private List createTabs(ArrayList tags) { List list = new ArrayList<>(); for (MakeupCustomClassBean tag : tags) { TabLayout.Tab tab; tab = tabLayout.newTab().setText(tag.getDesRes()); tab.setTag(tag.getBeanType()); list.add(tab); } return list; } private void setTab(List tabs) { tabLayout.removeAllTabs(); for (TabLayout.Tab tab : tabs) { tabLayout.addTab(tab); } tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { Object tabTag = tab.getTag(); if (tabTag instanceof Integer) { switch ((int) tab.getTag()) { case FaceParam.FACE_BEAUTY_SKIN: changeRecyclerItemCount(2); setContainerRecycler(FaceBeautySource.buildSkinParams()); break; case FaceParam.FACE_BEAUTY_SHAPE: changeRecyclerItemCount(2); setContainerRecycler(FaceBeautySource.buildShapeParams()); break; case FaceParam.FACE_BEAUTY_FILTER: changeRecyclerItemCount(5); setContainerRecycler(FaceBeautySource.buildFilters()); break; case FaceParam.FACE_BEAUTY_STYLE: changeRecyclerItemCount(5); setContainerRecycler(FaceBeautySource.buildStylesParams()); break; case FaceParam.FACE_ANIMOJI: changeRecyclerItemCount(5); setContainerRecycler(AnimojiSource.buildAnimojis()); break; case FaceParam.FACE_ANIM: changeRecyclerItemCount(5); setContainerRecycler(AnimojiSource.buildFilters()); break; case FaceParam.FACE_MAKEUP_TYPE_FOUNDATION: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_FOUNDATION)); break; case FaceParam.FACE_MAKEUP_TYPE_LIP_STICK: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_LIP_STICK)); break; case FaceParam.FACE_MAKEUP_TYPE_BLUSHER: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_BLUSHER)); break; case FaceParam.FACE_MAKEUP_TYPE_EYE_BROW: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_BROW)); break; case FaceParam.FACE_MAKEUP_TYPE_EYE_SHADOW: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_SHADOW)); break; case FaceParam.FACE_MAKEUP_TYPE_EYE_LINER: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_LINER)); break; case FaceParam.FACE_MAKEUP_TYPE_EYE_LASH: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_LASH)); break; case FaceParam.FACE_MAKEUP_TYPE_HIGH_LIGHT: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_HIGH_LIGHT)); break; case FaceParam.FACE_MAKEUP_TYPE_SHADOW: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_SHADOW)); break; case FaceParam.FACE_MAKEUP_TYPE_EYE_PUPIL: changeRecyclerItemCount(5); setContainerRecycler(MakeupSource.buildCustomItemParams().get(MakeupSource.FACE_MAKEUP_TYPE_EYE_PUPIL)); break; default: setContainerRecycler(new ArrayList<>()); } } else if (tabTag instanceof FineStickerTagEntity) { FineStickerTagEntity tag = (FineStickerTagEntity) tabTag; FineStickerEntity sticker = FineStickerDataFactory.getInstance().loadStickerList(tag); ArrayList list = new ArrayList<>(); FineStickerEntity.DocsBean docsBean = new FineStickerEntity.DocsBean(); docsBean.set_id("-1"); list.add(docsBean); list.addAll(sticker.getDocs()); changeRecyclerItemCount(5); setContainerRecycler(list); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } private void changeRecyclerItemCount(int count) { containerRecycler.setLayoutManager(new GridLayoutManager(mContext, count)); } private void setContainerRecycler(ArrayList list) { if (containerAdapter == null) { containerAdapter = new ContainerRecyclerAdapter(mContext); containerAdapter.setSeekBar(seekBar); containerRecycler.setLayoutManager(new GridLayoutManager(mContext, 2)); containerRecycler.setAdapter(containerAdapter); } containerAdapter.setList(list); containerAdapter.notifyDataSetChanged(); } @Override public void onGetTags(String[] tags) { List list = FineStickerDataFactory.formatTag(tags); setTab(createTabs(list)); } @Override public void onGetList(String tag, FineStickerEntity fineSticker) { } @Override public void onDownload(FineStickerEntity.DocsBean entity) { } @Override public void onDownloadError(FineStickerEntity.DocsBean entity, String msg) { } }