From e0b348f92a9155aec2bb08d8aa4f2fad27b65bea Mon Sep 17 00:00:00 2001 From: eggmanQQQ <3671373519@qq.com> Date: Wed, 20 Nov 2024 15:06:13 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=20=20=E9=87=8D=E5=86=99=20=E8=A3=85?= =?UTF-8?q?=E6=89=AE=E5=95=86=E5=9F=8E=20,=20=E6=88=91=E7=9A=84=E8=A3=85?= =?UTF-8?q?=E6=89=AE=20,=20=E8=A3=85=E6=89=AE=E8=B5=A0=E9=80=81=20=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 6 + .../avroom/dialog/RoomNotifyCpBindDialog.kt | 6 +- .../app/avroom/widget/GiftEffectView.java | 43 +- .../java/com/chwl/app/base/BaseActivity.java | 65 +- .../com/chwl/app/base/BaseDialogFragment.kt | 11 +- .../com/chwl/app/base/BaseListFragment.kt | 108 +++ .../chwl/app/base/BaseViewBindingActivity.kt | 7 + .../app/bindadapter/BaseBindingAdapter.kt | 4 +- .../app/decoration/adapter/DressUpAdapter.kt | 99 +++ .../adapter/MyUserCardWearAdapter.java | 2 +- .../chwl/app/decoration/ui/DressUpDialog.kt | 137 ++++ .../ui/activity/DressUpTabActivity.kt | 213 ++++++ .../ui/fragment/DressUpMyFragment.kt | 490 ++++++++++++ .../ui/fragment/DressUpStoreFragment.kt | 170 +++++ .../chwl/app/decoration/util/DressUpUtil.kt | 260 +++++++ .../view/DecorationStoreActivity.kt | 3 +- .../java/com/chwl/app/event/DressUpEvent.java | 29 + .../app/friend/view/SelectFriendActivity.java | 2 +- .../com/chwl/app/home/fragment/MeFragment.kt | 4 +- .../app/support/PreloadResourceViewModel.kt | 40 +- .../com/chwl/app/ui/im/RouterHandler.java | 44 +- .../app/ui/im/chat/MsgViewHolderText.java | 10 +- .../chwl/app/ui/search/SearchUserActivity.kt | 158 ++++ .../ui/user/activity/UserCpListActivity.kt | 8 +- .../java/com/chwl/app/ui/utils/ImageLoad.kt | 11 +- .../com/chwl/app/ui/webview/JSInterface.java | 118 ++- .../webview/baishun/BaiShunGameWebFragment.kt | 7 +- .../baishun/LeaderccGameWebFragment.kt | 4 +- .../chwl/app/ui/widget/UserInfoDialog.java | 2 +- .../com/chwl/app/utils/RoomBoomManager.kt | 2 +- .../app/vip/adapter/VipCenterBannerAdapter.kt | 3 +- .../res/drawable-xxhdpi/ic_derss_avatar.webp | Bin 0 -> 872 bytes .../drawable-xxhdpi/ic_dress_dialog_bg.webp | Bin 0 -> 24694 bytes .../drawable-xxhdpi/ic_dress_dialog_line.webp | Bin 0 -> 488 bytes .../drawable-xxhdpi/ic_dress_item_long_n.webp | Bin 0 -> 2784 bytes .../drawable-xxhdpi/ic_dress_item_long_s.webp | Bin 0 -> 2898 bytes .../res/drawable-xxhdpi/ic_dress_item_n.webp | Bin 0 -> 2550 bytes .../res/drawable-xxhdpi/ic_dress_item_s.webp | Bin 0 -> 2676 bytes .../res/drawable-xxhdpi/ic_dress_play.webp | Bin 0 -> 674 bytes .../drawable-xxhdpi/ic_dress_tab_bg_n.webp | Bin 0 -> 762 bytes .../drawable-xxhdpi/ic_dress_tab_bg_s.webp | Bin 0 -> 1220 bytes .../res/drawable-xxhdpi/ic_dress_tab_car.webp | Bin 0 -> 3406 bytes .../drawable-xxhdpi/ic_dress_tab_card.webp | Bin 0 -> 3328 bytes .../drawable-xxhdpi/ic_dress_tab_chat.webp | Bin 0 -> 3306 bytes .../drawable-xxhdpi/ic_dress_tab_head.webp | Bin 0 -> 3586 bytes .../ic_dress_tab_homepage.webp | Bin 0 -> 3226 bytes .../ic_dress_tab_nameplate.webp | Bin 0 -> 3126 bytes .../res/drawable-xxhdpi/ic_dress_top_bg.webp | Bin 0 -> 210886 bytes .../main/res/layout/activity_dress_up_tab.xml | 193 +++++ .../main/res/layout/activity_search_user.xml | 66 ++ .../main/res/layout/activity_user_info.xml | 8 +- .../main/res/layout/base_list_fragment.xml | 31 + app/src/main/res/layout/dialog_dress_up.xml | 117 +++ .../res/layout/item_decoration_common.xml | 1 + .../main/res/layout/item_dress_up_layout.xml | 150 ++++ app/src/main/res/layout/item_search_user.xml | 64 ++ .../main/res/layout/tab_dress_up_layout.xml | 41 + app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 8 + .../main/res/xml/network_security_config.xml | 2 + .../core/decoration/bean/DecorationInfo.kt | 9 +- .../core/decoration/bean/DressUpInfo.java | 45 ++ .../chwl/core/decoration/bean/ShopMine.java | 20 + .../decoration/headwear/HeadwearModel.java | 1 + .../java/com/chwl/core/home/bean/TabInfo.java | 7 + .../chwl/core/room/face/DynamicFaceModel.java | 25 +- .../com/chwl/core/utils/ImageSplitter.java | 1 + .../library}/utils/BitmapLruCacheHelper.java | 2 +- .../java/com/chwl/library/widget/SVGAView.kt | 142 +++- .../tab/SmartTabIndicationInterpolator.java | 96 +++ .../library/widget/tab/SmartTabLayout.java | 644 ++++++++++++++++ .../library/widget/tab/SmartTabLayout2.java | 705 ++++++++++++++++++ .../library/widget/tab/SmartTabStrip.java | 446 +++++++++++ .../chwl/library/widget/tab/TabColorizer.java | 19 + .../library/widget/tab/TabTitleProvider.java | 8 + .../com/chwl/library/widget/tab/Utils.java | 120 +++ .../widget/tab/util/FragmentPageAdapter.kt | 19 + .../library/widget/tab/util/PagerItem.java | 38 + .../library/widget/tab/util/PagerItems.java | 34 + .../widget/tab/util/ViewPagerItem.java | 45 ++ .../widget/tab/util/ViewPagerItemAdapter.java | 83 +++ .../widget/tab/util/ViewPagerItems.java | 64 ++ .../library/widget/tab/util/v4/Bundler.java | 520 +++++++++++++ .../widget/tab/util/v4/FragmentPagerItem.java | 76 ++ .../tab/util/v4/FragmentPagerItemAdapter.java | 84 +++ .../tab/util/v4/FragmentPagerItems.java | 81 ++ .../v4/FragmentStatePagerItemAdapter.java | 84 +++ .../library/widget/text/DrawableTextView.java | 2 +- library/src/main/res/values/attrs.xml | 60 ++ .../library/common/glide/AnimEffectUtil.kt | 434 +++++++++++ .../chwl/library/common/glide/GlideUtils.kt | 33 + .../com/chwl/library/common/util/OtherExt.kt | 28 + .../spannable/SpannableTextBuilder.kt | 98 ++- mode.json | 279 ++++--- .../common/ui/imageview/CircleImageView.java | 5 +- 98 files changed, 6761 insertions(+), 347 deletions(-) create mode 100644 app/src/main/java/com/chwl/app/base/BaseListFragment.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/adapter/DressUpAdapter.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/ui/DressUpDialog.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/ui/activity/DressUpTabActivity.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpMyFragment.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpStoreFragment.kt create mode 100644 app/src/main/java/com/chwl/app/decoration/util/DressUpUtil.kt create mode 100644 app/src/main/java/com/chwl/app/event/DressUpEvent.java create mode 100644 app/src/main/java/com/chwl/app/ui/search/SearchUserActivity.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_derss_avatar.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_dialog_bg.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_dialog_line.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_item_long_n.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_item_long_s.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_item_n.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_item_s.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_play.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_n.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_s.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_car.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_card.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_chat.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_head.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_homepage.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_tab_nameplate.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dress_top_bg.webp create mode 100644 app/src/main/res/layout/activity_dress_up_tab.xml create mode 100644 app/src/main/res/layout/activity_search_user.xml create mode 100644 app/src/main/res/layout/base_list_fragment.xml create mode 100644 app/src/main/res/layout/dialog_dress_up.xml create mode 100644 app/src/main/res/layout/item_dress_up_layout.xml create mode 100644 app/src/main/res/layout/item_search_user.xml create mode 100644 app/src/main/res/layout/tab_dress_up_layout.xml create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java rename {core/src/main/java/com/chwl/core => library/src/main/java/com/chwl/library}/utils/BitmapLruCacheHelper.java (98%) create mode 100644 library/src/main/java/com/chwl/library/widget/tab/SmartTabIndicationInterpolator.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout2.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/SmartTabStrip.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/TabColorizer.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/TabTitleProvider.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/Utils.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/FragmentPageAdapter.kt create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/PagerItem.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/PagerItems.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItem.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItemAdapter.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItems.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/v4/Bundler.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItem.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItemAdapter.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItems.java create mode 100644 library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentStatePagerItemAdapter.java create mode 100644 library/src/module_common/java/com/chwl/library/common/glide/AnimEffectUtil.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 129fae0ec..d518edcfc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -314,6 +314,12 @@ + + () { + GlideUtils.instance().downloadFromUrl2(getContext(), url, new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - - log("drawSvgaEffect onDownloadError url:" + url); + String message = ""; + if (e != null) { + message = e.getMessage(); + } + log("drawEffect drawSvgaEffect onDownloadError url:" + url + " error = "+message); effectHandler.sendEmptyMessage(0); return true; } @Override public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + String path = ""; if (resource != null) { - String path = resource.getPath(); - log("drawSvgaEffect onDownloadCompleted url:" + url + " path:" + path); + path = resource.getPath(); drawSvgaEffectFile(path); + } else { + effectHandler.sendEmptyMessage(0); } + log("drawEffect drawSvgaEffect onDownloadCompleted url:" + url + " path:" + path); return true; } + }); @@ -257,23 +264,33 @@ public class GiftEffectView extends RelativeLayout { } } - private void drawVAPEffect(String url) { - log("drawVAPEffect url:" + url); - GlideUtils.instance().downloadFromUrl(getContext(), url, new RequestListener() { + + private void drawVAPEffect(String url) { + log("drawEffect drawVAPEffect url:" + url); + + GlideUtils.instance().downloadFromUrl2(getContext(), url, new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - log("drawVAPEffect onDownloadError url:" + url); + String message = ""; + if (e != null) { + message = e.getMessage(); + } + log("drawEffect drawVAPEffect onDownloadError url:" + url + " error = "+message); effectHandler.sendEmptyMessageDelayed(0, 4000); return true; } @Override public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + String path = ""; if (resource != null) { - log("drawVAPEffect onDownloadCompleted url:" + url + " path:" + resource.getPath()); + path = resource.getPath(); vapAnimView.startPlay(resource); + } else { + effectHandler.sendEmptyMessage(0); } + log("drawEffect drawVAPEffect onDownloadCompleted url:" + url + " path:" + path); return true; } }); diff --git a/app/src/main/java/com/chwl/app/base/BaseActivity.java b/app/src/main/java/com/chwl/app/base/BaseActivity.java index cce9956f3..1e2adfb3f 100644 --- a/app/src/main/java/com/chwl/app/base/BaseActivity.java +++ b/app/src/main/java/com/chwl/app/base/BaseActivity.java @@ -46,34 +46,11 @@ import androidx.fragment.app.FragmentManager; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.chwl.app.notify.GlobalNotifyManager; -import com.chwl.app.utils.RoomBoomManager; -import com.chwl.core.gift.bean.BoomMsgAnimBean; -import com.chwl.core.gift.bean.BoomMsgDialogBean; -import com.chwl.core.im.custom.bean.BoomMsgAttachment; -import com.chwl.core.manager.AvRoomDataManager; -import com.chwl.core.utils.LogUtils; -import com.chwl.library.language.LanguageHelper; -import com.example.lib_utils.UiUtils; -import com.google.gson.Gson; -import com.netease.nim.uikit.common.util.log.LogUtil; -import com.netease.nimlib.chatroom.model.ChatRoomMessageImpl; -import com.netease.nimlib.sdk.NIMSDK; -import com.netease.nimlib.sdk.Observer; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; -import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; -import com.netease.nimlib.sdk.msg.model.BroadcastMessage; -import com.netease.nimlib.session.IMMessageImpl; -import com.orhanobut.logger.Logger; -import com.readystatesoftware.systembartint.SystemBarTintManager; -import com.tbruyelle.rxpermissions2.RxPermissions; -import com.trello.rxlifecycle3.android.ActivityEvent; -import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; import com.chwl.app.NimMiddleActivity; import com.chwl.app.R; +import com.chwl.app.application.App; import com.chwl.app.application.IReportConstants; import com.chwl.app.application.ReportManager; -import com.chwl.app.application.App; import com.chwl.app.avroom.activity.AVRoomActivity; import com.chwl.app.common.LoadingFragment; import com.chwl.app.common.NetworkErrorFragment; @@ -83,6 +60,7 @@ import com.chwl.app.common.permission.PermissionActivity; import com.chwl.app.common.widget.StatusLayout; import com.chwl.app.common.widget.dialog.DialogManager; import com.chwl.app.common.widget.dialog.DialogUiHelper; +import com.chwl.app.notify.GlobalNotifyManager; import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity; import com.chwl.app.ui.login.AddUserInfoActivity; import com.chwl.app.ui.login.LoginCodeActivity; @@ -94,14 +72,18 @@ import com.chwl.app.ui.widget.dialog.AllPlayEffectDialog; import com.chwl.app.ui.widget.dialog.AllServiceGiftLevelDialog; import com.chwl.app.ui.widget.dialog.AllServiceVipLevelUPDialog; import com.chwl.app.ui.widget.dialog.OpenNobleGlobalNoticeDialog; +import com.chwl.app.utils.RoomBoomManager; import com.chwl.app.utils.UserUtils; import com.chwl.core.XConstants; import com.chwl.core.bean.BaseProtocol; +import com.chwl.core.gift.bean.BoomMsgDialogBean; +import com.chwl.core.im.custom.bean.BoomMsgAttachment; import com.chwl.core.im.custom.bean.CustomAttachment; import com.chwl.core.im.custom.bean.NotifyH5Info; import com.chwl.core.im.custom.bean.PlayEffectInfo; import com.chwl.core.im.custom.bean.RoomLuckySeaMsgBean; import com.chwl.core.im.custom.bean.TarotMsgBean; +import com.chwl.core.manager.AvRoomDataManager; import com.chwl.core.manager.IMNetEaseManager; import com.chwl.core.manager.RoomEvent; import com.chwl.core.mentoring_relationship.event.GrabApprenticesEvent; @@ -115,8 +97,10 @@ import com.chwl.core.pay.bean.WalletInfo; import com.chwl.core.room.model.AvRoomModel; import com.chwl.core.treasurefairy.bean.FairyMsgInfoBean; import com.chwl.core.user.UserModel; +import com.chwl.core.utils.LogUtils; import com.chwl.core.utils.net.RxHelper; import com.chwl.core.vip.bean.VipMessageInfo; +import com.chwl.library.language.LanguageHelper; import com.chwl.library.rxbus.RxBus; import com.chwl.library.utils.NetworkUtils; import com.chwl.library.utils.ResUtil; @@ -125,6 +109,22 @@ import com.chwl.library.utils.UIUtils; import com.chwl.library.utils.codec.DESUtils; import com.chwl.library.utils.config.BasicConfig; import com.chwl.library.utils.log.MLog; +import com.example.lib_utils.UiUtils; +import com.google.gson.Gson; +import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.chatroom.model.ChatRoomMessageImpl; +import com.netease.nimlib.sdk.NIMSDK; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.model.BroadcastMessage; +import com.netease.nimlib.session.IMMessageImpl; +import com.orhanobut.logger.Logger; +import com.readystatesoftware.systembartint.SystemBarTintManager; +import com.tbruyelle.rxpermissions2.RxPermissions; +import com.trello.rxlifecycle3.android.ActivityEvent; +import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -276,7 +276,7 @@ public abstract class BaseActivity extends RxAppCompatActivity } } - public void initBlackTitleBar(String title) { + public void initDarkTitleBar(String title) { mTitleBar = findViewById(R.id.title_bar); if (mTitleBar != null) { mTitleBar.setTitle(title); @@ -285,6 +285,21 @@ public abstract class BaseActivity extends RxAppCompatActivity mTitleBar.setLeftImageResource(R.drawable.icon_user_back); mTitleBar.setBackgroundResource(R.color.transparent); mTitleBar.setLeftClickListener(v -> onLeftClickListener()); + StatusBarUtil.StatusBarLightMode(this,false); + StatusBarUtil.transparencyBar(this); + } + } + public void initLightTitleBar(String title) { + mTitleBar = findViewById(R.id.title_bar); + if (mTitleBar != null) { + mTitleBar.setTitle(title); + mTitleBar.setImmersive(false); + mTitleBar.setTitleColor(getResources().getColor(R.color.text_title_color)); + mTitleBar.setLeftImageResource(R.drawable.arrow_left); + mTitleBar.setBackgroundResource(R.color.transparent); + mTitleBar.setLeftClickListener(v -> onLeftClickListener()); + StatusBarUtil.StatusBarLightMode(this,true); + StatusBarUtil.transparencyBar(this); } } diff --git a/app/src/main/java/com/chwl/app/base/BaseDialogFragment.kt b/app/src/main/java/com/chwl/app/base/BaseDialogFragment.kt index d1b84d433..40140b629 100644 --- a/app/src/main/java/com/chwl/app/base/BaseDialogFragment.kt +++ b/app/src/main/java/com/chwl/app/base/BaseDialogFragment.kt @@ -5,7 +5,11 @@ import android.content.DialogInterface import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager import androidx.lifecycle.LifecycleOwner @@ -27,6 +31,7 @@ abstract class BaseDialogFragment : RxDialogFragment() { open var height = WindowManager.LayoutParams.WRAP_CONTENT open var gravity = Gravity.CENTER open var dimAmount = 0.5f + var mActionCallBack : Action?= null override fun onStart() { super.onStart() @@ -120,4 +125,8 @@ abstract class BaseDialogFragment : RxDialogFragment() { } abstract fun init() + + public interface Action{ + fun onAction(type:Int,data:D?) + } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/base/BaseListFragment.kt b/app/src/main/java/com/chwl/app/base/BaseListFragment.kt new file mode 100644 index 000000000..e3702379b --- /dev/null +++ b/app/src/main/java/com/chwl/app/base/BaseListFragment.kt @@ -0,0 +1,108 @@ +package com.chwl.app.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chwl.app.R +import com.chwl.app.bindadapter.BaseBindingAdapter +import com.chwl.app.databinding.BaseListFragmentBinding +import com.chwl.library.common.util.setVis +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadmoreListener + +abstract class BaseListFragment: + BaseViewBindingFragment() { + + lateinit var mAdapter: BaseBindingAdapter<*, D> + protected var mPageSize = 20; + protected var mPage = 1; + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = BaseListFragmentBinding.inflate(layoutInflater) + return binding.root + } + + + + override fun init() { + mAdapter = getAdapter() + + binding.rvList.layoutManager = getLayoutManager() + binding.rvList.adapter = mAdapter + + binding.srlLayout.setOnRefreshLoadmoreListener(object : OnRefreshLoadmoreListener { + override fun onRefresh(refreshlayout: RefreshLayout?) { + onRefresh() + } + + override fun onLoadmore(refreshlayout: RefreshLayout?) { + onLoad() + } + }) + mAdapter.onItemClickListener = BaseQuickAdapter.OnItemClickListener { adapter, view, position -> + onItemClicks(mAdapter, view, position) + } + mAdapter.onItemChildClickListener = BaseQuickAdapter.OnItemChildClickListener { adapter, view, position -> + onItemChildClicks(mAdapter, view, position) + } + initView() + } + + abstract fun getAdapter(): BaseBindingAdapter<*, D> + + protected open fun getLayoutManager(): RecyclerView.LayoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false) + protected open fun hasTitle(): Boolean = false + + protected open fun onItemClicks( + adapter: BaseBindingAdapter<*, D>?, + view: View?, + position: Int + ) {} + protected open fun onItemChildClicks( + adapter: BaseBindingAdapter<*, D>?, + view: View?, + position: Int + ) {} + + abstract fun onLoad() + abstract fun onRefresh() + + + abstract fun initView() + + protected open fun stopAnim() { + binding.srlLayout.finishLoadmore() + binding.srlLayout.finishRefresh() + } + + var mTitleBar : TitleBar?=null + open fun initWhiteTitleBar(title: String?,listener:View.OnClickListener) { + mTitleBar = _binding?.root?.findViewById(R.id.title_bar) + if (mTitleBar != null) { + mTitleBar?.setTitle(title) + mTitleBar?.setImmersive(false) + mTitleBar?.setTitleColor(resources.getColor(R.color.text_title_color)) + mTitleBar?.setLeftImageResource(R.drawable.arrow_left) + mTitleBar?.setBackgroundResource(R.color.transparent) + mTitleBar?.setLeftClickListener(listener) + mTitleBar?.setVis(true) + } + } + + fun initBlackTitleBar(title: String?,listener:View.OnClickListener) { + mTitleBar = _binding?.root?.findViewById(R.id.title_bar) + if (mTitleBar != null) { + mTitleBar?.setTitle(title) + mTitleBar?.setImmersive(false) + mTitleBar?.setTitleColor(resources.getColor(R.color.white)) + mTitleBar?.setLeftImageResource(R.drawable.icon_user_back) + mTitleBar?.setBackgroundResource(R.color.transparent) + mTitleBar?.setLeftClickListener(listener) + mTitleBar?.setVis(true) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/base/BaseViewBindingActivity.kt b/app/src/main/java/com/chwl/app/base/BaseViewBindingActivity.kt index 3c301a5cc..29b801b51 100644 --- a/app/src/main/java/com/chwl/app/base/BaseViewBindingActivity.kt +++ b/app/src/main/java/com/chwl/app/base/BaseViewBindingActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import androidx.annotation.Nullable import androidx.viewbinding.ViewBinding +import com.netease.nim.uikit.StatusBarUtil import java.lang.reflect.ParameterizedType @@ -20,6 +21,11 @@ abstract class BaseViewBindingActivity : BaseActivity(){ val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java) binding = method.invoke(null,layoutInflater) as T setContentView(binding.root) + + if (transparencyBar()) { + StatusBarUtil.transparencyBar(this) + } + init() } @@ -29,4 +35,5 @@ abstract class BaseViewBindingActivity : BaseActivity(){ protected open fun initBefore(@Nullable savedInstanceState: Bundle?) {} abstract fun init() + protected open fun transparencyBar():Boolean=false } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/bindadapter/BaseBindingAdapter.kt b/app/src/main/java/com/chwl/app/bindadapter/BaseBindingAdapter.kt index b36b29b3c..0329e2396 100644 --- a/app/src/main/java/com/chwl/app/bindadapter/BaseBindingAdapter.kt +++ b/app/src/main/java/com/chwl/app/bindadapter/BaseBindingAdapter.kt @@ -15,8 +15,8 @@ open class BaseBindingAdapter() : BaseQuickAdapter - val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java) - val binding = method.invoke(null, mLayoutInflater) as VB + val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java,ViewGroup::class.java, Boolean::class.java) + val binding = method.invoke(null, mLayoutInflater,parent,false) as VB val view = binding?.root?:return View(mContext) view.setTag(R.id.BaseQuickAdapter_databinding_support, binding) return view diff --git a/app/src/main/java/com/chwl/app/decoration/adapter/DressUpAdapter.kt b/app/src/main/java/com/chwl/app/decoration/adapter/DressUpAdapter.kt new file mode 100644 index 000000000..6cfe3b80f --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/adapter/DressUpAdapter.kt @@ -0,0 +1,99 @@ +package com.chwl.app.decoration.adapter + +import android.view.Gravity +import com.chwl.app.R +import com.chwl.app.bindadapter.BaseBindingAdapter +import com.chwl.app.bindadapter.BaseBindingViewHolder +import com.chwl.app.databinding.ItemDressUpLayoutBinding +import com.chwl.app.decoration.ui.activity.DressUpTabActivity +import com.chwl.app.decoration.util.DressUpUtil +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.library.common.util.isVerify +import com.chwl.library.common.util.setVis +import com.example.lib_utils.ktx.getString + +class DressUpAdapter : BaseBindingAdapter() { + + override fun convert( + helper: BaseBindingViewHolder, + item: DressUpInfo + ) { + val binding = helper.binding + setViewDef(binding) + + + + if (item.isSelect) { + binding.root.setBackgroundResource(R.drawable.ic_dress_item_s) + } else { + binding.root.setBackgroundResource(R.drawable.ic_dress_item_n) + } + + if (item.isNull) { + binding.empty.setVis(true) + binding.name.text = R.string.Not_used.getString() + binding.name.setVis(true) + return + } + + DressUpUtil.setItemPic(item,binding.picLayout) + binding.picLayout.setVis(true) + + + binding.name.text = item.name + binding.name.gravity = if (item.isMy) Gravity.CENTER else Gravity.START + binding.name.setVis(true) + + + DressUpUtil.setTextPrice(binding.price,item) + binding.price.setVis(!item.isMy) + + + binding.discount.text = item.discount.toString() + binding.discount.setVis(!item.isMy) + + + if (item.dressType != DressUpTabActivity.TAB_USER_CARD && item.effect.isVerify()) { + binding.btnPlay.setVis(true) + } else { + binding.btnPlay.setVis(false) + } + + if (item.isMy) { + if (item.isHasExpired) { + binding.limit.setVis(true) + binding.limit.text = R.string.Expired.getString() + } else { + if (item.expireDays != -1) { + binding.limit.text = R.string.sDays.getString(item.expireDays) + } else { + binding.limit.text = R.string.unDay.getString() + } + } + } else { + if (item.dressLimitStatus != 0) { + binding.limit.setVis(true) + } else { + binding.limit.setVis(false) + } + } + + + + + helper.addOnClickListener(R.id.btnPlay) + + } + + private fun setViewDef(binding : ItemDressUpLayoutBinding) { +// binding.bg.setVis(false) +// binding.picBg.setVis(false) + binding.picLayout.setVis(false) +// binding.name.setVis(false) + binding.price.setVis(false) + binding.discount.setVis(false) + binding.empty.setVis(false) + binding.btnPlay.setVis(false) + binding.limit.setVis(false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/adapter/MyUserCardWearAdapter.java b/app/src/main/java/com/chwl/app/decoration/adapter/MyUserCardWearAdapter.java index 11db79b8d..16bb7c0a8 100644 --- a/app/src/main/java/com/chwl/app/decoration/adapter/MyUserCardWearAdapter.java +++ b/app/src/main/java/com/chwl/app/decoration/adapter/MyUserCardWearAdapter.java @@ -37,7 +37,7 @@ public class MyUserCardWearAdapter extends BaseAdapter { ItemMyUserCardWearBinding binding = (ItemMyUserCardWearBinding) helper.getBinding(); binding.ivUserCardWearMp4.setLoop(Integer.MAX_VALUE); - GlideUtils.instance().downloadFromUrl(binding.ivUserCardWearMp4.getContext(), item.getPic(), new RequestListener() { + GlideUtils.instance().downloadFromUrl2(binding.ivUserCardWearMp4.getContext(), item.getPic(), new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { ImageLoadUtils.loadImage(mContext, item.getPic(), binding.ivUserCardWear); diff --git a/app/src/main/java/com/chwl/app/decoration/ui/DressUpDialog.kt b/app/src/main/java/com/chwl/app/decoration/ui/DressUpDialog.kt new file mode 100644 index 000000000..b1f3ba5cc --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/ui/DressUpDialog.kt @@ -0,0 +1,137 @@ +package com.chwl.app.decoration.ui + +import android.view.Gravity +import com.chwl.app.R +import com.chwl.app.base.BaseDialogFragment +import com.chwl.app.databinding.DialogDressUpBinding +import com.chwl.app.decoration.util.DressUpUtil +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.common.util.ClickUtils.click +import com.chwl.library.common.util.doToast +import com.chwl.library.net.rxnet.RxNet +import com.example.lib_utils.ktx.dp +import com.example.lib_utils.ktx.getString +import com.hjq.toast.ToastUtils +import io.reactivex.Single +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.POST + +class DressUpDialog : BaseDialogFragment() { + + override var width = 284.dp + override var height = 353.dp + override var dimAmount = 0.3f + override var gravity = Gravity.CENTER + + + var mDressUpInfo : DressUpInfo? = null + var mTargetUid = -1L + + override fun init() { + + mDressUpInfo?.let { + binding.name.text = it.name + if (it.vipLimit == 0 && it.obtainWay == 1){ + DressUpUtil.setTextPrice(binding.price,it) + }else{ + if (it.obtainWay != 1) { + binding.price.text = R.string.obtainWayAction.getString() + }else if (it.vipLimit != 0) { + binding.price.text = R.string.vipLimit.getString(it.vipLimit) + } + } + + DressUpUtil.setItemPic(it,binding.picLayout) + + } + + binding.btnBuy.text = if (mTargetUid != -1L) R.string.fairy_give.getString() else R.string.buy.getString() + + binding.btnBuy.click { + mDressUpInfo?.let { + if (mTargetUid != -1L) { + postShopGive(it.dressType,it.id,mTargetUid) + .compose(bindToLifecycle()) + .doOnSuccess{ + ToastUtils.show(R.string.doSuccess) + dismiss() + } + .doOnError { + it?.message?.doToast() + } + .subscribe() + } else { + postShopBuy(it.dressType,it.id) + .compose(bindToLifecycle()) + .doOnSuccess{ + ToastUtils.show(R.string.doSuccess) + dismiss() + } + .doOnError { + it?.message?.doToast() + } + .subscribe() + } + } + + } + binding.btnCancel.click { + dismiss() + } + + + + } + + + private fun postShopBuy(dressType: Int,id: Int): Single { + return api.postShopBuy(dressType,id) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + + private fun postShopGive(dressType: Int,id: Int,targetUid:Long): Single { + return api.postShopGive(dressType,id,targetUid) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + private val api: Api = RxNet.create(Api::class.java); + interface Api { + + /** + * 购买装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/buy") + fun postShopBuy( + @Field("dressType") dressType: Int, + @Field("id") id: Int + ): Single> + + + + /** + * 赠送装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/give") + fun postShopGive( + @Field("dressType") dressType: Int, + @Field("id") id: Int, + @Field("targetUid") targetUid: Long, + ): Single> + + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/ui/activity/DressUpTabActivity.kt b/app/src/main/java/com/chwl/app/decoration/ui/activity/DressUpTabActivity.kt new file mode 100644 index 000000000..db8d6eec4 --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/ui/activity/DressUpTabActivity.kt @@ -0,0 +1,213 @@ +package com.chwl.app.decoration.ui.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.viewpager2.widget.ViewPager2 +import com.alibaba.fastjson.JSON +import com.chwl.app.R +import com.chwl.app.base.BaseViewBindingActivity +import com.chwl.app.databinding.ActivityDressUpTabBinding +import com.chwl.app.databinding.TabDressUpLayoutBinding +import com.chwl.app.decoration.ui.DressUpDialog +import com.chwl.app.decoration.ui.fragment.DressUpMyFragment +import com.chwl.app.decoration.ui.fragment.DressUpStoreFragment +import com.chwl.app.decoration.util.DressUpUtil +import com.chwl.app.event.DressUpEvent +import com.chwl.app.ui.search.SearchUserActivity +import com.chwl.app.ui.utils.loadAvatar +import com.chwl.app.utils.AvatarHelper.loadAvatarFrame +import com.chwl.core.auth.AuthModel +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.home.bean.TabInfo +import com.chwl.core.user.UserModel +import com.chwl.library.common.util.ClickUtils.click +import com.chwl.library.common.util.setVis +import com.chwl.library.utils.ResUtil +import com.chwl.library.widget.tab.SmartTabLayout2 +import com.chwl.library.widget.tab.TabTitleProvider +import com.chwl.library.widget.tab.util.FragmentPageAdapter +import com.example.lib_utils.ktx.getString +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class DressUpTabActivity : BaseViewBindingActivity() { + + private var mDressUpInfo : DressUpInfo ? = null + + + + companion object{ + const val TAB_HEAD_WEAR = 0 + const val TAB_CAR = 1 + const val TAB_NAMEPLATE = 2 + const val TAB_USER_CARD = 3 + const val TAB_CHAT_BUBBLE = 4 + const val TAB_USER_INFO_BG = 5 + + fun start(context: Context,isMy:Boolean) { + val intent = Intent(context, DressUpTabActivity::class.java) + intent.putExtra("isMy",isMy) + context.startActivity(intent) + } + } + + private val isMy : Boolean by lazy { intent.getBooleanExtra("isMy",false) } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + EventBus.getDefault().register(this) + } + + override fun transparencyBar() = true + + override fun init() { + + if (isMy) { + binding.infoLayout.setVis(true) + binding.btnMyDressUp.setVis(false) + binding.avatar.loadAvatar(UserModel.get().cacheLoginUserInfo?.avatar) + initDarkTitleBar(R.string.decoration_view_mydecorationactivity_01.getString()) + } else { + binding.infoLayout.setVis(false) + binding.btnMyDressUp.setVis(true) + initDarkTitleBar(R.string.decoration_view_decorationstoreactivity_01.getString()) + } + + initTab() + initListener() + + if (isMy) { + UserModel.get().getUserInfo(AuthModel.get().currentUid) + .compose(bindToLifecycle()) + .doOnSuccess { + it?.userHeadwear?.let { head-> + loadAvatarFrame( + binding.avatarHead, + head.getFirstUrl(), + head.type + ) + } + }.subscribe() + } + + } + + val fgLists = arrayListOf() + val tabList = arrayListOf() + private fun initTab() { + + tabList.clear() + tabList.add(TabInfo(TAB_CAR, ResUtil.getString(R.string.decoration_view_decorationstoreactivity_04),R.drawable.ic_dress_tab_car)) + tabList.add(TabInfo(TAB_HEAD_WEAR, ResUtil.getString(R.string.decoration_view_decorationstoreactivity_03),R.drawable.ic_dress_tab_head)) + tabList.add(TabInfo(TAB_NAMEPLATE, ResUtil.getString(R.string.decoration_view_decorationstoreactivity_05),R.drawable.ic_dress_tab_nameplate)) + tabList.add(TabInfo(TAB_USER_CARD, ResUtil.getString(R.string.decoration_view_decorationstoreactivity_06),R.drawable.ic_dress_tab_card)) + tabList.add(TabInfo(TAB_CHAT_BUBBLE, ResUtil.getString(R.string.decoration_view_decorationstoreactivity_07),R.drawable.ic_dress_tab_chat)) + tabList.add(TabInfo(TAB_USER_INFO_BG, ResUtil.getString(R.string.userInfoBg),R.drawable.ic_dress_tab_homepage)) + + fgLists.clear() + tabList.forEach { + if (isMy) { + fgLists.add(DressUpMyFragment.newInstance(it.id)) + } else { + fgLists.add(DressUpStoreFragment.newInstance(it.id)) + } + } + + binding.tabLayout.setCustomTabView(SmartTabLayout2.TabProvider { container, position, pageTitle -> + val tabView = TabDressUpLayoutBinding.inflate(this@DressUpTabActivity.layoutInflater,container,false) + tabView.tabText.text = tabList.get(position).name + tabView.tabImg.setImageResource(tabList.get(position).res) +// tabView.root.layoutParams = LinearLayout.LayoutParams( +// LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT +// ) + return@TabProvider tabView.root + }) + + val pageAdapter = FragmentPageAdapter(this,fgLists) + binding.tabLayout.setViewPager(binding.viewPage,pageAdapter,object : TabTitleProvider { + override fun getPageTitle(position: Int): CharSequence? { + return tabList.get(position).name + } + }) + + binding.viewPage.offscreenPageLimit = 6 + binding.viewPage.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + selectTab(position) + mDressUpInfo = null + binding.bottomView.visibility = View.INVISIBLE + } + }) + + } + + private fun initListener() { + binding.btnBuy.click { + mDressUpInfo?.let { + val dressUpDialog = DressUpDialog() + dressUpDialog.mDressUpInfo = it + dressUpDialog.show(context) + } + + } + + binding.btnGive.click { + mDressUpInfo?.let { + SearchUserActivity.start(context,JSON.toJSONString(it)) + } + } + + binding.btnMyDressUp.click { + DressUpTabActivity.start(context,true) + } + + binding.playLayout.click { + binding.playLayout.setVis(false) + binding.playLayout.removeAllViews() + } + } + + + + + private fun selectTab(pos: Int) { + for (i in 0 until tabList.size) { + val tabAt = binding.tabLayout.getTabAt(i) + val tabView = TabDressUpLayoutBinding.bind(tabAt) + tabView.tabBg.setBackgroundResource(if (pos == i) R.drawable.ic_dress_tab_bg_s else R.drawable.ic_dress_tab_bg_n) + tabView.tabText.alpha = if (pos == i) 1f else 0.5f + } + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onDressUpEvent(event: DressUpEvent) { + val data = event.data + when (event.action) { + DressUpEvent.Action.Select -> { + mDressUpInfo = data + binding.bottomView.setVis(true) + DressUpUtil.setTextPrice(binding.price,data) + if (isMy) { + if (data.dressType == TAB_HEAD_WEAR) { + binding.avatarHead.loadUrl(data.effect) + } + } + } + + DressUpEvent.Action.Play -> { + DressUpUtil.play(data,binding.playLayout) + } + + else -> {} + } + } + + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpMyFragment.kt b/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpMyFragment.kt new file mode 100644 index 000000000..91792aa86 --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpMyFragment.kt @@ -0,0 +1,490 @@ +package com.chwl.app.decoration.ui.fragment + +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chwl.app.R +import com.chwl.app.base.BaseListFragment +import com.chwl.app.bindadapter.BaseBindingAdapter +import com.chwl.app.common.EmptyViewHelper +import com.chwl.app.decoration.adapter.DressUpAdapter +import com.chwl.app.decoration.ui.activity.DressUpTabActivity +import com.chwl.app.decoration.util.DressUpUtil +import com.chwl.app.event.DressUpEvent +import com.chwl.core.auth.AuthModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.decoration.bean.ShopMine +import com.chwl.core.decoration.car.bean.CarInfo +import com.chwl.core.decoration.headwear.bean.ChatBubbleInfo +import com.chwl.core.decoration.headwear.bean.UserCardWearInfo +import com.chwl.core.decoration.nameplate.bean.NamePlateInfo +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.manager.IMNetEaseManager +import com.chwl.core.user.UserModel +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.common.util.doToast +import com.chwl.library.common.util.isVerify +import com.chwl.library.common.util.setMargin +import com.chwl.library.net.rxnet.RxNet +import com.example.lib_utils.ktx.getString +import io.reactivex.Single +import org.greenrobot.eventbus.EventBus +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +class DressUpMyFragment : BaseListFragment() { + + companion object { + fun newInstance(dressType: Int): DressUpMyFragment { + val args = Bundle() + args.putInt("dressType", dressType) + val fragment = DressUpMyFragment() + fragment.arguments = args + return fragment + } + } + + private val mDressType: Int by lazy { requireArguments().getInt("dressType") } + private var mPosition = -1 + + + override fun initView() { + + mAdapter.setEmptyView( + EmptyViewHelper.createEmptyTextViewHeight( + context, + R.string.empty_data.getString() + ) + ) + binding.rvList.setMargin(start = 10, end = 10) + + mPosition = -1 + mAdapter.setNewData(arrayListOf()) + } + + override fun onResume() { + super.onResume() + if (!mAdapter?.data.isVerify()){ + onRefresh() + } + } + + override fun getAdapter(): BaseBindingAdapter<*, DressUpInfo> { + return DressUpAdapter() + } + + override fun getLayoutManager(): RecyclerView.LayoutManager { + return GridLayoutManager(context, 2, RecyclerView.VERTICAL, false) + } + + + override fun onLoad() { + loadDataByType(false) + } + + + + override fun onRefresh() { + loadDataByType(true) + } + + private fun loadDataByType(isRefresh: Boolean) { + + if (isRefresh){ + mPage = 1 + } + + when (mDressType) { + + DressUpTabActivity.TAB_CHAT_BUBBLE -> { + getChatBubbleInfoList() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.forEach { + newData.add(DressUpUtil.tranData(it)) + } + setData(newData) + } + }.doOnError { + stopAnim() + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_USER_CARD -> { + getMyUserCardWearList() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.forEach { + newData.add(DressUpUtil.tranData(it)) + } + setData(newData) + } + }.doOnError { + stopAnim() + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_NAMEPLATE -> { + getNamePlateList() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.nameplateList.forEach { + newData.add(DressUpUtil.tranData(it)) + } + setData(newData) + } + }.doOnError { + stopAnim() + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_HEAD_WEAR , DressUpTabActivity.TAB_USER_INFO_BG -> { + getShopMine() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.forEach { + newData.add(DressUpUtil.tranData(it)) + } + setData(newData) + } + }.doOnError { + stopAnim() + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_CAR -> { + getUserCarsV2() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.forEach { + newData.add(DressUpUtil.tranData(it)) + } + setData(newData) + } + }.doOnError { + stopAnim() + it?.message?.doToast() + }.subscribe() + } + + else -> {} + } + + } + + private fun userByType( + data: DressUpInfo, + adapter: BaseBindingAdapter<*, DressUpInfo>?, + position: Int + ) { + when (mDressType) { + + DressUpTabActivity.TAB_CHAT_BUBBLE -> { + userChatBubble(data.dressId) + .compose(bindToLifecycle()) + .doOnSuccess { + //更新用户信息 + UserModel.get().updateCurrentUserInfo().subscribe() + setSelect(adapter, position) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_USER_CARD -> { + userMyUserCardWear(data.dressId) + .compose(bindToLifecycle()) + .doOnSuccess { + //更新用户信息 + UserModel.get().updateCurrentUserInfo().subscribe() + setSelect(adapter, position) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_NAMEPLATE -> { + useMyNamePlate(data.id,data.word) + .compose(bindToLifecycle()) + .doOnSuccess { + if (AvRoomDataManager.get().mCurrentRoomInfo != null) { + // 更新房间信息 + IMNetEaseManager.get().updateMyRoomRole() + } + //更新用户信息 + UserModel.get().updateCurrentUserInfo().subscribe() + setSelect(adapter, position) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_HEAD_WEAR , DressUpTabActivity.TAB_USER_INFO_BG-> { + postOptDress(data.dressType, data.dressId) + .compose(bindToLifecycle()) + .doOnSuccess { + //更新用户信息 + UserModel.get().updateCurrentUserInfo().subscribe() + setSelect(adapter, position) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + + DressUpTabActivity.TAB_CAR -> { + driveThisCar(data.dressId) + .compose(bindToLifecycle()) + .doOnSuccess { + //更换座驾状态,需要更新缓存 + UserModel.get().onlyUpdateLoginUserInfoCache() + setSelect(adapter, position) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + + else -> {} + } + } + + private fun setData(newData:MutableList) { + if (mPage == 1) { + val find = newData.indexOfFirst { it.isSelect() } + newData.add(0,DressUpUtil.getEmpty(find == -1)) + mPosition= if (find==-1) 0 else find+1 + mAdapter.setNewData(newData) + } else { + mAdapter.addData(newData) + } + + if (newData.size >= mPageSize) { + mPage++ + binding.srlLayout.isEnableLoadmore = true + } else { + binding.srlLayout.isEnableLoadmore = false + } + stopAnim() + } + + private fun setSelect(adapter: BaseBindingAdapter<*, DressUpInfo>?, position: Int) { + if (mPosition != -1) { + adapter?.data?.getOrNull(mPosition)?.isSelect = false + adapter?.notifyItemChanged(mPosition) + } + + mPosition = position + adapter?.data?.getOrNull(mPosition)?.isSelect = true + adapter?.notifyItemChanged(mPosition) + R.string.doSuccess.doToast() + } + + override fun onItemChildClicks( + adapter: BaseBindingAdapter<*, DressUpInfo>?, + view: View?, + position: Int + ) { + view?.id?.let { + when (it) { + R.id.btnPlay -> { + adapter?.data?.getOrNull(position)?.let { data -> + EventBus.getDefault().post(DressUpEvent(DressUpEvent.Action.Play, data)) + } + } + else -> {} + } + } + } + + override fun onItemClicks( + adapter: BaseBindingAdapter<*, DressUpInfo>?, + view: View?, + position: Int + ) { + adapter?.data?.getOrNull(position)?.let { data -> + EventBus.getDefault().post(DressUpEvent(DressUpEvent.Action.Select, data)) + if (!data.isSelect() && !data.isHasExpired){ + userByType(data,adapter, position) + } + } + } + + + private fun getShopMine(): Single> { + return api.getShopMine(mDressType,mPage,mPageSize) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun postOptDress(dressType: Int,dressId: Int): Single { + return api.postOptDress(dressType,dressId) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun getUserCarsV2(): Single> { + return api.requestMyCarsV2(AuthModel.get().currentUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun driveThisCar(carId: Int): Single { + val ticket = AuthModel.get().ticket + val uid = AuthModel.get().currentUid + return api.driveThisCar(ticket, uid, carId) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun getNamePlateList(): Single { + return api.getNamePlateList(AuthModel.get().currentUid.toString(), mPage.toString(), mPageSize.toString()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun useMyNamePlate(id: Int,word: String): Single { + val ticket = AuthModel.get().ticket + val uid = AuthModel.get().currentUid + return api.useMyNamePlate(ticket, uid.toString(), id.toString(),word) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun userMyHeadWear(id: Int): Single { + val ticket = AuthModel.get().ticket + val uid = AuthModel.get().currentUid + return api.userMyHeadWear(ticket, uid.toString(), id.toString()) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun getMyUserCardWearList(): Single> { + return api.getMyUserCardWearList(mPage,mPageSize) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun userMyUserCardWear(id: Int): Single { + return api.userMyUserCardWear(id.toString()) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + + private fun getChatBubbleInfoList(): Single> { + return api.getChatBubbleInfoList(mPage,mPageSize) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun userChatBubble(id: Int): Single { + return api.userChatBubble(id.toString()) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()) + } + + + private val api: Api = RxNet.create(Api::class.java); + + interface Api { + + /** + * 获取 我的装扮 : dressType : 5-个人主页背景 + */ + @GET("/dress/shop/mine") + fun getShopMine(@Query("dressType") dressType: Int,@Query("page") page: Int,@Query("pageSize") pageSize: Int): Single>> + + /** + * 购买装扮 + */ + @GET("/dress/shop/optDress") + fun postOptDress(@Query("dressType") dressType: Int, @Query("dressId") id: Int): Single> + + /** + * 使用座驾 + * + * @param ticket 用户的ticket + * @param uid 用户的uid + * @param carId 座驾的id,id=0 则表示不使用座驾,id!=0 表示使用该carId的座驾 + */ + @POST("/car/carport/use") + @FormUrlEncoded + fun driveThisCar(@Field("ticket") ticket: String?, @Field("uid") uid: Long, @Field("carId") carId: Int): Single> + + /** + * 获取自己的车库V2 + * + * @param uid - + * @return - + */ + @GET("car/carport/v2/list") + fun requestMyCarsV2(@Query("uid") uid: Long): Single>> + + /** + * 使用头饰 + */ + @POST("v1/user/headwear/use") + fun userMyHeadWear(@Query("ticket") ticket: String?,@Query("uid") uid: String?, @Query("headwearId") headwear_id: String?): Single> + + /** + * 获取铭牌列表 + */ + @POST("nameplate/userNameplateList") + fun getNamePlateList(@Query("uid") uid: String?, @Query("page") page: String?, @Query("pageSize") pageSize: String?): Single?> + + @POST("nameplate/useNameplate") + fun useMyNamePlate(@Query("uid") uid: String?, @Query("ticket") ticket: String?, @Query("userNameplateId") id: String?, @Query("word") word: String?): Single> + + + /** + * 分页获取用户资料卡装扮列表 + */ + @GET("userInfoCard/listByPage") + fun getMyUserCardWearList(@Query("page") page: Int, @Query("pageSize") pageSize: Int): Single>> + + /** + * 使用资料卡装扮 + */ + @GET("userInfoCard/optUserInfoCard") + fun userMyUserCardWear(@Query("cardId") cardId: String?): Single> + + + /** + * 分页获取用户聊天气泡列表 + */ + @GET("userChatBubble/listByPage") + fun getChatBubbleInfoList(@Query("page") page: Int, @Query("pageSize") pageSize: Int): Single>> + + /** + * 使用聊天气泡 + */ + @FormUrlEncoded + @POST("userChatBubble/optUserChatBubble") + fun userChatBubble(@Field("bubbleId") cardId: String?): Single> + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpStoreFragment.kt b/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpStoreFragment.kt new file mode 100644 index 000000000..cbfeb3d8c --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/ui/fragment/DressUpStoreFragment.kt @@ -0,0 +1,170 @@ +package com.chwl.app.decoration.ui.fragment + +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chwl.app.R +import com.chwl.app.base.BaseListFragment +import com.chwl.app.bindadapter.BaseBindingAdapter +import com.chwl.app.common.EmptyViewHelper +import com.chwl.app.decoration.adapter.DressUpAdapter +import com.chwl.app.decoration.util.DressUpUtil +import com.chwl.app.event.DressUpEvent +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.decoration.bean.DecorationInfo +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.common.util.doToast +import com.chwl.library.common.util.setMargin +import com.chwl.library.net.rxnet.RxNet +import com.example.lib_utils.ktx.getString +import io.reactivex.Single +import org.greenrobot.eventbus.EventBus +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +class DressUpStoreFragment: BaseListFragment() { + + private var mPosition = -1 + + companion object { + fun newInstance(dressType: Int): DressUpStoreFragment { + val args = Bundle() + args.putInt("dressType", dressType) + val fragment = DressUpStoreFragment() + fragment.arguments = args + return fragment + } + } + + private val mDressType: Int by lazy { requireArguments().getInt("dressType") } + + override fun initView() { + + binding.srlLayout.isEnableRefresh = false + binding.srlLayout.isEnableLoadmore = false + + mAdapter.setEmptyView(EmptyViewHelper.createEmptyTextViewHeight(context, R.string.empty_data.getString())) + binding.rvList.setMargin(start = 10, end = 10) + + } + + override fun onResume() { + super.onResume() + mPosition = -1 + onLoad() + } + + override fun getAdapter(): BaseBindingAdapter<*, DressUpInfo> { + return DressUpAdapter() + } + + override fun getLayoutManager(): RecyclerView.LayoutManager { + return GridLayoutManager(context,2,RecyclerView.VERTICAL,false) + } + + + override fun onLoad() { + getShopList() + .compose(bindToLifecycle()) + .doOnSuccess { + it?.let { + val newData = mutableListOf() + it.forEach { + newData.add(DressUpUtil.tranData(it)) + } + mAdapter.setNewData(newData) + } + } + .doOnError { + it?.message?.doToast() + } + .subscribe() + } + + override fun onRefresh() { + + } + + override fun onItemChildClicks(adapter: BaseBindingAdapter<*, DressUpInfo>?, view: View?, position: Int) { + view?.id?.let { + when (it) { + R.id.btnPlay -> { + adapter?.data?.getOrNull(position)?.let { data-> + EventBus.getDefault().post(DressUpEvent(DressUpEvent.Action.Play,data)) + } + } + else -> {} + } + } + } + + override fun onItemClicks(adapter: BaseBindingAdapter<*, DressUpInfo>?, view: View?, position: Int) { + adapter?.data?.getOrNull(position)?.let { data -> + + if (mPosition != -1) { + adapter?.data?.getOrNull(mPosition)?.isSelect = false + adapter?.notifyItemChanged(mPosition) + } + + mPosition = position + adapter?.data?.getOrNull(mPosition)?.isSelect = true + adapter?.notifyItemChanged(mPosition) + + EventBus.getDefault().post(DressUpEvent(DressUpEvent.Action.Select, data)) + } + } + + + + private fun getShopList(): Single> { + return api.getShopList(mDressType) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private val api: Api = RxNet.create(Api::class.java); + interface Api { + /** + * 获取装扮商城列表 + * + * @return + */ + @GET("/dress/shop/list") + fun getShopList(@Query("dressType") dressType: Int): Single>> + + /** + * 购买装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/buy") + fun postShopBuy( + @Field("dressType") dressType: Int, + @Field("id") id: Int + ): Single> + + /** + * 赠送装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/give") + fun postShopGive( + @Field("dressType") dressType: Int, + @Field("id") id: Int, + @Field("targetUid") targetUid: Long, + ): Single> + + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/util/DressUpUtil.kt b/app/src/main/java/com/chwl/app/decoration/util/DressUpUtil.kt new file mode 100644 index 000000000..3a9523c42 --- /dev/null +++ b/app/src/main/java/com/chwl/app/decoration/util/DressUpUtil.kt @@ -0,0 +1,260 @@ +package com.chwl.app.decoration.util + +import android.graphics.Typeface +import android.view.ViewGroup +import android.widget.ImageView +import com.chwl.app.R +import com.chwl.app.avroom.widget.GalleryLayoutManager.LayoutParams +import com.chwl.app.decoration.ui.activity.DressUpTabActivity +import com.chwl.app.decoration.ui.activity.DressUpTabActivity.Companion.TAB_HEAD_WEAR +import com.chwl.app.decoration.ui.activity.DressUpTabActivity.Companion.TAB_USER_CARD +import com.chwl.app.ui.utils.loadAnim2 +import com.chwl.app.ui.utils.loadImage +import com.chwl.core.decoration.bean.DecorationInfo +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.decoration.bean.ShopMine +import com.chwl.core.decoration.car.bean.CarInfo +import com.chwl.core.decoration.headwear.bean.ChatBubbleInfo +import com.chwl.core.decoration.headwear.bean.UserCardWearInfo +import com.chwl.core.decoration.nameplate.bean.NamePlateInfo +import com.chwl.library.common.util.isVerify +import com.chwl.library.common.util.setViewWH +import com.chwl.library.common.util.setVis +import com.chwl.library.widget.SVGAView +import com.chwl.library.widget.text.DrawableTextView +import com.example.lib_utils.ktx.getColor +import com.example.lib_utils.ktx.getString +import com.example.lib_utils.spannable.SpannableTextBuilder +import com.tencent.qgame.animplayer.AnimView +import com.tencent.qgame.animplayer.util.ScaleType + +class DressUpUtil { + companion object { + + fun getEmpty(use:Boolean): DressUpInfo { + val outData = DressUpInfo() + outData.dressId = 0 + outData.isMy = true + outData.isNull = true + outData.isSelect = use + return outData + } + + fun tranData(inData: DecorationInfo): DressUpInfo { + + val outData = DressUpInfo() + + outData.dressLimitStatus = inData.dressLimitStatus + outData.id = inData.id + outData.discount = inData.discount + outData.originalPrice = inData.dressPrice + outData.buyDay = inData.dressDay + outData.price = inData.discountPrice.toInt() + outData.name = inData.name + outData.pic = inData.pic + outData.effect = inData.effect + outData.effectType = inData.effectType + outData.dressType = inData.dressType + outData.vipLimit = inData.vipLimit + outData.dressId = inData.dressId + outData.obtainWay = inData.obtainWay + + return outData + } + + // 个人主页 , 头饰 + fun tranData(inData: ShopMine): DressUpInfo { + + val outData = DressUpInfo() + outData.isMy = true + outData.isSelect = inData.isUsed + outData.name = inData.name + outData.pic = inData.pic + outData.effect = inData.effect + outData.effectType = inData.effectType + outData.dressType = inData.dressType + outData.dressId = inData.dressId + outData.obtainWay = inData.obtainWay + + outData.hasExpired = inData.hasExpired + outData.expireDays = inData.expireDays + + return outData + } + + fun tranData(inData: ChatBubbleInfo): DressUpInfo { + + val outData = DressUpInfo() + outData.isMy = true + outData.isSelect = inData.isHasUsed + outData.name = inData.name + outData.pic = inData.bubbleUrl + outData.dressType = DressUpTabActivity.TAB_CHAT_BUBBLE + if (inData.bubbleId.isVerify()) { + outData.dressId = inData.bubbleId.toInt() + } + outData.hasExpired = inData.isHasExpired + outData.expireDays = inData.expireDays + + return outData + } + + fun tranData(inData: UserCardWearInfo): DressUpInfo { + + val outData = DressUpInfo() + outData.isMy = true + outData.isSelect = inData.isUsed + outData.name = inData.name + outData.pic = inData.pic + outData.effect = inData.pic + outData.effectType = DressUpInfo.EffectType.MP4 + outData.dressType = DressUpTabActivity.TAB_USER_CARD + if (inData.cardId.isVerify()) { + outData.dressId = inData.cardId.toInt() + } + + outData.hasExpired = inData.isHasExpired + outData.expireDays = inData.expireDays + + return outData + } + + fun tranData(inData: NamePlateInfo.NameplateListBean): DressUpInfo { + + val outData = DressUpInfo() + outData.isMy = true + outData.isSelect = inData.isUsing + outData.name = inData.nameplateName + outData.word = inData.word + outData.pic = inData.nameplateImage + outData.dressType = DressUpTabActivity.TAB_NAMEPLATE + outData.dressId = inData.nameplateId + outData.id = inData.id + + outData.hasExpired = inData.isExpired + outData.expireDays = inData.expireDays + + return outData + } + + fun tranData(inData: CarInfo): DressUpInfo { + + val outData = DressUpInfo() + outData.isMy = true + outData.isSelect = inData.using == 1 + outData.name = inData.name + outData.pic = inData.pic + if (inData.viewUrl.isVerify()) { + outData.effect = inData.viewUrl + outData.effectType = inData.otherViewType + }else{ + outData.effect = inData.effect + outData.effectType = inData.otherViewType + } + outData.dressType = DressUpTabActivity.TAB_CAR + outData.dressId = inData.carId + + outData.hasExpired = inData.status != CarInfo.STATUS_USER_CAN_USE + +// val cTime = System.currentTimeMillis() +// val dTime = inData.expireDays - cTime +// val dDay = TimeUnit.MICROSECONDS.toDays(dTime) +// if (dDay < TimeUnit.DAYS.toMillis(1)) { +// // < 1 天 +// } else { +// // dDay天后过期 +// } + + outData.expireDays = inData.days + + return outData + } + + + + fun setTextPrice(textView: DrawableTextView, item: DressUpInfo) { + val message = R.string.s_sDays_s.getString(item.price, item.buyDay, item.originalPrice) + SpannableTextBuilder(textView).appendText(message) + .setTextStyle( + text = item.price.toString(), + textStyle = Typeface.BOLD + ).setTextStyle( + text = item.buyDay.toString(), + textStyle = Typeface.NORMAL + ).setTextStyle( + text = item.originalPrice.toString(), + textColor = R.color.color_d9e7f7.getColor(), + delLine = true + ).apply() + textView.setVis(true) + } + + fun setItemPic(data:DressUpInfo,layout: ViewGroup) { + if (data.dressType == DressUpTabActivity.TAB_USER_CARD) { + //此时传回的是mp4.. +// layout.setViewWH() + play(data,layout,true) + } else { + layout.removeAllViews() + val pic = ImageView(layout.context) + layout.addView(pic) + if (data.dressType == DressUpTabActivity.TAB_CAR) { + pic.setViewWH(129,129) + }else if (data.dressType == DressUpTabActivity.TAB_HEAD_WEAR) { + pic.setViewWH(117,117) + }else if (data.dressType == DressUpTabActivity.TAB_NAMEPLATE) { + pic.setViewWH(98,28) + }else if (data.dressType == DressUpTabActivity.TAB_CHAT_BUBBLE) { + pic.setViewWH(90,46) + }else if (data.dressType == DressUpTabActivity.TAB_USER_INFO_BG) { + pic.setViewWH(127,125) + } + pic.loadImage(data.pic) + } + } + + fun play(data:DressUpInfo,layout: ViewGroup,isItem :Boolean = false){ + if (data.effect.isVerify()) { + + var animView : AnimView?=null + var svgaView : SVGAView?=null + + layout.setVis(true) + layout.removeAllViews() + + if (data.effectType == DressUpInfo.EffectType.MP4) { + animView = AnimView(layout.context) + layout.addView(animView) + animView.setLoop(Int.MAX_VALUE) + animView.setScaleType(ScaleType.FIT_XY) + } else { + svgaView = SVGAView(layout.context) + layout.addView(svgaView) + svgaView.loops = Int.MAX_VALUE + svgaView.setScaleType(ImageView.ScaleType.FIT_XY) + } + + //item 时占满就行 + if (isItem) { + animView?.setViewWH(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, false) + svgaView?.setViewWH(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,false) + } else { + if (data.dressType == TAB_HEAD_WEAR) { + animView?.setViewWH(183, 183, true) + svgaView?.setViewWH(183, 183, true) + }else if (data.dressType == TAB_USER_CARD) { + animView?.setViewWH(285, 250, true) + svgaView?.setViewWH(285, 250, true) + } else { + animView?.setViewWH(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, false) + svgaView?.setViewWH(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,false) + } + } + + + animView?.loadAnim2(data.effect,false) + svgaView?.loadUrl(data.effect,true) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/decoration/view/DecorationStoreActivity.kt b/app/src/main/java/com/chwl/app/decoration/view/DecorationStoreActivity.kt index f119003e4..9a339d5cf 100644 --- a/app/src/main/java/com/chwl/app/decoration/view/DecorationStoreActivity.kt +++ b/app/src/main/java/com/chwl/app/decoration/view/DecorationStoreActivity.kt @@ -11,6 +11,7 @@ import com.chwl.app.R import com.chwl.app.base.BaseViewBindingActivity import com.chwl.app.base.TitleBar import com.chwl.app.databinding.ActivityDecorationStoreBinding +import com.chwl.app.decoration.ui.activity.DressUpTabActivity import com.chwl.app.decoration.view.widgets.CarMagicIndicator import com.chwl.app.decoration.view.widgets.MyDecorationMagicIndicator import com.chwl.app.decoration.viewmodel.DecorationViewModel @@ -60,7 +61,7 @@ class DecorationStoreActivity : BaseViewBindingActivity { //todo do 测试按钮 if (BuildConfig.DEBUG) { - start(requireActivity(), 8) + DressUpTabActivity.start(requireActivity(),false) } } diff --git a/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt b/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt index 0dc8ac741..ebd8406ed 100644 --- a/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt +++ b/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt @@ -7,17 +7,18 @@ import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target -import com.chwl.app.BuildConfig import com.chwl.app.base.BaseViewModel -import com.chwl.library.utils.PathHelper import com.chwl.core.home.model.HomeModel +import com.chwl.core.utils.LogUtils import com.chwl.library.common.glide.GlideUtils import com.chwl.library.common.util.SPUtils import com.chwl.library.utils.NetworkUtils +import com.chwl.library.utils.PathHelper import com.example.lib_utils.AppUtils import com.example.lib_utils.FileUtils2 import com.example.lib_utils.log.ILog import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.io.File @@ -33,18 +34,24 @@ class PreloadResourceViewModel : BaseViewModel(), ILog , RequestListener private var mContext : Context? = null + //todo 预加载 fun start(context: Context) { mContext = context - if (BuildConfig.DEBUG) { - // 太多请求了,影响查看控制台日志 - return - } + +// if (BuildConfig.DEBUG) { +// // 太多请求了,影响查看控制台日志 +// return +// } + if (isStarted) { return } - getPreloadResourceList { - isStarted = true - nextTask(null) + + viewModelScope?.launch(Dispatchers.IO) { + getPreloadResourceList { + isStarted = true + nextTask(null) + } } } @@ -91,7 +98,7 @@ class PreloadResourceViewModel : BaseViewModel(), ILog , RequestListener } } - private fun downloadTask(url: String) { + private fun downloadTask(url: String?) { // val path = PathHelper.generateResourcesFilePath(url) // logI("downloadTask() url:${url} path:${path}") @@ -104,9 +111,13 @@ class PreloadResourceViewModel : BaseViewModel(), ILog , RequestListener // ) // DownloadManager.download(request, this) - GlideUtils.instance().downloadFromUrl(mContext,url,this) - - + viewModelScope.launch { + delay(500) + LogUtils.d("预加载 -> downloadTask url = ${url?.trim()}") + if (url != null) { + GlideUtils.instance().downloadFromUrl2(mContext,url.trim(),this@PreloadResourceViewModel) + } + } } override fun onLoadFailed( @@ -119,6 +130,7 @@ class PreloadResourceViewModel : BaseViewModel(), ILog , RequestListener logI("onDownloadError() url:${model} message:${e?.message}") nextTask(model) } + LogUtils.d("预加载 onLoadFailed 失败 url = ${model}") return true } @@ -134,7 +146,7 @@ class PreloadResourceViewModel : BaseViewModel(), ILog , RequestListener makeDownloadRecord(model) nextTask(null) } - + LogUtils.d("预加载 onResourceReady 成功 url = ${model}") return true } diff --git a/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java b/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java index d0ab0cbee..59892014d 100644 --- a/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java +++ b/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java @@ -4,16 +4,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; -import com.chwl.app.decoration.view.DecorationStoreActivity; -import com.chwl.app.earn.activity.EarnRecordActivity; -import com.chwl.app.pay.activity.GiveGoldActivity; -import com.chwl.app.ui.feedback.FeedbackActivity; -import com.chwl.app.ui.game_team.record.GameTeamRecordActivity; -import com.chwl.app.ui.setting.VipSetActivity; -import com.chwl.app.vip.VipCenterActivity; -import com.chwl.core.module_hall.hall.bean.H5FamilyInfo; -import com.chwl.core.module_hall.hall.bean.UserClanInfo; -import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; import com.chwl.app.R; import com.chwl.app.UIHelper; import com.chwl.app.audio.VoiceMatchActivity; @@ -22,31 +12,38 @@ import com.chwl.app.avroom.recommendcard.MyRecommendCardActivity; import com.chwl.app.base.BaseActivity; import com.chwl.app.base.DialogManagerInterface; import com.chwl.app.common.widget.dialog.DialogManager; -import com.chwl.app.decoration.view.MyDecorationActivity; +import com.chwl.app.decoration.ui.activity.DressUpTabActivity; +import com.chwl.app.earn.activity.EarnRecordActivity; import com.chwl.app.home.activity.CollectionRoomActivity; import com.chwl.app.home.activity.VisitorListActivity; import com.chwl.app.home.helper.OpenRoomHelper; import com.chwl.app.module_hall.HallDataManager; import com.chwl.app.module_hall.hall.activity.ModuleClanActivity; import com.chwl.app.module_hall.hall.activity.ModuleHallActivity; +import com.chwl.app.pay.activity.GiveGoldActivity; import com.chwl.app.radish.task.activity.TaskCenterActivity; import com.chwl.app.relation.cp.activity.CpHomeActivity; import com.chwl.app.relation.cp.activity.CpInviteRecordActivity; import com.chwl.app.relation.cp.activity.CpTaskActivity; import com.chwl.app.team.view.NimTeamMessageActivity; +import com.chwl.app.ui.feedback.FeedbackActivity; +import com.chwl.app.ui.game_team.record.GameTeamRecordActivity; import com.chwl.app.ui.login.BindPhoneActivity; import com.chwl.app.ui.login.ShowBindPhoneActivity; import com.chwl.app.ui.pay.ChargeActivity; import com.chwl.app.ui.setting.ModifyPwdActivity; import com.chwl.app.ui.user.activity.UserInfoActivity; import com.chwl.app.ui.webview.CommonWebViewActivity; +import com.chwl.app.vip.VipCenterActivity; import com.chwl.core.DemoCache; import com.chwl.core.auth.AuthModel; import com.chwl.core.community.event.SquareTaskEvent; import com.chwl.core.im.custom.bean.RouterType; import com.chwl.core.manager.AvRoomDataManager; import com.chwl.core.module_hall.hall.HallModel; +import com.chwl.core.module_hall.hall.bean.H5FamilyInfo; import com.chwl.core.module_hall.hall.bean.HallInfo; +import com.chwl.core.module_hall.hall.bean.UserClanInfo; import com.chwl.core.room.bean.RoomInfo; import com.chwl.core.room.model.AvRoomModel; import com.chwl.core.utils.net.BeanObserver; @@ -55,6 +52,7 @@ import com.chwl.library.net.rxnet.callback.CallBack; import com.chwl.library.utils.JavaUtil; import com.chwl.library.utils.ResUtil; import com.chwl.library.utils.SingleToastUtil; +import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; import org.greenrobot.eventbus.EventBus; @@ -104,27 +102,27 @@ public class RouterHandler { break; case RouterType.CAR: if (JavaUtil.str2int(routerValue) == 0) { - DecorationStoreActivity.start(context, DecorationStoreActivity.TAB_CAR); + DressUpTabActivity.Companion.start(context,false); } else { - MyDecorationActivity.start(context, 1); + DressUpTabActivity.Companion.start(context,true); } break; case RouterType.DECORATION: if (JavaUtil.str2int(routerValue) == 0) { - DecorationStoreActivity.start(context, 0); + DressUpTabActivity.Companion.start(context,false); } else { - MyDecorationActivity.start(context, 0); + DressUpTabActivity.Companion.start(context,true); } break; case RouterType.NAMEPLATE: if (JavaUtil.str2int(routerValue) == 0) { - DecorationStoreActivity.start(context, DecorationStoreActivity.TAB_NAMEPLATE); + DressUpTabActivity.Companion.start(context,false); } else { - MyDecorationActivity.start(context, 2); + DressUpTabActivity.Companion.start(context,true); } break; case RouterType.USER_CARD_WEAR: - MyDecorationActivity.start(context, 3); + DressUpTabActivity.Companion.start(context,true); break; case RouterType.TEAM: NimTeamMessageActivity.start(context, routerValue); @@ -226,10 +224,10 @@ public class RouterHandler { CpTaskActivity.Companion.start(context); break; case RouterType.CP_WARE: - MyDecorationActivity.start(context, 0); + DressUpTabActivity.Companion.start(context,true); break; case RouterType.USER_BUBBLE: - MyDecorationActivity.start(context, 4); + DressUpTabActivity.Companion.start(context,true); break; case RouterType.MY_ROOM: //我的房间,开房 @@ -278,13 +276,13 @@ public class RouterHandler { if (intRouterValue < 0 || intRouterValue > 4) { intRouterValue = 0; } - DecorationStoreActivity.start(context, intRouterValue); + DressUpTabActivity.Companion.start(context,false); break; case RouterType.MY_DECORATION: if (intRouterValue < 0 || intRouterValue > 4) { intRouterValue = 0; } - MyDecorationActivity.start(context, intRouterValue); + DressUpTabActivity.Companion.start(context,true); break; case RouterType.MY_SET: UIHelper.showSettingAct(context); @@ -299,7 +297,7 @@ public class RouterHandler { GameTeamRecordActivity.Companion.start(context); break; case RouterType.MY_DRESS_ITEM: - MyDecorationActivity.start(context, 0); + DressUpTabActivity.Companion.start(context,true); break; default: SingleToastUtil.showToast(ResUtil.getString(R.string.ui_im_routerhandler_07)); diff --git a/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderText.java b/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderText.java index 76df73acd..ee98c2cad 100644 --- a/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderText.java +++ b/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderText.java @@ -7,11 +7,8 @@ import android.text.style.ForegroundColorSpan; import android.view.View; import android.widget.TextView; -import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; -import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; -import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; import com.chwl.app.R; -import com.chwl.app.decoration.view.MyDecorationActivity; +import com.chwl.app.decoration.ui.activity.DressUpTabActivity; import com.chwl.app.ui.im.RouterHandler; import com.chwl.app.ui.webview.CommonWebViewActivity; import com.chwl.app.utils.SpannableBuilder; @@ -28,6 +25,9 @@ import com.chwl.core.im.custom.bean.NobleAttachment; import com.chwl.core.im.custom.bean.VoiceBottleShakeHeartAttachment; import com.chwl.core.manager.IMNetEaseManager; import com.chwl.library.utils.ResUtil; +import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; +import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; import org.greenrobot.eventbus.EventBus; @@ -151,7 +151,7 @@ public class MsgViewHolderText extends MsgViewHolderBase { } else if (mCarAttachment != null) { if (mCarAttachment.mSecond == CUSTOM_MESS_SUB_CAR_EXPIRE) { - MyDecorationActivity.start(mTvMsg.getContext(), 1); + DressUpTabActivity.Companion.start(context,true); } } else if (awardAttachment != null) { RouterHandler.handle(context, awardAttachment.routerType, awardAttachment.routerValue); diff --git a/app/src/main/java/com/chwl/app/ui/search/SearchUserActivity.kt b/app/src/main/java/com/chwl/app/ui/search/SearchUserActivity.kt new file mode 100644 index 000000000..b436e7c6b --- /dev/null +++ b/app/src/main/java/com/chwl/app/ui/search/SearchUserActivity.kt @@ -0,0 +1,158 @@ +package com.chwl.app.ui.search + +import android.content.Context +import android.content.Intent +import androidx.core.widget.doOnTextChanged +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chwl.app.R +import com.chwl.app.base.BaseViewBindingActivity +import com.chwl.app.bindadapter.BaseBindingAdapter +import com.chwl.app.bindadapter.BaseBindingViewHolder +import com.chwl.app.common.EmptyViewHelper +import com.chwl.app.databinding.ActivitySearchUserBinding +import com.chwl.app.databinding.ItemSearchUserBinding +import com.chwl.app.decoration.ui.DressUpDialog +import com.chwl.app.ui.utils.loadAvatar +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.decoration.bean.DressUpInfo +import com.chwl.core.im.friend.IMFriendModel +import com.chwl.core.room.bean.SearchRoomInfo +import com.chwl.core.user.UserModel +import com.chwl.core.user.bean.UserInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.common.util.doToast +import com.chwl.library.common.util.isVerify +import com.chwl.library.net.rxnet.RxNet +import com.example.lib_utils.ktx.getString +import com.google.gson.Gson +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +class SearchUserActivity : BaseViewBindingActivity() { + + companion object{ + + fun start(context: Context, data:String) { + val intent = Intent(context, SearchUserActivity::class.java) + intent.putExtra("json",data) + context.startActivity(intent) + } + } + + private var mDressUpInfo : DressUpInfo? = null + private val mJson : String by lazy { intent.getStringExtra("json")?:"" } + lateinit var mAdapter : UserAdapter + override fun transparencyBar() = true + + + override fun init() { + initDarkTitleBar(R.string.search.getString()) + + if (mJson.isVerify()) { + mDressUpInfo = Gson().fromJson(mJson,DressUpInfo::class.java) + } + + mAdapter= UserAdapter() + binding.rvList.layoutManager = LinearLayoutManager(context,RecyclerView.VERTICAL,false) + binding.rvList.adapter = mAdapter + mAdapter.setEmptyView(EmptyViewHelper.createEmptyTextViewHeight(context,R.string.no_frenids_text.getString())) + + mAdapter.setOnItemChildClickListener { adapter, view, position -> + + when (view.id) { + R.id.btnGive -> { + val uid = mAdapter?.data?.getOrNull(position)?.uid + if (uid != null && mDressUpInfo != null) { + val dressUpDialog = DressUpDialog() + dressUpDialog.mDressUpInfo = mDressUpInfo + dressUpDialog.mTargetUid = uid + dressUpDialog.show(context) + } + } + else -> {} + } + } + + binding.etSearch.doOnTextChanged { text, start, before, count -> + text?.let { + doSearch(text.toString()) + } + } + + loadFriends() + + } + + private fun loadFriends() { + val accounts = IMFriendModel.get().myFriendsAccounts + if (accounts.isVerify()) { + UserModel.get().loadUserInfoByUids(accounts) + .compose(bindToLifecycle()) + .doOnSuccess { + mAdapter.setNewData(it) + } + .doOnError { + it?.message?.doToast() + }.subscribe() + } + } + + private fun doSearch(key: String) { + roomSearch(key) + .compose(bindToLifecycle()) + .doOnSuccess { + if (it.isVerify()) { + val newData = mutableListOf() + it.forEach { + newData.add(UserInfo().apply { + avatar = it.avatar + uid = it.uid + erbanNo = it.erbanNo + nick = it.nick + }) + mAdapter.setNewData(newData) + } + } + }.doOnError { + it?.message?.doToast() + }.subscribe() + } + + + + + class UserAdapter : BaseBindingAdapter() { + + override fun convert(helper: BaseBindingViewHolder, item: UserInfo) { + helper.binding.let { + it.avatar.loadAvatar(item.avatar) + it.name.text = item.nick + it.id.text = item.erbanNo.toString() + + helper.addOnClickListener(it.btnGive.id) + } + } + } + + private fun roomSearch(key: String) : Single>{ + return api.roomSearch(key,2) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private val api: Api = RxNet.create(Api::class.java); + + interface Api { + @GET("/search/room") + fun roomSearch( + @Query("key") key: String?, + @Query("type") type: Int + ): Single>> + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt index 7679421a3..4a5859c2e 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt @@ -3,7 +3,6 @@ package com.chwl.app.ui.user.activity import android.content.Context import android.content.Intent import android.view.View -import androidx.core.content.ContentProviderCompat.requireContext import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -21,18 +20,13 @@ import com.chwl.core.UriProvider import com.chwl.core.bean.response.ServiceResult import com.chwl.core.user.bean.UserCPListBean import com.chwl.core.utils.LogUtils -import com.chwl.core.utils.net.DontWarnObserver import com.chwl.core.utils.net.RxHelper import com.chwl.library.net.rxnet.RxNet import com.chwl.library.utils.ResUtil import com.example.lib_utils.ktx.getString import com.google.gson.JsonElement -import com.hjq.toast.ToastUtils import com.netease.nim.uikit.StatusBarUtil -import com.trello.rxlifecycle3.android.ActivityEvent import io.reactivex.Single -import io.reactivex.SingleObserver -import io.reactivex.disposables.Disposable import retrofit2.http.GET import retrofit2.http.POST import retrofit2.http.Query @@ -59,7 +53,7 @@ class UserCpListActivity : BaseViewBindingActivity() } private fun initTitle() { - initBlackTitleBar(ResUtil.getString(R.string.My_Cp)) + initDarkTitleBar(ResUtil.getString(R.string.My_Cp)) val titleBar = findViewById(R.id.title_bar) as TitleBar titleBar.addAction(object : ImageAction(R.drawable.ic_cp_list_more) { override fun performAction(view: View?) { diff --git a/app/src/main/java/com/chwl/app/ui/utils/ImageLoad.kt b/app/src/main/java/com/chwl/app/ui/utils/ImageLoad.kt index 9c5e1814b..442f42199 100644 --- a/app/src/main/java/com/chwl/app/ui/utils/ImageLoad.kt +++ b/app/src/main/java/com/chwl/app/ui/utils/ImageLoad.kt @@ -173,9 +173,9 @@ fun AnimView.loadAnim(url: String) { }) } -fun AnimView.loadAnim2(url: String) { +fun AnimView.loadAnim2(url: String,isSafe:Boolean = true) { if (context.isDestroyed()) return - GlideUtils.instance().downloadFromUrl(context,url.trim(),object : RequestListener { + GlideUtils.instance().downloadFromUrl2(context,url.trim(),object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, @@ -193,9 +193,14 @@ fun AnimView.loadAnim2(url: String) { isFirstResource: Boolean ): Boolean { if (resource != null) { - if (this@loadAnim2.isAttachedToWindow){ + if (isSafe) { + if (this@loadAnim2.isAttachedToWindow){ + this@loadAnim2.startPlay(resource) + } + } else { this@loadAnim2.startPlay(resource) } + } return true } diff --git a/app/src/main/java/com/chwl/app/ui/webview/JSInterface.java b/app/src/main/java/com/chwl/app/ui/webview/JSInterface.java index 74d271319..9f189354b 100644 --- a/app/src/main/java/com/chwl/app/ui/webview/JSInterface.java +++ b/app/src/main/java/com/chwl/app/ui/webview/JSInterface.java @@ -5,9 +5,7 @@ import static android.content.Context.CLIPBOARD_SERVICE; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.media.MediaRecorder; import android.os.Build; -import android.os.Environment; import android.os.Looper; import android.text.TextUtils; import android.util.Log; @@ -18,34 +16,27 @@ import androidx.annotation.NonNull; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.chwl.app.earn.activity.EarnRecordActivity; -import com.chwl.app.ui.invite.InviteImageHelper; -import com.chwl.app.ui.invite.ShareInviteDialog; -import com.chwl.app.ui.invite.ShareInviteInfo; -import com.chwl.app.ui.wallet.payment.GPaymentClient; -import com.chwl.app.ui.wallet.payment.IPaymentClient; -import com.chwl.app.ui.wallet.payment.PaymentIntent; -import com.chwl.app.ui.wallet.payment.PaymentResult; -import com.chwl.library.language.LanguageHelper; -import com.chwl.library.utils.json.JsonUtils; -import com.example.lib_utils.ICleared; -import com.google.gson.Gson; -import com.netease.nim.uikit.common.util.log.LogUtil; -import com.orhanobut.logger.Logger; import com.chwl.app.UIHelper; import com.chwl.app.application.IReportConstants; import com.chwl.app.application.ReportManager; import com.chwl.app.avroom.activity.AVRoomActivity; +import com.chwl.app.earn.activity.EarnRecordActivity; import com.chwl.app.ui.im.RouterHandler; import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity; +import com.chwl.app.ui.invite.InviteImageHelper; +import com.chwl.app.ui.invite.ShareInviteDialog; +import com.chwl.app.ui.invite.ShareInviteInfo; import com.chwl.app.ui.pay.ChargeActivity; +import com.chwl.app.ui.wallet.payment.GPaymentClient; +import com.chwl.app.ui.wallet.payment.IPaymentClient; +import com.chwl.app.ui.wallet.payment.PaymentIntent; +import com.chwl.app.ui.wallet.payment.PaymentResult; import com.chwl.app.ui.webview.event.H5NotifyClientEvent; import com.chwl.app.ui.webview.event.ShowNavEvent; import com.chwl.app.ui.webview.event.TaroPayResultEvent; import com.chwl.core.XConstants; import com.chwl.core.auth.AuthModel; import com.chwl.core.decoration.bean.DecorationStoreRouterType; -import com.chwl.core.file.FileModel; import com.chwl.core.manager.AvRoomDataManager; import com.chwl.core.market_verify.MarketVerifyModel; import com.chwl.core.pay.PayModel; @@ -55,18 +46,21 @@ import com.chwl.core.room.bean.RoomInfo; import com.chwl.core.user.UserModel; import com.chwl.core.web.bean.WebJsBeanInfo; import com.chwl.library.common.util.DeviceUtil; -import com.chwl.library.record.AuditRecorderConfiguration; -import com.chwl.library.record.ExtAudioRecorder; +import com.chwl.library.language.LanguageHelper; import com.chwl.library.rxbus.RxBus; import com.chwl.library.utils.AppMetaDataUtil; import com.chwl.library.utils.DeviceUuidFactory; import com.chwl.library.utils.SystemUtils; import com.chwl.library.utils.VersionUtil; import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.json.JsonUtils; +import com.example.lib_utils.ICleared; +import com.google.gson.Gson; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.orhanobut.logger.Logger; import org.greenrobot.eventbus.EventBus; -import java.io.File; import java.util.HashMap; /** @@ -79,9 +73,9 @@ public class JSInterface implements ICleared { private CommonWebViewActivity mActivity; private Context context; private int mPosition; - private MediaRecorder recorder; - private File myRecAudioFile; - private ExtAudioRecorder extAudioRecorder; +// private MediaRecorder recorder; +// private File myRecAudioFile; +// private ExtAudioRecorder extAudioRecorder; private GPaymentClient paymentClient; public JSInterface(WebView webView, CommonWebViewActivity activity) { @@ -420,45 +414,45 @@ public class JSInterface implements ICleared { NimP2PMessageActivity.start(context, uid); } - @JavascriptInterface - public boolean startRecode() { - // recorder 实例 - AuditRecorderConfiguration configuration = new AuditRecorderConfiguration.Builder() - .uncompressed(true) - .builder(); - extAudioRecorder = new ExtAudioRecorder(configuration); - // 录音地址 - File sdcardDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + - File.separator + "wewawa"); - if (!sdcardDir.exists()) { - boolean mkdirResult = sdcardDir.mkdir(); - Log.e(TAG, "startRecode: mkdirResult: " + mkdirResult); - } - myRecAudioFile = new File(sdcardDir.getAbsolutePath(), "wewawa-" + System.currentTimeMillis() + ".wav"); - Log.i(TAG, "startRecode: myRecAudioFile path: " + myRecAudioFile.getAbsolutePath()); - // 设置输出文件 - extAudioRecorder.setOutputFile(myRecAudioFile.getAbsolutePath()); - extAudioRecorder.prepare(); - extAudioRecorder.start(); - return true; - } - - @JavascriptInterface - public String stopRecode() { - if (extAudioRecorder == null || myRecAudioFile == null) - return null; - if (!myRecAudioFile.exists()) { - return null; - } - extAudioRecorder.stop(); - extAudioRecorder.release(); - String url = FileModel.get() - .uploadFile(myRecAudioFile.getAbsolutePath()) - .blockingGet(); - myRecAudioFile.delete(); - Log.i(TAG, "stopRecord: url: " + url); - return url; - } +// @JavascriptInterface +// public boolean startRecode() { +// // recorder 实例 +// AuditRecorderConfiguration configuration = new AuditRecorderConfiguration.Builder() +// .uncompressed(true) +// .builder(); +// extAudioRecorder = new ExtAudioRecorder(configuration); +// // 录音地址 +// File sdcardDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + +// File.separator + "wewawa"); +// if (!sdcardDir.exists()) { +// boolean mkdirResult = sdcardDir.mkdir(); +// Log.e(TAG, "startRecode: mkdirResult: " + mkdirResult); +// } +// myRecAudioFile = new File(sdcardDir.getAbsolutePath(), "wewawa-" + System.currentTimeMillis() + ".wav"); +// Log.i(TAG, "startRecode: myRecAudioFile path: " + myRecAudioFile.getAbsolutePath()); +// // 设置输出文件 +// extAudioRecorder.setOutputFile(myRecAudioFile.getAbsolutePath()); +// extAudioRecorder.prepare(); +// extAudioRecorder.start(); +// return true; +// } +// +// @JavascriptInterface +// public String stopRecode() { +// if (extAudioRecorder == null || myRecAudioFile == null) +// return null; +// if (!myRecAudioFile.exists()) { +// return null; +// } +// extAudioRecorder.stop(); +// extAudioRecorder.release(); +// String url = FileModel.get() +// .uploadFile(myRecAudioFile.getAbsolutePath()) +// .blockingGet(); +// myRecAudioFile.delete(); +// Log.i(TAG, "stopRecord: url: " + url); +// return url; +// } @JavascriptInterface public void openFamilyPage(String familyId) { diff --git a/app/src/main/java/com/chwl/app/ui/webview/baishun/BaiShunGameWebFragment.kt b/app/src/main/java/com/chwl/app/ui/webview/baishun/BaiShunGameWebFragment.kt index 7e6a3fddc..789f9f01d 100644 --- a/app/src/main/java/com/chwl/app/ui/webview/baishun/BaiShunGameWebFragment.kt +++ b/app/src/main/java/com/chwl/app/ui/webview/baishun/BaiShunGameWebFragment.kt @@ -81,7 +81,10 @@ class BaiShunGameWebFragment : BaseViewBindingFragment( super.onPageStarted(view, url, favicon) isLoadError = false if (url == gameUrl) { - dialogManager.showProgressDialog(requireContext()) + context?.let { + dialogManager.showProgressDialog(it) + } + } } @@ -162,7 +165,7 @@ class BaiShunGameWebFragment : BaseViewBindingFragment( settings?.domStorageEnabled = true //设置开启数据库缓存 settings?.databaseEnabled = true - settings?.databasePath = (requireContext().applicationContext.filesDir.absolutePath) + settings?.databasePath = (context?.applicationContext?.filesDir?.absolutePath) //设置⽀持缩放 settings?.setSupportZoom(true) //设置⾃适应 diff --git a/app/src/main/java/com/chwl/app/ui/webview/baishun/LeaderccGameWebFragment.kt b/app/src/main/java/com/chwl/app/ui/webview/baishun/LeaderccGameWebFragment.kt index c03377859..82766ffbb 100644 --- a/app/src/main/java/com/chwl/app/ui/webview/baishun/LeaderccGameWebFragment.kt +++ b/app/src/main/java/com/chwl/app/ui/webview/baishun/LeaderccGameWebFragment.kt @@ -86,7 +86,7 @@ class LeaderccGameWebFragment : BaseViewBindingFragment super.onPageStarted(view, url, favicon) isLoadError = false if (url == gameUrl) { - dialogManager.showProgressDialog(requireContext()) + dialogManager.showProgressDialog(context) } } @@ -162,7 +162,7 @@ class LeaderccGameWebFragment : BaseViewBindingFragment settings?.domStorageEnabled = true //设置开启数据库缓存 settings?.databaseEnabled = true - settings?.databasePath = (requireContext().applicationContext.filesDir.absolutePath) + settings?.databasePath = (context?.applicationContext?.filesDir?.absolutePath) //设置⽀持缩放 settings?.setSupportZoom(true) //设置⾃适应 diff --git a/app/src/main/java/com/chwl/app/ui/widget/UserInfoDialog.java b/app/src/main/java/com/chwl/app/ui/widget/UserInfoDialog.java index 02e7cac3b..de6d10b97 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/chwl/app/ui/widget/UserInfoDialog.java @@ -667,7 +667,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private void drawVAPEffect(String url) { - GlideUtils.instance().downloadFromUrl(getContext(), url, new RequestListener() { + GlideUtils.instance().downloadFromUrl2(getContext(), url, new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { ImageLoadUtils.loadImage(context, userInfo.getUserInfoCardPic(), ivUserCardWear); diff --git a/app/src/main/java/com/chwl/app/utils/RoomBoomManager.kt b/app/src/main/java/com/chwl/app/utils/RoomBoomManager.kt index 2fdbab8d8..33df2c631 100644 --- a/app/src/main/java/com/chwl/app/utils/RoomBoomManager.kt +++ b/app/src/main/java/com/chwl/app/utils/RoomBoomManager.kt @@ -115,7 +115,7 @@ object RoomBoomManager { urls.forEach { url -> LogUtils.dd(" RoomBoomManager startDownAnim() forEach url=$url") mAnimLayout?.let { animLayout -> - GlideUtils.instance().downloadFromUrl( + GlideUtils.instance().downloadFromUrl2( animLayout.context, url.trim(), object : RequestListener { diff --git a/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt b/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt index 0834c9ac3..ff2f516a2 100644 --- a/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt +++ b/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt @@ -135,8 +135,7 @@ class VipCenterBannerAdapter( }) - //todo do , liulishuo 下载器 换 glide 下载 , 注意 .trim() 去掉前后空格符 - GlideUtils.instance().downloadFromUrl(holder.vapAnimView.context,data.vipLogo.trim(),object : RequestListener { + GlideUtils.instance().downloadFromUrl2(holder.vapAnimView.context,data.vipLogo.trim(),object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, diff --git a/app/src/main/res/drawable-xxhdpi/ic_derss_avatar.webp b/app/src/main/res/drawable-xxhdpi/ic_derss_avatar.webp new file mode 100644 index 0000000000000000000000000000000000000000..26a6bc24baca1e8a9caabeeebd3a92a38f36e372 GIT binary patch literal 872 zcmV-u1DE_#Nk&Fs0{{S5MM6+kP&iCf0{{RoCV&YL7Y8enZP!Y#LvVn90l4EYo*|fk z8%efnWp?lXfQhRjAb*!Mh(wEX26Ed-k|e5rV zmWpB+!o{oioxV<6h9b=A3=|r|wW3sMz|m%4?Ho~HM<8Hekzgbe1Tk=h1(9e#5TGp= z)N%+SK@gx23|4(E=`ceqa3C0z%;6UdfC*95F$M}wt1T2Uq=jPT6^>AVs|OM?PJuW+ zF7+=&$;y34!w)&5__YG~ZrL5?+i0>|+2)>BkDR&qh3uT3cYGe+&%>Q4t`b*SIu!NO z%B)n$1L{(FN4Ut8hO;v&#YF!C<1O6n@D~;9GW{D-So?fm%jWiDJa5ExvC4T~6x!{e@$D+d0TL_lEi4>PF7;G0E4lcdcA=6Bo<85GSO4DF>kDzn767n}B-^%a+csux+qS)D z+qP}nwti)^xh$XCq=@LhkRXxd6``eoh?M--A3uM6my;HmRT8q_%q%Pkp-sOiNX#N} zMPo~Q2S+E0XRS;W#nJm{Zd>aNs>4Py$VnR7xwy_$V{7mMwa?bo?l8pW6KZ-@9-c5v zr9Nsp?mlpCx~Q%2^7VsZy_caj#rnhLO`jOW5CqXXkIvzJrIjy}kd07KpbU z4NVL!HoJarR8~^c(9*^nQB~g9iI~_1^);(1$_jF_Gbl`#makf?zCrB2{n@m6b$tOz zJbL`}scAfQI4Pa3U%6$SD6~eEorNh!Pn^Ga`Px+w&0OU0k>sM~TN@#@YL*C2T)cXn z+<+s5x`YMA+t$yhX-C$HD>rYU;jZA!?ag3gsTZg_=qNsI6m0joJ9qD)W0~{2zy!DN y&kjxkJ9h8k?C{6HPCR(>n4itzGhinly_g-20XzHj`Rou3_U7fY*?ILEFIE^M;jG92 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_dialog_bg.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_dialog_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..dc4634d525f9ead8d47f6f6d1ecf321d6af5f39c GIT binary patch literal 24694 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 zbfWja&xu*m&2du0v%;k300000000000000000000 F005Cz;DP`E literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_dialog_line.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_dialog_line.webp new file mode 100644 index 0000000000000000000000000000000000000000..82ad717525ed0a024b6c297bda5273ab4f74b6c7 GIT binary patch literal 488 zcmV6ZuyrEHyE}?|2~uVIz}vji;V%L~ z3jB9AAUP*6jFj`@dth2*DML`ofV?pTRg9)-0-DfZ>rzElsm3ZCF~BKy-(fTPt^#eg zOzO1QeQBbmajCtnX%1UxyyWk>09H^qAT|L20PqO_odGJ)0tEm*kw~CSrKBSzp=bcG z5(#Gq3`SVNI8dGeo&Q1uJ}tk@0PO%@TXp~gZL5Vj79WxC!o(m?z=CJ+p+bcUy#4)}fF~Cfrv7iI1d)*@v?aYc@UY%#|FFgGfL4CVZV4 z3@`Bq_bVa(P4gf8HO~?Jf6N2)|BO$x{tf?Z{u+J#4fKZ1x5p$1P-#i~K8W2qUR%q= z9BrUS4V4{`k8;iUFe^5lAJjNf&HFYw;&aDr6OhJafTngEC9AsOD7HIQC%3V82uxoR zYPKzaUIn${O0CQY|J3O7g#kt~-qEd@X$$lmG1x&Z(?`A?SA;SzRSKZmv-&Q1Qnd^d e((1>84~K1p74+5kou5A=y^HZXCAzklQosP=irX~+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_item_long_n.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_item_long_n.webp new file mode 100644 index 0000000000000000000000000000000000000000..c5a0f7c044662a60952f6285ad5b91cf3e295cc9 GIT binary patch literal 2784 zcmd6o`9IX(9>+h!Sh9ueOa>8RB-zQ>m#mY0FGVKCItbO+w=g6sLzbD!R#F&+WXVqU z!PtpJUu$1(;!gDa_PvjL|A70$Ssv$c&inm*z0UhQ4#H4RkHi1~Ho98o*5*pKlqtYU zXM0*!_yF3a<1ek=Pfe1!@>8Mpqe;X(d3sCv>qfIO9a-wP?yox2EgC3fiBjgjIf ziQ?4howHZ&cw6`{Qs>qg7F52TB4Iu^2J&s^gg>IS>=m1Mlfgn7F6JUYh~#m7`4yKp zn6JyBcL@3;pqVTr&30Afg8`)SD%FP^=O=y4N*Z1 zfxZL>d{ZZdo9XazgI4Ea4eT4r40J2lQP;$f9Bcb~mvPjv)ZjA>HLJJbd(%ArA6$F1 zQ1QxNgchlPm>mopY-#+z3$c17I_m7SnuHkpw63H{;|K-0J~hufRAYFNBs0vgx0KLW zM3<+Xy(itvuQA3-zV@OJ&qq14hf1e2(^p-4pFh)&pjz5n+XH z4CbSX-gX`tJjccFWa(6V{gG4^;B7a4Zue%-bn3^x@TMOUGOC=?pXJ0 zeyQ^FPCmXf%Gd*|Q>?WgMgySHIy$@J#}Y4keE|8%gJgA{ybtt9YH>j2iAhMm;-P6C z1hN`hvO~~6!VwPcXBiWoQO=5~;30qf9m4Qxt7TN(x}o=j z2ACKnj8syDHvHbl2l%QkSMC$$Cpa>@Mdsih43j&*SB%jHs#6@9qj#xhkyKaG+Y>*9 z+-?8o%85=SvtK{vuOMt5Y4Qk;@Sl5sL0PD9TzPv)bEE{eCEgNznC&R2(~<^h(np0S-6JYCb#M89lG*Ui*!jaKQ{3fASJ1T^;bn9 z&Lf9JtK5L9GBQd_@|PnN25$!h%`2x+;v1}!-SfJ>Cl1rZTZ}Q=o-{*`z6`YtMlN?JNW|FM25J7h z!b8&pY8q%l4{Tn(`DfcbXJ1_19m<06=jnNGBRHYBVlq=A|2cE92jN4K>_#uoE^DIQ z-yEhxoT{2%AgFMs_PoXFD~pmNmD^$SY(0j-&=h~QWH&A)$30G#W>x4)y+SMFSReY}=wtvZC8cLZo^6l%4>N*LCY#`M$>r^TzXkxjh6>8>otDsvRKAAM zQ0PO~HAU}e_qKGYEl%uwz`yc|k><<}=ZzA@s=o9Bfc^dX&a#Qc9C&>-(Ja+K@ss*H zmrD4~TFClhZkM*l7K1k+o_WkAt0RQ!ypaj z2U!k+8A($~zI=mUYSBsxezDR`;Bmo>G|AcV&e}?q^|Q0%-BKXq*xJXpdQ45&E9P;X zHe565_)0aN(fLv}d<{3vLQa3ikHTv%U&n~AEJOTU1X3$oj=l1{KbUZF1tP&|)hknL zSt8a@oB!CFce*4Sb0(C_+a+-q^OlV5Jr98BZOdte0HE_DqaWo5{rcE9(O?x{NB#M};k+eV3_!I|e!_$Othz@z9Psp7KV99+CfXAT(D+)}tE!)B#FcN9 z!t?8KK|Lnc=0ol>Z~HOH;>P#a%AJ1Q4G&e-72nAB%bP zeT>;J%Mu(AvA*G|uoD{=1gr}RO!1m7=3AoTpHDlKnwR^j^KPrq&HYzr|6&u_EV8*D ztce9cxBjfr=V4mi6Ha)PffVaOC8rXmsV^>O$j_{iE_q>FF>@gtZHB zh6_g9G7%eq#fDAM?H7{^LM+bUnD`g(?W8!K&GE$r$HAL$rZaR|0_91uIP4-#%AVx_ zQg6XRO>c^Qg8EE#U+%Fiw~#&vqHR7Ol%JbxcXu7b)B%G((?w z%9hqSF zoTXfb7d5NxtkeL?fGa;XbDGT%yytfLhZS tc{0G`6W@ld0rm)EymZk>i8E~-{$hiXBhEsa?HfkyCHv^pl0lR@`!~e2K9v9f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_item_long_s.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_item_long_s.webp new file mode 100644 index 0000000000000000000000000000000000000000..c3b8ca168085020b31f2447acbf80d9cda14c7be GIT binary patch literal 2898 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 U&L{En;vYGk=jg~Vy+^>m00C7JrT_o{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_play.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_play.webp new file mode 100644 index 0000000000000000000000000000000000000000..ebc863afa2f1775ee8815fd32f3511602458b293 GIT binary patch literal 674 zcmV;T0$u%5Nk&GR0ssJ4MM6+kP&iDD0ssInO+XM3HAr$BNs^@e|EJmAlZ(4~%snDP z4z_KEo$Xw+dwjx~!wDAi#ZF~AT~g&r#oCoS+i2A}HL9ew_1k|J(}CMaij=BjhQ=rC zsvwxe%$tKhb%PJ>jj{7(BEirlM0HpYi~<^>Y?OtVgN}_%18r?GnmGfJ4h@8~+3BG+ zB!mKjqHIzVRx%Ev!pS^45K$b&g(Gko1`G!i;%2BG1fC&nhVo&~#lxgahlLDtgJEIB zcaSp;j=sVZ2lHlq3u7`^K;->QFi7WAv>ZjEW5EdBq3Uo^7gEE3O z`MAlZLSYf#A3~(nQRwp>?>-rq6v?x6|3E<FtFFkN;+Pd)K%ly9nA||0x7SJ}H&DpQ|C&d(25Q_s z|3bd0&9y9ajf)cO-f?e1dS*f+UP8BJk>~vO7g8EZd+hfnwDngPt=)z#Jz`Rw9(}6| zofyraH9O?JS@8u<--l3i-pI!ci%r7~FE)`aHZ3kT$u2i#*UUZhs#x`~H#`xHcyGDG zGru`u{hzivdqec>xs4M_%Bqq~Hdh%9J#Q-`p?mkB- I#ujk{04e}DFaQ7m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_n.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_n.webp new file mode 100644 index 0000000000000000000000000000000000000000..f47cde5d71047e0877abc42a5215be30d348631a GIT binary patch literal 762 zcmV{06|PpNSy%y00Dqw+t#w? zeR!#DDMbPHG_!kiq0PQln5=-Ta zr*(l{UfNzxM-_(wx@z+$)>VONH8T}3b-^=xzy-D+N=rQ*V(yum!1-O$#X1ozaDnxg zOt1rSO&56AwRk(`kxPO5n^ALXqg8?Z>PSoR8-f4JcrzB%1O>GqYvju4B+v`)M#&dJ zLq5}>=T1rxy{vs^T}*TJlF}$bjpK*tqN+6~RWJP`I2ipdn@^h>;x;{V=L#5%C1~U}_GI s;FRF#wy0KMBoii3oTy$dEGDv~CRKLpu^<6>n;(O#@|sn+v4T240MO-DegFUf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_s.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_tab_bg_s.webp new file mode 100644 index 0000000000000000000000000000000000000000..20f5a1d0b0683ccdf2fb396df87d902ed6885761 GIT binary patch literal 1220 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_tab_card.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_tab_card.webp new file mode 100644 index 0000000000000000000000000000000000000000..12f24c86c598f66df5f5af380719fb25b182aa6c GIT binary patch literal 3328 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 KA*(Cs0002UiEzCD literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_tab_chat.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_tab_chat.webp new file mode 100644 index 0000000000000000000000000000000000000000..829d43e7313f29a0a6b45debef5c2519a4a2df0b GIT binary patch literal 3306 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_tab_head.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_tab_head.webp new file mode 100644 index 0000000000000000000000000000000000000000..dbe4a09bb73c42337b41b3d01fe8c2058320b84b GIT binary patch literal 3586 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 Qn5W!;g#X$MlAip~0OV;2{Qv*} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dress_top_bg.webp b/app/src/main/res/drawable-xxhdpi/ic_dress_top_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..718a7b07d3b6f28161345862d5246b57ce6b26f8 GIT binary patch literal 210886 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ⅈ?N?YSD~ob^?Eg$ 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

j6@Y2fpHPI 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⋙9r$63%hvC-`SEQV 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

V|ADJtSVzQ0V<(e@Wm4-94?BD=-}ha zbQX|~)bWD!v{p>(hUp8uBeQXT{H=LSiXWh!q-i$v#E&GQbE&#qmH_-k`BP5?3}n^w z)kY>#4rQ~E!q=B}%epSG<@y+dpE?kG(j8K-Eq58H>A{H+zGnduLJ}gRAAZQMcEWE5 z+AdQC_*@hEq_l?SY1yV7vz^Ys&JKZ1k*A<)qmOx&@} zP62i_W$Mqk03MUTWl*=@mgJ3P%dZil^vP9pgh{n(Wnq{B!cL)h@Y0uRm6QK33z@2> ztU^ZcoWMh5{bZ;io^Tatoyw!9rvIB1Cd*@Ql|(neVWnLgD5Gfsq{ePON1E-0Y~t2* z6%FP0x)NhysK)*NOkn6~_wuo%uANqu8l^stTg|Q+OmzZ%^{G)(Dy#QGk-*c;ITO5l zNg(AaDSM2>>EdzAa$Msq#9Zk(ie=>}dRKgV$?RDm6|Qn09yfKXY_A<<88mMbxxvqtK94i`>Wm$-@*BY<6_vsK^1S0cEwq( ze48B~O4&+Z-Sj{?ZnT4&C5BR$r{X4a>Iw4*lNowp0?8m3 z5O>09&2k#X z@-nr+dJ8Mtiuk^nRKdzW0d#zoz*R&V*({S&wSMsgvq|uXCwpH(xNlG&@1lAlgs%Wg z7H&Dd`Z2wI&4xqIuND}i38!K4ZdU^y;ii_!UIg21OVo=#FlDufrx+1&ph>dDi?S8( zeu16f%xroXJ%8N9ozv_J2Vc`D4QC(20@>Y?1|k(rY5*RHu4TWEhZlDUJ~wFh178@} zllMp(s7;gRlSn2CIZkHg8`~)w-y(~3$8t|QIS5MfZu4tF2P0$3)dW{y~OsyO}D#(8LbX-3rhwZ z-I8Jv9dw`GYBV{Bqg=#2iBt$2n1Sr0chmrSv0LgH6WEhh2N(uPV(%vJF3dvw`K$#z zkO8v+SG8bA;&p`wrv_!JxdbOUDDD_tn}PEO1??{8)rzLRk^?xa4_qF@p7ZNsHh-=m z>JKVZ-hBLY+;NjD3|$OE-`s3?$9XjteTQ%fH-FLK>x?Ax!CY}A6^I{yZsFgTs?zgI z2%PrXRac?b<?Mf(KICr#zjEJ#p84Fl}A4_|S(@4({@10Pp(MdD>Q> z!TjL4kxE7Q%707fnW#f2fr_ee5nGuBQb?*E$Yl7?Z@lw6z9o3|Sn@ zzWxSi9D$6S7yU{J2=;656f*WReG^E`h-z2ezcKSogzC#n3kN5mMW3Bi@iKmcR99EX zaUG_&nF$6xLM-DswsX|qwtq9^TFX^!a~b@^N>+=<2bD)}8&2sp8Z53gFgN z_^2Ey+m3_#JliFX1x~>SXEF@z+6|_(Q)MjPf58JGQnFhf!z>|j$86mLvu}dlSE?qe z!=eY&MN24lmfPR8QU{YPJrTqje6ClQobE(H0B7# zm8FbEu^hsAO(7bB#9E{zmnU1H zg~yeH&>c8>LF-D~n1Dey!%k5e!yj0cDK4TFA0i6{PH!$q{8d0ir6n=w^T zw-!!+@LP$?fZMl?q`QvIZ0k)U0??8L&NhzK1=63cBE+{X-;ZE``i_~WfM9*^9TY

W)=K-yRwu@8_}I(3rc<%UFz^ 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_dress_up_tab.xml b/app/src/main/res/layout/activity_dress_up_tab.xml new file mode 100644 index 000000000..c46bf1acf --- /dev/null +++ b/app/src/main/res/layout/activity_dress_up_tab.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_user.xml b/app/src/main/res/layout/activity_search_user.xml new file mode 100644 index 000000000..a5212a1be --- /dev/null +++ b/app/src/main/res/layout/activity_search_user.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index d871df75d..44005a762 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -537,14 +537,14 @@ + app:layout_constraintTop_toTopOf="@id/ivHeadWear" + tools:src="@color/white" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_dress_up.xml b/app/src/main/res/layout/dialog_dress_up.xml new file mode 100644 index 000000000..b678f6ea4 --- /dev/null +++ b/app/src/main/res/layout/dialog_dress_up.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_decoration_common.xml b/app/src/main/res/layout/item_decoration_common.xml index 941d8827b..37cb1bf39 100644 --- a/app/src/main/res/layout/item_decoration_common.xml +++ b/app/src/main/res/layout/item_decoration_common.xml @@ -44,6 +44,7 @@ android:textColor="@color/white" android:textSize="10sp" android:visibility="gone" + tools:visibility="visible" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_dress_up_layout.xml b/app/src/main/res/layout/item_dress_up_layout.xml new file mode 100644 index 000000000..3053091f5 --- /dev/null +++ b/app/src/main/res/layout/item_dress_up_layout.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_user.xml b/app/src/main/res/layout/item_search_user.xml new file mode 100644 index 000000000..b80bcc8ff --- /dev/null +++ b/app/src/main/res/layout/item_search_user.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_dress_up_layout.xml b/app/src/main/res/layout/tab_dress_up_layout.xml new file mode 100644 index 000000000..1b7f3b415 --- /dev/null +++ b/app/src/main/res/layout/tab_dress_up_layout.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 47883d39a..0494d2276 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -5343,4 +5343,5 @@ %s/%s يوم %s يوم <1 يوم + %s/%s يوم %s \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index b92ec79ed..a05e823f3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -5139,4 +5139,5 @@ Toplam imza alın, ilgili ödülü alın %s/%s gün %s gün <1 gün + %s/%s gün %s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 45e947c7e..e448dee63 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -5286,5 +5286,6 @@ %s/%s天 %s天 <1天 + %s/%s天 %s \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 42ca3f369..96b036a56 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -769,5 +769,6 @@ #696969 #ff9741 #ff5656 + #d9e7f7 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 179c604a9..1f51cc8b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5350,6 +5350,14 @@ You cannot join again within 24 hours after leaving %sDays <1Days + + Not used + userInfoBg + My Dress + VIP限制 %s + 活动获取 不可购买 + %s/%sDays %s + diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index 349e86f6c..dd50af150 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -16,6 +16,8 @@ beta.api.molistar.xyz beta.img.pekolive.com + image.lecheng163.com + image.hfighting.com diff --git a/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt b/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt index e331a334b..a663bb170 100644 --- a/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt +++ b/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt @@ -10,5 +10,12 @@ data class DecorationInfo( val iosPic: String = "", val name: String = "", val pic: String = "", - val dressLimitStatus: Int = 0 + val dressLimitStatus: Int = 0, + val effect: String = "", //装扮动效图片 + val effectType: Int = 0, //动效类型 + val discountPrice: Double = 0.0, //折扣价格 + val vipLevel: Int = 0, //VIP等级 + val discount: Int = 0, // 折扣百分比 + val vipLimit: Int = 0, //VIP等级限定 ,0=不限定 + val obtainWay: Int = 0 //1-普通 2-活动 ) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java b/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java new file mode 100644 index 000000000..8cd3d7caa --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java @@ -0,0 +1,45 @@ +package com.chwl.core.decoration.bean; + +import lombok.Data; + +@Data +public class DressUpInfo { + public boolean isNull; + public boolean isMy; + public boolean isSelect; + public int dressLimitStatus; + + public String pic; + public String name; + public String word; + public int price; + public int buyDay; + public int originalPrice; + + public String effect; //装扮动效图片 + /** + * 特效类型 1-mp4 2-svga + */ + public int effectType; + public int dressType; // 商品类型 + public int dressId; // 商品类型 + public int discountPrice; //折扣价格 + public int vipLevel; //当前用户VIP等级 + public int discount; // 折扣百分比 + public int vipLimit; //VIP等级限定 ,0=不限定 + /** + * //1-普通 2-活动 + */ + public int obtainWay; + public int id; //商品类型id + + + public int expireDays; //剩余天数 + public boolean hasExpired; //是否过期 + + public @interface EffectType{ + int MP4 = 1; + int SVGA = 2; + } + +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java b/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java new file mode 100644 index 000000000..1c54b5f19 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java @@ -0,0 +1,20 @@ +package com.chwl.core.decoration.bean; + +import lombok.Data; + +@Data +public class ShopMine { + public int dressId; //装扮id + public int dressType; //装扮类型 + public int obtainWay; //获取方式 1-普通 2-活动 + + public String pic; + public String name; + public String effect; + public boolean used; + public int expireDays = -1; //剩余天数 + public int effectType; + public boolean hasExpired; //是否过期 + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java b/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java index 567f1c728..03960926c 100644 --- a/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java +++ b/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java @@ -122,6 +122,7 @@ public class HeadwearModel extends BaseModel implements IHeadwearModel { /** * 使用已经购买的头饰 + * id == 0标识不使用头饰 * * @param headwearId * @return diff --git a/core/src/main/java/com/chwl/core/home/bean/TabInfo.java b/core/src/main/java/com/chwl/core/home/bean/TabInfo.java index 74526d38d..f90b72896 100644 --- a/core/src/main/java/com/chwl/core/home/bean/TabInfo.java +++ b/core/src/main/java/com/chwl/core/home/bean/TabInfo.java @@ -36,6 +36,7 @@ public class TabInfo implements Parcelable,Serializable { protected String name; protected String pict; protected int seq; + protected int res; protected int type; protected boolean status; protected boolean istop; @@ -49,6 +50,12 @@ public class TabInfo implements Parcelable,Serializable { this.name = name; } + public TabInfo(int id, String name,int res) { + this.id = id; + this.name = name; + this.res = res; + } + protected TabInfo(Parcel in) { id = in.readInt(); diff --git a/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java b/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java index caf44b9ba..464f1c17f 100644 --- a/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java +++ b/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java @@ -7,21 +7,12 @@ import android.annotation.SuppressLint; import android.text.TextUtils; import android.util.SparseArray; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; -import com.chwl.core.utils.MyUriUtils; -import com.chwl.library.common.glide.GlideUtils; -import com.google.gson.Gson; -import com.netease.nim.uikit.common.util.string.StringUtil; -import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; -import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; -import com.orhanobut.logger.Logger; import com.chwl.core.DemoCache; import com.chwl.core.auth.AuthModel; import com.chwl.core.base.BaseModel; @@ -41,12 +32,20 @@ import com.chwl.core.room.queue.bean.MicMemberInfo; import com.chwl.core.user.UserModel; import com.chwl.core.user.bean.UserInfo; import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.MyUriUtils; import com.chwl.core.vip.bean.UserVipInfo; +import com.chwl.library.common.glide.GlideUtils; import com.chwl.library.utils.ListUtils; import com.chwl.library.utils.NetworkUtils; import com.chwl.library.utils.codec.DESUtils; import com.chwl.library.utils.codec.MD5Utils; import com.chwl.library.utils.config.BasicConfig; +import com.google.gson.Gson; +import com.netease.nim.uikit.common.util.string.StringUtil; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.orhanobut.logger.Logger; import org.greenrobot.eventbus.EventBus; @@ -55,7 +54,6 @@ import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -67,11 +65,6 @@ import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.BiConsumer; import io.reactivex.functions.Consumer; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import okhttp3.ResponseBody; import retrofit2.http.GET; import retrofit2.http.Headers; @@ -634,7 +627,7 @@ public class DynamicFaceModel extends BaseModel implements IDynamicFaceModel { String url = onlineFacesList.getZipUrl(); - GlideUtils.instance().downloadFromUrl(getContext(), url, new RequestListener() { + GlideUtils.instance().downloadFromUrl2(getContext(), url, new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { Logger.d("face.zip download onLoadFailed"); diff --git a/core/src/main/java/com/chwl/core/utils/ImageSplitter.java b/core/src/main/java/com/chwl/core/utils/ImageSplitter.java index b7685d9a1..af038dff3 100644 --- a/core/src/main/java/com/chwl/core/utils/ImageSplitter.java +++ b/core/src/main/java/com/chwl/core/utils/ImageSplitter.java @@ -6,6 +6,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.library.utils.BitmapLruCacheHelper; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/com/chwl/core/utils/BitmapLruCacheHelper.java b/library/src/main/java/com/chwl/library/utils/BitmapLruCacheHelper.java similarity index 98% rename from core/src/main/java/com/chwl/core/utils/BitmapLruCacheHelper.java rename to library/src/main/java/com/chwl/library/utils/BitmapLruCacheHelper.java index a003711a0..9684c3a90 100644 --- a/core/src/main/java/com/chwl/core/utils/BitmapLruCacheHelper.java +++ b/library/src/main/java/com/chwl/library/utils/BitmapLruCacheHelper.java @@ -1,4 +1,4 @@ -package com.chwl.core.utils; +package com.chwl.library.utils; import android.graphics.Bitmap; import android.util.Log; diff --git a/library/src/main/java/com/chwl/library/widget/SVGAView.kt b/library/src/main/java/com/chwl/library/widget/SVGAView.kt index dd0be7b66..34bc95767 100644 --- a/library/src/main/java/com/chwl/library/widget/SVGAView.kt +++ b/library/src/main/java/com/chwl/library/widget/SVGAView.kt @@ -1,8 +1,15 @@ package com.chwl.library.widget import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Matrix +import android.graphics.drawable.AnimationDrawable +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import android.util.AttributeSet import android.util.LruCache +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener @@ -76,7 +83,7 @@ class SVGAView : SVGAImageView, ILog { } fun loadUrl(url: String?,autoPayer:Boolean = true) { - logD("loadUrl() url:$url") + logD("SVGAView loadUrl() url:$url") if (url.isNullOrEmpty()) { this.resourceUrl = null this.setImageDrawable(null) @@ -84,17 +91,8 @@ class SVGAView : SVGAImageView, ILog { return } - if (!url.endsWith(".svga")) { - this.resourceUrl = null - this.setImageDrawable(null) - onViewStateChanged(0) - GlideUtils.instance().load(url,this) - return - } - - if (url == resourceUrl && drawable is SVGADrawable) { - logD("loadUrl() 已加载 isAnimating:$isAnimating") + logD("SVGAView loadUrl() 已加载 isAnimating:$isAnimating") if (!isAnimating) { if (autoPayer) { startAnimation() @@ -107,7 +105,7 @@ class SVGAView : SVGAImageView, ILog { this.resourceUrl = url val cacheItem = svgaCache?.get(url) if (cacheItem != null) { - logD("loadUrl() 有缓存") + logD("SVGAView loadUrl() 有缓存") this@SVGAView.setImageDrawable(SVGADrawable(cacheItem)) if (autoPayer) { this@SVGAView.startAnimation() @@ -118,15 +116,15 @@ class SVGAView : SVGAImageView, ILog { } private fun loadSVGAUrl(url: String,autoPayer:Boolean = true) { - logD("loadSVGAUrl url:$url") - GlideUtils.instance().downloadFromUrl(context,url,object : RequestListener { + logD("SVGAView loadSVGAUrl url:$url") + GlideUtils.instance().downloadFromUrl2(context,url,object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean ): Boolean { - logD("loadSVGAUrl onDownloadError url:$url") + logD("SVGAView loadSVGAUrl onDownloadError url:$url") if (resourceUrl == url) { onViewStateChanged(-1) } @@ -142,20 +140,112 @@ class SVGAView : SVGAImageView, ILog { ): Boolean { if (resource != null) { val path = resource.path - logD("loadSVGAUrl onDownloadCompleted url:$url path:$path") if (resourceUrl == url) { - loadSVGAFile(url, path,autoPayer) + var isImg = false + var outMimeType = "null" + try { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + val decodeFile = BitmapFactory.decodeFile(path, options) + outMimeType = options.outMimeType + isImg = true + + } catch (e: Exception) { + isImg = false + } + + logD("SVGAView loadSVGAUrl onDownloadCompleted url:$url isImg=$isImg outMimeType=$outMimeType path:$path") + if (!isImg) { + loadSVGAFile(url, path, autoPayer) + } else { + this@SVGAView.post { + this@SVGAView.resourceUrl = null + onViewStateChanged(0) + loadImage(url) + } + } + } } return true } }) + } + private fun loadImage(url: String) { + Glide.with(this) + .asBitmap() + .dontAnimate() + .dontTransform() + .load(url) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any, + target: Target, + isFirstResource: Boolean + ): Boolean { + this@SVGAView.resourceUrl = null + onViewStateChanged(0) + return false + } + + override fun onResourceReady( + resource: Bitmap?, + model: Any, + target: Target, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + if (resource == null) return false + val split: List = split(resource) + val animationDrawable = AnimationDrawable() + for (i in split.indices) { + animationDrawable.addFrame(split[i], 200) + } + this@SVGAView.post(Runnable { + this@SVGAView.setImageDrawable(animationDrawable) + animationDrawable.isOneShot = false + animationDrawable.start() + }) + return false + } + }).submit() + } + + fun split(bitmap: Bitmap?): List { + val pieces: MutableList = ArrayList() + try { + if (bitmap!!.width == bitmap.height) { + pieces.add(BitmapDrawable(bitmap)) + } else { + val matrix = Matrix() + matrix.setScale(0.5f, 0.5f) + + val width = bitmap.width + val pieceWidth = bitmap.height + val pieceHeight = bitmap.height + val xPiece = width / pieceWidth + for (j in 0 until xPiece) { + val xValue = j * pieceWidth + pieces.add( + BitmapDrawable( + Bitmap.createBitmap( + bitmap, xValue, 0, + pieceWidth, pieceHeight, matrix, true + ) + ) + ) + } + } + } catch (e: java.lang.Exception) { + } + return pieces } private fun loadSVGAFile(url: String, path: String,autoPayer:Boolean = true) { try { - logD("loadSVGAFile path:$path url:$url") + logD("SVGAView loadSVGAFile path:$path url:$url") val inputStream = BufferedInputStream(FileInputStream(path)) shareParser().decodeFromInputStream( inputStream, @@ -188,7 +278,7 @@ class SVGAView : SVGAImageView, ILog { ) } catch (e: Exception) { e.printStackTrace() - logD("loadSVGAFile url:$url e:${e.message}") + logD("SVGAView loadSVGAFile url:$url e:${e.message}") onViewStateChanged(-1) } } @@ -197,16 +287,16 @@ class SVGAView : SVGAImageView, ILog { * @param state -1 异常、0 空、1 成功 */ private fun onViewStateChanged(state: Int) { - logD("onViewStateChanged state:$state") + logD("SVGAView onViewStateChanged state:$state") } fun bindCache(cache: SVGACache?) { - logD("bindCache() cache:$cache") + logD("SVGAView bindCache() cache:$cache") this.svgaCache = cache } fun setLogTag(tag: String) { - logD("setLogTag() newTag:$tag oldTag:$logTag") + logD("SVGAView setLogTag() newTag:$tag oldTag:$logTag") this.logTag = tag } @@ -219,23 +309,25 @@ class SVGAView : SVGAImageView, ILog { } override fun onDetachedFromWindow() { - logD("onDetachedFromWindow()") + logD("SVGAView onDetachedFromWindow()") super.onDetachedFromWindow() } override fun onAttachedToWindow() { - logD("onAttachedToWindow()") + logD("SVGAView onAttachedToWindow()") super.onAttachedToWindow() if (resumePlayAfterAttached) { if (drawable is SVGADrawable) { if (!isAnimating) { - logD("onAttachedToWindow() startAnimation") + logD("SVGAView onAttachedToWindow() startAnimation") startAnimation() } } } } + + interface SVGACache { fun get(key: String): SVGAVideoEntity? diff --git a/library/src/main/java/com/chwl/library/widget/tab/SmartTabIndicationInterpolator.java b/library/src/main/java/com/chwl/library/widget/tab/SmartTabIndicationInterpolator.java new file mode 100644 index 000000000..2ae177692 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/SmartTabIndicationInterpolator.java @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2015 ogaclejapan + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab; + +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +public abstract class SmartTabIndicationInterpolator { + + public static final SmartTabIndicationInterpolator SMART = new SmartIndicationInterpolator(); + public static final SmartTabIndicationInterpolator LINEAR = new LinearIndicationInterpolator(); + + static final int ID_SMART = 0; + static final int ID_LINEAR = 1; + + public static SmartTabIndicationInterpolator of(int id) { + switch (id) { + case ID_SMART: + return SMART; + case ID_LINEAR: + return LINEAR; + default: + throw new IllegalArgumentException("Unknown id: " + id); + } + } + + public abstract float getLeftEdge(float offset); + + public abstract float getRightEdge(float offset); + + public float getThickness(float offset) { + return 1f; //Always the same thickness by default + } + + public static class SmartIndicationInterpolator extends SmartTabIndicationInterpolator { + + private static final float DEFAULT_INDICATOR_INTERPOLATION_FACTOR = 3.0f; + + private final Interpolator leftEdgeInterpolator; + private final Interpolator rightEdgeInterpolator; + + public SmartIndicationInterpolator() { + this(DEFAULT_INDICATOR_INTERPOLATION_FACTOR); + } + + public SmartIndicationInterpolator(float factor) { + leftEdgeInterpolator = new AccelerateInterpolator(factor); + rightEdgeInterpolator = new DecelerateInterpolator(factor); + } + + @Override + public float getLeftEdge(float offset) { + return leftEdgeInterpolator.getInterpolation(offset); + } + + @Override + public float getRightEdge(float offset) { + return rightEdgeInterpolator.getInterpolation(offset); + } + + @Override + public float getThickness(float offset) { + return 1f / (1.0f - getLeftEdge(offset) + getRightEdge(offset)); + } + + } + + public static class LinearIndicationInterpolator extends SmartTabIndicationInterpolator { + + @Override + public float getLeftEdge(float offset) { + return offset; + } + + @Override + public float getRightEdge(float offset) { + return offset; + } + + } +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout.java b/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout.java new file mode 100644 index 000000000..92c8062f7 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout.java @@ -0,0 +1,644 @@ +/** + * Copyright (C) 2015 ogaclejapan + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Typeface; +import android.os.Build; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.core.view.ViewCompat; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.chwl.library.R; + +/** + * To be used with ViewPager to provide a tab indicator component which give constant feedback as + * to + * the user's scroll progress. + *

+ * To use the component, simply add it to your view hierarchy. Then in your + * {@link android.app.Activity} or {@link androidx.fragment.app.Fragment} call + * {@link #setViewPager(ViewPager)} providing it the ViewPager this + * layout + * is being used for. + *

+ * The colors can be customized in two ways. The first and simplest is to provide an array of + * colors + * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The + * alternative is via the {@link TabColorizer} interface which provides you complete control over + * which color is used for any individual position. + *

+ * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)}, + * providing the layout ID of your custom layout. + *

