From 60b910179c0557b7b307c2db2bc904fe5bfa45ca Mon Sep 17 00:00:00 2001 From: huangjian Date: Mon, 1 Aug 2022 17:04:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A6=96=E9=A1=B5=E4=B8=BB?= =?UTF-8?q?=E6=92=AD=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yizhuan/erban/MainActivity.java | 54 +++- .../erban/application/XChatApplication.java | 2 +- .../com/yizhuan/erban/home/HomeViewModel.kt | 15 ++ .../erban/home/fragment/HomeFragment.kt | 12 +- .../erban/home/widget/AnchorCardView.kt | 235 ++++++++++++++++++ .../ui/patriarch/help/PmDialogShowMrg.java | 2 + .../res/drawable-xhdpi/bg_anchor_card.png | Bin 0 -> 33951 bytes .../res/drawable/shape_anchor_card_time.xml | 10 + app/src/main/res/layout/activity_main.xml | 13 + .../item_anchor_card_skill_abspicture.xml | 5 + .../res/layout/layout_anchor_card_view.xml | 130 ++++++++++ .../res/layout/layout_vs_anchor_card_view.xml | 6 + .../home/model/HomeModel.kt | 12 + .../yizhuan/xchat_android_core/DemoCache.java | 31 ++- .../initial/InitialModel.java | 28 +-- .../room/bean/AnchorInfo.kt | 14 ++ 16 files changed, 537 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/home/widget/AnchorCardView.kt create mode 100644 app/src/main/res/drawable-xhdpi/bg_anchor_card.png create mode 100644 app/src/main/res/drawable/shape_anchor_card_time.xml create mode 100644 app/src/main/res/layout/item_anchor_card_skill_abspicture.xml create mode 100644 app/src/main/res/layout/layout_anchor_card_view.xml create mode 100644 app/src/main/res/layout/layout_vs_anchor_card_view.xml create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/bean/AnchorInfo.kt diff --git a/app/src/main/java/com/yizhuan/erban/MainActivity.java b/app/src/main/java/com/yizhuan/erban/MainActivity.java index 27f2073b2..343351e1c 100644 --- a/app/src/main/java/com/yizhuan/erban/MainActivity.java +++ b/app/src/main/java/com/yizhuan/erban/MainActivity.java @@ -14,7 +14,9 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; +import android.view.ViewStub; import android.view.animation.LinearInterpolator; import android.widget.LinearLayout; import android.widget.TextView; @@ -23,6 +25,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import com.netease.nim.uikit.StatusBarUtil; @@ -71,6 +74,7 @@ import com.yizhuan.erban.home.fragment.HomeFragment; import com.yizhuan.erban.home.fragment.MeFragment; import com.yizhuan.erban.home.presenter.MainPresenter; import com.yizhuan.erban.home.view.IMainView; +import com.yizhuan.erban.home.widget.AnchorCardView; import com.yizhuan.erban.luckymoney.viewholder.LuckyMoneyMsgViewHolder; import com.yizhuan.erban.luckymoney.viewholder.LuckyMoneyTipsViewHolder; import com.yizhuan.erban.main.helper.NoticationsUiHelper; @@ -177,6 +181,7 @@ import com.yizhuan.xchat_android_core.pay.event.NewUserChargeEvent; import com.yizhuan.xchat_android_core.public_chat_hall.attachment.AitMeAttachment; import com.yizhuan.xchat_android_core.recall.bean.CheckLostUserInfo; import com.yizhuan.xchat_android_core.recall.event.CheckLostUserEvent; +import com.yizhuan.xchat_android_core.room.bean.AnchorInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; @@ -186,6 +191,7 @@ import com.yizhuan.xchat_android_core.user.event.LoadLoginUserInfoEvent; import com.yizhuan.xchat_android_core.user.event.LoginUserInfoUpdateEvent; import com.yizhuan.xchat_android_core.user.event.NeedBindPhoneEvent; import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent; +import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; import com.yizhuan.xchat_android_core.utils.StringUtils; import com.yizhuan.xchat_android_library.base.factory.CreatePresenter; @@ -226,6 +232,7 @@ public class MainActivity extends BaseMvpActivity private LivingIconView userLivingView; private View viewClose; private MainTabLayout mMainTabLayout; + private AnchorCardView anchorCardView; private int mCurrentTabType = MainTabType.TAB_TYPE_HOME; /** * 房间最小化动画,换成属性动画,原先的补间动画影响了activity的生命周期 @@ -236,6 +243,7 @@ public class MainActivity extends BaseMvpActivity */ private LimitEnterRoomHelper limitEnterRoomHelper; private HomeViewModel homeViewModel; + private boolean mResumed = false; @Nullable private Fragment tempFragment = null; private ContactEventListener listener1 = new ContactEventListener() { @@ -266,6 +274,8 @@ public class MainActivity extends BaseMvpActivity } }; + @Nullable + private Runnable touchRunnable; { fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment()); @@ -334,6 +344,12 @@ public class MainActivity extends BaseMvpActivity .observeOn(AndroidSchedulers.mainThread()) .subscribe(aLong -> EventBus.getDefault().post(new RefreshHomeDataEvent())); + homeViewModel.getAnchorInfoLiveData().observe(this, anchorInfo -> { + if (anchorInfo != null) { + anchorCardView.setAnchorInfo(anchorInfo); + DemoCache.saveAnchorCardView(2); + } + }); } private void otherModelInit() { @@ -459,6 +475,7 @@ public class MainActivity extends BaseMvpActivity @Override protected void onResume() { super.onResume(); + mResumed = true; if (avatarLayout.getVisibility() == View.VISIBLE) { userLivingView.start(); } @@ -471,15 +488,48 @@ public class MainActivity extends BaseMvpActivity DemoCache.saveNewUserChargeGift(2); } } + checkShowAnchorCardView(); + } + } + + private void checkShowAnchorCardView() { + if (touchRunnable != null && !mResumed) return; + int anchorCardViewType = DemoCache.readAnchorCardView(); + if (anchorCardViewType == 2) { + if (CurrentTimeUtils.getCurrentTime() - DemoCache.readAnchorCardViewTime() > 15 * 60 * 1000) { + touchRunnable = () -> { + touchRunnable = null; + homeViewModel.requestAnchorInfo(); + }; + mMainTabLayout.postDelayed(touchRunnable, 5000); + } + } else if (anchorCardViewType == 1 || DemoCache.readLaunchCount() == 1) { + homeViewModel.requestAnchorInfo(); } } @Override protected void onPause() { super.onPause(); + mResumed = false; if (avatarLayout.getVisibility() == View.VISIBLE) { userLivingView.stop(); } + mMainTabLayout.removeCallbacks(touchRunnable); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (touchRunnable == null) return super.onTouchEvent(event); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mMainTabLayout.removeCallbacks(touchRunnable); + break; + case MotionEvent.ACTION_UP: + mMainTabLayout.postDelayed(touchRunnable, 5000); + break; + } + return super.onTouchEvent(event); } private void initView() { @@ -494,6 +544,7 @@ public class MainActivity extends BaseMvpActivity llDragInfo = findViewById(R.id.ll_drag_info); userLivingView.setColor(Color.WHITE); mMainTabLayout.setOnTabClickListener(this); + anchorCardView = findViewById(R.id.vs_anchor_card); } @@ -851,9 +902,10 @@ public class MainActivity extends BaseMvpActivity EventBus.getDefault().post(new UnReadCountEvent(integer)); } }); - + checkShowAnchorCardView(); } + @SuppressLint("CheckResult") private void checkProtocolUpdate() { UserModel.get() diff --git a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java index 4360dc101..0b895aa13 100644 --- a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java +++ b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java @@ -37,7 +37,6 @@ import com.coorchice.library.utils.LogUtils; import com.heytap.msp.push.HeytapPushManager; import com.hjq.toast.ToastUtils; import com.huawei.hms.support.common.ActivityMgr; -import com.idlefish.flutterboost.FlutterBoost; import com.llew.huawei.verifier.LoadedApkHuaWei; import com.microquation.linkedme.android.LinkedME; import com.mob.MobSDK; @@ -249,6 +248,7 @@ public class XChatApplication extends Application { ToastUtils.init(application); if (inMainProcess(context)) { + DemoCache.saveLaunchCount(); // 注册自定义推送消息处理,这个是可选项 NIMPushClient.registerMixPushMessageHandler(new PushMessageHandler()); diff --git a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt index b103cdb92..872fef11d 100644 --- a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt @@ -9,6 +9,7 @@ import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo import com.yizhuan.xchat_android_core.home.bean.ResourceInfo import com.yizhuan.xchat_android_core.home.model.HomeModel +import com.yizhuan.xchat_android_core.room.bean.AnchorInfo import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo import com.yizhuan.xchat_android_core.utils.toast @@ -61,6 +62,9 @@ class HomeViewModel : BaseViewModel() { private val _homeLiveTopInfoLiveData = MutableLiveData() val homeLiveTopInfoLiveData: LiveData = _homeLiveTopInfoLiveData + private val _anchorInfoLiveData = MutableLiveData() + val anchorInfoLiveData: LiveData = _anchorInfoLiveData + fun getBannerInfo() { safeLaunch { _bannerLiveData.value = HomeModel.getHomeBanner("9") @@ -210,5 +214,16 @@ class HomeViewModel : BaseViewModel() { ) } + fun requestAnchorInfo() { + safeLaunch( + onError = { + _anchorInfoLiveData.value = null + }, + block = { + _anchorInfoLiveData.value = HomeModel.requestAnchorInfo() + } + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt index 9783fd71b..0edafe9bc 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt @@ -7,7 +7,6 @@ import android.widget.TextView import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import com.yizhuan.erban.R -import com.yizhuan.erban.avroom.adapter.RoomContributeListAdapter import com.yizhuan.erban.avroom.adapter.RoomVPAdapter import com.yizhuan.erban.base.BaseFragment import com.yizhuan.erban.databinding.FragmentHomeBinding @@ -15,18 +14,13 @@ import com.yizhuan.erban.home.adapter.MainMagicIndicatorAdapter import com.yizhuan.erban.home.helper.OpenRoomHelper import com.yizhuan.erban.ui.search.SearchActivity import com.yizhuan.erban.ui.webview.CommonWebViewActivity -import com.yizhuan.erban.ui.widget.OnPageSelectedListener import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator +import com.yizhuan.xchat_android_core.DemoCache import com.yizhuan.xchat_android_core.UriProvider -import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent import com.yizhuan.xchat_android_core.statistic.StatisticManager import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import org.greenrobot.eventbus.EventBus import java.util.* -import java.util.concurrent.TimeUnit /** * 大鹅开黑首页 @@ -39,6 +33,10 @@ class HomeFragment : BaseFragment(), View.OnClickListener, R.id.iv_search -> { StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_SEARCH, "进入搜索页") SearchActivity.start(activity) + //为啥触发条件这么恶心 + if (DemoCache.readAnchorCardView() == 0) { + DemoCache.saveAnchorCardView(1) + } } R.id.iv_ranking -> { StatisticManager.Instance() diff --git a/app/src/main/java/com/yizhuan/erban/home/widget/AnchorCardView.kt b/app/src/main/java/com/yizhuan/erban/home/widget/AnchorCardView.kt new file mode 100644 index 000000000..4698ba702 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/home/widget/AnchorCardView.kt @@ -0,0 +1,235 @@ +package com.yizhuan.erban.home.widget + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator +import android.annotation.SuppressLint +import android.content.Context +import android.media.AudioAttributes +import android.os.Build +import android.os.SystemClock +import android.os.Vibrator +import android.text.TextUtils +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.widget.FrameLayout +import android.widget.ImageView +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yizhuan.erban.R +import com.yizhuan.erban.audio.helper.AudioPlayerHelper +import com.yizhuan.erban.audio.helper.OnPlayListener +import com.yizhuan.erban.avroom.activity.AVRoomActivity +import com.yizhuan.erban.databinding.LayoutAnchorCardViewBinding +import com.yizhuan.erban.ui.user.decorationsend.UserInfoSkillDecoration +import com.yizhuan.erban.ui.utils.load +import com.yizhuan.erban.ui.utils.loadAvatar +import com.yizhuan.xchat_android_core.room.bean.AnchorInfo +import com.yizhuan.xchat_android_core.user.bean.UserInfo +import com.yizhuan.xchat_android_core.user.bean.UserInfoSkillEntity +import com.yizhuan.xchat_android_library.utils.ListUtils +import com.yizhuan.xchat_android_library.utils.SingleToastUtil +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import java.util.concurrent.TimeUnit + +class AnchorCardView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + + private lateinit var binding: LayoutAnchorCardViewBinding + private var disposable: Disposable? = null + private var downY = 0f + private var audioPlaying = false + private var anchorInfo: AnchorInfo? = null + private var mVibrator: Vibrator? = null + private val patter = longArrayOf(0, 1000, 2500) + private var count: Long = 10 + + private fun initView() { + if (!this::binding.isInitialized) { + mVibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator? + binding = LayoutAnchorCardViewBinding.inflate(LayoutInflater.from(context)) + addView( + binding.root, + LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + ) + binding.recyclerviewSkillCard.adapter = object : + BaseQuickAdapter(R.layout.item_userinfo_skill_abspicture) { + override fun convert(helper: BaseViewHolder, item: String) { + helper.getView(R.id.iv_skill_picture).load(item) + } + } + binding.recyclerviewSkillCard.layoutManager = LinearLayoutManager( + context, + LinearLayoutManager.HORIZONTAL, + false + ) + binding.recyclerviewSkillCard.addItemDecoration(UserInfoSkillDecoration(context, 4)) + } + + } + + private fun setupData() { + initView() + startVibrate() + isVisible = true + anchorInfo?.let { + (binding.recyclerviewSkillCard.adapter as BaseQuickAdapter).setNewData( + it.absCardPics + ) + initVoiceShow(it.voiceCard) + binding.ivAvatar.loadAvatar(it.avatar) + binding.tvNick.text = it.nick + binding.tvSignature.text = it.signture + if (it.gender == UserInfo.GENDER_MALE) { + binding.ivGender.setImageResource(R.drawable.ic_gender_male) + } else { + binding.ivGender.setImageResource(R.drawable.ic_gender_female) + } + binding.tvGoRoom.setOnClickListener { _ -> + AVRoomActivity.start(context, it.uid) + } + intervalRange() + } + } + + @SuppressLint("SetTextI18n") + private fun intervalRange() { + disposable?.dispose() + disposable = Observable.intervalRange(0, count + 1, 0, 1, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext { aLong -> + count -= 1 + binding.tvTime.text = "剩余${10 - aLong}s" + } + .doOnComplete { + if (!audioPlaying) isVisible = false + } + .subscribe() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + disposable?.dispose() + } + + override fun onTouchEvent(event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> downY = event.rawY + MotionEvent.ACTION_MOVE -> { + if (event.rawY - downY < 0) { + translationY = event.rawY - downY + } + } + MotionEvent.ACTION_UP -> { + val offset = event.rawY - downY + when { + offset < -height / 2 -> { + val end = -height.toFloat() + startAnimator(translationY, end) { + stopAudio() + isVisible = false + } + } + else -> { + startAnimator(translationY, 0f) {} + translationY = 0f + } + } + } + else -> { + } + } + return true + } + + private fun startAnimator(start: Float, end: Float, onAnimationEnd: () -> Unit) { + val slowdownAnim = ObjectAnimator.ofFloat(this, "TranslationY", start, end) + slowdownAnim.duration = 200 + slowdownAnim.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + onAnimationEnd() + } + }) + slowdownAnim.start() + } + + private fun initVoiceShow(skillEntity: UserInfoSkillEntity?) { + if (skillEntity != null) { + binding.llAudio.visibility = VISIBLE + binding.livUser.stop() + binding.llAudio.setOnClickListener { toggleAudio(skillEntity.propVals) } + } else { + binding.llAudio.visibility = GONE + } + } + + private fun toggleAudio(list: List) { + if (ListUtils.isListEmpty(list)) return + var url: String? = "" + for (s in list) { + if (s!!.contains("http")) { + url = s + } + } + if (TextUtils.isEmpty(url)) return + if (!audioPlaying) { + playAudio(url) + } else { + stopAudio() + } + } + + private fun playAudio(url: String?) { + if (audioPlaying) return + disposable?.dispose() + audioPlaying = true + binding.livUser.start() + binding.ivAudioControl.setImageResource(R.drawable.ic_skill_play) + AudioPlayerHelper.get().playInThread(url, object : OnPlayListener { + override fun onError(error: String) { + SingleToastUtil.showToast("播放出错,请重试") + stopAudio() + } + + override fun onPrepared() {} + override fun onPlaying(currDuration: Long) {} + override fun onCompletion() { + stopAudio() + } + }) + } + + private fun stopAudio() { + if (!audioPlaying) return + intervalRange() + audioPlaying = false + binding.livUser.stop() + binding.ivAudioControl.setImageResource(R.drawable.ic_skill_pause) + AudioPlayerHelper.get().endPlay() + } + + fun setAnchorInfo(anchorInfo: AnchorInfo) { + this.anchorInfo = anchorInfo + setupData() + } + + private fun startVibrate() { + if (mVibrator == null) { + mVibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator? + } + mVibrator?.cancel() + val audioAttributes = AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_ALARM) + .build() + mVibrator?.vibrate(patter, -1, audioAttributes) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/ui/patriarch/help/PmDialogShowMrg.java b/app/src/main/java/com/yizhuan/erban/ui/patriarch/help/PmDialogShowMrg.java index 0a5b21469..737fa2b25 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/patriarch/help/PmDialogShowMrg.java +++ b/app/src/main/java/com/yizhuan/erban/ui/patriarch/help/PmDialogShowMrg.java @@ -114,6 +114,7 @@ public class PmDialogShowMrg { //如果弱引导,并且该uid已经存在缓存中,说明弹过一次,则不用再弹窗 if (InitialModel.get().getTeenagerMode() == 2) { if (map.containsKey(currUid)) { + hasShow = true; return; } show(context); @@ -127,6 +128,7 @@ public class PmDialogShowMrg { } } if (!TimeUtils.isTomorrow(currUidTime)) { + hasShow = true; return; } show(context); diff --git a/app/src/main/res/drawable-xhdpi/bg_anchor_card.png b/app/src/main/res/drawable-xhdpi/bg_anchor_card.png new file mode 100644 index 0000000000000000000000000000000000000000..1926d21fbed2e88a933974f4d1e6efab6c4c7b40 GIT binary patch literal 33951 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 NJw?^qISPh;{}05rXi5M8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/shape_anchor_card_time.xml b/app/src/main/res/drawable/shape_anchor_card_time.xml new file mode 100644 index 000000000..40fe25c43 --- /dev/null +++ b/app/src/main/res/drawable/shape_anchor_card_time.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index be6ac5abe..215ca7738 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -112,8 +112,21 @@ android:src="@drawable/ic_room_main_entrance_close" /> + + + diff --git a/app/src/main/res/layout/item_anchor_card_skill_abspicture.xml b/app/src/main/res/layout/item_anchor_card_skill_abspicture.xml new file mode 100644 index 000000000..e36d6522e --- /dev/null +++ b/app/src/main/res/layout/item_anchor_card_skill_abspicture.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_anchor_card_view.xml b/app/src/main/res/layout/layout_anchor_card_view.xml new file mode 100644 index 000000000..f1bbf4d81 --- /dev/null +++ b/app/src/main/res/layout/layout_anchor_card_view.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_vs_anchor_card_view.xml b/app/src/main/res/layout/layout_vs_anchor_card_view.xml new file mode 100644 index 000000000..6294313e8 --- /dev/null +++ b/app/src/main/res/layout/layout_vs_anchor_card_view.xml @@ -0,0 +1,6 @@ + + + + diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt index 4f6f00de4..9cdc2f593 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt @@ -6,6 +6,7 @@ import com.yizhuan.xchat_android_core.bean.response.ServiceResult import com.yizhuan.xchat_android_core.community.CommunityConstant import com.yizhuan.xchat_android_core.community.bean.UnReadCountInfo import com.yizhuan.xchat_android_core.home.bean.* +import com.yizhuan.xchat_android_core.room.bean.AnchorInfo import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo import com.yizhuan.xchat_android_core.room.bean.MeCenterInfo import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo @@ -174,6 +175,11 @@ object HomeModel : BaseModel() { api.getGameList() } + suspend fun requestAnchorInfo(): AnchorInfo? = + launchRequest { + api.requestAnchorInfo() + } + private interface Api { /** @@ -367,6 +373,12 @@ object HomeModel : BaseModel() { suspend fun getGameList( ): ServiceResult> + + /** + * @return + */ + @GET("user/get/userCard") + suspend fun requestAnchorInfo(): ServiceResult } } \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java b/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java index f753273ea..6c65bea80 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java @@ -51,6 +51,9 @@ public class DemoCache { private static final String KEY_NEW_USER_CHARGE_GIFT = "key_new_user_charge_gift"; private static final String KEY_MAIN_TAB_DATA = "key_main_tab_data"; private static final String KEY_SPEEDY_MESSAGE_GONE_TIME = "SpeedyMessageGoneTime"; + private static final String KEY_ANCHOR_CARD_VIEW = "key_anchor_card_view"; + private static final String KEY_ANCHOR_CARD_VIEW_TIME = "key_anchor_card_view_time"; + private static final String KEY_LAUNCH_COUNT = "key_launch_count"; private static StatusBarNotificationConfig notificationConfig; public static Long readSpeedyMessageGoneTime() { @@ -249,7 +252,7 @@ public class DemoCache { SettingsPref.instance().putBoolean(KEY_NEW_USER_GIFT, value); } - public static Boolean readNewUserGift() { + public static boolean readNewUserGift() { return SettingsPref.instance().getBoolean(KEY_NEW_USER_GIFT, true); } @@ -264,5 +267,31 @@ public class DemoCache { return SettingsPref.instance().getInt(KEY_NEW_USER_CHARGE_GIFT, 0); } + /** + * @param value 0初始值 1 显示首次弹窗 2 非首次弹窗,需要判断时间再显示 + */ + public static void saveAnchorCardView(int value) { + SettingsPref.instance().putInt(KEY_ANCHOR_CARD_VIEW, value); + if (value == 2) { + SettingsPref.instance().putLong(KEY_ANCHOR_CARD_VIEW_TIME, CurrentTimeUtils.getCurrentTime()); + } + } + + public static int readAnchorCardView() { + return SettingsPref.instance().getInt(KEY_ANCHOR_CARD_VIEW, 0); + } + + public static long readAnchorCardViewTime() { + return SettingsPref.instance().getLong(KEY_ANCHOR_CARD_VIEW_TIME, 0); + } + + public static void saveLaunchCount() { + SettingsPref.instance().putInt(KEY_LAUNCH_COUNT, readLaunchCount() + 1); + } + + public static int readLaunchCount() { + return SettingsPref.instance().getInt(KEY_LAUNCH_COUNT, -1); + } + } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java index 1b93e667c..c4cb55c84 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java @@ -115,6 +115,9 @@ public class InitialModel extends BaseModel implements IInitialModel { */ private int findNewbieCharmLevel; + @Nullable + private InitInfo cacheInitInfo; + private InitialModel() { api = RxNet.create(Api.class); loadMainTabInfoList(); @@ -201,6 +204,7 @@ public class InitialModel extends BaseModel implements IInitialModel { private void cacheInitData(InitInfo initInfo) { if (initInfo == null) return; + this.cacheInitInfo = initInfo; DemoCache.saveInitInfo(initInfo); // 更新时间 DemoCache.saveInitInfoSavingTime(System.currentTimeMillis()); @@ -230,7 +234,7 @@ public class InitialModel extends BaseModel implements IInitialModel { } // 兑换比率 - if (initInfo != null && initInfo.getExchangeGoldRate() != 0) { + if (initInfo.getExchangeGoldRate() != 0) { SharedPreferenceUtils.setExchangeGoldRate(initInfo.getExchangeGoldRate()); } @@ -325,27 +329,7 @@ public class InitialModel extends BaseModel implements IInitialModel { @Nullable @Override public InitInfo getCacheInitInfo() { - // 过期了 - if (System.currentTimeMillis() - DemoCache.readInitInfoSavingTime() > TIME_EXPIRED) - return null; - // 没有缓存 - InitInfo initInfo = DemoCache.readInitInfo(); - if (initInfo == null) { - return null; - } else if (initInfo.getSplashVo() == null) { - return null; - } - // 图片是否存在 -// String path = DemoCache.readSplashPicture(); -// if (TextUtils.isEmpty(path)) { -// return null; -// } else { -// if (!new File(path).exists()) { -// downloadSplashPicture(path); -// return null; -// } -// } - return initInfo; + return cacheInitInfo == null ? DemoCache.readInitInfo() : cacheInitInfo; } /** diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/AnchorInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/AnchorInfo.kt new file mode 100644 index 000000000..31b634ed0 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/AnchorInfo.kt @@ -0,0 +1,14 @@ +package com.yizhuan.xchat_android_core.room.bean + +import com.yizhuan.xchat_android_core.user.bean.UserInfoSkillEntity + +data class AnchorInfo( + val absCardPics: List? = null, + val avatar: String = "", + val erbanNo: Int = 0, + val gender: Int = 0, + val nick: String = "", + val signture: String = "", + val uid: Long = 0, + val voiceCard: UserInfoSkillEntity? = null +) \ No newline at end of file