+ * To use the component, simply add it to your view hierarchy. Then in your + * {@link android.app.Activity} or {@link androidx.fragment.app.Fragment} call + * {@link #setViewPager(ViewPager2, RecyclerView.Adapter, TabTitleProvider)} providing it the ViewPager this + * layout + * is being used for. + *

+ * The colors can be customized in two ways. The first and simplest is to provide an array of + * colors + * via {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)}. The + * alternative is via the {@link TabColorizer} interface which provides you complete control over + * which color is used for any individual position. + *

+ * The views used as tabs can be customized by calling {@link #setCustomTabView(int, int)}, + * providing the layout ID of your custom layout. + *

+ * Forked from Google Samples > SlidingTabsBasic > + * SlidingTabLayout + */ +public class SmartTabLayout2 extends HorizontalScrollView { + + private static final boolean DEFAULT_DISTRIBUTE_EVENLY = false; + private static final int TITLE_OFFSET_DIPS = 24; + private static final int TITLE_OFFSET_AUTO_CENTER = -1; + private static final int TAB_VIEW_PADDING_DIPS = 16; + private static final boolean TAB_VIEW_TEXT_ALL_CAPS = true; + private static final int TAB_VIEW_TEXT_SIZE_SP = 12; + private static final int TAB_VIEW_TEXT_COLOR = 0xFC000000; + private static final int TAB_VIEW_TEXT_MIN_WIDTH = 0; + private static final boolean TAB_CLICKABLE = true; + private static final int NO_TEXT_STYLE = -1; + + protected final SmartTabStrip tabStrip; + private int titleOffset; + private int tabViewBackgroundResId; + private boolean tabViewTextAllCaps; + private ColorStateList tabViewTextColors; + private float tabViewTextSize; + private int tabViewTextHorizontalPadding; + private int tabViewTextMinWidth; + private ViewPager2 viewPager; + private ViewPager2.OnPageChangeCallback viewPagerPageChangeCallback; + @Nullable + private TabTitleProvider tabTitleProvider; + private OnScrollChangeListener onScrollChangeListener; + private TabProvider tabProvider; + private InternalTabClickListener internalTabClickListener; + private InternalTabLongClickListener internalTabLongClickListener; + private OnTabClickListener onTabClickListener; + private OnTabLongClickListener onTabLongClickListener; + private boolean distributeEvenly; + private int textAppearance; + + private int childCountCache = 0; + + public SmartTabLayout2(Context context) { + this(context, null); + } + + public SmartTabLayout2(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SmartTabLayout2(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // Disable the Scroll Bar + setHorizontalScrollBarEnabled(false); + + final DisplayMetrics dm = getResources().getDisplayMetrics(); + final float density = dm.density; + + int tabBackgroundResId = NO_ID; + boolean textAllCaps = TAB_VIEW_TEXT_ALL_CAPS; + ColorStateList textColors; + float textSize = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP, dm); + int textHorizontalPadding = (int) (TAB_VIEW_PADDING_DIPS * density); + int textMinWidth = (int) (TAB_VIEW_TEXT_MIN_WIDTH * density); + boolean distributeEvenly = DEFAULT_DISTRIBUTE_EVENLY; + int customTabLayoutId = NO_ID; + int customTabTextViewId = NO_ID; + boolean clickable = TAB_CLICKABLE; + int titleOffset = (int) (TITLE_OFFSET_DIPS * density); + int textStyle = NO_TEXT_STYLE; + + TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.stl_SmartTabLayout, defStyle, 0); + tabBackgroundResId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_defaultTabBackground, tabBackgroundResId); + textAllCaps = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextAllCaps, textAllCaps); + textColors = a.getColorStateList( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextColor); + textSize = a.getDimension( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextSize, textSize); + textHorizontalPadding = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextHorizontalPadding, textHorizontalPadding); + textMinWidth = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextMinWidth, textMinWidth); + customTabLayoutId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_customTabTextLayoutId, customTabLayoutId); + customTabTextViewId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_customTabTextViewId, customTabTextViewId); + distributeEvenly = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_distributeEvenly, distributeEvenly); + clickable = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_clickable, clickable); + titleOffset = a.getLayoutDimension( + R.styleable.stl_SmartTabLayout_stl_titleOffset, titleOffset); + textStyle = a.getResourceId(R.styleable.stl_SmartTabLayout_stl_tabTextStyle, textStyle); + a.recycle(); + + this.titleOffset = titleOffset; + this.tabViewBackgroundResId = tabBackgroundResId; + this.tabViewTextAllCaps = textAllCaps; + this.tabViewTextColors = (textColors != null) + ? textColors + : ColorStateList.valueOf(TAB_VIEW_TEXT_COLOR); + this.tabViewTextSize = textSize; + this.tabViewTextHorizontalPadding = textHorizontalPadding; + this.tabViewTextMinWidth = textMinWidth; + this.internalTabClickListener = clickable ? new InternalTabClickListener() : null; + this.internalTabLongClickListener = clickable ? new InternalTabLongClickListener() : null; + this.distributeEvenly = distributeEvenly; + this.textAppearance = textStyle; + + if (customTabLayoutId != NO_ID) { + setCustomTabView(customTabLayoutId, customTabTextViewId); + } + + this.tabStrip = new SmartTabStrip(context, attrs); + + if (distributeEvenly && tabStrip.isIndicatorAlwaysInCenter()) { + throw new UnsupportedOperationException( + "'distributeEvenly' and 'indicatorAlwaysInCenter' both use does not support"); + } + + // Make sure that the Tab Strips fills this View + setFillViewport(!tabStrip.isIndicatorAlwaysInCenter()); + + addView(tabStrip, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (onScrollChangeListener != null) { + onScrollChangeListener.onScrollChanged(l, oldl); + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + adjustForIndicatorAlwaysInCenter(w, h); + } + + private void adjustForIndicatorAlwaysInCenter(int w, int h) { + if (tabStrip.isIndicatorAlwaysInCenter() && tabStrip.getChildCount() > 0) { + View firstTab = tabStrip.getChildAt(0); + View lastTab = tabStrip.getChildAt(tabStrip.getChildCount() - 1); + int start = (w - Utils.getMeasuredWidth(firstTab)) / 2 - Utils.getMarginStart(firstTab); + int end = (w - Utils.getMeasuredWidth(lastTab)) / 2 - Utils.getMarginEnd(lastTab); + tabStrip.setMinimumWidth(tabStrip.getMeasuredWidth()); + ViewCompat.setPaddingRelative(this, start, getPaddingTop(), end, getPaddingBottom()); + setClipToPadding(false); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + // Ensure first scroll + if (changed && viewPager != null) { + scrollToTab(viewPager.getCurrentItem(), 0); + } + if (childCountCache != tabStrip.getChildCount()) { + adjustForIndicatorAlwaysInCenter(getMeasuredWidth(), getMeasuredHeight()); + } + childCountCache = tabStrip.getChildCount(); + } + + /** + * Set the behavior of the Indicator scrolling feedback. + * + * @param interpolator {@link SmartTabIndicationInterpolator} + */ + public void setIndicationInterpolator(SmartTabIndicationInterpolator interpolator) { + tabStrip.setIndicationInterpolator(interpolator); + } + + /** + * Set the custom {@link TabColorizer} to be used. + * + * If you only require simple customisation then you can use + * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve + * similar effects. + */ + public void setCustomTabColorizer(TabColorizer tabColorizer) { + tabStrip.setCustomTabColorizer(tabColorizer); + } + + /** + * Set the color used for styling the tab text. This will need to be called prior to calling + * {@link #setViewPager(ViewPager2, RecyclerView.Adapter, TabTitleProvider)} otherwise it will not get set + * + * @param color to use for tab text + */ + public void setDefaultTabTextColor(int color) { + tabViewTextColors = ColorStateList.valueOf(color); + } + + /** + * Sets the colors used for styling the tab text. This will need to be called prior to calling + * {@link #setViewPager(ViewPager2, RecyclerView.Adapter, TabTitleProvider)} otherwise it will not get set + * + * @param colors ColorStateList to use for tab text + */ + public void setDefaultTabTextColor(ColorStateList colors) { + tabViewTextColors = colors; + } + + /** + * Set the same weight for tab + */ + public void setDistributeEvenly(boolean distributeEvenly) { + this.distributeEvenly = distributeEvenly; + } + + /** + * Sets the colors to be used for indicating the selected tab. These colors are treated as a + * circular array. Providing one color will mean that all tabs are indicated with the same color. + */ + public void setSelectedIndicatorColors(int... colors) { + tabStrip.setSelectedIndicatorColors(colors); + } + + /** + * Sets the colors to be used for tab dividers. These colors are treated as a circular array. + * Providing one color will mean that all tabs are indicated with the same color. + */ + public void setDividerColors(int... colors) { + tabStrip.setDividerColors(colors); + } + + /** + * Set the {@link ViewPager2.OnPageChangeCallback}. When using {@link SmartTabLayout2} you are + * required to set any {@link ViewPager2.OnPageChangeCallback} through this method. This is so + * that the layout can update it's scroll position correctly. + * + * @see ViewPager2#registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback) + */ + public void setOnPageChangeCallback(ViewPager2.OnPageChangeCallback listener) { + viewPagerPageChangeCallback = listener; + } + + /** + * Set {@link OnScrollChangeListener} for obtaining values of scrolling. + * + * @param listener the {@link OnScrollChangeListener} to set + */ + public void setOnScrollChangeListener(OnScrollChangeListener listener) { + onScrollChangeListener = listener; + } + + /** + * Set {@link OnTabClickListener} for obtaining click event. + * + * @param listener the {@link OnTabClickListener} to set + */ + public void setOnTabClickListener(OnTabClickListener listener) { + onTabClickListener = listener; + } + + public void setOnTabLongClickListener(OnTabLongClickListener listener) { + onTabLongClickListener = listener; + } + + /** + * Set the custom layout to be inflated for the tab views. + * + * @param layoutResId Layout id to be inflated + * @param textViewId id of the {@link TextView} in the inflated view + */ + public void setCustomTabView(int layoutResId, int textViewId) { + tabProvider = new SimpleTabProvider(getContext(), layoutResId, textViewId); + } + + /** + * Set the custom layout to be inflated for the tab views. + * + * @param provider {@link TabProvider} + */ + public void setCustomTabView(TabProvider provider) { + tabProvider = provider; + } + + /** + * Sets the associated view pager. Note that the assumption here is that the pager content + * (number of tabs and tab titles) does not change after this call has been made. + */ + public void setViewPager(@NonNull ViewPager2 viewPager, @NonNull RecyclerView.Adapter adapter, + @Nullable TabTitleProvider titleProvider) { + tabStrip.removeAllViews(); + + this.viewPager = viewPager; + if (this.viewPager.getAdapter() != adapter){ + this.viewPager.setAdapter(adapter); + } + this.tabTitleProvider = titleProvider; + if (viewPager != null && viewPager.getAdapter() != null) { + viewPager.registerOnPageChangeCallback(new InternalViewPagerListener()); + populateTabStrip(); + } + } + + /** + * Returns the view at the specified position in the tabs. + * + * @param position the position at which to get the view from + * @return the view at the specified position or null if the position does not exist within the + * tabs + */ + public View getTabAt(int position) { + return tabStrip.getChildAt(position); + } + + /** + * Create a default view to be used for tabs. This is called if a custom tab view is not set via + * {@link #setCustomTabView(int, int)}. + */ + protected TextView createDefaultTabView(CharSequence title) { + TextView textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setText(title); + if (textAppearance != NO_TEXT_STYLE) { + textView.setTextAppearance(getContext(), textAppearance); + } else { + textView.setTextColor(tabViewTextColors); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabViewTextSize); + textView.setTypeface(Typeface.DEFAULT_BOLD); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style + textView.setAllCaps(tabViewTextAllCaps); + } + + if (tabViewTextMinWidth > 0) { + textView.setMinWidth(tabViewTextMinWidth); + } + } + if (tabViewBackgroundResId != NO_ID) { + textView.setBackgroundResource(tabViewBackgroundResId); + } else { + // If we're running on Honeycomb or newer, then we can use the Theme's + // selectableItemBackground to ensure that the View has a pressed state + TypedValue outValue = new TypedValue(); + getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, + outValue, true); + textView.setBackgroundResource(outValue.resourceId); + } + textView.setPadding( + tabViewTextHorizontalPadding, 0, + tabViewTextHorizontalPadding, 0); + textView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + return textView; + } + + private void populateTabStrip() { + final RecyclerView.Adapter adapter = viewPager.getAdapter(); + + for (int i = 0; i < adapter.getItemCount(); i++) { + + CharSequence pageTitle = null; + if (tabTitleProvider != null) { + pageTitle = tabTitleProvider.getPageTitle(i); + } + + final View tabView = (tabProvider == null) + ? createDefaultTabView(pageTitle) + : tabProvider.createTabView(tabStrip, i, pageTitle); + + if (tabView == null) { + throw new IllegalStateException("tabView is null."); + } + + if (distributeEvenly) { + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams(); + lp.width = 0; + lp.weight = 1; + } + + if (internalTabClickListener != null) { + tabView.setOnClickListener(internalTabClickListener); + } + if (internalTabLongClickListener != null) { + tabView.setOnLongClickListener(internalTabLongClickListener); + } + + tabStrip.addView(tabView); + + if (i == viewPager.getCurrentItem()) { + tabView.setSelected(true); + } + + } + } + + private void scrollToTab(int tabIndex, float positionOffset) { + final int tabStripChildCount = tabStrip.getChildCount(); + if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { + return; + } + + final boolean isLayoutRtl = Utils.isLayoutRtl(this); + View selectedTab = tabStrip.getChildAt(tabIndex); + int widthPlusMargin = Utils.getWidth(selectedTab) + Utils.getMarginHorizontally(selectedTab); + int extraOffset = (int) (positionOffset * widthPlusMargin); + + if (tabStrip.isIndicatorAlwaysInCenter()) { + + if (0f < positionOffset && positionOffset < 1f) { + View nextTab = tabStrip.getChildAt(tabIndex + 1); + int selectHalfWidth = Utils.getWidth(selectedTab) / 2 + Utils.getMarginEnd(selectedTab); + int nextHalfWidth = Utils.getWidth(nextTab) / 2 + Utils.getMarginStart(nextTab); + extraOffset = Math.round(positionOffset * (selectHalfWidth + nextHalfWidth)); + } + + View firstTab = tabStrip.getChildAt(0); + int x; + if (isLayoutRtl) { + int first = Utils.getWidth(firstTab) + Utils.getMarginEnd(firstTab); + int selected = Utils.getWidth(selectedTab) + Utils.getMarginEnd(selectedTab); + x = Utils.getEnd(selectedTab) - Utils.getMarginEnd(selectedTab) - extraOffset; + x -= (first - selected) / 2; + } else { + int first = Utils.getWidth(firstTab) + Utils.getMarginStart(firstTab); + int selected = Utils.getWidth(selectedTab) + Utils.getMarginStart(selectedTab); + x = Utils.getStart(selectedTab) - Utils.getMarginStart(selectedTab) + extraOffset; + x -= (first - selected) / 2; + } + + scrollTo(x, 0); + return; + + } + + int x; + if (titleOffset == TITLE_OFFSET_AUTO_CENTER) { + + if (0f < positionOffset && positionOffset < 1f) { + View nextTab = tabStrip.getChildAt(tabIndex + 1); + int selectHalfWidth = Utils.getWidth(selectedTab) / 2 + Utils.getMarginEnd(selectedTab); + int nextHalfWidth = Utils.getWidth(nextTab) / 2 + Utils.getMarginStart(nextTab); + extraOffset = Math.round(positionOffset * (selectHalfWidth + nextHalfWidth)); + } + + if (isLayoutRtl) { + x = -Utils.getWidthWithMargin(selectedTab) / 2 + getWidth() / 2; + x -= Utils.getPaddingStart(this); + } else { + x = Utils.getWidthWithMargin(selectedTab) / 2 - getWidth() / 2; + x += Utils.getPaddingStart(this); + } + + } else { + + if (isLayoutRtl) { + x = (tabIndex > 0 || positionOffset > 0) ? titleOffset : 0; + } else { + x = (tabIndex > 0 || positionOffset > 0) ? -titleOffset : 0; + } + + } + + int start = Utils.getStart(selectedTab); + int startMargin = Utils.getMarginStart(selectedTab); + if (isLayoutRtl) { + x += start + startMargin - extraOffset - getWidth() + Utils.getPaddingHorizontally(this); + } else { + x += start - startMargin + extraOffset; + } + + scrollTo(x, 0); + + } + + /** + * Interface definition for a callback to be invoked when the scroll position of a view changes. + */ + public interface OnScrollChangeListener { + + /** + * Called when the scroll position of a view changes. + * + * @param scrollX Current horizontal scroll origin. + * @param oldScrollX Previous horizontal scroll origin. + */ + void onScrollChanged(int scrollX, int oldScrollX); + } + + /** + * Interface definition for a callback to be invoked when a tab is clicked. + */ + public interface OnTabClickListener { + + /** + * Called when a tab is clicked. + * + * @param position tab's position + */ + void onTabClicked(int position); + } + + /** + * Interface definition for a callback to be invoked when a tab is long clicked. + */ + public interface OnTabLongClickListener { + + /** + * Called when a tab is clicked. + * + * @param position tab's position + */ + void onTabLongClicked(int position); + } + + /** + * Create the custom tabs in the tab layout. Set with + * {@link #setCustomTabView(TabProvider)} + */ + public interface TabProvider { + + /** + * @return Return the View of {@code position} for the Tabs + */ + View createTabView(ViewGroup container, int position, @Nullable CharSequence pageTitle); + + } + + private static class SimpleTabProvider implements TabProvider { + + private final LayoutInflater inflater; + private final int tabViewLayoutId; + private final int tabViewTextViewId; + + private SimpleTabProvider(Context context, int layoutResId, int textViewId) { + inflater = LayoutInflater.from(context); + tabViewLayoutId = layoutResId; + tabViewTextViewId = textViewId; + } + + @Override + public View createTabView(ViewGroup container, int position, CharSequence pageTitle) { + View tabView = null; + TextView tabTitleView = null; + + if (tabViewLayoutId != NO_ID) { + tabView = inflater.inflate(tabViewLayoutId, container, false); + } + + if (tabViewTextViewId != NO_ID && tabView != null) { + tabTitleView = (TextView) tabView.findViewById(tabViewTextViewId); + } + + if (tabTitleView == null && TextView.class.isInstance(tabView)) { + tabTitleView = (TextView) tabView; + } + + if (tabTitleView != null) { + tabTitleView.setText(pageTitle); + } + + return tabView; + } + + } + + private class InternalViewPagerListener extends ViewPager2.OnPageChangeCallback { + + private int scrollState; + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + int tabStripChildCount = tabStrip.getChildCount(); + if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { + return; + } + + tabStrip.onViewPagerPageChanged(position, positionOffset); + + scrollToTab(position, positionOffset); + + if (viewPagerPageChangeCallback != null) { + viewPagerPageChangeCallback.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + scrollState = state; + + if (viewPagerPageChangeCallback != null) { + viewPagerPageChangeCallback.onPageScrollStateChanged(state); + } + } + + @Override + public void onPageSelected(int position) { + if (scrollState == ViewPager2.SCROLL_STATE_IDLE) { + tabStrip.onViewPagerPageChanged(position, 0f); + scrollToTab(position, 0); + } + + for (int i = 0, size = tabStrip.getChildCount(); i < size; i++) { + tabStrip.getChildAt(i).setSelected(position == i); + } + + if (viewPagerPageChangeCallback != null) { + viewPagerPageChangeCallback.onPageSelected(position); + } + } + + } + + private class InternalTabClickListener implements OnClickListener { + @Override + public void onClick(View v) { + for (int i = 0; i < tabStrip.getChildCount(); i++) { + if (v == tabStrip.getChildAt(i)) { + if (onTabClickListener != null) { + onTabClickListener.onTabClicked(i); + } + viewPager.setCurrentItem(i); + return; + } + } + } + } + + private class InternalTabLongClickListener implements OnLongClickListener { + @Override + public boolean onLongClick(View v) { + for (int i = 0; i < tabStrip.getChildCount(); i++) { + if (v == tabStrip.getChildAt(i)) { + if (onTabLongClickListener != null) { + onTabLongClickListener.onTabLongClicked(i); + } + return true; + } + } + return false; + } + } +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/SmartTabStrip.java b/library/src/main/java/com/chwl/library/widget/tab/SmartTabStrip.java new file mode 100644 index 000000000..8ecaf053d --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/SmartTabStrip.java @@ -0,0 +1,446 @@ +/** + * Copyright (C) 2015 ogaclejapan + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.widget.LinearLayout; + +import com.chwl.library.R; + +/** + *

+ * Forked from Google Samples > SlidingTabsBasic > + * SlidingTabStrip + */ +class SmartTabStrip extends LinearLayout { + + private static final int GRAVITY_BOTTOM = 0; + private static final int GRAVITY_TOP = 1; + private static final int GRAVITY_CENTER = 2; + + private static final int AUTO_WIDTH = -1; + + private static final int DEFAULT_TOP_BORDER_THICKNESS_DIPS = 0; + private static final byte DEFAULT_TOP_BORDER_COLOR_ALPHA = 0x26; + private static final int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 2; + private static final byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0x26; + private static final int SELECTED_INDICATOR_THICKNESS_DIPS = 8; + private static final int DEFAULT_SELECTED_INDICATOR_COLOR = 0xFF33B5E5; + private static final float DEFAULT_INDICATOR_CORNER_RADIUS = 0f; + private static final int DEFAULT_DIVIDER_THICKNESS_DIPS = 1; + private static final byte DEFAULT_DIVIDER_COLOR_ALPHA = 0x20; + private static final float DEFAULT_DIVIDER_HEIGHT = 0.5f; + private static final boolean DEFAULT_INDICATOR_IN_CENTER = false; + private static final boolean DEFAULT_INDICATOR_IN_FRONT = false; + private static final boolean DEFAULT_INDICATOR_WITHOUT_PADDING = false; + private static final int DEFAULT_INDICATOR_GRAVITY = GRAVITY_BOTTOM; + private static final boolean DEFAULT_DRAW_DECORATION_AFTER_TAB = false; + + private final int topBorderThickness; + private final int topBorderColor; + private final int bottomBorderThickness; + private final int bottomBorderColor; + private final Paint borderPaint; + private final RectF indicatorRectF = new RectF(); + private final boolean indicatorWithoutPadding; + private final boolean indicatorAlwaysInCenter; + private final boolean indicatorInFront; + private final int indicatorThickness; + private final int indicatorWidth; + private final int indicatorGravity; + private final float indicatorCornerRadius; + private final Paint indicatorPaint; + private final int dividerThickness; + private final Paint dividerPaint; + private final float dividerHeight; + private final SimpleTabColorizer defaultTabColorizer; + private final boolean drawDecorationAfterTab; + + private int lastPosition; + private int selectedPosition; + private float selectionOffset; + private SmartTabIndicationInterpolator indicationInterpolator; + private TabColorizer customTabColorizer; + + SmartTabStrip(Context context, AttributeSet attrs) { + super(context); + setWillNotDraw(false); + + final float density = getResources().getDisplayMetrics().density; + + TypedValue outValue = new TypedValue(); + context.getTheme().resolveAttribute(android.R.attr.colorForeground, outValue, true); + final int themeForegroundColor = outValue.data; + + boolean indicatorWithoutPadding = DEFAULT_INDICATOR_WITHOUT_PADDING; + boolean indicatorInFront = DEFAULT_INDICATOR_IN_FRONT; + boolean indicatorAlwaysInCenter = DEFAULT_INDICATOR_IN_CENTER; + int indicationInterpolatorId = SmartTabIndicationInterpolator.ID_SMART; + int indicatorGravity = DEFAULT_INDICATOR_GRAVITY; + int indicatorColor = DEFAULT_SELECTED_INDICATOR_COLOR; + int indicatorColorsId = NO_ID; + int indicatorThickness = (int) (SELECTED_INDICATOR_THICKNESS_DIPS * density); + int indicatorWidth = AUTO_WIDTH; + float indicatorCornerRadius = DEFAULT_INDICATOR_CORNER_RADIUS * density; + int overlineColor = setColorAlpha(themeForegroundColor, DEFAULT_TOP_BORDER_COLOR_ALPHA); + int overlineThickness = (int) (DEFAULT_TOP_BORDER_THICKNESS_DIPS * density); + int underlineColor = setColorAlpha(themeForegroundColor, DEFAULT_BOTTOM_BORDER_COLOR_ALPHA); + int underlineThickness = (int) (DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density); + int dividerColor = setColorAlpha(themeForegroundColor, DEFAULT_DIVIDER_COLOR_ALPHA); + int dividerColorsId = NO_ID; + int dividerThickness = (int) (DEFAULT_DIVIDER_THICKNESS_DIPS * density); + boolean drawDecorationAfterTab = DEFAULT_DRAW_DECORATION_AFTER_TAB; + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.stl_SmartTabLayout); + indicatorAlwaysInCenter = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_indicatorAlwaysInCenter, indicatorAlwaysInCenter); + indicatorWithoutPadding = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_indicatorWithoutPadding, indicatorWithoutPadding); + indicatorInFront = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_indicatorInFront, indicatorInFront); + indicationInterpolatorId = a.getInt( + R.styleable.stl_SmartTabLayout_stl_indicatorInterpolation, indicationInterpolatorId); + indicatorGravity = a.getInt( + R.styleable.stl_SmartTabLayout_stl_indicatorGravity, indicatorGravity); + indicatorColor = a.getColor( + R.styleable.stl_SmartTabLayout_stl_indicatorColor, indicatorColor); + indicatorColorsId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_indicatorColors, indicatorColorsId); + indicatorThickness = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_indicatorThickness, indicatorThickness); + indicatorWidth = a.getLayoutDimension( + R.styleable.stl_SmartTabLayout_stl_indicatorWidth, indicatorWidth); + indicatorCornerRadius = a.getDimension( + R.styleable.stl_SmartTabLayout_stl_indicatorCornerRadius, indicatorCornerRadius); + overlineColor = a.getColor( + R.styleable.stl_SmartTabLayout_stl_overlineColor, overlineColor); + overlineThickness = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_overlineThickness, overlineThickness); + underlineColor = a.getColor( + R.styleable.stl_SmartTabLayout_stl_underlineColor, underlineColor); + underlineThickness = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_underlineThickness, underlineThickness); + dividerColor = a.getColor( + R.styleable.stl_SmartTabLayout_stl_dividerColor, dividerColor); + dividerColorsId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_dividerColors, dividerColorsId); + dividerThickness = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_dividerThickness, dividerThickness); + drawDecorationAfterTab = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_drawDecorationAfterTab, drawDecorationAfterTab); + a.recycle(); + + final int[] indicatorColors = (indicatorColorsId == NO_ID) + ? new int[] { indicatorColor } + : getResources().getIntArray(indicatorColorsId); + + final int[] dividerColors = (dividerColorsId == NO_ID) + ? new int[] { dividerColor } + : getResources().getIntArray(dividerColorsId); + + this.defaultTabColorizer = new SimpleTabColorizer(); + this.defaultTabColorizer.setIndicatorColors(indicatorColors); + this.defaultTabColorizer.setDividerColors(dividerColors); + + this.topBorderThickness = overlineThickness; + this.topBorderColor = overlineColor; + this.bottomBorderThickness = underlineThickness; + this.bottomBorderColor = underlineColor; + this.borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + this.indicatorAlwaysInCenter = indicatorAlwaysInCenter; + this.indicatorWithoutPadding = indicatorWithoutPadding; + this.indicatorInFront = indicatorInFront; + this.indicatorThickness = indicatorThickness; + this.indicatorWidth = indicatorWidth; + this.indicatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + this.indicatorCornerRadius = indicatorCornerRadius; + this.indicatorGravity = indicatorGravity; + + this.dividerHeight = DEFAULT_DIVIDER_HEIGHT; + this.dividerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + this.dividerPaint.setStrokeWidth(dividerThickness); + this.dividerThickness = dividerThickness; + + this.drawDecorationAfterTab = drawDecorationAfterTab; + + this.indicationInterpolator = SmartTabIndicationInterpolator.of(indicationInterpolatorId); + } + + /** + * Set the alpha value of the {@code color} to be the given {@code alpha} value. + */ + private static int setColorAlpha(int color, byte alpha) { + return Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color)); + } + + /** + * Blend {@code color1} and {@code color2} using the given ratio. + * + * @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend, + * 0.0 will return {@code color2}. + */ + private static int blendColors(int color1, int color2, float ratio) { + final float inverseRation = 1f - ratio; + float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation); + float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation); + float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation); + return Color.rgb((int) r, (int) g, (int) b); + } + + void setIndicationInterpolator(SmartTabIndicationInterpolator interpolator) { + indicationInterpolator = interpolator; + invalidate(); + } + + void setCustomTabColorizer(TabColorizer customTabColorizer) { + this.customTabColorizer = customTabColorizer; + invalidate(); + } + + void setSelectedIndicatorColors(int... colors) { + // Make sure that the custom colorizer is removed + customTabColorizer = null; + defaultTabColorizer.setIndicatorColors(colors); + invalidate(); + } + + void setDividerColors(int... colors) { + // Make sure that the custom colorizer is removed + customTabColorizer = null; + defaultTabColorizer.setDividerColors(colors); + invalidate(); + } + + void onViewPagerPageChanged(int position, float positionOffset) { + selectedPosition = position; + selectionOffset = positionOffset; + if (positionOffset == 0f && lastPosition != selectedPosition) { + lastPosition = selectedPosition; + } + invalidate(); + } + + boolean isIndicatorAlwaysInCenter() { + return indicatorAlwaysInCenter; + } + + TabColorizer getTabColorizer() { + return (customTabColorizer != null) ? customTabColorizer : defaultTabColorizer; + } + + @Override + protected void onDraw(Canvas canvas) { + if (!drawDecorationAfterTab) { + drawDecoration(canvas); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (drawDecorationAfterTab) { + drawDecoration(canvas); + } + } + + private void drawDecoration(Canvas canvas) { + final int height = getHeight(); + final int width = getWidth(); + final int tabCount = getChildCount(); + final TabColorizer tabColorizer = getTabColorizer(); + final boolean isLayoutRtl = Utils.isLayoutRtl(this); + + if (indicatorInFront) { + drawOverline(canvas, 0, width); + drawUnderline(canvas, 0, width, height); + } + + // Thick colored underline below the current selection + if (tabCount > 0) { + View selectedTab = getChildAt(selectedPosition); + int selectedStart = Utils.getStart(selectedTab, indicatorWithoutPadding); + int selectedEnd = Utils.getEnd(selectedTab, indicatorWithoutPadding); + int left; + int right; + if (isLayoutRtl) { + left = selectedEnd; + right = selectedStart; + } else { + left = selectedStart; + right = selectedEnd; + } + + int color = tabColorizer.getIndicatorColor(selectedPosition); + float thickness = indicatorThickness; + + if (selectionOffset > 0f && selectedPosition < (getChildCount() - 1)) { + int nextColor = tabColorizer.getIndicatorColor(selectedPosition + 1); + if (color != nextColor) { + color = blendColors(nextColor, color, selectionOffset); + } + + // Draw the selection partway between the tabs + float startOffset = indicationInterpolator.getLeftEdge(selectionOffset); + float endOffset = indicationInterpolator.getRightEdge(selectionOffset); + float thicknessOffset = indicationInterpolator.getThickness(selectionOffset); + + View nextTab = getChildAt(selectedPosition + 1); + int nextStart = Utils.getStart(nextTab, indicatorWithoutPadding); + int nextEnd = Utils.getEnd(nextTab, indicatorWithoutPadding); + if (isLayoutRtl) { + left = (int) (endOffset * nextEnd + (1.0f - endOffset) * left); + right = (int) (startOffset * nextStart + (1.0f - startOffset) * right); + } else { + left = (int) (startOffset * nextStart + (1.0f - startOffset) * left); + right = (int) (endOffset * nextEnd + (1.0f - endOffset) * right); + } + thickness = thickness * thicknessOffset; + } + + drawIndicator(canvas, left, right, height, thickness, color); + + } + + if (!indicatorInFront) { + drawOverline(canvas, 0, width); + drawUnderline(canvas, 0, getWidth(), height); + } + + // Vertical separators between the titles + drawSeparator(canvas, height, tabCount); + + } + + private void drawSeparator(Canvas canvas, int height, int tabCount) { + if (dividerThickness <= 0) { + return; + } + + final int dividerHeightPx = (int) (Math.min(Math.max(0f, dividerHeight), 1f) * height); + final TabColorizer tabColorizer = getTabColorizer(); + + // Vertical separators between the titles + final int separatorTop = (height - dividerHeightPx) / 2; + final int separatorBottom = separatorTop + dividerHeightPx; + + final boolean isLayoutRtl = Utils.isLayoutRtl(this); + for (int i = 0; i < tabCount - 1; i++) { + View child = getChildAt(i); + int end = Utils.getEnd(child); + int endMargin = Utils.getMarginEnd(child); + int separatorX = isLayoutRtl ? end - endMargin : end + endMargin; + dividerPaint.setColor(tabColorizer.getDividerColor(i)); + canvas.drawLine(separatorX, separatorTop, separatorX, separatorBottom, dividerPaint); + } + } + + private void drawIndicator(Canvas canvas, int left, int right, int height, float thickness, + int color) { + if (indicatorThickness <= 0 || indicatorWidth == 0) { + return; + } + + float center; + float top; + float bottom; + + switch (indicatorGravity) { + case GRAVITY_TOP: + center = indicatorThickness / 2f; + top = center - (thickness / 2f); + bottom = center + (thickness / 2f); + break; + case GRAVITY_CENTER: + center = height / 2f; + top = center - (thickness / 2f); + bottom = center + (thickness / 2f); + break; + case GRAVITY_BOTTOM: + default: + center = height - (indicatorThickness / 2f); + top = center - (thickness / 2f); + bottom = center + (thickness / 2f); + } + + indicatorPaint.setColor(color); + if (indicatorWidth == AUTO_WIDTH) { + indicatorRectF.set(left, top, right, bottom); + } else { + float padding = (Math.abs(left - right) - indicatorWidth) / 2f; + indicatorRectF.set(left + padding, top, right - padding, bottom); + } + + if (indicatorCornerRadius > 0f) { + canvas.drawRoundRect( + indicatorRectF, indicatorCornerRadius, + indicatorCornerRadius, indicatorPaint); + } else { + canvas.drawRect(indicatorRectF, indicatorPaint); + } + } + + private void drawOverline(Canvas canvas, int left, int right) { + if (topBorderThickness <= 0) { + return; + } + // Thin overline along the entire top edge + borderPaint.setColor(topBorderColor); + canvas.drawRect(left, 0, right, topBorderThickness, borderPaint); + } + + private void drawUnderline(Canvas canvas, int left, int right, int height) { + if (bottomBorderThickness <= 0) { + return; + } + // Thin underline along the entire bottom edge + borderPaint.setColor(bottomBorderColor); + canvas.drawRect(left, height - bottomBorderThickness, right, height, borderPaint); + } + + private static class SimpleTabColorizer implements TabColorizer { + + private int[] indicatorColors; + private int[] dividerColors; + + @Override + public final int getIndicatorColor(int position) { + return indicatorColors[position % indicatorColors.length]; + } + + @Override + public final int getDividerColor(int position) { + return dividerColors[position % dividerColors.length]; + } + + void setIndicatorColors(int... colors) { + indicatorColors = colors; + } + + void setDividerColors(int... colors) { + dividerColors = colors; + } + } +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/TabColorizer.java b/library/src/main/java/com/chwl/library/widget/tab/TabColorizer.java new file mode 100644 index 000000000..24276ea41 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/TabColorizer.java @@ -0,0 +1,19 @@ +package com.chwl.library.widget.tab; + +/** + * Allows complete control over the colors drawn in the tab layout. Set with + * {@link SmartTabLayout#setCustomTabColorizer(TabColorizer)}. + */ +public interface TabColorizer { + + /** + * @return return the color of the indicator used when {@code position} is selected. + */ + int getIndicatorColor(int position); + + /** + * @return return the color of the divider drawn to the right of {@code position}. + */ + int getDividerColor(int position); + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/TabTitleProvider.java b/library/src/main/java/com/chwl/library/widget/tab/TabTitleProvider.java new file mode 100644 index 000000000..a97434194 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/TabTitleProvider.java @@ -0,0 +1,8 @@ +package com.chwl.library.widget.tab; + +import androidx.annotation.Nullable; + +public interface TabTitleProvider { + @Nullable + CharSequence getPageTitle(int position); +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/Utils.java b/library/src/main/java/com/chwl/library/widget/tab/Utils.java new file mode 100644 index 000000000..e5e5528a5 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/Utils.java @@ -0,0 +1,120 @@ +/** + * Copyright (C) 2015 ogaclejapan + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.core.view.MarginLayoutParamsCompat; +import androidx.core.view.ViewCompat; + +final class Utils { + + private Utils() { } + + static int getMeasuredWidth(View v) { + return (v == null) ? 0 : v.getMeasuredWidth(); + } + + static int getWidth(View v) { + return (v == null) ? 0 : v.getWidth(); + } + + static int getWidthWithMargin(View v) { + return getWidth(v) + getMarginHorizontally(v); + } + + static int getStart(View v) { + return getStart(v, false); + } + + static int getStart(View v, boolean withoutPadding) { + if (v == null) { + return 0; + } + if (isLayoutRtl(v)) { + return (withoutPadding) ? v.getRight() - getPaddingStart(v) : v.getRight(); + } else { + return (withoutPadding) ? v.getLeft() + getPaddingStart(v) : v.getLeft(); + } + } + + static int getEnd(View v) { + return getEnd(v, false); + } + + static int getEnd(View v, boolean withoutPadding) { + if (v == null) { + return 0; + } + if (isLayoutRtl(v)) { + return (withoutPadding) ? v.getLeft() + getPaddingEnd(v) : v.getLeft(); + } else { + return (withoutPadding) ? v.getRight() - getPaddingEnd(v) : v.getRight(); + } + } + + static int getPaddingStart(View v) { + if (v == null) { + return 0; + } + return ViewCompat.getPaddingStart(v); + } + + static int getPaddingEnd(View v) { + if (v == null) { + return 0; + } + return ViewCompat.getPaddingEnd(v); + } + + static int getPaddingHorizontally(View v) { + if (v == null) { + return 0; + } + return v.getPaddingLeft() + v.getPaddingRight(); + } + + static int getMarginStart(View v) { + if (v == null) { + return 0; + } + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + return MarginLayoutParamsCompat.getMarginStart(lp); + } + + static int getMarginEnd(View v) { + if (v == null) { + return 0; + } + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + return MarginLayoutParamsCompat.getMarginEnd(lp); + } + + static int getMarginHorizontally(View v) { + if (v == null) { + return 0; + } + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + return MarginLayoutParamsCompat.getMarginStart(lp) + MarginLayoutParamsCompat.getMarginEnd(lp); + } + + static boolean isLayoutRtl(View v) { + return ViewCompat.getLayoutDirection(v) == ViewCompat.LAYOUT_DIRECTION_RTL; + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/FragmentPageAdapter.kt b/library/src/main/java/com/chwl/library/widget/tab/util/FragmentPageAdapter.kt new file mode 100644 index 000000000..da0c2e7e4 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/FragmentPageAdapter.kt @@ -0,0 +1,19 @@ +package com.chwl.library.widget.tab.util + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + +class FragmentPageAdapter(fragmentManager: FragmentActivity, var fgList: List?) : + FragmentStateAdapter(fragmentManager) { + + + override fun getItemCount(): Int { + return fgList?.size?:0 + } + + override fun createFragment(position: Int): Fragment { + return fgList?.get(position) ?: Fragment() + } + +} \ No newline at end of file diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/PagerItem.java b/library/src/main/java/com/chwl/library/widget/tab/util/PagerItem.java new file mode 100644 index 000000000..69772b279 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/PagerItem.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util; + +public abstract class PagerItem { + + protected static final float DEFAULT_WIDTH = 1.f; + + private final CharSequence title; + private final float width; + + protected PagerItem(CharSequence title, float width) { + this.title = title; + this.width = width; + } + + public CharSequence getTitle() { + return title; + } + + public float getWidth() { + return width; + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/PagerItems.java b/library/src/main/java/com/chwl/library/widget/tab/util/PagerItems.java new file mode 100644 index 000000000..6a9636511 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/PagerItems.java @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util; + +import android.content.Context; + +import java.util.ArrayList; + +public abstract class PagerItems extends ArrayList { + + private final Context context; + + protected PagerItems(Context context) { + this.context = context; + } + + public Context getContext() { + return context; + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItem.java b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItem.java new file mode 100644 index 000000000..ab5eabd4b --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItem.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.LayoutRes; + +public class ViewPagerItem extends PagerItem { + + private final int resource; + + protected ViewPagerItem(CharSequence title, float width, @LayoutRes int resource) { + super(title, width); + this.resource = resource; + } + + public static ViewPagerItem of(CharSequence title, @LayoutRes int resource) { + return of(title, DEFAULT_WIDTH, resource); + } + + public static ViewPagerItem of(CharSequence title, float width, @LayoutRes int resource) { + return new ViewPagerItem(title, width, resource); + } + + public View initiate(LayoutInflater inflater, ViewGroup container) { + return inflater.inflate(resource, container, false); + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItemAdapter.java b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItemAdapter.java new file mode 100644 index 000000000..4dc50fad7 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItemAdapter.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.collection.SparseArrayCompat; +import androidx.viewpager.widget.PagerAdapter; + +import java.lang.ref.WeakReference; + +public class ViewPagerItemAdapter extends PagerAdapter { + + private final ViewPagerItems pages; + private final SparseArrayCompat> holder; + private final LayoutInflater inflater; + + public ViewPagerItemAdapter(ViewPagerItems pages) { + this.pages = pages; + this.holder = new SparseArrayCompat<>(pages.size()); + this.inflater = LayoutInflater.from(pages.getContext()); + } + + @Override + public int getCount() { + return pages.size(); + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + View view = getPagerItem(position).initiate(inflater, container); + container.addView(view); + holder.put(position, new WeakReference(view)); + return view; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + holder.remove(position); + container.removeView((View) object); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return object == view; + } + + @Override + public CharSequence getPageTitle(int position) { + return getPagerItem(position).getTitle(); + } + + @Override + public float getPageWidth(int position) { + return getPagerItem(position).getWidth(); + } + + public View getPage(int position) { + final WeakReference weakRefItem = holder.get(position); + return (weakRefItem != null) ? weakRefItem.get() : null; + } + + protected ViewPagerItem getPagerItem(int position) { + return pages.get(position); + } +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItems.java b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItems.java new file mode 100644 index 000000000..e456e9de5 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/ViewPagerItems.java @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util; + +import android.content.Context; + +import androidx.annotation.LayoutRes; +import androidx.annotation.StringRes; + +public class ViewPagerItems extends PagerItems { + + public ViewPagerItems(Context context) { + super(context); + } + + public static Creator with(Context context) { + return new Creator(context); + } + + public static class Creator { + + private final ViewPagerItems items; + + public Creator(Context context) { + items = new ViewPagerItems(context); + } + + public Creator add(@StringRes int title, @LayoutRes int resource) { + return add(ViewPagerItem.of(items.getContext().getString(title), resource)); + } + + public Creator add(@StringRes int title, float width, @LayoutRes int resource) { + return add(ViewPagerItem.of(items.getContext().getString(title), width, resource)); + } + + public Creator add(CharSequence title, @LayoutRes int resource) { + return add(ViewPagerItem.of(title, resource)); + } + + public Creator add(ViewPagerItem item) { + items.add(item); + return this; + } + + public ViewPagerItems create() { + return items; + } + + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/v4/Bundler.java b/library/src/main/java/com/chwl/library/widget/tab/util/v4/Bundler.java new file mode 100644 index 000000000..527ae53e4 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/v4/Bundler.java @@ -0,0 +1,520 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util.v4; + +import android.annotation.TargetApi; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcelable; +import android.util.Size; +import android.util.SizeF; +import android.util.SparseArray; + +import androidx.fragment.app.Fragment; + +import java.io.Serializable; +import java.util.ArrayList; + +public class Bundler { + + private final Bundle bundle; + + /** + * Constructs a new, empty Bundle. + */ + public Bundler() { + this(null); + } + + private Bundler(Bundle b) { + bundle = (b == null) ? new Bundle() : new Bundle(b); + } + + /** + * Constructs a Bundle containing a copy of the mappings from the given + * Bundle. + * + * @param b a Bundle to be copied. + */ + public static Bundler of(Bundle b) { + return new Bundler(b); + } + + /** + * Inserts all mappings from the given Bundle into this Bundle. + * + * @param bundle a Bundle + * @return this + */ + public Bundler putAll(Bundle bundle) { + this.bundle.putAll(bundle); + return this; + } + + /** + * Inserts a byte value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a byte + * @return this + */ + public Bundler putByte(String key, byte value) { + bundle.putByte(key, value); + return this; + } + + /** + * Inserts a char value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a char, or null + * @return this + */ + public Bundler putChar(String key, char value) { + bundle.putChar(key, value); + return this; + } + + /** + * Inserts a short value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a short + * @return this + */ + public Bundler putShort(String key, short value) { + bundle.putShort(key, value); + return this; + } + + /** + * Inserts a float value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a float + * @return this + */ + public Bundler putFloat(String key, float value) { + bundle.putFloat(key, value); + return this; + } + + /** + * Inserts a CharSequence value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a CharSequence, or null + * @return this + */ + public Bundler putCharSequence(String key, CharSequence value) { + bundle.putCharSequence(key, value); + return this; + } + + /** + * Inserts a Parcelable value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a Parcelable object, or null + * @return this + */ + public Bundler putParcelable(String key, Parcelable value) { + bundle.putParcelable(key, value); + return this; + } + + /** + * Inserts a Size value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a Size object, or null + * @return this + */ + @TargetApi(21) + public Bundler putSize(String key, Size value) { + bundle.putSize(key, value); + return this; + } + + /** + * Inserts a SizeF value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a SizeF object, or null + * @return this + */ + @TargetApi(21) + public Bundler putSizeF(String key, SizeF value) { + bundle.putSizeF(key, value); + return this; + } + + /** + * Inserts an array of Parcelable values into the mapping of this Bundle, + * replacing any existing value for the given key. Either key or value may + * be null. + * + * @param key a String, or null + * @param value an array of Parcelable objects, or null + * @return this + */ + public Bundler putParcelableArray(String key, Parcelable[] value) { + bundle.putParcelableArray(key, value); + return this; + } + + /** + * Inserts a List of Parcelable values into the mapping of this Bundle, + * replacing any existing value for the given key. Either key or value may + * be null. + * + * @param key a String, or null + * @param value an ArrayList of Parcelable objects, or null + * @return this + */ + public Bundler putParcelableArrayList(String key, + ArrayList value) { + bundle.putParcelableArrayList(key, value); + return this; + } + + /** + * Inserts a SparceArray of Parcelable values into the mapping of this + * Bundle, replacing any existing value for the given key. Either key + * or value may be null. + * + * @param key a String, or null + * @param value a SparseArray of Parcelable objects, or null + * @return this + */ + public Bundler putSparseParcelableArray(String key, + SparseArray value) { + bundle.putSparseParcelableArray(key, value); + return this; + } + + /** + * Inserts an ArrayList value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value an ArrayList object, or null + * @return this + */ + public Bundler putIntegerArrayList(String key, ArrayList value) { + bundle.putIntegerArrayList(key, value); + return this; + } + + /** + * Inserts an ArrayList value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value an ArrayList object, or null + * @return this + */ + public Bundler putStringArrayList(String key, ArrayList value) { + bundle.putStringArrayList(key, value); + return this; + } + + /** + * Inserts an ArrayList value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value an ArrayList object, or null + * @return this + */ + @TargetApi(8) + public Bundler putCharSequenceArrayList(String key, ArrayList value) { + bundle.putCharSequenceArrayList(key, value); + return this; + } + + /** + * Inserts a Serializable value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a Serializable object, or null + * @return this + */ + public Bundler putSerializable(String key, Serializable value) { + bundle.putSerializable(key, value); + return this; + } + + /** + * Inserts a byte array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a byte array object, or null + * @return this + */ + public Bundler putByteArray(String key, byte[] value) { + bundle.putByteArray(key, value); + return this; + } + + /** + * Inserts a short array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a short array object, or null + * @return this + */ + public Bundler putShortArray(String key, short[] value) { + bundle.putShortArray(key, value); + return this; + } + + /** + * Inserts a char array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a char array object, or null + * @return this + */ + public Bundler putCharArray(String key, char[] value) { + bundle.putCharArray(key, value); + return this; + } + + /** + * Inserts a float array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a float array object, or null + * @return this + */ + public Bundler putFloatArray(String key, float[] value) { + bundle.putFloatArray(key, value); + return this; + } + + /** + * Inserts a CharSequence array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a CharSequence array object, or null + * @return this + */ + @TargetApi(8) + public Bundler putCharSequenceArray(String key, CharSequence[] value) { + bundle.putCharSequenceArray(key, value); + return this; + } + + /** + * Inserts a Bundle value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a Bundle object, or null + * @return this + */ + public Bundler putBundle(String key, Bundle value) { + bundle.putBundle(key, value); + return this; + } + + /** + * Inserts an {@link IBinder} value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + *

You should be very careful when using this function. In many + * places where Bundles are used (such as inside of Intent objects), the Bundle + * can live longer inside of another process than the process that had originally + * created it. In that case, the IBinder you supply here will become invalid + * when your process goes away, and no longer usable, even if a new process is + * created for you later on.

+ * + * @param key a String, or null + * @param value an IBinder object, or null + * @return this + */ + @TargetApi(18) + public Bundler putBinder(String key, IBinder value) { + bundle.putBinder(key, value); + return this; + } + + /** + * Inserts a Boolean value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a Boolean, or null + * @return this + */ + public Bundler putBoolean(String key, boolean value) { + bundle.putBoolean(key, value); + return this; + } + + /** + * Inserts an int value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value an int, or null + * @return this + */ + public Bundler putInt(String key, int value) { + bundle.putInt(key, value); + return this; + } + + /** + * Inserts a long value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a long + * @return this + */ + public Bundler putLong(String key, long value) { + bundle.putLong(key, value); + return this; + } + + /** + * Inserts a double value into the mapping of this Bundle, replacing + * any existing value for the given key. + * + * @param key a String, or null + * @param value a double + * @return this + */ + public Bundler putDouble(String key, double value) { + bundle.putDouble(key, value); + return this; + } + + /** + * Inserts a String value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a String, or null + * @return this + */ + public Bundler putString(String key, String value) { + bundle.putString(key, value); + return this; + } + + /** + * Inserts a boolean array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a boolean array object, or null + * @return this + */ + public Bundler putBooleanArray(String key, boolean[] value) { + bundle.putBooleanArray(key, value); + return this; + } + + /** + * Inserts an int array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value an int array object, or null + * @return this + */ + public Bundler putIntArray(String key, int[] value) { + bundle.putIntArray(key, value); + return this; + } + + /** + * Inserts a long array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a long array object, or null + * @return this + */ + public Bundler putLongArray(String key, long[] value) { + bundle.putLongArray(key, value); + return this; + } + + /** + * Inserts a double array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a double array object, or null + * @return this + */ + public Bundler putDoubleArray(String key, double[] value) { + bundle.putDoubleArray(key, value); + return this; + } + + /** + * Inserts a String array value into the mapping of this Bundle, replacing + * any existing value for the given key. Either key or value may be null. + * + * @param key a String, or null + * @param value a String array object, or null + * @return this + */ + public Bundler putStringArray(String key, String[] value) { + bundle.putStringArray(key, value); + return this; + } + + /** + * Get the bundle. + * + * @return a bundle + */ + public Bundle get() { + return bundle; + } + + /** + * Set the argument of Fragment. + * + * @param fragment a fragment + * @return a fragment + */ + public T into(T fragment) { + fragment.setArguments(get()); + return fragment; + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItem.java b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItem.java new file mode 100644 index 000000000..7ca6266e7 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItem.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util.v4; + +import android.content.Context; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import com.chwl.library.widget.tab.util.PagerItem; + + +public class FragmentPagerItem extends PagerItem { + + private static final String TAG = "FragmentPagerItem"; + private static final String KEY_POSITION = TAG + ":Position"; + + private final String className; + private final Bundle args; + + protected FragmentPagerItem(CharSequence title, float width, String className, Bundle args) { + super(title, width); + this.className = className; + this.args = args; + } + + public static FragmentPagerItem of(CharSequence title, Class clazz) { + return of(title, DEFAULT_WIDTH, clazz); + } + + public static FragmentPagerItem of(CharSequence title, Class clazz, + Bundle args) { + return of(title, DEFAULT_WIDTH, clazz, args); + } + + public static FragmentPagerItem of(CharSequence title, float width, + Class clazz) { + return of(title, width, clazz, new Bundle()); + } + + public static FragmentPagerItem of(CharSequence title, float width, + Class clazz, Bundle args) { + return new FragmentPagerItem(title, width, clazz.getName(), args); + } + + public static boolean hasPosition(Bundle args) { + return args != null && args.containsKey(KEY_POSITION); + } + + public static int getPosition(Bundle args) { + return (hasPosition(args)) ? args.getInt(KEY_POSITION) : 0; + } + + static void setPosition(Bundle args, int position) { + args.putInt(KEY_POSITION, position); + } + + public Fragment instantiate(Context context, int position) { + setPosition(args, position); + return Fragment.instantiate(context, className, args); + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItemAdapter.java b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItemAdapter.java new file mode 100644 index 000000000..dd99fdfe9 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItemAdapter.java @@ -0,0 +1,84 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util.v4; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.collection.SparseArrayCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.lang.ref.WeakReference; + +public class FragmentPagerItemAdapter extends FragmentPagerAdapter { + + private final FragmentPagerItems pages; + private final SparseArrayCompat> holder; + + public FragmentPagerItemAdapter(FragmentManager fm, FragmentPagerItems pages) { + super(fm); + this.pages = pages; + this.holder = new SparseArrayCompat<>(pages.size()); + } + + @Override + public int getCount() { + return pages.size(); + } + + @Override + public Fragment getItem(int position) { + return getPagerItem(position).instantiate(pages.getContext(), position); + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + Object item = super.instantiateItem(container, position); + if (item instanceof Fragment) { + holder.put(position, new WeakReference((Fragment) item)); + } + return item; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + holder.remove(position); + super.destroyItem(container, position, object); + } + + @Override + public CharSequence getPageTitle(int position) { + return getPagerItem(position).getTitle(); + } + + @Override + public float getPageWidth(int position) { + return super.getPageWidth(position); + } + + public Fragment getPage(int position) { + final WeakReference weakRefItem = holder.get(position); + return (weakRefItem != null) ? weakRefItem.get() : null; + } + + protected FragmentPagerItem getPagerItem(int position) { + return pages.get(position); + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItems.java b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItems.java new file mode 100644 index 000000000..c5c987761 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentPagerItems.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util.v4; + +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.StringRes; +import androidx.fragment.app.Fragment; + +import com.chwl.library.widget.tab.util.PagerItems; + + +public class FragmentPagerItems extends PagerItems { + + public FragmentPagerItems(Context context) { + super(context); + } + + public static Creator with(Context context) { + return new Creator(context); + } + + public static class Creator { + + private final FragmentPagerItems items; + + public Creator(Context context) { + items = new FragmentPagerItems(context); + } + + public Creator add(@StringRes int title, Class clazz) { + return add(FragmentPagerItem.of(items.getContext().getString(title), clazz)); + } + + public Creator add(@StringRes int title, Class clazz, Bundle args) { + return add(FragmentPagerItem.of(items.getContext().getString(title), clazz, args)); + } + + public Creator add(@StringRes int title, float width, Class clazz) { + return add(FragmentPagerItem.of(items.getContext().getString(title), width, clazz)); + } + + public Creator add(@StringRes int title, float width, Class clazz, + Bundle args) { + return add(FragmentPagerItem.of(items.getContext().getString(title), width, clazz, args)); + } + + public Creator add(CharSequence title, Class clazz) { + return add(FragmentPagerItem.of(title, clazz)); + } + + public Creator add(CharSequence title, Class clazz, Bundle args) { + return add(FragmentPagerItem.of(title, clazz, args)); + } + + public Creator add(FragmentPagerItem item) { + items.add(item); + return this; + } + + public FragmentPagerItems create() { + return items; + } + + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentStatePagerItemAdapter.java b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentStatePagerItemAdapter.java new file mode 100644 index 000000000..fe29eb7b5 --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/util/v4/FragmentStatePagerItemAdapter.java @@ -0,0 +1,84 @@ +/** + * Copyright (C) 2015 ogaclejapan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab.util.v4; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.collection.SparseArrayCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import java.lang.ref.WeakReference; + +public class FragmentStatePagerItemAdapter extends FragmentStatePagerAdapter { + + private final FragmentPagerItems pages; + private final SparseArrayCompat> holder; + + public FragmentStatePagerItemAdapter(FragmentManager fm, FragmentPagerItems pages) { + super(fm); + this.pages = pages; + this.holder = new SparseArrayCompat<>(pages.size()); + } + + @Override + public int getCount() { + return pages.size(); + } + + @Override + public Fragment getItem(int position) { + return getPagerItem(position).instantiate(pages.getContext(), position); + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + Object item = super.instantiateItem(container, position); + if (item instanceof Fragment) { + holder.put(position, new WeakReference((Fragment) item)); + } + return item; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + holder.remove(position); + super.destroyItem(container, position, object); + } + + @Override + public CharSequence getPageTitle(int position) { + return getPagerItem(position).getTitle(); + } + + @Override + public float getPageWidth(int position) { + return getPagerItem(position).getWidth(); + } + + public Fragment getPage(int position) { + final WeakReference weakRefItem = holder.get(position); + return (weakRefItem != null) ? weakRefItem.get() : null; + } + + protected FragmentPagerItem getPagerItem(int position) { + return pages.get(position); + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/text/DrawableTextView.java b/library/src/main/java/com/chwl/library/widget/text/DrawableTextView.java index 562313377..0ab96cb24 100644 --- a/library/src/main/java/com/chwl/library/widget/text/DrawableTextView.java +++ b/library/src/main/java/com/chwl/library/widget/text/DrawableTextView.java @@ -120,7 +120,7 @@ public class DrawableTextView extends AppCompatTextView { strikeColor = a.getColor(R.styleable.DrawableTextView_dt_strikeColor, -1); strikeWidth = a.getDimensionPixelSize(R.styleable.DrawableTextView_dt_strikeWidth, 0); //填充颜色 - soildColor = a.getColor(R.styleable.DrawableTextView_dt_soildColor, 0xffffffff); + soildColor = a.getColor(R.styleable.DrawableTextView_dt_soildColor, 0x00000000); //渐变相关 angle = a.getInt(R.styleable.DrawableTextView_dt_angle, 0); startColor = a.getColor(R.styleable.DrawableTextView_dt_startColor, -1); diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 185b1dfd3..68afd3200 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -191,4 +191,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/library/src/module_common/java/com/chwl/library/common/glide/AnimEffectUtil.kt b/library/src/module_common/java/com/chwl/library/common/glide/AnimEffectUtil.kt new file mode 100644 index 000000000..d4ac20d19 --- /dev/null +++ b/library/src/module_common/java/com/chwl/library/common/glide/AnimEffectUtil.kt @@ -0,0 +1,434 @@ +//package com.kelly.dawi.util +// +//import android.graphics.Bitmap +//import android.graphics.Paint +//import android.os.Looper +//import android.text.TextPaint +//import android.view.View +//import android.widget.ImageView +//import androidx.annotation.DrawableRes +//import androidx.lifecycle.findViewTreeLifecycleOwner +//import androidx.lifecycle.lifecycleScope +//import com.bumptech.glide.Glide +//import com.bumptech.glide.load.DataSource +//import com.bumptech.glide.load.engine.GlideException +//import com.bumptech.glide.request.FutureTarget +//import com.bumptech.glide.request.RequestFutureTarget +//import com.bumptech.glide.request.RequestListener +//import com.bumptech.glide.request.RequestOptions +//import com.bumptech.glide.request.target.Target +//import com.kelly.dawi.dp +//import com.kelly.dawi.getOrNull +//import com.kelly.dawi.simpleImpl.SimpleSvgaCallback +//import com.kelly.dawi.suspendGetOrNull +//import com.opensource.svgaplayer.SVGAImageView +//import com.opensource.svgaplayer.glideplugin.asSVGADrawable +//import com.tencent.qgame.animplayer.AnimView +//import com.tencent.qgame.animplayer.inter.IFetchResource +//import com.tencent.qgame.animplayer.mix.Resource +//import com.tencent.qgame.animplayer.util.ScaleType +//import com.kelly.dawi.simpleImpl.SimpleVapCallback +//import kotlinx.coroutines.* +//import java.io.File +//import java.lang.RuntimeException +//import java.util.concurrent.CancellationException +// +///** +// * @Author Vance +// * @Date 2022/6/17 0017 13:44 +// */ +// +//object AnimEffectUtil { +// +// @JvmStatic +// fun newBuilder(): ExtBuilder { +// return ExtBuilder() +// } +// +// @JvmStatic +// fun load(url: String?): ExtBuilder { +// return ExtBuilder().load(url) +// } +// +// class ExtBuilder : IFetchResource, View.OnAttachStateChangeListener { +// private val defTextPaint = TextPaint().apply { textAlign = Paint.Align.CENTER } +// +// private var job: Job? = null +// private var extMap = mutableMapOf() +// private var glideRequests = mutableListOf?>() +// +// private var tempExtMap = mutableMapOf() +// private var listener: Listener? = null +// private var repeatCount: Int? = null +// private var clearsAfterDetached: Boolean? = null +// private var scaleType: ImageView.ScaleType? = null +// +// private var url: String? = null +// +// private var skipMemoryCache = true +// +// private var scope:CoroutineScope? = null +// +// fun load(url: String?): ExtBuilder { +// this.url = url +// return this +// } +// +// fun setCoroutineScope(scope:CoroutineScope): ExtBuilder { +// this.scope = scope +// return this +// } +// +// fun skipMemoryCache(skipMemoryCache: Boolean): ExtBuilder { +// this.skipMemoryCache = skipMemoryCache +// return this +// } +// +// fun scaleType(scaleType: ImageView.ScaleType): ExtBuilder { +// this.scaleType = scaleType +// return this +// } +// +// fun clearsAfterDetached(clearsAfterDetached: Boolean): ExtBuilder { +// this.clearsAfterDetached = clearsAfterDetached +// return this +// } +// +// fun listener(listener: Listener?): ExtBuilder { +// this.listener = listener +// return this +// } +// +// fun repeatCount(repeatCount: Int): ExtBuilder { +// this.repeatCount = repeatCount +// return this +// } +// +// /** +// * textPain是SVGA用的 +// */ +// @JvmOverloads +// fun putText(key: String, text: String?, textPaint: TextPaint = defTextPaint): ExtBuilder { +// tempExtMap[key] = Ext(text, textPaint) +// return this +// } +// +// @JvmOverloads +// fun putImg( +// key: String, +// imgUrl: Any?, +// widthDp: Float = 0f, +// heightDp: Float = 0f, +// isCircle: Boolean = true, +// @DrawableRes default: Int = 0 +// ): ExtBuilder { +// tempExtMap[key] = Ext( +// imgGetter = { +// val option = RequestOptions() +// if (isCircle) { +// option.circleCrop() +// } +// if (widthDp > 0 && heightDp > 0) { +// option.override(widthDp.dp, heightDp.dp) +// } +// +// val futureTarget = RequestFutureTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) +// glideRequests.add(futureTarget) +// var bitmap: Bitmap? = null +// try { +// bitmap = Glide.with(MyUtils.application) +// .asBitmap() +// .load(imgUrl) +// .apply(option) +// .addListener(futureTarget) +// .into(futureTarget) +// .get() +// }catch (e: InterruptedException){ +// glideRequests.remove(futureTarget) +// return@Ext null //取消掉的直接返回不去加载默认图了 +// }catch (e: CancellationException){ +// glideRequests.remove(futureTarget) +// return@Ext null //取消掉的直接返回不去加载默认图了 +// }catch (e: Exception){ +// glideRequests.remove(futureTarget) +// } +// +// if (bitmap == null && default != 0) { +// val defFutureTarget = RequestFutureTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) +// glideRequests.add(defFutureTarget) +// bitmap = Glide.with(MyUtils.application) +// .asBitmap() +// .load(default) +// .apply(option) +// .addListener(defFutureTarget) +// .into(defFutureTarget) +// .getOrNull() +// } +// bitmap +// }) +// return this +// } +// +// fun into(svgaImageView: SVGAImageView){ +// setup(svgaImageView) +// val animUrl = url +// if(animUrl.isNullOrBlank()){ +// listener?.onAnimError(RuntimeException("url is empty")) +// return +// } +// +// var svgaUrl = animUrl +// if(!animUrl.startsWith("http")){//没有http前缀就当成asset文件加载 +// svgaUrl = "file:///android_asset/$animUrl" +// } +// +// if(scope == null){ +// scope = svgaImageView.findViewTreeLifecycleOwner()?.lifecycleScope +// } +// +// job = scope?.launch(Dispatchers.IO) { +// val svgaJob = async { +// Glide.with(svgaImageView.context) +// .asSVGADrawable() +// .load(svgaUrl.trim()) +// .skipMemoryCache(skipMemoryCache) +// .submit() +// .suspendGetOrNull() +// } +// +// val bitmapJobMap = mutableMapOf>() +// val textMap = mutableMapOf() +// val paramsMap = mutableMapOf() +// try { +// paramsMap.putAll(extMap) +// paramsMap.forEach { +// ensureActive() +// if (it.value.isImg()) { +// val job = async { it.value.getBitMap() } +// bitmapJobMap[it.key] = job +// } else { +// textMap[it.key] = it.value +// } +// } +// } catch (_: Exception) { } +// +// val drawable = svgaJob.await() +// if (drawable == null) { +// bitmapJobMap.forEach { +// it.value.cancelAndJoin() +// } +// val imgRequests = glideRequests +// imgRequests.forEach { +// it?.cancel(true) +// } +// withContext(Dispatchers.Main) { +// onAnimError("svga loading error ") +// } +// } else { +// bitmapJobMap.forEach { entry -> +// ensureActive() +// entry.value.await()?.let { +// drawable.dynamicItem.setDynamicImage(it, entry.key) +// } +// } +// textMap.forEach { entry -> +// entry.value.text?.let { +// drawable.dynamicItem.setDynamicText(it, entry.value.textPaint, entry.key) +// } +// } +// +// withContext(Dispatchers.Main) { +// onAnimStart() +// svgaImageView.setImageDrawable(drawable) +// svgaImageView.startAnimation() +// extMap = mutableMapOf() +// glideRequests = mutableListOf() +// } +// } +// } +// } +// +// fun into(animView: AnimView){ +// setup(animView) +// val mp4Url = url +// if(mp4Url.isNullOrBlank()){ +// listener?.onAnimError(RuntimeException("url is empty")) +// return +// } +// +// animView.setFetchResource(this) +// +// if(!mp4Url.startsWith("http")){//没有http前缀就当成asset文件加载 +// onAnimStart() +// animView.startPlay(animView.context.assets, mp4Url) +// return +// } +// +// if(scope == null){ +// scope = animView.findViewTreeLifecycleOwner()?.lifecycleScope +// } +// job = scope?.launch(Dispatchers.IO) { +// Glide.with(animView.context) +// .asFile() +// .skipMemoryCache(skipMemoryCache) +// .load(mp4Url) +// .addListener(object : RequestListener { +// override fun onLoadFailed(e: GlideException?, model: Any?, target: Target, isFirstResource: Boolean): Boolean { +// e?.logRootCauses("vap_loading_error") +// animView.post { +// onAnimError("vap loading error msg:${e?.message ?: "empty"}") +// } +// return true +// } +// +// override fun onResourceReady(resource: File, model: Any, target: Target?, dataSource: DataSource, isFirstResource: Boolean): Boolean { +// return false +// } +// }) +// .submit() +// .suspendGetOrNull() +// ?.let { +// withContext(Dispatchers.Main){ +// onAnimStart() +// animView.startPlay(it) +// } +// } +// } +// } +// +// private fun setup(view: View){ +// if(Looper.myLooper() != Looper.getMainLooper()){ +// throw Exception("must run on MAIN Thread current Thread ${Thread.currentThread().name}") +// } +// cancelJob() +// extMap = mutableMapOf() +// extMap.putAll(tempExtMap) +// view.addOnAttachStateChangeListener(this) +// +// if(view is SVGAImageView){ +// if(!skipMemoryCache){ +// view.clearsAfterDetached = false +// } else { +// clearsAfterDetached?.let { view.clearsAfterDetached = it } +// } +// repeatCount?.let { view.loops = if(it <= 0) Int.MAX_VALUE else it } +// scaleType?.let { view.scaleType = it } +// view.callback = object: SimpleSvgaCallback(){ +// override fun onStep(frame: Int, percentage: Double) { +// if (percentage == 1.0) { +// view.post { onAnimComplete() } +// } +// } +// } +// }else if (view is AnimView){ +// repeatCount?.let { view.setLoop(if(it <= 0) Int.MAX_VALUE else it) } +// scaleType?.let { +// when (it) { +// ImageView.ScaleType.FIT_XY -> { +// view.setScaleType(ScaleType.FIT_XY) +// } +// ImageView.ScaleType.CENTER_CROP -> { +// view.setScaleType(ScaleType.CENTER_CROP) +// } +// else -> { +// view.setScaleType(ScaleType.FIT_CENTER) +// } +// } +// } +// view.setAnimListener(object : SimpleVapCallback(){ +// override fun onFailed(errorType: Int, errorMsg: String?) { +// view.post { onAnimError("vap errorType:${errorMsg} errorMsg:${errorMsg ?: "empty"}") } +// } +// +// override fun onVideoComplete() { +// view.post { onAnimComplete() } +// } +// }) +// } +// } +// +// fun clear(){ +// tempExtMap = mutableMapOf() +// extMap = mutableMapOf() +// cancelJob() +// } +// +// private fun cancelJob(){ +// try { +// job?.cancel() +// val imgRequests = glideRequests +// glideRequests = mutableListOf() +// imgRequests.forEach { +// it?.cancel(true) +// } +// } catch (_: Exception) { } +// } +// +// private fun onAnimStart() { +// listener?.onAnimStart() +// } +// +// private fun onAnimComplete() { +// extMap = mutableMapOf() +// glideRequests = mutableListOf() +// listener?.onAnimComplete() +// } +// +// private fun onAnimError(msg: String) { +// extMap = mutableMapOf() +// cancelJob() +// listener?.onAnimError(Exception(msg)) +// } +// +// override fun fetchImage(resource: Resource, result: (Bitmap?) -> Unit) { +// val ext = extMap[resource.tag] +// result(ext?.getBitMap()) +// } +// +// override fun fetchText(resource: Resource, result: (String?) -> Unit) { +// val ext = extMap[resource.tag] +// result(ext?.text) +// } +// +// override fun releaseResource(resources: List) { +// } +// +// private inner class Ext( +// val text: String? = null, +// val textPaint: TextPaint = defTextPaint, +// val imgGetter: (() -> Bitmap?)? = null) { +// fun getBitMap(): Bitmap? { +// return try { +// val bitmap = imgGetter?.invoke() +// bitmap +// } catch (t: Throwable) { +// null +// } +// } +// +// fun isImg(): Boolean { +// return text.isNullOrBlank() +// } +// +// fun isText(): Boolean { +// return !text.isNullOrBlank() +// } +// } +// +// override fun onViewAttachedToWindow(v: View) { +// } +// +// override fun onViewDetachedFromWindow(v: View) { +// v.removeOnAttachStateChangeListener(this) +// cancelJob() +// } +// } +// +// interface Listener { +// fun onAnimStart() {} +// fun onAnimComplete() +// fun onAnimError(e: Exception?) { +// onAnimComplete() +// } +// } +//} \ No newline at end of file diff --git a/library/src/module_common/java/com/chwl/library/common/glide/GlideUtils.kt b/library/src/module_common/java/com/chwl/library/common/glide/GlideUtils.kt index f8d38edcc..c4409d8f6 100644 --- a/library/src/module_common/java/com/chwl/library/common/glide/GlideUtils.kt +++ b/library/src/module_common/java/com/chwl/library/common/glide/GlideUtils.kt @@ -1376,6 +1376,28 @@ class GlideUtils { glideConfig?.downloadOnly()?.load(url)?.listener(listener)?.preload() } + /** + * 使用Glide下载图片,返回File + */ + fun downloadFromUrl2( + context: Context?, + url: String?, + listener: RequestListener? + ) { + if (context == null) { + LibLogger.error(TAG, "load context is null") + return + } + + val glideConfig = getGlideConfig(context) + glideConfig + ?.asFile() + ?.skipMemoryCache(true) + ?.load(url) + ?.addListener(listener) + ?.submit() + } + /** * 加载图片,并添加RequestListener ,无占位图 ,listener需使用addListener方法添加 */ @@ -1422,6 +1444,17 @@ class GlideUtils { .into(imageView) } } + //加载图片,无默认图片 + fun loadAsBitmap(url: String?, imageView: ImageView?) { + if (imageView == null || TextUtils.isEmpty(url)) { + LibLogger.error(TAG, "load url is invalid or imageViw is null") + return + } + getGlideConfig(imageView.context)?.apply { + this.asDrawable().load(url) + .into(imageView) + } + } //加载图片,无默认图片 fun loadWithError(url: String?, errorDrawable: Int, imageView: ImageView?) { diff --git a/library/src/module_common/java/com/chwl/library/common/util/OtherExt.kt b/library/src/module_common/java/com/chwl/library/common/util/OtherExt.kt index 8e5dc8db9..f2f90cc7e 100644 --- a/library/src/module_common/java/com/chwl/library/common/util/OtherExt.kt +++ b/library/src/module_common/java/com/chwl/library/common/util/OtherExt.kt @@ -8,6 +8,8 @@ import androidx.core.view.isVisible import com.chwl.library.utils.ResUtil import com.chwl.library.utils.SizeUtils import com.example.lib_utils.UiUtils.isRtl +import com.example.lib_utils.ktx.getString +import com.hjq.toast.ToastUtils fun View.setMargin(start:Int?=null,top:Int?=null,end:Int?=null,bottom:Int?=null,isDP:Boolean = true) { @@ -70,6 +72,32 @@ fun String?.isVerify() : Boolean { return this?.isBlank() == false } +fun String?.isSvgaUrl() : Boolean { + if (this.isVerify()) { + return this?.endsWith(".svga") == true || this?.endsWith(".SVGA") == true + } + return false +} +fun String?.isMp4() : Boolean { + if (this.isVerify()) { + return this?.endsWith(".mp4") == true + } + return false +} + +fun String?.doToast() { + if (this.isVerify()) { + ToastUtils.show(this) + } +} + +fun Int.doToast() { + val string = this.getString() + if (string.isVerify()) { + ToastUtils.show(this) + } +} + fun List?.isVerify() : Boolean{ return this?.isEmpty() == false } diff --git a/libs/lib_utils/src/main/java/com/example/lib_utils/spannable/SpannableTextBuilder.kt b/libs/lib_utils/src/main/java/com/example/lib_utils/spannable/SpannableTextBuilder.kt index 1de51695d..096a04b81 100644 --- a/libs/lib_utils/src/main/java/com/example/lib_utils/spannable/SpannableTextBuilder.kt +++ b/libs/lib_utils/src/main/java/com/example/lib_utils/spannable/SpannableTextBuilder.kt @@ -74,11 +74,74 @@ class SpannableTextBuilder(private val textView: TextView) { textSize, textStyle, underline, + null, clickListener ) return this } + fun setTextStyle( + text: String, + @ColorInt textColor: Int? = null, + @ColorInt backgroundColor: Int? = null, + textSize: Int? = null, + textStyle: Int? = null, + underline: Boolean? = null, + clickListener: ((String) -> Unit)? = null + ): SpannableTextBuilder { + if (text.isEmpty()) { + return this + } + val start = spannableBuilder.indexOf(text) + if (start == -1) { + return this + } + val end = start + text.length + return setTextStyle( + text, + start, + end, + textColor, + backgroundColor, + textSize, + textStyle, + underline, + null, + clickListener + ) + } + fun setTextStyle( + text: String, + @ColorInt textColor: Int? = null, + @ColorInt backgroundColor: Int? = null, + textSize: Int? = null, + textStyle: Int? = null, + underline: Boolean? = null, + delLine: Boolean? = null, + clickListener: ((String) -> Unit)? = null + ): SpannableTextBuilder { + if (text.isEmpty()) { + return this + } + val start = spannableBuilder.indexOf(text) + if (start == -1) { + return this + } + val end = start + text.length + return setTextStyle( + text, + start, + end, + textColor, + backgroundColor, + textSize, + textStyle, + underline, + delLine, + clickListener + ) + } + /** * 添加图片 * @param drawable 图片 @@ -187,6 +250,7 @@ class SpannableTextBuilder(private val textView: TextView) { textSize: Int? = null, textStyle: Int? = null, underline: Boolean? = null, + delLine: Boolean? = null, clickListener: ((String) -> Unit)? = null ): SpannableTextBuilder { if (start < 0 || end > spannableBuilder.length) { @@ -236,6 +300,10 @@ class SpannableTextBuilder(private val textView: TextView) { if (underline == true) { spannableBuilder.setSpan(UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } + // 删除线 + if (delLine == true) { + spannableBuilder.setSpan(StrikethroughSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + } // 点击事件 if (clickListener != null) { @@ -251,35 +319,7 @@ class SpannableTextBuilder(private val textView: TextView) { return this } - fun setTextStyle( - text: String, - @ColorInt textColor: Int? = null, - @ColorInt backgroundColor: Int? = null, - textSize: Int? = null, - textStyle: Int? = null, - underline: Boolean? = null, - clickListener: ((String) -> Unit)? = null - ): SpannableTextBuilder { - if (text.isEmpty()) { - return this - } - val start = spannableBuilder.indexOf(text) - if (start == -1) { - return this - } - val end = start + text.length - return setTextStyle( - text, - start, - end, - textColor, - backgroundColor, - textSize, - textStyle, - underline, - clickListener - ) - } + fun build(): SpannableStringBuilder { return spannableBuilder diff --git a/mode.json b/mode.json index a364a26d5..b202e578a 100644 --- a/mode.json +++ b/mode.json @@ -1,98 +1,181 @@ -[ - { - "id": 359, - "uid": 3224, - "nameplateId": 101, - "isCustomWord": false, - "word": " ", - "remark": " ", - "expireTime": 1731998395000, - "createTime": 1731047995000, - "updateTime": 1731318342000, - "nameplateName": "schoolgirl-Advanced", - "nameplateImage": "https://image.pekolive.com/gonghuizhangmingpaikaobei.png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/gonghuizhangmingpaikaobei.png", - "fixedWord": " ", - "nameplateType": "1" - }, - { - "id": 371, - "uid": 3224, - "nameplateId": 96, - "isCustomWord": false, - "remark": " ", - "expireTime": 1731143136000, - "createTime": 1731056736000, - "updateTime": 1731056736000, - "nameplateName": "king", - "nameplateImage": "https://image.pekolive.com/zu689(11).png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/zu689(11).png", - "nameplateType": "1" - }, - { - "id": 369, - "uid": 3224, - "nameplateId": 100, - "isCustomWord": false, - "remark": " ", - "expireTime": 1731143131000, - "createTime": 1731056731000, - "updateTime": 1731056731000, - "nameplateName": "schoolgirl-Advanced", - "nameplateImage": "https://image.pekolive.com/huayunu:shen.png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/guanfangzhuli-bajisitan.png", - "nameplateType": "1" - }, - { - "id": 367, - "uid": 3224, - "nameplateId": 93, - "isCustomWord": false, - "remark": " ", - "expireTime": 1731143124000, - "createTime": 1731056724000, - "updateTime": 1731056724000, - "nameplateName": "queen", - "nameplateImage": "https://image.pekolive.com/zu688(3).png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/zu688(3).png", - "nameplateType": "1" - }, - { - "id": 365, - "uid": 3224, - "nameplateId": 92, - "isCustomWord": true, - "word": " العناوين", - "remark": " العناوين", - "expireTime": 1731143086000, - "createTime": 1731056686000, - "updateTime": 1731056686000, - "nameplateName": "給糖不搗蛋", - "nameplateImage": "https://image.pekolive.com/8350643695e74ec9bb78b9944fc9e842.png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/zu689(5).png", - "fixedWord": "العناوين", - "nameplateType": "1" - }, - { - "id": 124, - "uid": 3224, - "nameplateId": 101, - "isCustomWord": false, - "word": " ", - "remark": " ", - "expireTime": 1729340700000, - "createTime": 1728476700000, - "updateTime": 1731318342000, - "nameplateName": "schoolgirl-Advanced", - "nameplateImage": "https://image.pekolive.com/gonghuizhangmingpaikaobei.png", - "expireDays": 0, - "iconPic": "https://image.pekolive.com/gonghuizhangmingpaikaobei.png", - "fixedWord": " ", - "nameplateType": "1" - } -] \ No newline at end of file +{ + "success": true, + "code": 200, + "message": "success", + "data": [ + { + "dressId": 195, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.pekolive.com/Vip5headdress.png", + "effectType": 2, + "effect": "https://image.pekolive.com/Vip5headdress.svga", + "name": "VIP5頭飾", + "used": true, + "expireDays": 22, + "hasExpired": false, + "expireTime": 1733976000000 + }, + { + "dressId": 196, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.pekolive.com/Vip6headdress.png", + "effectType": 2, + "effect": "https://image.pekolive.com/Vip6headdress.svga", + "name": "VIP6頭飾", + "used": false, + "expireDays": 25, + "hasExpired": false, + "expireTime": 1734235200000 + }, + { + "dressId": 193, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.pekolive.com/Vip3headdress.png", + "effectType": 2, + "effect": "https://image.pekolive.com/Vip3headdress.svga", + "name": "VIP3頭飾", + "used": false, + "expireDays": 23, + "hasExpired": false, + "expireTime": 1734062400000 + }, + { + "dressId": 26, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/1df2071a-610d-41be-b763-8437ef9f3524", + "effectType": 2, + "effect": "https://image.hfighting.com/6d9ff134-80c1-44d5-97b0-981817e03bd4", + "name": "幸運星人", + "used": false, + "expireDays": 22, + "hasExpired": false, + "expireTime": 1733919509000 + }, + { + "dressId": 31, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/2ec2f8cd-e660-4af2-bd49-b9eed8de10a2", + "effectType": 2, + "effect": "https://image.hfighting.com/34369437-e9a3-4bb8-80a2-f310bf8e90fc", + "name": "財氣沖天", + "used": false, + "expireDays": 13, + "hasExpired": false, + "expireTime": 1733173500000 + }, + { + "dressId": 27, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/06fe0618-cd55-4e5e-84bf-1071f821d608", + "effectType": 2, + "effect": "https://image.hfighting.com/22f0fbb1-fdb1-46f9-b037-03f0693effeb", + "name": "潮舞星迎", + "used": false, + "expireDays": 13, + "hasExpired": false, + "expireTime": 1733131248000 + }, + { + "dressId": 123, + "dressType": 0, + "obtainWay": 1, + "pic": "http://beta.img.pekolive.com/FklHnzcmijfk_0QGRePXuzG3LSdN?imageslim", + "effectType": 2, + "effect": "http://beta.img.pekolive.com/FmDgjyKd_p0SvpKmC5v0rwhszdH9?imageslim", + "name": "花语小兔", + "used": false, + "expireDays": 9, + "hasExpired": false, + "expireTime": 1732780728000 + }, + { + "dressId": 110, + "dressType": 0, + "obtainWay": 1, + "pic": "http://beta.img.pekolive.com/FrTtFcnSI88bITGonp5PJjdbGLLR?imageslim", + "effectType": 2, + "effect": "http://beta.img.pekolive.com/FrTtFcnSI88bITGonp5PJjdbGLLR?imageslim", + "name": "豪氣季軍", + "used": false, + "expireDays": 8, + "hasExpired": false, + "expireTime": 1732760886000 + }, + { + "dressId": 30, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/0fcea959-e82a-410e-a3f5-52f751a6c327", + "effectType": 2, + "effect": "https://image.hfighting.com/efacf269-c628-4940-984f-b817aabf2127", + "name": "拉丁之神", + "used": false, + "expireDays": 6, + "hasExpired": false, + "expireTime": 1732526621000 + }, + { + "dressId": 28, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/4dd02f23-e30f-4df7-9326-53a1f4ae8ebf", + "effectType": 2, + "effect": "https://image.hfighting.com/c17f08d6-1854-4d03-a760-e02ad5fdf081", + "name": "月魔法帽", + "used": false, + "expireDays": 6, + "hasExpired": false, + "expireTime": 1732526452000 + }, + { + "dressId": 42, + "dressType": 0, + "obtainWay": 1, + "pic": "http://beta.img.pekolive.com/Fq_EzPCxN99nV84CgO3c3z242pEh?imageslim", + "effectType": 2, + "effect": "http://beta.img.pekolive.com/Fq_EzPCxN99nV84CgO3c3z242pEh?imageslim", + "name": "海浪", + "used": false, + "expireDays": 2, + "hasExpired": false, + "expireTime": 1732175930000 + }, + { + "dressId": 29, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/a51c4b19-6862-41fa-83cb-2475db2320da", + "effectType": 2, + "effect": "https://image.hfighting.com/5df51843-1c4c-40c1-b1dd-5420ce093de2", + "name": "神囚魔法", + "used": false, + "expireDays": 1, + "hasExpired": false, + "expireTime": 1732097432000 + }, + { + "dressId": 102, + "dressType": 0, + "obtainWay": 1, + "pic": "http://beta.img.pekolive.com/FrQQrQ0yEhTCLxyKHygT76kZLHoy?imageslim", + "effectType": 2, + "effect": "http://beta.img.pekolive.com/FqJrMr8YmRr6WBR0FOMaYL05HPxy?imageslim", + "name": "星河白羽", + "used": false, + "expireDays": 0, + "hasExpired": true, + "expireTime": 1731664948000 + }, + { + "dressId": 44, + "dressType": 0, + "obtainWay": 1, + "pic": "https://image.hfighting.com/bb55be24-3418-4f03-bf46-1bb491b95ba2", + "effectType": 2, + "effect": "https:/ diff --git a/nim_uikit/src/com/netease/nim/uikit/common/ui/imageview/CircleImageView.java b/nim_uikit/src/com/netease/nim/uikit/common/ui/imageview/CircleImageView.java index 547115658..367df10ac 100644 --- a/nim_uikit/src/com/netease/nim/uikit/common/ui/imageview/CircleImageView.java +++ b/nim_uikit/src/com/netease/nim/uikit/common/ui/imageview/CircleImageView.java @@ -31,11 +31,12 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.AttributeSet; -import android.widget.ImageView; + +import androidx.appcompat.widget.AppCompatImageView; import com.netease.nim.uikit.R; -public class CircleImageView extends ImageView { +public class CircleImageView extends AppCompatImageView { private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

+ * Forked from Google Samples > SlidingTabsBasic > + * SlidingTabLayout + */ +public class SmartTabLayout extends HorizontalScrollView { + + private static final boolean DEFAULT_DISTRIBUTE_EVENLY = false; + private static final int TITLE_OFFSET_DIPS = 24; + private static final int TITLE_OFFSET_AUTO_CENTER = -1; + private static final int TAB_VIEW_PADDING_DIPS = 16; + private static final boolean TAB_VIEW_TEXT_ALL_CAPS = true; + private static final int TAB_VIEW_TEXT_SIZE_SP = 12; + private static final int TAB_VIEW_TEXT_COLOR = 0xFC000000; + private static final int TAB_VIEW_TEXT_MIN_WIDTH = 0; + private static final boolean TAB_CLICKABLE = true; + private static final int NO_TEXT_STYLE = -1; + + protected final SmartTabStrip tabStrip; + private int titleOffset; + private int tabViewBackgroundResId; + private boolean tabViewTextAllCaps; + private ColorStateList tabViewTextColors; + private float tabViewTextSize; + private int tabViewTextHorizontalPadding; + private int tabViewTextMinWidth; + private ViewPager viewPager; + private ViewPager.OnPageChangeListener viewPagerPageChangeListener; + private OnScrollChangeListener onScrollChangeListener; + private TabProvider tabProvider; + private InternalTabClickListener internalTabClickListener; + private OnTabClickListener onTabClickListener; + private boolean distributeEvenly; + private int textAppearance; + + public SmartTabLayout(Context context) { + this(context, null); + } + + public SmartTabLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SmartTabLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // Disable the Scroll Bar + setHorizontalScrollBarEnabled(false); + + final DisplayMetrics dm = getResources().getDisplayMetrics(); + final float density = dm.density; + + int tabBackgroundResId = NO_ID; + boolean textAllCaps = TAB_VIEW_TEXT_ALL_CAPS; + ColorStateList textColors; + float textSize = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP, dm); + int textHorizontalPadding = (int) (TAB_VIEW_PADDING_DIPS * density); + int textMinWidth = (int) (TAB_VIEW_TEXT_MIN_WIDTH * density); + boolean distributeEvenly = DEFAULT_DISTRIBUTE_EVENLY; + int customTabLayoutId = NO_ID; + int customTabTextViewId = NO_ID; + boolean clickable = TAB_CLICKABLE; + int titleOffset = (int) (TITLE_OFFSET_DIPS * density); + int textStyle = NO_TEXT_STYLE; + + TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.stl_SmartTabLayout, defStyle, 0); + tabBackgroundResId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_defaultTabBackground, tabBackgroundResId); + textAllCaps = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextAllCaps, textAllCaps); + textColors = a.getColorStateList( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextColor); + textSize = a.getDimension( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextSize, textSize); + textHorizontalPadding = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextHorizontalPadding, textHorizontalPadding); + textMinWidth = a.getDimensionPixelSize( + R.styleable.stl_SmartTabLayout_stl_defaultTabTextMinWidth, textMinWidth); + customTabLayoutId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_customTabTextLayoutId, customTabLayoutId); + customTabTextViewId = a.getResourceId( + R.styleable.stl_SmartTabLayout_stl_customTabTextViewId, customTabTextViewId); + distributeEvenly = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_distributeEvenly, distributeEvenly); + clickable = a.getBoolean( + R.styleable.stl_SmartTabLayout_stl_clickable, clickable); + titleOffset = a.getLayoutDimension( + R.styleable.stl_SmartTabLayout_stl_titleOffset, titleOffset); + textStyle = a.getResourceId(R.styleable.stl_SmartTabLayout_stl_tabTextStyle, textStyle); + a.recycle(); + + this.titleOffset = titleOffset; + this.tabViewBackgroundResId = tabBackgroundResId; + this.tabViewTextAllCaps = textAllCaps; + this.tabViewTextColors = (textColors != null) + ? textColors + : ColorStateList.valueOf(TAB_VIEW_TEXT_COLOR); + this.tabViewTextSize = textSize; + this.tabViewTextHorizontalPadding = textHorizontalPadding; + this.tabViewTextMinWidth = textMinWidth; + this.internalTabClickListener = clickable ? new InternalTabClickListener() : null; + this.distributeEvenly = distributeEvenly; + this.textAppearance = textStyle; + + if (customTabLayoutId != NO_ID) { + setCustomTabView(customTabLayoutId, customTabTextViewId); + } + + this.tabStrip = new SmartTabStrip(context, attrs); + + if (distributeEvenly && tabStrip.isIndicatorAlwaysInCenter()) { + throw new UnsupportedOperationException( + "'distributeEvenly' and 'indicatorAlwaysInCenter' both use does not support"); + } + + // Make sure that the Tab Strips fills this View + setFillViewport(!tabStrip.isIndicatorAlwaysInCenter()); + + addView(tabStrip, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (onScrollChangeListener != null) { + onScrollChangeListener.onScrollChanged(l, oldl); + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (tabStrip.isIndicatorAlwaysInCenter() && tabStrip.getChildCount() > 0) { + View firstTab = tabStrip.getChildAt(0); + View lastTab = tabStrip.getChildAt(tabStrip.getChildCount() - 1); + int start = (w - Utils.getMeasuredWidth(firstTab)) / 2 - Utils.getMarginStart(firstTab); + int end = (w - Utils.getMeasuredWidth(lastTab)) / 2 - Utils.getMarginEnd(lastTab); + tabStrip.setMinimumWidth(tabStrip.getMeasuredWidth()); + ViewCompat.setPaddingRelative(this, start, getPaddingTop(), end, getPaddingBottom()); + setClipToPadding(false); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + // Ensure first scroll + if (changed && viewPager != null) { + scrollToTab(viewPager.getCurrentItem(), 0); + } + } + + /** + * Set the behavior of the Indicator scrolling feedback. + * + * @param interpolator {@link com.ogaclejapan.smarttablayout.SmartTabIndicationInterpolator} + */ + public void setIndicationInterpolator(SmartTabIndicationInterpolator interpolator) { + tabStrip.setIndicationInterpolator(interpolator); + } + + /** + * Set the custom {@link TabColorizer} to be used. + * + * If you only require simple customisation then you can use + * {@link #setSelectedIndicatorColors(int...)} and {@link #setDividerColors(int...)} to achieve + * similar effects. + */ + public void setCustomTabColorizer(TabColorizer tabColorizer) { + tabStrip.setCustomTabColorizer(tabColorizer); + } + + /** + * Set the color used for styling the tab text. This will need to be called prior to calling + * {@link #setViewPager(ViewPager)} otherwise it will not get set + * + * @param color to use for tab text + */ + public void setDefaultTabTextColor(int color) { + tabViewTextColors = ColorStateList.valueOf(color); + } + + /** + * Sets the colors used for styling the tab text. This will need to be called prior to calling + * {@link #setViewPager(ViewPager)} otherwise it will not get set + * + * @param colors ColorStateList to use for tab text + */ + public void setDefaultTabTextColor(ColorStateList colors) { + tabViewTextColors = colors; + } + + /** + * Set the same weight for tab + */ + public void setDistributeEvenly(boolean distributeEvenly) { + this.distributeEvenly = distributeEvenly; + } + + /** + * Sets the colors to be used for indicating the selected tab. These colors are treated as a + * circular array. Providing one color will mean that all tabs are indicated with the same color. + */ + public void setSelectedIndicatorColors(int... colors) { + tabStrip.setSelectedIndicatorColors(colors); + } + + /** + * Sets the colors to be used for tab dividers. These colors are treated as a circular array. + * Providing one color will mean that all tabs are indicated with the same color. + */ + public void setDividerColors(int... colors) { + tabStrip.setDividerColors(colors); + } + + /** + * Set the {@link ViewPager.OnPageChangeListener}. When using {@link SmartTabLayout} you are + * required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so + * that the layout can update it's scroll position correctly. + * + * @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener) + */ + public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { + viewPagerPageChangeListener = listener; + } + + /** + * Set {@link OnScrollChangeListener} for obtaining values of scrolling. + * + * @param listener the {@link OnScrollChangeListener} to set + */ + public void setOnScrollChangeListener(OnScrollChangeListener listener) { + onScrollChangeListener = listener; + } + + /** + * Set {@link OnTabClickListener} for obtaining click event. + * + * @param listener the {@link OnTabClickListener} to set + */ + public void setOnTabClickListener(OnTabClickListener listener) { + onTabClickListener = listener; + } + + /** + * Set the custom layout to be inflated for the tab views. + * + * @param layoutResId Layout id to be inflated + * @param textViewId id of the {@link TextView} in the inflated view + */ + public void setCustomTabView(int layoutResId, int textViewId) { + tabProvider = new SimpleTabProvider(getContext(), layoutResId, textViewId); + } + + /** + * Set the custom layout to be inflated for the tab views. + * + * @param provider {@link TabProvider} + */ + public void setCustomTabView(TabProvider provider) { + tabProvider = provider; + } + + /** + * Sets the associated view pager. Note that the assumption here is that the pager content + * (number of tabs and tab titles) does not change after this call has been made. + */ + public void setViewPager(ViewPager viewPager) { + tabStrip.removeAllViews(); + + this.viewPager = viewPager; + if (viewPager != null && viewPager.getAdapter() != null) { + viewPager.addOnPageChangeListener(new InternalViewPagerListener()); + populateTabStrip(); + } + } + + /** + * Returns the view at the specified position in the tabs. + * + * @param position the position at which to get the view from + * @return the view at the specified position or null if the position does not exist within the + * tabs + */ + public View getTabAt(int position) { + return tabStrip.getChildAt(position); + } + + /** + * Create a default view to be used for tabs. This is called if a custom tab view is not set via + * {@link #setCustomTabView(int, int)}. + */ + protected TextView createDefaultTabView(CharSequence title) { + TextView textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setText(title); + if (textAppearance != NO_TEXT_STYLE) { + textView.setTextAppearance(getContext(), textAppearance); + } else { + textView.setTextColor(tabViewTextColors); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabViewTextSize); + textView.setTypeface(Typeface.DEFAULT_BOLD); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style + textView.setAllCaps(tabViewTextAllCaps); + } + + if (tabViewTextMinWidth > 0) { + textView.setMinWidth(tabViewTextMinWidth); + } + } + if (tabViewBackgroundResId != NO_ID) { + textView.setBackgroundResource(tabViewBackgroundResId); + } else { + // If we're running on Honeycomb or newer, then we can use the Theme's + // selectableItemBackground to ensure that the View has a pressed state + TypedValue outValue = new TypedValue(); + getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, + outValue, true); + textView.setBackgroundResource(outValue.resourceId); + } + textView.setPadding( + tabViewTextHorizontalPadding, 0, + tabViewTextHorizontalPadding, 0); + textView.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); + + return textView; + } + + private void populateTabStrip() { + final PagerAdapter adapter = viewPager.getAdapter(); + + for (int i = 0; i < adapter.getCount(); i++) { + + final View tabView = (tabProvider == null) + ? createDefaultTabView(adapter.getPageTitle(i)) + : tabProvider.createTabView(tabStrip, i, adapter); + + if (tabView == null) { + throw new IllegalStateException("tabView is null."); + } + + if (distributeEvenly) { + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams(); + lp.width = 0; + lp.weight = 1; + } + + if (internalTabClickListener != null) { + tabView.setOnClickListener(internalTabClickListener); + } + + tabStrip.addView(tabView); + + if (i == viewPager.getCurrentItem()) { + tabView.setSelected(true); + } + + } + } + + private void scrollToTab(int tabIndex, float positionOffset) { + final int tabStripChildCount = tabStrip.getChildCount(); + if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { + return; + } + + final boolean isLayoutRtl = Utils.isLayoutRtl(this); + View selectedTab = tabStrip.getChildAt(tabIndex); + int widthPlusMargin = Utils.getWidth(selectedTab) + Utils.getMarginHorizontally(selectedTab); + int extraOffset = (int) (positionOffset * widthPlusMargin); + + if (tabStrip.isIndicatorAlwaysInCenter()) { + + if (0f < positionOffset && positionOffset < 1f) { + View nextTab = tabStrip.getChildAt(tabIndex + 1); + int selectHalfWidth = Utils.getWidth(selectedTab) / 2 + Utils.getMarginEnd(selectedTab); + int nextHalfWidth = Utils.getWidth(nextTab) / 2 + Utils.getMarginStart(nextTab); + extraOffset = Math.round(positionOffset * (selectHalfWidth + nextHalfWidth)); + } + + View firstTab = tabStrip.getChildAt(0); + int x; + if (isLayoutRtl) { + int first = Utils.getWidth(firstTab) + Utils.getMarginEnd(firstTab); + int selected = Utils.getWidth(selectedTab) + Utils.getMarginEnd(selectedTab); + x = Utils.getEnd(selectedTab) - Utils.getMarginEnd(selectedTab) - extraOffset; + x -= (first - selected) / 2; + } else { + int first = Utils.getWidth(firstTab) + Utils.getMarginStart(firstTab); + int selected = Utils.getWidth(selectedTab) + Utils.getMarginStart(selectedTab); + x = Utils.getStart(selectedTab) - Utils.getMarginStart(selectedTab) + extraOffset; + x -= (first - selected) / 2; + } + + scrollTo(x, 0); + return; + + } + + int x; + if (titleOffset == TITLE_OFFSET_AUTO_CENTER) { + + if (0f < positionOffset && positionOffset < 1f) { + View nextTab = tabStrip.getChildAt(tabIndex + 1); + int selectHalfWidth = Utils.getWidth(selectedTab) / 2 + Utils.getMarginEnd(selectedTab); + int nextHalfWidth = Utils.getWidth(nextTab) / 2 + Utils.getMarginStart(nextTab); + extraOffset = Math.round(positionOffset * (selectHalfWidth + nextHalfWidth)); + } + + if (isLayoutRtl) { + x = -Utils.getWidthWithMargin(selectedTab) / 2 + getWidth() / 2; + x -= Utils.getPaddingStart(this); + } else { + x = Utils.getWidthWithMargin(selectedTab) / 2 - getWidth() / 2; + x += Utils.getPaddingStart(this); + } + + } else { + + if (isLayoutRtl) { + x = (tabIndex > 0 || positionOffset > 0) ? titleOffset : 0; + } else { + x = (tabIndex > 0 || positionOffset > 0) ? -titleOffset : 0; + } + + } + + int start = Utils.getStart(selectedTab); + int startMargin = Utils.getMarginStart(selectedTab); + if (isLayoutRtl) { + x += start + startMargin - extraOffset - getWidth() + Utils.getPaddingHorizontally(this); + } else { + x += start - startMargin + extraOffset; + } + + scrollTo(x, 0); + + } + + /** + * Interface definition for a callback to be invoked when the scroll position of a view changes. + */ + public interface OnScrollChangeListener { + + /** + * Called when the scroll position of a view changes. + * + * @param scrollX Current horizontal scroll origin. + * @param oldScrollX Previous horizontal scroll origin. + */ + void onScrollChanged(int scrollX, int oldScrollX); + } + + /** + * Interface definition for a callback to be invoked when a tab is clicked. + */ + public interface OnTabClickListener { + + /** + * Called when a tab is clicked. + * + * @param position tab's position + */ + void onTabClicked(int position); + } + + /** + * Create the custom tabs in the tab layout. Set with + * {@link #setCustomTabView(com.ogaclejapan.smarttablayout.SmartTabLayout.TabProvider)} + */ + public interface TabProvider { + + /** + * @return Return the View of {@code position} for the Tabs + */ + View createTabView(ViewGroup container, int position, PagerAdapter adapter); + + } + + private static class SimpleTabProvider implements TabProvider { + + private final LayoutInflater inflater; + private final int tabViewLayoutId; + private final int tabViewTextViewId; + + private SimpleTabProvider(Context context, int layoutResId, int textViewId) { + inflater = LayoutInflater.from(context); + tabViewLayoutId = layoutResId; + tabViewTextViewId = textViewId; + } + + @Override + public View createTabView(ViewGroup container, int position, PagerAdapter adapter) { + View tabView = null; + TextView tabTitleView = null; + + if (tabViewLayoutId != NO_ID) { + tabView = inflater.inflate(tabViewLayoutId, container, false); + } + + if (tabViewTextViewId != NO_ID && tabView != null) { + tabTitleView = (TextView) tabView.findViewById(tabViewTextViewId); + } + + if (tabTitleView == null && TextView.class.isInstance(tabView)) { + tabTitleView = (TextView) tabView; + } + + if (tabTitleView != null) { + tabTitleView.setText(adapter.getPageTitle(position)); + } + + return tabView; + } + + } + + private class InternalViewPagerListener implements ViewPager.OnPageChangeListener { + + private int scrollState; + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + int tabStripChildCount = tabStrip.getChildCount(); + if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { + return; + } + + tabStrip.onViewPagerPageChanged(position, positionOffset); + + scrollToTab(position, positionOffset); + + if (viewPagerPageChangeListener != null) { + viewPagerPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + scrollState = state; + + if (viewPagerPageChangeListener != null) { + viewPagerPageChangeListener.onPageScrollStateChanged(state); + } + } + + @Override + public void onPageSelected(int position) { + if (scrollState == ViewPager.SCROLL_STATE_IDLE) { + tabStrip.onViewPagerPageChanged(position, 0f); + scrollToTab(position, 0); + } + + for (int i = 0, size = tabStrip.getChildCount(); i < size; i++) { + tabStrip.getChildAt(i).setSelected(position == i); + } + + if (viewPagerPageChangeListener != null) { + viewPagerPageChangeListener.onPageSelected(position); + } + } + + } + + private class InternalTabClickListener implements OnClickListener { + @Override + public void onClick(View v) { + for (int i = 0; i < tabStrip.getChildCount(); i++) { + if (v == tabStrip.getChildAt(i)) { + if (onTabClickListener != null) { + onTabClickListener.onTabClicked(i); + } + viewPager.setCurrentItem(i); + return; + } + } + } + } + +} diff --git a/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout2.java b/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout2.java new file mode 100644 index 000000000..2adac7d3a --- /dev/null +++ b/library/src/main/java/com/chwl/library/widget/tab/SmartTabLayout2.java @@ -0,0 +1,705 @@ +/** + * Copyright (C) 2015 ogaclejapan + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chwl.library.widget.tab; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Typeface; +import android.os.Build; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.widget.ViewPager2; + +import com.chwl.library.R; + +/** + * To be used with ViewPager2 to provide a tab indicator component which give constant feedback as + * to + * the user's scroll progress. + *