43 Commits

Author SHA1 Message Date
Max
18b680db70 feat:删除首页-交友列表 无用的样式属性 2023-12-28 20:22:28 +08:00
Max
0fd330848c feat:大富翁游戏隐藏背景 2023-12-28 19:32:23 +08:00
Max
d0d2418dbf fix:修复交友页UI问题 2023-12-28 18:46:20 +08:00
Max
a129fb405e fix:修复首页-交友-数据未正常请求问题 2023-12-28 16:44:16 +08:00
Max
91b006422c feat:首页广场的下拉刷新组件换新样式 2023-12-28 15:49:05 +08:00
Max
d83dbe2337 fix:修复游戏房打开消息弹窗回来导致的闪烁问题:因为生命周期变化调用游戏暂停恢复导致,目前把游戏暂停恢复已到onStart,onStop中 2023-12-28 15:34:52 +08:00
Max
ce27034ca6 feat:恢复房间顶部排行榜入口:游戏房显示一个,其他房间三个 2023-12-28 14:36:20 +08:00
Max
340403fe0d fix:修复TRTC 上麦闭麦状态下还有声音光波问题,参考peko同步调整部分配置 2023-12-28 14:21:41 +08:00
Max
ac8dc50955 fix:调整埋点问题:eventLable为空被拦截问题 2023-12-28 11:06:56 +08:00
Max
32ef74df3a fix:调整游戏房间列表样式问题 2023-12-28 10:55:21 +08:00
Max
e4cb690b68 fix:调整UI问题 2023-12-27 21:15:00 +08:00
Max
96de9e153c feat:优化房间布局(动态状态栏高度) 2023-12-27 20:01:31 +08:00
Max
35032c1f8e feat:调整首页派对-礼物消息-房间上锁的处理 2023-12-27 17:39:01 +08:00
Max
3e1ab090aa feat:完成数据埋点需求 2023-12-27 17:14:07 +08:00
Max
95aeda920a Merge branch 'develop' into test/2.0.0 2023-12-27 15:07:12 +08:00
Max
60d6bbeae8 Merge branch 'feature/game' into test/2.0.0 2023-12-27 15:07:07 +08:00
Max
0b339136cc feat:去掉本地一键匹配的忽略私聊限制:由后端处理 2023-12-27 15:04:40 +08:00
Max
6e7743960c fix:修复首页房间条目点击进房参数问题 2023-12-27 14:57:54 +08:00
Max
7709020221 feat:完成用户资料页优化需求 2023-12-27 14:47:59 +08:00
Max
b9d59e9477 feat:拆分首页ViewModel 2023-12-27 11:22:00 +08:00
Max
321fa1b9ea feat:完成一键匹配入口进私聊:忽略限制功能 2023-12-26 23:22:04 +08:00
Max
ff746b5a11 feat:调整首页下拉刷新UI效果 2023-12-26 22:09:06 +08:00
Max
802383b9e8 feat:初步完成首页下拉动画 2023-12-26 20:20:31 +08:00
Max
b41a2e0376 feat:完成首页-交友UI与数据联调
feat:完成更多游戏房间页面功能
2023-12-26 19:23:15 +08:00
Max
732cea412c feat:调整首页部分类命名与目录结构、删除部分无用类 2023-12-26 10:56:05 +08:00
Max
52db404fc0 Merge branch 'fix/speaker' into develop 2023-12-26 09:53:49 +08:00
Max
2d954d21ef feat:调整TRTC音质级别 2023-12-25 20:56:10 +08:00
Max
b7eb1e66fa fix:修复声网上麦后导致静音失效问题 2023-12-25 20:20:09 +08:00
Max
6491efe708 feat:完善首页交友页UI与数据
feat:删除无用代码(旧首页)
2023-12-25 18:34:22 +08:00
Max
37ed8facf3 feat:完善首页-交友UI 2023-12-22 20:21:50 +08:00
Max
6becbb6226 fix:调整派对-房间-条目边框加载策略 2023-12-22 19:00:06 +08:00
Max
ea19645fe8 feat:删除无用代码 2023-12-22 18:08:58 +08:00
Max
d48844dc14 temp:增加打印ABI信息 2023-12-22 17:09:00 +08:00
Max
a939c29e3e feat:升级TRTC版本(abi开放x86) 2023-12-22 16:24:20 +08:00
Max
e55b4d7348 fix:增加异常捕获打印 2023-12-22 14:56:59 +08:00
Max
583d5a139b feat:调整派对-房间条目样式尺寸
feat:完善交友UI
2023-12-22 12:11:45 +08:00
Max
c7dd6ec61c feat:调整首页相关类命名 2023-12-22 10:08:38 +08:00
Max
a58165213d feat:增加首页动态切换Tab 2023-12-22 09:50:24 +08:00
Max
f21e117e7f feat:首页资源位增加本地缓存 2023-12-22 09:32:22 +08:00
Max
f9bd5b7a9f feat:初步完善【首页-派对】数据与UI对接 2023-12-21 20:24:05 +08:00
Max
b9251a89a5 feat:完成【首页-派对】部分UI 2023-12-20 20:00:39 +08:00
Max
e81d75a8b8 feat:升级最新SUD游戏SDK版本1.3.6.1181,完善房间入口等功能 2023-12-19 18:27:42 +08:00
Max
c691e5f570 feat:初步搭建新版首页页面(未实现功能) 2023-12-19 10:42:53 +08:00
203 changed files with 4799 additions and 6143 deletions

View File

@@ -22,7 +22,7 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
}
flavorDimensions 'default'
}
@@ -31,7 +31,7 @@ android {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a'
include 'armeabi-v7a', 'arm64-v8a', 'x86'
universalApk true
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -1177,7 +1177,7 @@
android:name="com.nnbc123.app.shipantics.RadishRankingActivity"
android:theme="@style/room_message_activity" />
<activity
android:name="com.nnbc123.app.home.activity.MoreRoomActivity"
android:name="com.nnbc123.app.game_room.GameRoomActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.nnbc123.app.avroom.wishlist.WishListCreateActivity"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,12 +2,10 @@ package com.nnbc123.app;
import static com.nnbc123.core.channel_page.model.ChannelPageModel.KEY_FLAG_VALID_CHANNEL_PAGE;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
@@ -16,7 +14,6 @@ import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -43,7 +40,6 @@ import com.nnbc123.app.application.ActivityStackManager;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.avroom.newuserchargegift.NewUserChargeGiftDialog;
import com.nnbc123.app.base.BaseMvpActivity;
import com.nnbc123.app.common.widget.CircleImageView;
import com.nnbc123.app.common.widget.DragLayout;
import com.nnbc123.app.community.dynamic.view.DynamicDetailActivity;
import com.nnbc123.app.community.publish.view.PublishActivity;
@@ -52,10 +48,9 @@ import com.nnbc123.app.family.view.activity.FamilyHomeActivity;
import com.nnbc123.app.home.HomeViewModel;
import com.nnbc123.app.home.dialog.NewUserHelloDialog;
import com.nnbc123.app.home.dialog.ProtocolUpdateDialog;
import com.nnbc123.app.home.fragment.HomeFragment;
import com.nnbc123.app.home.fragment.home.HomeFragment;
import com.nnbc123.app.home.fragment.MeFragment;
import com.nnbc123.app.home.fragment.MsgFragment;
import com.nnbc123.app.home.fragment.PartyFragment;
import com.nnbc123.app.home.fragment.PmModeFragment;
import com.nnbc123.app.home.presenter.MainPresenter;
import com.nnbc123.app.home.view.IMainView;
@@ -77,7 +72,6 @@ import com.nnbc123.app.ui.patriarch.help.PmDialogShowMrg;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2;
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
import com.nnbc123.app.ui.widget.LivingIconView;
import com.nnbc123.app.ui.widget.MainTabLayout;
import com.nnbc123.app.utils.CleanLeakUtils;
import com.nnbc123.app.utils.PushMessageHandler;
@@ -176,7 +170,6 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private Runnable touchRunnable;
{
fragmentArray.put(MainTabType.TAB_TYPE_PARTY, new PartyFragment());
fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_MSG, new MsgFragment());
fragmentArray.put(MainTabType.TAB_TYPE_SQUARE, new SquareFragment());

View File

@@ -93,7 +93,7 @@ public class AudioPlayerHelper {
try {
player.setDataSource(filePath);
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
preparing = true;
@@ -122,6 +122,9 @@ public class AudioPlayerHelper {
}
public void endPlay() {
if (listener != null) {
listener.onCompletion();
}
handler.removeMessages(WHAT_STATUS.COUNT_PLAY);
if (player != null) {
if (preparing) {

View File

@@ -6,6 +6,7 @@ import android.view.View
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.GameMicroViewAdapter
import com.nnbc123.app.avroom.adapter.GameMiniMicroViewAdapter
@@ -58,6 +59,7 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
override fun onFindViews() {
super.onFindViews()
gameBinding = DataBindingUtil.bind(mView)!!
ImmersionBar.with(this).titleBarMarginTop(gameBinding.spaceTitleBar).init()
gameBinding.lifecycleOwner = this
gameBinding.click = this
gameBinding.ktvModel = false
@@ -169,22 +171,13 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
override fun onStart() {
super.onStart()
gameDelegate.onStart()
}
override fun onResume() {
super.onResume()
gameDelegate.onResume()
}
override fun onPause() {
super.onPause()
gameDelegate.onPause()
gameDelegate.onStart()
}
override fun onStop() {
super.onStop()
gameDelegate.onPause()
gameDelegate.onStop()
}

View File

@@ -8,11 +8,13 @@ import android.view.View
import android.view.ViewConfiguration
import android.widget.ImageView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import cn.sharesdk.framework.Platform
import com.chad.library.adapter.base.BaseQuickAdapter
import com.gyf.immersionbar.ImmersionBar
import com.netease.nim.uikit.common.util.string.StringUtil
import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
@@ -53,6 +55,9 @@ import com.nnbc123.core.room.anotherroompk.ShowUserInfoDialogEvent
import com.nnbc123.core.room.bean.RoomContributeDataInfo
import com.nnbc123.core.room.bean.RoomContributeUserInfo
import com.nnbc123.core.room.bean.RoomInfo
import com.nnbc123.core.room.bean.RoomModeType
import com.nnbc123.core.room.game.GameInfo
import com.nnbc123.core.room.game.GameModel
import com.nnbc123.core.room.model.RoomContributeListModel
import com.nnbc123.core.room.queuing_mic.event.HasAnimationEffect
import com.nnbc123.core.share.ShareModel
@@ -66,6 +71,7 @@ import com.nnbc123.core.utils.net.RxHelper
import com.nnbc123.library.rxbus.RxBus
import com.nnbc123.library.utils.FormatUtils
import com.nnbc123.library.utils.JavaUtil
import com.nnbc123.library.utils.ResUtil
import com.nnbc123.library.utils.SingleToastUtil
import com.trello.rxlifecycle3.android.FragmentEvent
import io.reactivex.SingleObserver
@@ -119,6 +125,7 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
override fun onFindViews() {
_binding = DataBindingUtil.bind(mView)
ImmersionBar.with(this).titleBarMarginTop(binding.layoutTitleBar).init()
setupRoomTitleMarquee()
}
@@ -240,16 +247,16 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
}
//这里的2和4是服务端定义的错误状态 关闭排麦模式和关闭PK模式!
private val isShowChangeGame: Boolean
get() = false
/* RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
private val isShowChangeGame: Boolean get() {
val currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
return currentRoomInfo != null &&
AvRoomDataManager.get().isRoomOwner() &&
currentRoomInfo.getIsPermitRoom() != 1 &&
currentRoomInfo.getType() != RoomInfo.ROOM_TYPE_SINGLE &&
(currentRoomInfo.getRoomModeType() == RoomModeType.NORMAL_MODE ||
currentRoomInfo.getRoomModeType() == 2 ||
currentRoomInfo.getRoomModeType() == 4);*/
currentRoomInfo.getRoomModeType() == 4)
}
fun setRoomBg(roomInfo: RoomInfo?) {
if (_binding == null) return
@@ -421,6 +428,38 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
setupFollowRoom()
FOLLOW_ROOM_TYPE = if (AvRoomDataManager.get().isRoomFans) "2" else "1"
setIdOnlineData()
if (isShowChangeGame) {
initRvGame()
binding.layoutRankTop1.isVisible = false
binding.layoutRankTop2.isVisible = false
binding.llChangeGame.visibility = View.VISIBLE
if (AvRoomDataManager.get().isOpenGame) {
binding.tvCurrGame.text = it.mgName
} else {
binding.tvCurrGame.text = "扩列交友"
}
GameModel.getGameList()
.compose(bindToLifecycle())
.subscribe { gameInfos ->
if (AvRoomDataManager.get().isOpenGame) {
for (i in gameInfos.indices) {
val gameInfo: GameInfo = gameInfos[i]
if (gameInfo.mgId.toLongOrNull() == it.mgId) {
gameInfos.removeAt(i)
break
}
}
val gameInfo = GameInfo()
gameInfo.name = "扩列交友"
gameInfos.add(gameInfo)
}
gameAdapter?.setNewData(gameInfos)
}
} else {
binding.llChangeGame.setVisibility(View.GONE)
binding.layoutRankTop1.isVisible = true
binding.layoutRankTop2.isVisible = true
}
}
}
@@ -538,13 +577,13 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
private fun updateRoomRanks(data: List<RoomContributeUserInfo>) {
val avatarList = arrayListOf(
binding.ivRank0,
binding.ivRank1,
binding.ivRank2
// binding.ivRank1,
// binding.ivRank2
)
val stvList = arrayListOf(
binding.stvRank0,
binding.stvRank1,
binding.stvRank2
// binding.stvRank1,
// binding.stvRank2
)
for (i in 0 until avatarList.size) {
avatarList[i].loadAvatar(data.getOrNull(i)?.avatar)

View File

@@ -8,6 +8,7 @@ import android.widget.ImageView;
import androidx.databinding.DataBindingUtil;
import com.gyf.immersionbar.ImmersionBar;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
@@ -133,6 +134,7 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
public void onFindViews() {
super.onFindViews();
gameBinding = DataBindingUtil.bind(mView);
ImmersionBar.with(this).titleBarMarginTop(gameBinding.layoutRoot).init();
gameBinding.setLifecycleOwner(this);
gameBinding.setClick(this);
gameBinding.setKtvModel(false);

View File

@@ -9,6 +9,7 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.viewModels
import com.gyf.immersionbar.ImmersionBar
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.OnMicroItemClickListener
@@ -86,6 +87,7 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
override fun onFindViews() {
super.onFindViews()
gameBinding = DataBindingUtil.bind(mView)!!
ImmersionBar.with(this).titleBarMarginTop(gameBinding.spaceTitleBar).init()
gameBinding.lifecycleOwner = this
gameBinding.click = this
}
@@ -265,13 +267,13 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
gameBinding.microView.bindAdapter(SingleRoomPKMicroViewAdapter(context))
gameBinding.viewPkBoard.isVisible = true
gameBinding.microView.updateLayoutParams<ConstraintLayout.LayoutParams> {
topMargin = ScreenUtil.dip2px(140f)
topMargin = ScreenUtil.dip2px(50f)
}
} else if (!AvRoomDataManager.get().isOpenAnotherPKMode && gameBinding.microView.adapter !is SingleAnchorMicroViewAdapter) {
gameBinding.microView.bindAdapter(SingleAnchorMicroViewAdapter(context))
gameBinding.viewPkBoard.isVisible = false
gameBinding.microView.updateLayoutParams<ConstraintLayout.LayoutParams> {
topMargin = ScreenUtil.dip2px(110f)
topMargin = ScreenUtil.dip2px(10f)
}
} else {
gameBinding.microView.adapter?.notifyDataSetChanged()

View File

@@ -8,8 +8,8 @@ import com.nnbc123.app.BuildConfig;
public class AppConfig {
protected static final String APP_ID = "1467745235064848385";
protected static final String APP_KEY = "BvjLDpWol7OihaYeFebuepx1bZu6cxU5";
protected static final String APP_ID = "1735573973195948033";
protected static final String APP_KEY = "r23OylNqnjOBPM0SDgVBfq6RCKMWAc0X";
protected static boolean isTestEnv = BuildConfig.DEBUG;
}

View File

@@ -34,7 +34,7 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
private val TAG = "GameDelegate"
private var APP_CODE = ""
private val mRoomID = AvRoomDataManager.get().roomUid.toString()
private val mRoomID :String get() = AvRoomDataManager.get().roomUid.toString()
private val mLanguage = "zh-CN" //语言
//调用游戏SDK的接口,成功加载游戏后可用:
@@ -84,7 +84,10 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
}
fun updateGame(mgId: Long?) {
if (mgId == null || mgId == 0L || mgId == mMGID || iSudFSTAPP == null) return
if (mgId == null || mgId == 0L) return
if (mgId == mMGID && iSudFSTAPP != null) {
return
}
mMGID = mgId
updateMyMicQueue(GameStatus.STATUS_NOT_JOIN)
loadMG(activity, mUid, mRoomID, APP_CODE, mMGID, mLanguage)
@@ -164,8 +167,11 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
language: String
) {
iSudFSTAPP?.destroyMG()
SudMGP.getCfg().showLoadingGameBg = !isHideLoadingBg()
iSudFSTAPP = SudMGP.loadMG(activity, userID, roomID, code, mgID, language, mISudFSMMG)
addGameView(iSudFSTAPP!!.gameView)
iSudFSTAPP?.apply {
addGameView(gameView)
}
}
/**
@@ -226,6 +232,9 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
LogUtils.d(p0)
}
override fun onGameLoadingProgress(p0: Int, p1: Int, p2: Int) {
}
override fun onGameStarted() {
}
@@ -285,7 +294,11 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
}
override fun onGetGameCfg(handle: ISudFSMStateHandle?, p1: String?) {
handle?.success(gson.toJson(GameCfg()))
val config = GameCfg()
if (isHideGameBg()) {
config.ui.game_bg.hide = true
}
handle?.success(gson.toJson(config))
}
/**
@@ -313,9 +326,9 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
//游戏安全操作区域
val viewGameRect = JSONObject()
viewGameRect.put("left", 0)
viewGameRect.put("top", ScreenUtil.dip2px(200f))
viewGameRect.put("top", ScreenUtil.dip2px(180f))
viewGameRect.put("right", 0)
viewGameRect.put("bottom", ScreenUtil.dip2px(200f))
viewGameRect.put("bottom", ScreenUtil.dip2px(150f))
jsonObject.put("view_game_rect", viewGameRect)
//通知游戏
@@ -655,6 +668,12 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
iSudFSTAPP?.destroyMG()
}
private fun isHideLoadingBg(): Boolean {
return mMGID == 1704460412809043970
}
private fun isHideGameBg(): Boolean {
return mMGID == 1704460412809043970
}
}
internal interface AppLoginListener {

View File

@@ -2,33 +2,24 @@ package com.nnbc123.app.common.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.Outline;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;
import android.view.View;
import android.view.ViewOutlineProvider;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.shape.CornerFamily;
import com.google.android.material.shape.ShapeAppearanceModel;
import com.nnbc123.app.R;
import java.io.InputStream;
/**
* 自定义View实现圆角圆形等效果
*
* @author zhy
*/
public class RectRoundImageView extends ImageView {
public class RectRoundImageView extends ShapeableImageView {
/**
* TYPE_CIRCLE / TYPE_ROUND
@@ -37,42 +28,11 @@ public class RectRoundImageView extends ImageView {
public static final int TYPE_CIRCLE = 0;
public static final int TYPE_ROUND = 1;
/**
* 图片
*/
private Bitmap mSrc;
/**
* 圆角的大小
*/
private int mRadius = 8;
/**
* 控件的宽度
*/
private int mWidth;
/**
* 控件的高度
*/
private int mHeight;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getmRadius() {
return mRadius;
}
public void setmRadius(int mRadius) {
this.mRadius = mRadius;
}
public RectRoundImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -98,17 +58,6 @@ public class RectRoundImageView extends ImageView {
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.RectRoundImageView_src:
// mSrc = BitmapFactory.decodeResource(getResources(),
// a.getResourceId(attr, 0));
InputStream is = getResources().openRawResource(a.getResourceId(attr, 0));
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inTempStorage = new byte[100 * 1024];
opts.inPreferredConfig = Config.RGB_565;
opts.inPurgeable = true;
opts.inSampleSize = 4;
mSrc = BitmapFactory.decodeStream(is, null, opts);
break;
case R.styleable.RectRoundImageView_type:
type = a.getInt(attr, 0);// 默认为Circle
break;
@@ -121,197 +70,25 @@ public class RectRoundImageView extends ImageView {
}
setScaleType(ScaleType.CENTER_CROP);
a.recycle();
setup(type, mRadius);
}
/**
* 计算控件的高度和宽度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Drawable drawable = getDrawable();
if (null != drawable) {
mSrc = drawableToBitmap(getDrawable());
}
/**
* 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mWidth = specSize;
} else {
// 由图片决定的宽
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mWidth = Math.min(desireByImg, specSize);
} else
mWidth = desireByImg;
}
/***
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else {
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}
setMeasuredDimension(mWidth, mHeight);
}
/**
* 绘制
*/
@Override
protected void onDraw(Canvas canvas) {
switch (type) {
// 如果是TYPE_CIRCLE绘制圆形
case TYPE_CIRCLE:
int min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
if (null != mSrc) {
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);
canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
private void setup(int type, int cornerSize) {
if (type == TYPE_CIRCLE) {
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
int min = Math.min(view.getWidth(), view.getHeight());
int left = (view.getWidth() - min) / 2;
int top = (view.getHeight() - min) / 2;
outline.setOval(left, top, min, min);
}
break;
case TYPE_ROUND:
canvas.drawBitmap(createFramedPhoto(mWidth, mHeight, mSrc, mRadius), 0, 0, null);
break;
});
setClipToOutline(true);
} else if (type == TYPE_ROUND) {
setShapeAppearanceModel(ShapeAppearanceModel.builder()
.setAllCorners(CornerFamily.ROUNDED, cornerSize)
.build());
}
}
/**
* Drawable → Bitmap
*
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888
: Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private Bitmap createCircleImage(Bitmap source, int min) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Config.RGB_565);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN参考上面的说明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* 根据原图添加圆角
*
* @param source
* @return
*/
private Bitmap createRoundConerImage(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* @param x 图像的宽度
* @param y 图像的高度
* @param image 源图片
* @param outerRadiusRat 圆角的大小
* @return 圆角图片
*/
Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
//根据源文件新建一个darwable对象
Drawable imageDrawable = new BitmapDrawable(image);
// 新建一个新的输出图片
Bitmap output = Bitmap.createBitmap(x, y, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
// 新建一个矩形
RectF outerRect = new RectF(0, 0, x, y);
// 产生一个红色的圆角矩形
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);
// 将源图片绘制到这个圆角矩形上
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
imageDrawable.setBounds(0, 0, x, y);
canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
imageDrawable.draw(canvas);
canvas.restore();
return output;
}
}

View File

@@ -0,0 +1,134 @@
package com.nnbc123.app.game_room
import android.content.Context
import android.content.Intent
import androidx.core.view.isVisible
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingActivity
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.common.widget.dialog.DialogManager.AbsOkDialogListener
import com.nnbc123.app.databinding.ActivityMoreRoomBinding
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.pay.PayModel.NOT_REAL_NAME_BEFORE_CHARGING
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
/**
* 更多游戏-房间列表
*/
@ActLayoutRes(R.layout.activity_more_room)
class GameRoomActivity : BaseBindingActivity<ActivityMoreRoomBinding>() {
private val gameTabAdapter = GameTabAdapter()
private val roomAdapter = GameRoomAdapter()
private lateinit var viewModel: GameRoomViewModel
private var rvDelegate: RVDelegate<HomeRoomInfo>? = null
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, GameRoomActivity::class.java)
context.startActivity(starter)
}
}
override fun init() {
ImmersionBar.with(this).titleBarMarginTop(mBinding.ivBack).init()
viewModel = ViewModelProvider(this)[GameRoomViewModel::class.java]
initView()
initEvent()
initObserve()
viewModel.getData()
}
private fun initView() {
mBinding.ivBack.setOnClickListener {
finish()
}
mBinding.rvTop.adapter = gameTabAdapter
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomAdapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(GridLayoutManager(this, 2))
.build()
}
private fun initObserve() {
viewModel.jumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@GameRoomActivity.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
viewModel.gameTabLiveData.observe(this) {
gameTabAdapter.setNewData(it)
mBinding.rvTop.isVisible = !it.isNullOrEmpty()
}
viewModel.roomListLiveData.observe(this) {
rvDelegate?.loadData(it)
}
}
private fun initEvent() {
gameTabAdapter.setOnItemClickListener { adapter, view, position ->
gameTabAdapter.getItem(position)?.let {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_MORE_GAME_TAB_CLICK,
it.name
)
dialogManager.showProgressDialog(this)
val type = if (it.isFriendsType == true) {
2
} else {
1
}
viewModel.getJumpInfo(it.mgId ?: 0, type)
}
}
roomAdapter.setOnItemClickListener { adapter, view, position ->
roomAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
}
}
}
override fun onDestroy() {
super.onDestroy()
dialogManager?.dismissDialog()
}
}

View File

@@ -0,0 +1,49 @@
package com.nnbc123.app.game_room
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
/**
* Created by Max on 2023/12/26 11:31
* Desc:
**/
class GameRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.game_room_item_room) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.getView<ImageView>(R.id.iv_bg)
.load(item.backgroundPic, defaultRes = R.drawable.game_room_bg_item_default)
helper.getView<ImageView>(R.id.iv_room_cover).load(item.avatar)
helper.setText(R.id.tv_room_name, item.title)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
//gameState=0 (idle 状态游戏未开始空闲状态gameState=1 loading 状态所有玩家都准备好队长点击了开始游戏按钮等待加载游戏场景开始游戏gameState=2playing状态游戏进行中状态
if (item.mgId > 0) {
when (item.state) {
0 -> {
helper.setText(R.id.tv_message, "游戏未开始,等待加入")
}
else -> {
helper.setText(R.id.tv_message, "游戏进行中,立即围观")
}
}
} else {
helper.setText(R.id.tv_message, "扩列交友")
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].load(avatarUrl, defaultRes = R.drawable.game_room_ic_mic)
}
}
}

View File

@@ -0,0 +1,50 @@
package com.nnbc123.app.game_room
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeGameBean
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.utils.toast
class GameRoomViewModel : BaseViewModel() {
val gameTabLiveData = MutableLiveData<List<HomeGameBean>>()
val roomListLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val jumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
fun getData() {
safeLaunch(
onError = {
roomListLiveData.value = ListResult.failed(1)
gameTabLiveData.value = ArrayList<HomeGameBean>().apply {
add(HomeGameBean(isFriendsType = true))
}
},
block = {
val result = HomeModel.getHomeGame()
val gameList = ArrayList<HomeGameBean>()
result?.miniGames?.let {
gameList.addAll(it)
}
gameList.add(HomeGameBean(isFriendsType = true))
gameTabLiveData.value = gameList
roomListLiveData.value = ListResult.success(result?.playRooms, 1)
}
)
}
fun getJumpInfo(id: Long, type: Int) {
safeLaunch(
onError = {
jumpLiveData.value = BeanResult.failed(it)
},
block = {
jumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, type))
}
)
}
}

View File

@@ -0,0 +1,24 @@
package com.nnbc123.app.game_room
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeGameBean
/**
* Created by Max on 2023/12/26 11:31
* Desc:
**/
class GameTabAdapter :
BaseQuickAdapter<HomeGameBean, BaseViewHolder>(R.layout.game_room_item_tab) {
override fun convert(helper: BaseViewHolder, item: HomeGameBean) {
if (item.isFriendsType == true) {
helper.getView<ImageView>(R.id.iv_cover)
.setImageResource(R.drawable.game_room_bg_friends)
} else {
helper.getView<ImageView>(R.id.iv_cover).load(item.pic)
}
}
}

View File

@@ -0,0 +1,90 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeGameTab
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.toast
/**
* Created by Max on 2023/12/27 10:18
* Desc:
**/
class FriendsViewModel: BaseViewModel() {
private val _resourceJumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
val resourceJumpLiveData: LiveData<BeanResult<HomeRoomInfo>?> = _resourceJumpLiveData
private val _homeChatPickLiveData = MutableLiveData<String?>()
val homeChatPickLiveData: LiveData<String?> = _homeChatPickLiveData
private val _newFriendLiveData = MutableLiveData<ListResult<UserInfo>>()
val newFriendLiveData: LiveData<ListResult<UserInfo>> = _newFriendLiveData
val friendRecommendModeLiveData = MutableLiveData<ListResult<UserInfo>>()
val gameTabLiveData = MutableLiveData<MutableList<HomeGameTab>>()
fun getResourceJumpInfo(id: Long) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = BeanResult.failed(it)
},
block = {
_resourceJumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, 0))
}
)
}
fun getHomeChatPick() {
safeLaunch(
onError = {
_homeChatPickLiveData.value = null
it.message.toast()
},
block = {
_homeChatPickLiveData.value = HomeModel.getHomeChatPick()
}
)
}
fun getNewFriendList(gender: Int? = null, gameId: Long? = null) {
safeLaunch(
onError = {
_newFriendLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getNewFriendList(gender, gameId)
_newFriendLiveData.value = ListResult.success(result, 1)
}
)
}
fun getFriendRecommendMore() {
safeLaunch(
onError = {
friendRecommendModeLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getFriendRecommendMore()
friendRecommendModeLiveData.value = ListResult.success(result, 1)
}
)
}
fun getHomeGameTab() {
safeLaunch {
if (gameTabLiveData.value == null) {
HomeModel.getHomeGameTabListByLocal()?.let {
gameTabLiveData.value = it
}
}
gameTabLiveData.value = HomeModel.getHomeGameTabList()
}
}
}

View File

@@ -2,136 +2,42 @@ package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.community.CommunityConstant
import com.nnbc123.core.home.bean.*
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.room.bean.AnchorInfo
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.room.bean.SingleRoomSortInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.toast
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.user.bean.UserInfo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
class HomeViewModel : BaseViewModel() {
private val _bannerLiveData = MutableLiveData<List<BannerInfo>>()
val bannerLiveData: LiveData<List<BannerInfo>> = _bannerLiveData
private val _partyBannerLiveData = MutableLiveData<List<BannerInfo>?>()
val partyBannerLiveData: LiveData<List<BannerInfo>?> = _partyBannerLiveData
private val _hotRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val hotRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _hotRoomLiveData
private val _gameRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val gameRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _gameRoomLiveData
private val _pickRoomLiveData = MutableLiveData<HomeRoomInfo?>()
val pickRoomLiveData: LiveData<HomeRoomInfo?> = _pickRoomLiveData
private val _openGameRoomLiveData = MutableLiveData<Long?>()
val openGameRoomLiveData: LiveData<Long?> = _openGameRoomLiveData
private val _concernsLiveData = MutableLiveData<List<HomeRoomInfo>>()
val concernsLiveData: LiveData<List<HomeRoomInfo>> = _concernsLiveData
private val _collectLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val collectLiveData: LiveData<ListResult<HomeRoomInfo>> = _collectLiveData
private val _tagLiveData = MutableLiveData<MutableList<HomeTagInfo>>()
val tagLiveData: LiveData<MutableList<HomeTagInfo>> = _tagLiveData
private val _emptyLiveData = MutableLiveData<Boolean>()
val emptyLiveData: LiveData<Boolean> = _emptyLiveData
private val _resourceLiveData = MutableLiveData<MutableList<ResourceInfo>>()
val resourceLiveData: LiveData<MutableList<ResourceInfo>> = _resourceLiveData
private val _resourceJumpLiveData = MutableLiveData<HomeRoomInfo?>()
val resourceJumpLiveData: LiveData<HomeRoomInfo?> = _resourceJumpLiveData
private val _homeChatPickLiveData = MutableLiveData<String?>()
val homeChatPickLiveData: LiveData<String?> = _homeChatPickLiveData
private val _singleAnchorHomeLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val singleAnchorHomeLiveData: LiveData<ListResult<HomeRoomInfo>> = _singleAnchorHomeLiveData
private val _singleRoomSortInfoLiveData = MutableLiveData<ListResult<SingleRoomSortInfo>>()
val singleRoomSortInfoLiveData: LiveData<ListResult<SingleRoomSortInfo>> =
_singleRoomSortInfoLiveData
private val _homeLiveTopInfoLiveData = MutableLiveData<HomeLiveTopInfo?>()
val homeLiveTopInfoLiveData: LiveData<HomeLiveTopInfo?> = _homeLiveTopInfoLiveData
private val _anchorInfoLiveData = MutableLiveData<AnchorInfo?>()
val anchorInfoLiveData: LiveData<AnchorInfo?> = _anchorInfoLiveData
private val _partyRecommendRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val partyRecommendRoomLiveData: LiveData<ListResult<HomeRoomInfo>> =
_partyRecommendRoomLiveData
private val _partyRecommendRoomMoreLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val partyRecommendRoomMoreLiveData: LiveData<ListResult<HomeRoomInfo>> =
_partyRecommendRoomMoreLiveData
private val _giftServiceLiveData = MutableLiveData<ListResult<GiftServiceMsgVo>>()
val giftServiceLiveData: LiveData<ListResult<GiftServiceMsgVo>> = _giftServiceLiveData
private val _newFriendLiveData = MutableLiveData<ListResult<UserInfo>>()
val newFriendLiveData: LiveData<ListResult<UserInfo>> = _newFriendLiveData
fun getBannerInfo() {
safeLaunch {
_bannerLiveData.value = HomeModel.getHomeBanner("9")
}
}
fun getTagInfo() {
safeLaunch {
_tagLiveData.value = HomeModel.getHomeTag()
}
}
fun getHomeResource() {
safeLaunch(
block = {
if (_resourceLiveData.value == null) {
HomeModel.getHomeResourceByLocal()?.let {
_resourceLiveData.value = it
}
}
_resourceLiveData.value = HomeModel.getHomeResource()
},
onError = {
}
)
}
fun getResourceJumpInfo(id: Int) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = null
it.message.toast()
},
block = {
_resourceJumpLiveData.value = HomeModel.getResourceJumpInfo(id)
}
)
}
fun getHomeChatPick() {
safeLaunch(
onError = {
_homeChatPickLiveData.value = null
it.message.toast()
},
block = {
_homeChatPickLiveData.value = HomeModel.getHomeChatPick()
}
)
}
fun getHotRoom(pageNum: Int, pageSize: Int) {
@@ -146,145 +52,6 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getPartyBanner() {
safeLaunch(
onError = {
_partyBannerLiveData.value = null
},
block = {
val result = HomeModel.getHotRoom()
var bannerInfoList: List<BannerInfo>?
bannerInfoList = result?.find { it.isBanner }?.bannerVoList
if (bannerInfoList == null) {
bannerInfoList = HomeModel.getPlayRoom()?.find { it.isBanner }?.bannerVoList
}
_partyBannerLiveData.value = bannerInfoList
}
)
}
fun getGameRoom(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_gameRoomLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getGameRoom(pageNum, pageSize)
_gameRoomLiveData.value = ListResult.success(result, pageNum)
}
)
}
fun fastPickGameRoom(mgId: Long? = null) {
safeLaunch(
onError = {
it.message.toast()
StatisticManager.Instance()
.onEvent(
StatisticsProtocol.EVENT_USERCENTER_QUICK_ENTRYSUCCESS_CLICK,
"个人中心快捷进房点击未匹配成功"
)
},
block = {
val homeRoomInfo = HomeModel.fastPickGameRoom(mgId)
if (homeRoomInfo?.isPick == true) {
_pickRoomLiveData.value = homeRoomInfo
} else if (homeRoomInfo?.isNeedOpenSelfRoom == true) {
_openGameRoomLiveData.value = mgId
}
}
)
}
fun getCollectRoom(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_collectLiveData.value = ListResult.failed(pageNum)
_emptyLiveData.value = true
},
block = {
if (pageNum == 1) {
val concernsRooms = async(Dispatchers.IO) {
try {
HomeModel.getConcernsRoom()
} catch (e: Throwable) {
null
}
}
val collectRooms = async(Dispatchers.IO) {
try {
HomeModel.getCollectRoom(pageNum, pageSize)
} catch (e: Throwable) {
null
}
}
_concernsLiveData.value = concernsRooms.await()
val collectList = collectRooms.await()
if (collectList == null) {
_collectLiveData.value = ListResult.failed(pageNum)
} else {
_collectLiveData.value =
ListResult.success(collectList.fansRoomList, pageNum)
}
_emptyLiveData.value = _concernsLiveData.value.isNullOrEmpty() &&
_collectLiveData.value?.data.isNullOrEmpty()
} else {
val result = HomeModel.getCollectRoom(pageNum, pageSize)
_collectLiveData.value = ListResult.success(result?.fansRoomList, pageNum)
}
}
)
}
fun requestSingleRoomSortList() {
safeLaunch(
onError = {
//保证最少有一个推荐tab,防止出现空白页
_singleRoomSortInfoLiveData.value =
ListResult.success(listOf(SingleRoomSortInfo(null, "推荐")), 1)
},
block = {
val result = HomeModel.requestSingleRoomSortList()
val fullResult = ArrayList<SingleRoomSortInfo>()
fullResult.add(SingleRoomSortInfo(null, "推荐"))
result?.let { fullResult.addAll(it) }
_singleRoomSortInfoLiveData.value = ListResult.success(fullResult, 1)
}
)
}
fun getHomeSingleAnchorList() {
safeLaunch(
onError = {
_singleAnchorHomeLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getHomeSingleAnchorList()
_singleAnchorHomeLiveData.value = ListResult.success(
if ((result?.size ?: 0) > 4) {
result?.subList(0, 4)
} else {
result
}, 1
)
}
)
}
fun requestHomeLiveTopInfo() {
safeLaunch(
onError = {
_homeLiveTopInfoLiveData.value = null
},
block = {
_homeLiveTopInfoLiveData.value = HomeModel.requestHomeLiveTopInfo()
}
)
}
fun requestAnchorInfo() {
safeLaunch(
onError = {
@@ -296,54 +63,4 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getPartyRecommendRoomList() {
safeLaunch(
onError = {
_partyRecommendRoomLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getPartyRecommendRoomList(
AuthModel.get().currentUid.toString(),
CommunityConstant.VERSION_VALID_TYPE
)
_partyRecommendRoomLiveData.value = ListResult.success(result, 1)
}
)
}
fun getPartyRecommendRoomMoreList() {
safeLaunch(
onError = {
_partyRecommendRoomMoreLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getPartyRecommendRoomMoreList()
_partyRecommendRoomMoreLiveData.value = ListResult.success(result, 1)
}
)
}
fun getServiceGiftRecord() {
safeLaunch(
onError = {
_giftServiceLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getServiceGiftRecord()
_giftServiceLiveData.value = ListResult.success(result, 1)
}
)
}
fun getNewFriendList(gender: Int? = null) {
safeLaunch(
onError = {
_newFriendLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getNewFriendList(gender)
_newFriendLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -0,0 +1,56 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.BannerInfo
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.utils.toast
/**
* Created by Max on 2023/12/27 10:18
* Desc:
**/
class PartyViewModel : BaseViewModel() {
private val _giftServiceLiveData = MutableLiveData<ListResult<GiftServiceMsgVo>>()
val giftServiceLiveData: LiveData<ListResult<GiftServiceMsgVo>> = _giftServiceLiveData
private val _bannerLiveData = MutableLiveData<List<BannerInfo>>()
val bannerLiveData: LiveData<List<BannerInfo>> = _bannerLiveData
private val _resourceJumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
val resourceJumpLiveData: LiveData<BeanResult<HomeRoomInfo>?> = _resourceJumpLiveData
fun getResourceJumpInfo(id: Long) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = BeanResult.failed(it)
},
block = {
_resourceJumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, 0))
}
)
}
fun getBannerInfo() {
safeLaunch {
_bannerLiveData.value = HomeModel.getHomeBanner("1")
}
}
fun getServiceGiftRecord() {
safeLaunch(
onError = {
_giftServiceLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getServiceGiftRecord()
_giftServiceLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -1,27 +0,0 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
class RoomCommonViewModel : BaseViewModel() {
private val _commonRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val commonRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _commonRoomLiveData
fun getCommonRoom(tabId: Int, pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_commonRoomLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getCommonRoom(tabId, pageNum, pageSize)
_commonRoomLiveData.value = ListResult.success(result, pageNum)
}
)
}
}

View File

@@ -1,27 +0,0 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
class RoomSingleViewModel : BaseViewModel() {
private val _singleAnchorMoreLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val singleAnchorMoreLiveData: LiveData<ListResult<HomeRoomInfo>> = _singleAnchorMoreLiveData
fun getMoreSingleAnchorList(id: Long?) {
safeLaunch(
onError = {
_singleAnchorMoreLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getMoreSingleAnchorList(id)
_singleAnchorMoreLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -1,38 +0,0 @@
package com.nnbc123.app.home.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.home.fragment.PartyFragment
import com.netease.nim.uikit.StatusBarUtil
class MoreRoomActivity : BaseActivity() {
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, MoreRoomActivity::class.java)
context.startActivity(starter)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_more_room)
initTitleBar("更多房间")
supportFragmentManager
.beginTransaction()
.replace(R.id.fcv, PartyFragment.newInstance())
.commitAllowingStateLoss()
}
override fun needSteepStateBar() = true
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -1,58 +0,0 @@
package com.nnbc123.app.home.adapter;
import android.graphics.drawable.AnimationDrawable;
import androidx.annotation.NonNull;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.common.widget.CircleImageView;
import com.nnbc123.app.ui.user.UserInfoActivity;
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2;
import com.nnbc123.core.home.bean.HomeRoomInfo;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.core.utils.StringExtensionKt;
public class HomeConcernsAdapter extends BaseQuickAdapter<HomeRoomInfo, BaseViewHolder> {
public HomeConcernsAdapter() {
super(R.layout.item_home_concerns, null);
}
@Override
protected void convert(@NonNull BaseViewHolder helper, HomeRoomInfo item) {
if (item == null) {
return;
}
CircleImageView circleImageView = helper.getView(R.id.civ_room_avatar);
ImageLoadUtilsV2.loadImage(circleImageView, item.getAvatar());
helper.setText(R.id.tv_room_name, StringExtensionKt.subAndReplaceDot(item.getNick(), 4));
if (item.getRoomUid() > 0) {
helper.setVisible(R.id.view_avatar_bg, true);
helper.setVisible(R.id.view_living, true);
helper.setVisible(R.id.tv_live, true);
if (helper.getView(R.id.view_living).getBackground() instanceof AnimationDrawable) {
((AnimationDrawable) helper.getView(R.id.view_living).getBackground()).start();
}
helper.itemView.setOnClickListener(v -> {
AVRoomActivity.startForFromType(mContext,
item.getRoomUid(),
AVRoomActivity.FROM_TYPE_USER,
item.getNick(),
String.valueOf(item.getUid()));
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_GZR_ROOM_SUCCESS, "喜欢tab点击关注的人进入房间");
});
} else {
helper.setVisible(R.id.view_avatar_bg, false);
helper.setVisible(R.id.tv_live, false);
helper.setVisible(R.id.view_living, false);
helper.itemView.setOnClickListener(v -> UserInfoActivity.Companion.start(mContext, item.getUid()));
}
}
}

View File

@@ -0,0 +1,64 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeGameTab
/**
* Created by Max on 2023/12/25 10:30
* Desc:
**/
class HomeFriendsGameTabAdapter :
BaseQuickAdapter<HomeGameTab, BaseViewHolder>(R.layout.home_friends_item_game) {
var selectGameId: Long? = null
private var selectPosition: Int? = null
override fun convertPayloads(
helper: BaseViewHolder,
item: HomeGameTab,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
override fun convert(helper: BaseViewHolder, item: HomeGameTab) {
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: HomeGameTab) {
if (helper.absoluteAdapterPosition == selectPosition) {
helper.getView<ImageView>(R.id.iv_cover).load(item.onClick, defaultRes = null)
} else {
helper.getView<ImageView>(R.id.iv_cover).load(item.onUnclick, defaultRes = null)
}
}
fun selectItem(position: Int?) {
val item = getItem(position ?: -1)
if (item == null || position == null) {
val oldPosition = selectPosition
this.selectGameId = null
this.selectPosition = null
if (oldPosition != null) {
notifyItemChanged(oldPosition, true)
}
} else if (position == selectPosition) {
this.selectGameId = null
this.selectPosition = null
notifyItemChanged(position, true)
} else {
val oldPosition = this.selectPosition
this.selectGameId = item.gameId
this.selectPosition = position
if (oldPosition != null) {
notifyItemChanged(oldPosition, true)
}
notifyItemChanged(position, true)
}
}
}

View File

@@ -0,0 +1,251 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.audio.helper.AudioPlayerHelper
import com.nnbc123.app.audio.helper.OnPlayListener
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.app.vip.VipHelper
import com.nnbc123.core.Constants
import com.nnbc123.core.manager.AudioEngineManager
import com.nnbc123.core.manager.AvRoomDataManager
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.library.utils.SingleToastUtil
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.opensource.svgaplayer.SVGAParser
import com.opensource.svgaplayer.SVGAVideoEntity
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.Date
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/12/18 18:33
* Desc:
**/
class HomeFriendsUserAdapter :
BaseQuickAdapter<UserInfo, BaseViewHolder>(R.layout.home_friends_list_item) {
private var disposable: Disposable? = null
private var isMute = false
private var isRemoteMute = false
override fun convert(helper: BaseViewHolder, item: UserInfo) {
// 昵称
val nameView = helper.getView<TextView>(R.id.tv_name)
nameView.text = item.nick
VipHelper.loadVipNickColor(nameView, item.userVipInfoVO, "#2B2D33")
// 头像
helper.getView<ImageView>(R.id.iv_avatar).load(item.avatar)
// 星座
var star: String? = null
if (item.birth > 0) {
star = StarUtils.getConstellation(Date(item.birth))
}
helper.setGone(R.id.tv_constellation, !star.isNullOrEmpty())
.setText(R.id.tv_constellation, star)
// 状态
if (item.isInOnline) {
val svgaLiving = helper.getView<SVGAImageView>(R.id.svga_state_live)
if (item.inRoomUid > 0L) {
svgaLiving.loadFromAssets("svga/home_living_white.svga")
svgaLiving.startAnimation()
svgaLiving.isVisible = true
helper.getView<View>(R.id.iv_state_leisure).isVisible = false
helper.setText(R.id.tv_state, "直播中")
} else {
svgaLiving.stopAnimation()
svgaLiving.isVisible = false
helper.getView<View>(R.id.iv_state_leisure).isVisible = true
helper.setText(R.id.tv_state, "空闲中")
}
helper.setGone(R.id.layout_state, true)
} else {
helper.setGone(R.id.layout_state, false)
}
// 房间
val roomInfoView = helper.getView<View>(R.id.layout_room_info)
if (item.roomTitle.isNullOrEmpty()) {
roomInfoView.isVisible = false
} else {
roomInfoView.isVisible = true
roomInfoView.isSelected = true
helper.setText(R.id.tv_room_title, item.roomTitle)
roomInfoView.singleClick {
if (!item.isLock && item.inRoomUid > 0) {
AVRoomActivity.start(it.context, item.inRoomUid)
}
}
}
// 声音
val audioUrl = item.voiceCard?.getAudioUrl()
val svagAudio = helper.getView<SVGAImageView>(R.id.svga_audio)
if (audioUrl.isNullOrEmpty()) {
svagAudio.stopAnimation()
helper.setGone(R.id.layout_audio, false)
} else {
helper.getView<TextView>(R.id.tv_audio_duration).text =
"${item.voiceCard?.getAudioDuration() ?: 0}"
helper.getView<View>(R.id.layout_audio)
.setOnClickListener { toggleAudio(helper, item) }
svagAudio.setImageResource(R.drawable.home_ic_audio_playing)
helper.setGone(R.id.layout_audio, true)
}
// 游戏
val groupGame = helper.getView<View>(R.id.group_game)
item.userGamePartnerVo?.let {
val name =
if (!it.firstGameName.isNullOrEmpty() && !it.secondGameName.isNullOrEmpty()) {
"${it.firstGameName}|${it.secondGameName}"
} else if (!it.firstGameName.isNullOrEmpty()) {
it.firstGameName
} else if (!it.secondGameName.isNullOrEmpty()) {
it.secondGameName
} else {
null
}
helper.setText(R.id.tv_game_name, name)
helper.getView<ImageView>(R.id.iv_game_icon).load(it.firstLogo)
groupGame.isVisible = true
} ?: kotlin.run {
groupGame.isVisible = false
}
}
private fun toggleAudio(holder: BaseViewHolder, item: UserInfo) {
if (item.isVoicePlaying) {
stopAudio()
} else {
playAudio(holder, item)
}
}
private fun stopAudio() {
AudioPlayerHelper.get().endPlay()
}
private fun resetAudioUI(holder: BaseViewHolder, item: UserInfo) {
item.isVoicePlaying = false
disposable?.dispose()
holder.setImageResource(R.id.iv_audio_btn, R.drawable.home_ic_audio_play)
holder.setText(
R.id.tv_audio_duration,
"${item.voiceCard?.getAudioDuration() ?: 0}"
)
val svgaImageView = holder.getView<SVGAImageView>(R.id.svga_audio)
svgaImageView.stopAnimation()
svgaImageView.setImageResource(R.drawable.home_ic_audio_playing)
AvRoomDataManager.get().mCurrentRoomInfo?.run {
AudioEngineManager.get().isRemoteMute = isRemoteMute //非靜音
AudioEngineManager.get().isMute = isMute //能説話
AudioEngineManager.get().setRole(
if (isRemoteMute) Constants.CLIENT_ROLE_AUDIENCE else Constants.CLIENT_ROLE_BROADCASTER
)
}
}
private fun playAudio(holder: BaseViewHolder, item: UserInfo) {
AudioPlayerHelper.get().endPlay()
item.isVoicePlaying = true
holder.setImageResource(R.id.iv_audio_btn, R.drawable.home_ic_audio_pause)
val svgaImageView = holder.getView<SVGAImageView>(R.id.svga_audio)
SVGAParser.shareParser()
.decodeFromAssets("svga/home_voice_playing.svga", object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
if (item.isVoicePlaying) {
val drawable = SVGADrawable(videoItem)
svgaImageView.setImageDrawable(drawable)
svgaImageView.startAnimation()
}
}
override fun onError() {
}
})
val duration = item.voiceCard?.getAudioDuration() ?: 0
disposable = Observable.interval(1L, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.map { it + 1 }
.takeUntil { it == duration }
.subscribe {
holder.setText(
R.id.tv_audio_duration,
"${(duration - it)}"
)
}
AvRoomDataManager.get().mCurrentRoomInfo?.run {
isRemoteMute = AudioEngineManager.get().isRemoteMute
isMute = AudioEngineManager.get().isMute
AudioEngineManager.get().isRemoteMute = true //設置靜音
AudioEngineManager.get().isMute = true //不能説話
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE)
}
AudioPlayerHelper.get()
.playInThread(item.voiceCard?.getAudioUrl(), object : OnPlayListener {
override fun onError(error: String) {
SingleToastUtil.showToast("播放出错,请重试")
resetAudioUI(holder, item)
}
override fun onPrepared() {}
override fun onPlaying(currDuration: Long) {}
override fun onCompletion() {
resetAudioUI(holder, item)
}
})
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
if (holder.itemViewType == 0) {
val svgaLiving = holder.getView<SVGAImageView>(R.id.svga_state_live)
if (svgaLiving.isVisible) {
svgaLiving?.loadFromAssets("svga/home_living_white.svga")
}
}
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
super.onViewDetachedFromWindow(holder)
if (holder.itemViewType == 0) {
val position = holder.absoluteAdapterPosition
if (position < 0 || position >= data.size) {
return
}
val item = data[position]
if (item.isVoicePlaying) {
stopAudio()
}
}
}
override fun setNewData(data: MutableList<UserInfo>?) {
stopAudio()
super.setNewData(data)
}
}

View File

@@ -1,41 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
class HomeLiveTopAdapter :
BaseQuickAdapter<HomeLiveTopInfo.SingleRoom, BaseViewHolder>(R.layout.item_home_live_top) {
private var onceLookStatus: Boolean = false
fun setOnceLookStatus(onceLookStatus: Boolean) {
this.onceLookStatus = onceLookStatus
}
override fun convert(helper: BaseViewHolder, item: HomeLiveTopInfo.SingleRoom) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_room_title, item.title)
setGone(R.id.iv_room_tag, item.isRecommend && onceLookStatus)
}
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.uid)
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_RECENT_CARD_CLICK,
"最近在看卡片点击",
mapOf("room_id" to item.erbanNo)
)
}
}
}

View File

@@ -0,0 +1,128 @@
package com.nnbc123.app.home.adapter;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.nnbc123.app.R;
import com.nnbc123.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.nnbc123.app.ui.widget.magicindicator.buildins.UIUtil;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.DrawableIndicator;
import java.util.List;
public class HomeMagicIndicatorAdapter extends CommonNavigatorAdapter {
private final List<? extends CharSequence> mTitleList;
private int textSize = 20;
private float minScale = 0.7f;
protected int mNormalColor = Color.BLACK;
protected int mSelectedColor = Color.BLACK;
private boolean showIndicator = true;
private int resId = R.drawable.home_bg_indicator;
public HomeMagicIndicatorAdapter(Context context, List<? extends CharSequence> charSequences ) {
this.mTitleList = charSequences;
}
@Override
public int getCount() {
return mTitleList == null ? 0 : mTitleList.size();
}
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(mNormalColor);
scaleTransitionPagerTitleView.setSelectedColor(mSelectedColor);
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
scaleTransitionPagerTitleView.setAutoResetPivot(true);
int padding = UIUtil.dip2px(context, 6);
scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
scaleTransitionPagerTitleView.setText(mTitleList.get(i));
scaleTransitionPagerTitleView.setOnClickListener(view -> {
if (mOnItemSelectListener != null) {
mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
}
});
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
if (!showIndicator) return null;
DrawableIndicator indicator = new DrawableIndicator(context);
indicator.setMode(DrawableIndicator.MODE_MATCH_EDGE);
indicator.setIndicatorDrawable(context.getResources().getDrawable(resId));
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, UIUtil.dip2px(context, 28));
lp.gravity = Gravity.CENTER_VERTICAL;
indicator.setLayoutParams(lp);
return indicator;
}
public void setResId(int resId) {
this.resId = resId;
}
public int getTextSize() {
return textSize;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public float getMinScale() {
return minScale;
}
public void setMinScale(float minScale) {
this.minScale = minScale;
}
public int getSelectedColor() {
return mSelectedColor;
}
public void setSelectedColor(int selectedColor) {
mSelectedColor = selectedColor;
}
public int getNormalColor() {
return mNormalColor;
}
public void setNormalColor(int normalColor) {
mNormalColor = normalColor;
}
public boolean isShowIndicator() {
return showIndicator;
}
public void setShowIndicator(boolean showIndicator) {
this.showIndicator = showIndicator;
}
private OnItemSelectListener mOnItemSelectListener;
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -0,0 +1,48 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import androidx.core.view.isVisible
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadAvatar
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.utils.subAndReplaceDot2
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.bannerview.BaseViewHolder
/**
* Created by Max on 2023/12/18 19:02
* Desc:
**/
class HomePartyMessageAdapter : BaseBannerAdapter<GiftServiceMsgVo>() {
var clickListener: ((GiftServiceMsgVo) -> Unit)? = null
override fun bindData(
holder: BaseViewHolder<GiftServiceMsgVo>,
item: GiftServiceMsgVo,
position: Int,
pageSize: Int
) {
holder.setText(R.id.tv_nick_send, item.senderNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_nick_receiver, item.receiverNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_name, item.giftName.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_num, "x${item.giftNum}")
holder.findViewById<ImageView>(R.id.iv_avatar_send).loadAvatar(item.senderAvatar)
holder.findViewById<ImageView>(R.id.iv_avatar_receiver).loadAvatar(item.receiverAvatar)
holder.findViewById<ImageView>(R.id.iv_gift).load(item.giftPicUrl)
val arrowView = holder.findViewById<View>(R.id.iv_arrow)
arrowView.isVisible = !item.isLock
arrowView.setOnClickListener {
clickListener?.invoke(item)
}
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.home_party_item_message
}
fun getItem(position: Int): GiftServiceMsgVo? {
return mList.getOrNull(position)
}
}

View File

@@ -1,7 +1,5 @@
package com.nnbc123.app.home.adapter
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
@@ -10,34 +8,38 @@ import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
class PartyHotAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_party_hot) {
/**
* Created by Max on 2023/12/18 18:33
* Desc:
**/
class HomePartyRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_party_room_item) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
getView<ImageView>(R.id.iv_cover).load(item.avatar)
setText(R.id.tv_online_number, "${item.onlineNum}")
setText(R.id.tv_room_title, item.title)
setText(R.id.tv_name, item.title)
setGone(R.id.iv_tag, !item.tagPict.isNullOrEmpty())
getView<ImageView>(R.id.iv_tag).load(item.tagPict)
setGone(R.id.iv_pk, item.isCrossPking)
val borderView = getView<ImageView>(R.id.iv_cover_border)
if (item.backgroundPic.isNullOrEmpty()) {
borderView.setImageDrawable(null)
} else {
borderView.load(item.backgroundPic, defaultRes = null)
}
}
helper.setGone(R.id.tv_in_pk, item.isCrossPking)
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.iconContent))
.setText(R.id.tv_tag_content, item.iconContent)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4),
helper.getView(R.id.iv_avatar_5)
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
}

View File

@@ -1,88 +0,0 @@
package com.nnbc123.app.home.adapter
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Shader
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.makeramen.roundedimageview.RoundedImageView
import com.nnbc123.app.R
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.core.utils.ifNullOrEmpty
/**
* create by lvzebiao @2019/11/13
*/
class HomePlayAdapter : BaseMultiItemQuickAdapter<HomeRoomInfo, BaseViewHolder>(null) {
init {
addItemType(HomeRoomInfo.TYPE_ROOM, R.layout.item_home_play)
addItemType(HomeRoomInfo.TYPE_BANNER, R.layout.item_room_banner)
addItemType(HomeRoomInfo.TYPE_BROADCAST, R.layout.item_home_play_broadcast)
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
if (item.itemType == HomeRoomInfo.TYPE_ROOM ||
item.itemType == HomeRoomInfo.TYPE_BROADCAST
) {
helper.setText(R.id.tv_room_title, item.title)
helper.setGone(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
val tvMgName = helper.getView<TextView>(R.id.tv_mg_name)
tvMgName.text = item.mgName.ifNullOrEmpty { "扩列交友" }
if (item.mgName.isNullOrEmpty()) {
setGradient(tvMgName, "#FF8C5FFF", "#FFFF969B")
} else {
setGradient(tvMgName, "#FF61C4FE", "#FFA979FF")
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
val ivRoomImage = helper.getView<RoundedImageView>(R.id.iv_room_image)
ImageLoadUtilsV2.loadAvatar(ivRoomImage, item.avatar)
ivRoomImage.borderColor =
Color.parseColor(if (item.gender == 1) "#CCD7FF" else "#FFD0D0")
if (item.itemType == HomeRoomInfo.TYPE_BROADCAST) {
helper.setText(R.id.tv_broad_msg, item.broadMsg)
} else {
helper.setBackgroundRes(
R.id.view_bg,
if (item.gender == 1) R.drawable.bg_home_play_item_man else R.drawable.bg_home_play_item_woman
)
}
} else {
BannerHelper.setBanner(helper.getView(R.id.roll_view), item.bannerVoList)
}
}
private fun setGradient(textView: TextView, startColor: String, endColor: String) {
val endX = textView.paint.textSize * textView.text.length
val linearGradient = LinearGradient(
0f, 0f, endX, 0f,
Color.parseColor(startColor),
Color.parseColor(endColor),
Shader.TileMode.CLAMP
)
textView.paint.shader = linearGradient
textView.invalidate()
}
}

View File

@@ -1,91 +0,0 @@
package com.nnbc123.app.home.adapter;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.core.home.bean.HomeTabMapInfo;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
/**
* <p> 首页热门adapter </p>
*
* @author Administrator
* @date 2017/11/16
*/
public class HomeRoomFragmentAdapter extends BaseMultiItemQuickAdapter<HomeTabMapInfo, BaseViewHolder> {
private Context mContext;
/**
* 校验跳转房间的频率
*/
public HomeRoomFragmentAdapter(Context context) {
super(null);
addItemType(HomeTabMapInfo.TYPE_NORMAL, R.layout.item_home_tab_map);
addItemType(HomeTabMapInfo.TYPE_EMPTY, R.layout.item_erban_grid_empty);
this.mContext = context;
}
protected void convert(@NonNull BaseViewHolder helper, HomeTabMapInfo item) {
if (item == null) {
return;
}
switch (helper.getItemViewType()) {
case HomeTabMapInfo.TYPE_NORMAL:
helper.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_TJ_ROOM_SUCCESS, "首页_进入推荐房间");
AVRoomActivity.startForFromType(mContext, item.getRoomUid(), AVRoomActivity.FROM_TYPE_RECOMMEND);
}
});
helper.setText(R.id.tv_online_number, item.getOnlineNum() + "")
.setText(R.id.tv_title, item.getTitle());
//注意这里有三个标签,展示优先级 PK中>自定义>房间标签
helper.setGone(R.id.tv_tag_in_pk, item.isCrossPking());
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.getIconContent()) && !item.isCrossPking())
.setText(R.id.tv_tag_content, item.getIconContent());
ImageView mIvTabLabel = helper.getView(R.id.iv_tab_label);
if (!TextUtils.isEmpty(item.getTagPict()) && !item.isCrossPking() && TextUtils.isEmpty(item.getIconContent())) {
mIvTabLabel.setVisibility(View.VISIBLE);
ImageLoadUtils.loadAvatarBig(item.getTagPict(), mIvTabLabel);
} else {
mIvTabLabel.setVisibility(View.GONE);
}
ImageView ivCover = helper.getView(R.id.iv_cover);
if (!TextUtils.isEmpty(item.getAvatar())) {
ImageLoadUtils.loadAvatarBig(item.getAvatar(), ivCover, R.drawable.default_cover);
} else {
GlideApp.with(mContext)
.load(R.drawable.default_cover)
.placeholder(R.drawable.default_cover)
.into(ivCover);
}
break;
case HomeTabMapInfo.TYPE_EMPTY:
break;
}
}
}

View File

@@ -1,51 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.opensource.svgaplayer.SVGAImageView
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
/**
* create by lvzebiao @2019/11/13
* 人气主播更多
*/
class MoreSingleAnchorAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_home_single_anchor_more) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
val ivPking = helper.getView<SVGAImageView>(R.id.iv_pking)
val ivTag = helper.getView<ImageView>(R.id.iv_tag)
ivPking.isVisible = item.isCrossPking
ivTag.isVisible = !TextUtils.isEmptyText(item.tagPict) && !item.isCrossPking
if (item.isCrossPking) {
ivPking.loadFromAssets("svga/single_room_pking.svga")
} else {
ivTag.load(item.tagPict)
}
helper.setText(R.id.tv_online_num, item.onlineNum.toString())
.setText(R.id.tv_nickname, item.nick)
.setText(R.id.tv_room_name, item.title)
.setImageResource(
R.id.iv_gender,
if (item.gender == 1) R.drawable.ic_gender_male else R.drawable.ic_gender_female
)
helper.getView<ImageView>(R.id.iv_room_avatar)
.load(item.avatar, 12f, R.drawable.default_cover)
helper.itemView.setOnClickListener {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_ZB_TAB_ROOM_SUCCESS, "直播tab进入房间成功")
AVRoomActivity.start(mContext, item.uid)
}
}
}

View File

@@ -1,55 +0,0 @@
package com.nnbc123.app.home.adapter
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
class RoomCommonAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_common) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_online_number, "${item.onlineNum}")
setText(R.id.tv_room_title, item.title)
}
helper.setGone(R.id.tv_in_pk, item.isCrossPking)
helper.setGone(R.id.iv_room_tag, !TextUtils.isEmpty(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.iconContent))
.setText(R.id.tv_tag_content, item.iconContent)
helper.getView<View>(R.id.view_bg).setBackgroundResource(
when (helper.layoutPosition % 3) {
0 -> R.drawable.bg_home_common_item0
1 -> R.drawable.bg_home_common_item1
else -> R.drawable.bg_home_common_item2
}
)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4),
helper.getView(R.id.iv_avatar_5)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
}

View File

@@ -1,64 +0,0 @@
package com.nnbc123.app.home.adapter
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Shader
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
class RoomGameAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_game) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_room_title, item.title)
itemView.setOnClickListener {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_MINI_GAME_ROOM_SUCCESS, "小游戏tab进入房间成功")
AVRoomActivity.start(mContext, item.uid)
}
val tvRoomGame = helper.getView<TextView>(R.id.tv_room_game)
tvRoomGame.text = item.mgName
helper.setText(R.id.tv_game_status, if (item.state == 1) "游戏中" else "等人中")
setGradient(tvRoomGame)
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
private fun setGradient(textView: TextView) {
val endX = textView.paint.textSize * textView.text.length
val linearGradient = LinearGradient(
0f, 0f, endX, 0f,
Color.parseColor("#FF61C4FE"),
Color.parseColor("#FFA979FF"),
Shader.TileMode.CLAMP
)
textView.paint.shader = linearGradient
textView.invalidate()
}
}

View File

@@ -1,62 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
class RoomHotAdapter : BaseMultiItemQuickAdapter<HomeRoomInfo, BaseViewHolder>(null) {
init {
addItemType(HomeRoomInfo.TYPE_ROOM, R.layout.item_room_hot)
addItemType(HomeRoomInfo.TYPE_BROADCAST, R.layout.item_room_hot)
addItemType(HomeRoomInfo.TYPE_BANNER, R.layout.item_room_banner)
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
if (item.itemType != HomeRoomInfo.TYPE_BANNER) {
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_RM_ROOM_SUCCESS, "热门进入房间")
}
helper.getView<ImageView>(R.id.iv_room_image).load(item.avatar,round = 8f)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
helper.setText(R.id.tv_room_title, item.title)
helper.setText(R.id.tv_id, "ID:${item.erbanNo}")
helper.setVisible(R.id.tv_in_pk, item.isCrossPking)
helper.setVisible(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
helper.getView<ImageView>(R.id.iv_room_tag).load(item.tagPict)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
} else {
BannerHelper.setBanner(helper.getView(R.id.roll_view), item.bannerVoList)
}
}
}

View File

@@ -1,59 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
class RoomLikeAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_like) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.roomAvatar)
setText(R.id.tv_online_number, "${item.roomOnlineNum}")
setText(R.id.tv_room_title, item.roomName)
setText(R.id.tv_id, "ID:${item.erbanNo}")
}
helper.setVisible(R.id.tv_in_pk, item.isCrossPking)
helper.setVisible(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.roomUid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_SCFJ_ROOM_SUCCESS, "成功进入收藏的房间")
}
if (item.isValid) {
helper.setGone(R.id.tv_online_number, true)
helper.setBackgroundRes(R.id.view_bg, R.drawable.bg_home_like_item)
helper.setBackgroundRes(R.id.view_room_cover, R.drawable.bg_home_common_avatar)
} else {
helper.setGone(R.id.tv_online_number, false)
helper.setBackgroundRes(R.id.view_bg, R.drawable.bg_home_like_item_disable)
helper.setBackgroundRes(R.id.view_room_cover, R.drawable.bg_home_common_avatar_disable)
}
}
}

View File

@@ -1,111 +0,0 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.user.UserInfoActivity
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.loadAvatar
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.app.vip.VipHelper
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.CurrentTimeUtils
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.core.utils.ifNullOrEmpty
import com.opensource.svgaplayer.SVGAImageView
import java.util.*
class RoomNewFriendsAdapter :
BaseQuickAdapter<UserInfo, BaseViewHolder>(R.layout.item_room_new_friends) {
override fun convert(helper: BaseViewHolder, item: UserInfo) {
val userGamePartnerInfo = item.userGamePartnerVo
if (userGamePartnerInfo != null) {
helper.getView<AppCompatImageView>(R.id.iv_game).visibility = View.VISIBLE
helper.getView<LinearLayout>(R.id.ll_game_type).visibility = View.VISIBLE
if (TextUtils.isEmptyText(userGamePartnerInfo.secondGameName)) {
helper.setText(R.id.tv_game_type, userGamePartnerInfo.firstGameName)
} else {
helper.setText(
R.id.tv_game_type,
"${userGamePartnerInfo.firstGameName}|${userGamePartnerInfo.secondGameName}"
)
}
ImageLoadUtilsV2.loadImage(
helper.getView(R.id.iv_game_icon),
userGamePartnerInfo.firstLogo
)
} else {
helper.getView<AppCompatImageView>(R.id.iv_game).visibility = View.GONE
helper.getView<LinearLayout>(R.id.ll_game_type).visibility = View.GONE
}
helper.getView<ImageView>(R.id.iv_avatar).loadAvatar(item.avatar)
helper.setText(R.id.tv_desc, item.userDesc.ifNullOrEmpty { "我是个默认签名" })
.setText(
R.id.tv_age,
((CurrentTimeUtils.getCurrentTime() - item.birth) / 1000 / 60 / 60 / 24 / 365).toString()
)
//设置星座
val star = StarUtils.getConstellation(Date(item.birth))
helper.setGone(R.id.tv_constellation, star != null)
.setText(R.id.tv_constellation, star)
helper.setBackgroundRes(
R.id.ll_gender_age,
if (item.gender == 1) R.drawable.shape_65d3f7_corner else R.drawable.shape_ff9cce_corner
)
helper.setImageResource(
R.id.iv_gender,
if (item.gender == 1) R.drawable.ic_home_man else R.drawable.ic_home_woman
)
val tvOnlineText = helper.getView<TextView>(R.id.tv_online_text)
val ivTalk = helper.getView<AppCompatImageView>(R.id.iv_talk)
val svgaLiving = helper.getView<SVGAImageView>(R.id.svga_living)
val llOnline = helper.getView<View>(R.id.ll_online)
val viewOnline = helper.getView<View>(R.id.view_online)
if (item.inRoomUid != 0L) {
ivTalk.isVisible = false
svgaLiving.isVisible = true
viewOnline.isVisible = true
svgaLiving.loadFromAssets("svga/home_living.svga")
tvOnlineText.text = "直播中"
llOnline.setOnClickListener {
AVRoomActivity.start(mContext, item.inRoomUid)
}
} else {
ivTalk.isVisible = true
svgaLiving.isVisible = false
viewOnline.isVisible = false
tvOnlineText.text = "和TA聊"
llOnline.setOnClickListener {
NimP2PMessageActivity.start(mContext, item.uid.toString())
}
}
helper.getView<View>(R.id.iv_avatar).setOnClickListener {
UserInfoActivity.Companion.start(mContext, item.uid)
}
val tvNickname = helper.getView<TextView>(R.id.tv_nickname)
tvNickname.text = item.nick
VipHelper.loadVipNickColor(tvNickname, item.userVipInfoVO, "#282828")
VipHelper.loadVipIcon(helper.getView(R.id.iv_vip_icon), item.userVipInfoVO)
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
val svgaLiving = holder.getView<SVGAImageView>(R.id.svga_living)
svgaLiving?.loadFromAssets("svga/home_living.svga")
}
}

View File

@@ -1,65 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.view.View
import androidx.databinding.DataBindingUtil
import com.nnbc123.core.DemoCache
import com.nnbc123.core.UriProvider
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.databinding.FragmentHomeBinding
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.ui.search.SearchActivity
import com.nnbc123.app.ui.webview.CommonWebViewActivity
/**
* 音萌首页
*/
class HomeFragment : BaseFragment(), View.OnClickListener {
private lateinit var mBinding: FragmentHomeBinding
override fun onClick(v: View) {
when (v.id) {
R.id.tv_search -> {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_SEARCH, "进入搜索页")
SearchActivity.start(activity)
//为啥触发条件这么恶心 我也不知道啊
if (DemoCache.readAnchorCardView() == 0) {
DemoCache.saveAnchorCardView(1)
}
}
R.id.iv_ranking -> {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_RANK_CLICK, "首页_榜单")
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
}
R.id.iv_my_room -> {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_MY_ROOM_CLICK, "首页_我的房间")
OpenRoomHelper.openRoom(baseActivity)
}
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_home
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun onSetListener() {
mBinding.click = this
}
@SuppressLint("CheckResult")
override fun initiate() {
requireActivity().supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, RecommendFragment.newInstance())
.commitAllowingStateLoss()
}
}

View File

@@ -1,104 +0,0 @@
package com.nnbc123.app.home.fragment
import com.nnbc123.app.base.BaseFragment
import androidx.recyclerview.widget.RecyclerView
import com.nnbc123.app.home.adapter.HomePlayAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import org.greenrobot.eventbus.EventBus
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.avroom.activity.AVRoomActivity
import android.annotation.SuppressLint
import com.nnbc123.core.home.model.GameHomeModel
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import com.nnbc123.core.user.event.LoadLoginUserInfoEvent
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.app.home.fragment.HomePlayFragment
import android.os.Bundle
import android.view.View
import com.chad.library.adapter.base.BaseQuickAdapter
import com.nnbc123.app.R
/**
* create by lvzebiao @2020/1/7
*/
class HomePlayFragment : BaseFragment() {
private var recyclerView: RecyclerView? = null
private lateinit var playAdapter: HomePlayAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
override fun getRootLayoutId(): Int {
return R.layout.fragment_home_play
}
override fun initiate() {
recyclerView = mView.findViewById(R.id.recycler_view)
EventBus.getDefault().register(this)
playAdapter = HomePlayAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(playAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setRecyclerView(recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.build()
playAdapter.onItemClickListener =
BaseQuickAdapter.OnItemClickListener { _: BaseQuickAdapter<*, *>, _: View, position: Int ->
val homePlayInfo = playAdapter.getItem(position)
if (homePlayInfo != null) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_KH_ROOM_SUCCESS, "点击组队开黑进入房间")
AVRoomActivity.startForFromType(
mContext,
homePlayInfo.uid,
AVRoomActivity.FROM_TYPE_RECOMMEND
)
}
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
private fun loadData(refresh: Boolean) {
GameHomeModel.get().homePlayV2
.compose(bindToLifecycle())
.subscribe { homePlayInfoList: List<HomeRoomInfo>?, throwable: Throwable? ->
if (throwable != null) {
rvDelegate.loadErr(refresh)
} else {
rvDelegate.loadData(homePlayInfoList?.filter { !it.isBanner }, refresh)
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onLoadLoginUserInfoEvent(event: LoadLoginUserInfoEvent?) {
if (isResumed) loadData(true)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
override fun onDestroyView() {
EventBus.getDefault().unregister(this)
super.onDestroyView()
}
companion object {
fun newInstance(): HomePlayFragment {
val fragment = HomePlayFragment()
val bundle = Bundle()
fragment.arguments = bundle
return fragment
}
}
}

View File

@@ -1,192 +0,0 @@
package com.nnbc123.app.home.fragment;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.nnbc123.core.home.bean.HomeTabMapInfo;
import com.nnbc123.core.home.event.RefreshHomeDataEvent;
import com.nnbc123.core.home.model.GameHomeModel;
import com.nnbc123.core.utils.net.RxHelper;
import com.nnbc123.app.R;
import com.nnbc123.app.base.BaseFragment;
import com.nnbc123.app.home.adapter.HomeRoomFragmentAdapter;
import com.nnbc123.library.utils.ListUtils;
import com.trello.rxlifecycle3.android.FragmentEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
/**
*
*/
public class HomeTabHomeFragment extends BaseFragment {
public static final int ROWS = 3;
private static final Comparator<HomeTabMapInfo> comp = (o1, o2) -> {
int seq = o1.getSeq() - o2.getSeq();
return Integer.compare(seq, 0);
};
private RecyclerView recyclerView;
private HomeRoomFragmentAdapter mHomeRoomAdapter;
@NonNull
public static HomeTabHomeFragment newInstance() {
HomeTabHomeFragment fragment = new HomeTabHomeFragment();
return fragment;
}
@Override
public int getRootLayoutId() {
return R.layout.fragment_home_room_tab;
}
@Override
public void onFindViews() {
super.onFindViews();
recyclerView = mView.findViewById(R.id.recycler_view);
initRecyclerView();
}
/**
* 请求数据
*/
@SuppressLint("CheckResult")
private void getData() {
GameHomeModel.get()
.getHomeTabHome()
.compose(RxHelper.handleSchedulers())
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe((serviceResult, throwable) -> {
if (throwable == null) {
if (ListUtils.isListEmpty(serviceResult)) {
return;
}
List<HomeTabMapInfo> roomsList = new ArrayList<>(serviceResult);//未处理的数
List<HomeTabMapInfo> randomList = new ArrayList<>();//不是置顶的
List<HomeTabMapInfo> finalList = new ArrayList<>();//最终的6条数据
for (int i = 0; i < roomsList.size(); i++) {
roomsList.get(i).setItemType(HomeTabMapInfo.TYPE_NORMAL);//对原始数据设置type
}
for (int i = 0; i < roomsList.size(); i++) {
if (roomsList.get(i).isIsTop()) {
finalList.add(roomsList.get(i));
} else {
randomList.add(roomsList.get(i));
}
}
sortSeqRoom(finalList);
refreshRoomData(finalList, randomList);
}
});
}
/**
* 刷新数据
*/
private void refreshRoomData(List<HomeTabMapInfo> finalList, List<HomeTabMapInfo> randomList) {
List<HomeTabMapInfo> finalList1 = new ArrayList<>(finalList);//最终的6条数据
List<HomeTabMapInfo> randomList1 = new ArrayList<>(randomList);//不是置顶的
mHomeRoomAdapter.setNewData(getConvertData(finalList1, randomList1));
}
private void initRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(),LinearLayoutManager.HORIZONTAL,false));
recyclerView.setItemAnimator(null);
mHomeRoomAdapter = new HomeRoomFragmentAdapter(getContext());
mHomeRoomAdapter.setEnableLoadMore(false);
mHomeRoomAdapter.setEnableLoadMore(false);
recyclerView.setAdapter(mHomeRoomAdapter);
View emptyView = getLayoutInflater().inflate(R.layout.layout_home_room_empty, null);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
emptyView.setLayoutParams(lp);
mHomeRoomAdapter.setEmptyView(emptyView);
}
/**
* 转化房间数组不足6的加上虚位以待
*
* @param
* @return
*/
private List<HomeTabMapInfo> getConvertData(List<HomeTabMapInfo> finalList, List<HomeTabMapInfo> randomList) {
List<HomeTabMapInfo> finalList1 = new ArrayList<>(finalList);//最终的6条数据
List<HomeTabMapInfo> randomList1 = new ArrayList<>(randomList);//不是置顶的
int ROOM_COUNT = 6;//首页显示6条数据
randomList1 = randomList(randomList1);
finalList1.addAll(randomList1);
if (finalList1.size() >= ROOM_COUNT) {
finalList1 = finalList1.subList(0, ROOM_COUNT);
} else {
while (finalList1.size() < ROOM_COUNT) {
HomeTabMapInfo info = new HomeTabMapInfo();
info.setItemType(HomeTabMapInfo.TYPE_EMPTY);
finalList1.add(info);
}
}
return finalList1;
}
/**
* **************************** 排序 ***********************************
*/
private void sortSeqRoom(List<HomeTabMapInfo> list) {
if (list.size() == 0) {
return;
}
Collections.sort(list, comp);
}
private List<HomeTabMapInfo> randomList(List<HomeTabMapInfo> sourceList) {
if (sourceList == null || sourceList.size() == 0) {
return sourceList;
}
ArrayList randomList = new ArrayList(sourceList.size());
do {
int randomIndex = Math.abs(new Random().nextInt(sourceList.size()));
randomList.add(sourceList.remove(randomIndex));
} while (sourceList.size() > 0);
return randomList;
}
@Override
public void initiate() {
getData();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRefreshHomeDataEvent(RefreshHomeDataEvent event) {
if (isResumed()) getData();
}
}

View File

@@ -1,185 +0,0 @@
package com.nnbc123.app.home.fragment
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.scwang.smartrefresh.layout.internal.ProgressDrawable
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.databinding.FragmentLiveBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeLiveTopAdapter
import com.nnbc123.app.home.adapter.PartyMagicIndicatorAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.room.bean.SingleRoomSortInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.CurrentTimeUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 音萌首页
*/
class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
PartyMagicIndicatorAdapter.OnItemSelectListener {
private val mFragments: ArrayList<Fragment> = ArrayList()
private val mTabInfoList: ArrayList<String> = ArrayList()
private var currentIndex = 0
private var lastLoadDataTime = 0L
private lateinit var mAdapter: HomeLiveTopAdapter
private lateinit var rvDelegate: RVDelegate<HomeLiveTopInfo.SingleRoom>
private val homeViewModel: HomeViewModel by activityViewModels()
companion object {
fun newInstance(): LiveFragment {
val args = Bundle()
val fragment = LiveFragment()
fragment.arguments = args
return fragment
}
}
override fun init() {
mAdapter = HomeLiveTopAdapter()
rvDelegate = RVDelegate.Builder<HomeLiveTopInfo.SingleRoom>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false))
.setRecyclerView(binding.recyclerView)
.build()
initRefreshView()
homeViewModel.singleRoomSortInfoLiveData.observe(
viewLifecycleOwner
) {
if (it.isSuccess) {
it.data?.let { date -> onGetSingleRoomSortInfoSuccess(date) }
}
}
homeViewModel.homeLiveTopInfoLiveData.observe(viewLifecycleOwner) {
it?.let {
mAdapter.setOnceLookStatus(it.onceLookStatus)
rvDelegate.loadData(it.singleRoomList, true)
binding.tvTitle.text = if (it.onceLookStatus) "曾经看过的人" else "Top热播"
}
}
binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_GEBO_TAB_CLICK,
"个播页二级tab分类点击",
mapOf("tab_name" to mTabInfoList.getOrElse(position) { "未知tab" })
)
}
})
}
override fun onResume() {
super.onResume()
loadData()
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_RECENT_CARD_SHOW, "最近在看卡片曝光"
)
}
private fun onGetSingleRoomSortInfoSuccess(info: List<SingleRoomSortInfo>) {
var changed = false
val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList)
for (tagInfo in info) {
if (!oldTabInfoList.contains(tagInfo.sortName)) {
changed = true
break
}
}
//只有HomeTagInfo发生改变才刷新数据
if (changed) {
mTabInfoList.clear()
mFragments.clear()
for (tagInfo in info) {
mTabInfoList.add(tagInfo.sortName)
val fragment = RoomSingleFragment.newInstance(tagInfo.id)
mFragments.add(fragment)
}
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
commonNavigator.titleMargin = ScreenUtil.dip2px(2.0F)
commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL)
val magicIndicatorAdapter = PartyMagicIndicatorAdapter(mTabInfoList)
magicIndicatorAdapter.textSize = 14
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
binding.viewPager.offscreenPageLimit = 2
binding.viewPager.adapter = RoomVPAdapter(
childFragmentManager,
mFragments
)
ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
onItemSelect(currentIndex, null)
}
}
private fun initRefreshView() {
binding.refreshLayout.setOnRefreshListener {
binding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
binding.refreshLayout.isEnableLoadmore = false
binding.refreshLayout.isEnableOverScrollBounce = false
val themeColor = requireContext().resources.getColor(R.color.color_666666)
binding.refreshHeader.lastUpdateText.setTextColor(themeColor)
binding.refreshHeader.titleText.setTextColor(themeColor)
binding.refreshHeader.setBackgroundColor(Color.TRANSPARENT)
val progressDrawable = ProgressDrawable()
progressDrawable.setColor(themeColor)
binding.refreshHeader.progressView.setImageDrawable(progressDrawable)
}
override fun onItemSelect(position: Int, view: TextView?) {
currentIndex = position
binding.viewPager.currentItem = currentIndex
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
private fun loadData() {
if (CurrentTimeUtils.getCurrentTime() - lastLoadDataTime < 15 * 1000) return
lastLoadDataTime = CurrentTimeUtils.getCurrentTime()
homeViewModel.requestSingleRoomSortList()
homeViewModel.requestHomeLiveTopInfo()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -2,7 +2,6 @@ package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.content.Intent
import android.text.TextUtils
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
@@ -39,7 +38,6 @@ import com.nnbc123.app.ui.patriarch.PatriarchModeActivity
import com.nnbc123.app.ui.pay.ChargeActivity
import com.nnbc123.app.ui.relation.AttentionListActivity
import com.nnbc123.app.ui.relation.FansListActivity
import com.nnbc123.app.ui.utils.ImageLoadUtils
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.OnPageSelectedListener
import com.nnbc123.app.utils.UserUtils
@@ -57,12 +55,10 @@ import com.nnbc123.core.room.bean.RoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.user.UserModel
import com.nnbc123.core.user.bean.UserExpInfo
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.user.event.LoginUserInfoUpdateEvent
import com.nnbc123.core.utils.CurrentTimeUtils
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.core.utils.net.BeanObserver
import com.nnbc123.core.utils.toast
import com.trello.rxlifecycle3.android.FragmentEvent
import io.reactivex.Observable
@@ -241,12 +237,15 @@ class MeFragment : BaseFragment(), View.OnClickListener {
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "我的")
}
if (mUserInfo?.isReview == true) {
requestUpdateUserInfo()
}
initUserDate()
}
@SuppressLint("CheckResult")
private fun initUserDate() {
UserModel.get().currentUserInfo
@@ -274,7 +273,11 @@ class MeFragment : BaseFragment(), View.OnClickListener {
if (it.isParentMode) {
mBinding.meItemSkill.isVisible = false
}
it.userHeadwear?.effect?.let { effect ->
var avatarBorder = it.userHeadwear?.effect
if (avatarBorder.isNullOrEmpty()) {
avatarBorder = it.userHeadwear?.pic
}
avatarBorder?.let { effect ->
if (mBinding.ivHeadWear.tag != effect) {
NobleUtil.loadHeadWear(effect, mBinding.ivHeadWear)
mBinding.ivHeadWear.tag = effect

View File

@@ -17,6 +17,8 @@ import com.nnbc123.app.ui.im.friend.FriendListFragment
import com.nnbc123.app.ui.im.recent.RecentListFragment
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
/**
@@ -42,6 +44,13 @@ class MsgFragment : BaseViewBindingFragment<FragmentMsgBinding>(),
binding.viewPager.currentItem = currentIndex
}
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "消息")
}
}
override fun init() {
val tagList = arrayListOf("消息", "好友")
mFragments.clear()

View File

@@ -1,156 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import android.widget.TextView
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.coorchice.library.utils.LogUtils
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.databinding.FragmentPartyBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.home.bean.HomeTagInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 音萌首页
*/
class PartyFragment : BaseFragment(), MainMagicIndicatorAdapter.OnItemSelectListener {
private lateinit var mBinding: FragmentPartyBinding
private val mFragments: ArrayList<Fragment> = ArrayList()
private val mTabInfoList: ArrayList<CharSequence> = ArrayList()
private val homeViewModel: HomeViewModel by activityViewModels()
private var currentIndex = 0
companion object {
fun newInstance(): PartyFragment {
val args = Bundle()
val fragment = PartyFragment()
fragment.arguments = args
return fragment
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_party
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun initiate() {
homeViewModel.tagLiveData.observe(this) {
it?.let {
onGetHomeTagSuccess(it)
}
}
homeViewModel.partyBannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, _ ->
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_BANNER_CLICK, "首页_banner")
}
}
}
override fun onResume() {
super.onResume()
homeViewModel.getTagInfo()
homeViewModel.getPartyBanner()
}
private fun onGetHomeTagSuccess(tagInfoList: MutableList<HomeTagInfo>) {
tagInfoList.add(0,HomeTagInfo("热门"))
var changed = false
val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList)
for (tagInfo in tagInfoList) {
if (!oldTabInfoList.contains(tagInfo.name)) {
changed = true
break
}
}
//只有HomeTagInfo发生改变才刷新数据
if (changed) {
LogUtils.e("$changed:oldTabInfoList")
mTabInfoList.clear()
mFragments.clear()
for (i in tagInfoList.indices) {
//过滤对象是空和没有标签名同时也没有子标签的情况
var title: CharSequence?
var fragment: Fragment?
var name = tagInfoList[i].name
if (name != null) {
name = name.trim { it <= ' ' }
}
title = name
mTabInfoList.add(title)
val tabId: Int = tagInfoList[i].id
fragment = when (title) {
"热门" -> {
PartyRecommendFragment.newInstance()
}
"喜欢" -> {
RoomLikeFragment.newInstance()
}
"小游戏" -> {
RoomGameFragment.newInstance()
}
else -> {
RoomCommonFragment.newInstance(tabId)
}
}
mFragments.add(fragment)
}
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
commonNavigator.titleMargin = ScreenUtil.dip2px(6.0F)
val magicIndicatorAdapter = MainMagicIndicatorAdapter(context, mTabInfoList)
magicIndicatorAdapter.textSize = 16
magicIndicatorAdapter.minScale = 0.85f
magicIndicatorAdapter.setResId(R.drawable.ic_home_indicator_center)
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
mBinding.viewPager.offscreenPageLimit = 2
mBinding.viewPager.adapter = RoomVPAdapter(
childFragmentManager,
mFragments
)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
onItemSelect(currentIndex, null)
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) homeViewModel.getTagInfo()
}
override fun onItemSelect(position: Int, view: TextView?) {
currentIndex = position
mBinding.viewPager.currentItem = currentIndex
}
}

View File

@@ -1,113 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentPartyHotBinding
import com.nnbc123.app.databinding.FragmentRoomCommonBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.PartyHotAdapter
import com.nnbc123.app.home.adapter.RoomCommonAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class PartyRecommendFragment : BaseViewBindingFragment<FragmentPartyHotBinding>() {
companion object {
fun newInstance(): PartyRecommendFragment {
val args = Bundle()
val fragment = PartyRecommendFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var mAdapter: PartyHotAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private lateinit var mMoreAdapter: RoomCommonAdapter
private lateinit var rvMoreDelegate: RVDelegate<HomeRoomInfo>
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
mAdapter = PartyHotAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(GridLayoutManager(mContext, 2, GridLayoutManager.VERTICAL, false))
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerView)
.build()
mAdapter.setOnItemClickListener { _, _, position ->
mAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.roomUid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
mMoreAdapter = RoomCommonAdapter()
rvMoreDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mMoreAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerMoreView)
.build()
mMoreAdapter.setOnItemClickListener { _, _, position ->
mMoreAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.partyRecommendRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
homeViewModel.partyRecommendRoomMoreLiveData.observe(this) {
rvMoreDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
homeViewModel.getPartyRecommendRoomList()
homeViewModel.getPartyRecommendRoomMoreList()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,345 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager.widget.ViewPager
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRecommendBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.GiftServiceAdapter
import com.nnbc123.app.home.adapter.HomeSingleAnchorAdapter
import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.NewFriendsFilterWindow
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.scwang.smartrefresh.layout.internal.ProgressDrawable
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.concurrent.TimeUnit
/**
* 音萌首页
*/
class RecommendFragment : BaseFragment(),
MainMagicIndicatorAdapter.OnItemSelectListener {
private lateinit var mBinding: FragmentRecommendBinding
private var mFragmentsBottom: MutableList<Fragment> = ArrayList()
private lateinit var singleAnchorAdapter: HomeSingleAnchorAdapter
private lateinit var giftServiceAdapter: GiftServiceAdapter
private lateinit var rvDelegate: RVDelegate<GiftServiceMsgVo>
private var disposable: Disposable? = null
private val homeViewModel: HomeViewModel by activityViewModels()
private var currGender: Int? = null
//仅埋点使用,不影响业务逻辑
private val abcArray = arrayOf("A", "B", "C", "D")
private var currMatchClick = abcArray[0]
companion object {
fun newInstance(): RecommendFragment {
val args = Bundle()
val fragment = RecommendFragment()
fragment.arguments = args
return fragment
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_recommend
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun onResume() {
super.onResume()
loadData()
homeViewModel.getServiceGiftRecord()
}
@SuppressLint("SetTextI18n")
override fun initiate() {
initRefreshView()
initTitleTab()
//initSingleAnchor()
giftServiceAdapter = GiftServiceAdapter()
giftServiceAdapter.setOnItemClickListener { _, _, position ->
giftServiceAdapter.getItem(position)?.let {
AVRoomActivity.start(mContext, it.roomUid)
}
}
rvDelegate = RVDelegate.Builder<GiftServiceMsgVo>()
.setAdapter(giftServiceAdapter)
.setRecyclerView(mBinding.rvGiftService)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.build()
homeViewModel.bannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, _ ->
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_BANNER_CLICK, "首页_banner")
}
}
homeViewModel.resourceLiveData.observe(this) {
if (it.isNullOrEmpty() || it.size != 4) {
mBinding.llResource.isGone = true
return@observe
}
mBinding.llResource.isGone = false
val resourceViews = arrayOf(
mBinding.ivResource0,
mBinding.ivResource1,
mBinding.ivResource2,
mBinding.ivResource3
)
for (i in resourceViews.indices) {
resourceViews[i].load(it[i].icon)
if (it[i].resourceType == 8) {
mBinding.tvOnlineNum.text = "${it[i].resourceContent}人组队中"
}
resourceViews[i].setOnClickListener { _ ->
currMatchClick = abcArray[i]
StatisticManager.Instance().onEvent(
"${currMatchClick}_match_click",
"资源位点击",
mapOf("user_id" to AuthModel.get().currentUid.toString())
)
when {
it[i].resourceType == 5 -> {
CommonWebViewActivity.start(context, it[i].resourceContent)
}
i == 3 -> {
dialogManager.showProgressDialog(mContext)
homeViewModel.getHomeChatPick()
}
else -> {
dialogManager.showProgressDialog(mContext)
homeViewModel.getResourceJumpInfo(it[i].id)
}
}
}
}
}
homeViewModel.resourceJumpLiveData.observe(this) {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance().onEvent(
"${currMatchClick}_match_success",
"资源位匹配成功",
mapOf("user_id" to AuthModel.get().currentUid.toString())
)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}
homeViewModel.homeChatPickLiveData.observe(viewLifecycleOwner) {
dialogManager.dismissDialog()
it?.let {
if (it.isNotEmpty()) {
NimP2PMessageActivity.start(context, it)
}
}
}
homeViewModel.giftServiceLiveData.observe(viewLifecycleOwner) {
rvDelegate.loadData(it)
}
mBinding.rvGiftService.setOnTouchListener { _, _ -> true }
disposable = Observable.intervalRange(0, Int.MAX_VALUE.toLong(), 0, 5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.filter { rvDelegate.adapter.itemCount > 0 && isResumed }
.subscribe {
val index = (it % rvDelegate.adapter.itemCount).toInt()
if (index == 0) {
mBinding.rvGiftService.scrollToPosition(index)
} else {
mBinding.rvGiftService.smoothScrollToPosition(index)
}
}
mBinding.tvNewRefresh.setOnClickListener {
homeViewModel.getNewFriendList(currGender)
}
mBinding.tvNewFilter.setOnClickListener {
val popup = NewFriendsFilterWindow(
mContext,
mBinding.tvNewFilter.text.toString()
)
popup.setOnClickListener {
popup.dismiss()
when (it.id) {
R.id.tv_all -> {
homeViewModel.getNewFriendList()
mBinding.tvNewFilter.text = "全部"
currGender = null
}
R.id.tv_man -> {
homeViewModel.getNewFriendList(1)
mBinding.tvNewFilter.text = "男生"
currGender = 1
}
R.id.tv_woman -> {
homeViewModel.getNewFriendList(2)
mBinding.tvNewFilter.text = "女生"
currGender = 2
}
}
}
popup.show(mBinding.tvNewFilter, Gravity.BOTTOM)
}
}
private fun initRefreshView() {
mBinding.refreshLayout.setOnRefreshListener {
mBinding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
val themeColor = requireContext().resources.getColor(R.color.color_666666)
mBinding.refreshHeader.lastUpdateText.setTextColor(themeColor)
mBinding.refreshHeader.titleText.setTextColor(themeColor)
mBinding.refreshHeader.setBackgroundColor(Color.TRANSPARENT)
val progressDrawable = ProgressDrawable()
progressDrawable.setColor(themeColor)
mBinding.refreshHeader.progressView.setImageDrawable(progressDrawable)
}
private fun initTitleTab() {
val tagList = arrayListOf("发现新朋友", "组队开黑")
mFragmentsBottom.add(RoomNewFriendsFragment.newInstance())
mFragmentsBottom.add(HomePlayFragment.newInstance())
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
val magicIndicatorAdapter = MainMagicIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setResId(R.drawable.ic_home_indicator_center)
magicIndicatorAdapter.textSize = 16
magicIndicatorAdapter.minScale = 0.85f
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
mBinding.viewPager.offscreenPageLimit = 5
mBinding.viewPager.adapter =
RoomVPAdapter(childFragmentManager, mFragmentsBottom)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
mBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
mBinding.tvNewRefresh.isVisible = position == 0
mBinding.tvNewFilter.isVisible = position == 0
}
override fun onPageScrollStateChanged(state: Int) {
}
})
}
private fun initSingleAnchor() {
singleAnchorAdapter = HomeSingleAnchorAdapter()
mBinding.rvSingleAnchor.adapter = singleAnchorAdapter
val layoutManager =
GridLayoutManager(requireContext(), 4, LinearLayoutManager.VERTICAL, false)
mBinding.rvSingleAnchor.layoutManager = layoutManager
homeViewModel.singleAnchorHomeLiveData.observe(this) {
if (it.data.isNullOrEmpty()) {
mBinding.llSingleAnchor.visibility = View.GONE
mBinding.rvSingleAnchor.visibility = View.GONE
} else {
mBinding.llSingleAnchor.visibility = View.VISIBLE
mBinding.rvSingleAnchor.visibility = View.VISIBLE
}
singleAnchorAdapter.setNewData(it.data)
}
}
override fun onItemSelect(position: Int, view: TextView?) {
if (mFragmentsBottom.isEmpty()) {
return
}
mBinding.tvNewRefresh.isVisible = position == 0
mBinding.tvNewFilter.isVisible = position == 0
mBinding.viewPager.currentItem = position
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_TJ_TABEXCHANGE, "用户切换tab次数,热门房间or组队开黑")
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
private fun loadData() {
homeViewModel.getHomeResource()
homeViewModel.getBannerInfo()
//homeViewModel.getHomeSingleAnchorList()
}
override fun onDestroyView() {
super.onDestroyView()
disposable?.dispose()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -1,100 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomCommonBinding
import com.nnbc123.app.home.RoomCommonViewModel
import com.nnbc123.app.home.adapter.RoomCommonAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomCommonFragment : BaseViewBindingFragment<FragmentRoomCommonBinding>() {
companion object {
fun newInstance(tabID: Int): RoomCommonFragment {
val args = Bundle()
args.putInt("tab_id", tabID)
val fragment = RoomCommonFragment()
fragment.arguments = args
return fragment
}
}
private val tabID: Int by lazy { arguments?.getInt("tab_id") ?: -1 }
private var pageNum: Int = 1
private val pageSize = 20
private lateinit var mAdapter: RoomCommonAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val roomCommonViewModel: RoomCommonViewModel by viewModels()
override fun init() {
mAdapter = RoomCommonAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(20)
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerView)
.build()
mAdapter.setOnItemClickListener { _, _, position ->
mAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.roomUid)
StatisticManager.Instance()
.onEvent("tab${tabID}_success_room", "通过派对tab下面的房间成功进房的统计")
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
mAdapter.setOnLoadMoreListener({
loadData(false)
}, binding.recyclerView)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
roomCommonViewModel.commonRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
pageNum = if (isRefresh) 1 else (pageNum + 1)
roomCommonViewModel.getCommonRoom(tabID, pageNum, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,98 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomGameBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomGameAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomGameFragment : BaseViewBindingFragment<FragmentRoomGameBinding>() {
companion object {
fun newInstance(): RoomGameFragment {
val args = Bundle()
val fragment = RoomGameFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter: RoomGameAdapter
private var page = 1
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val pageSize = 20
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomGameAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.setRefreshLayout(binding.refreshLayout)
.setPageSize(pageSize)
.build()
roomHotAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.gameRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
binding.tvMatch.setOnClickListener {
homeViewModel.fastPickGameRoom()
}
homeViewModel.pickRoomLiveData.observe(this) {
it?.let {
AVRoomActivity.start(mContext, it.uid)
}
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
if (isRefresh) {
page = 1
} else {
page++
}
homeViewModel.getGameRoom(page, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,75 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomHotBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomHotAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomHotFragment : BaseViewBindingFragment<FragmentRoomHotBinding>() {
companion object {
fun newInstance(): RoomHotFragment {
val args = Bundle()
val fragment = RoomHotFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter : RoomHotAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private var page = 1
private val pageSize = Int.MAX_VALUE
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomHotAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(pageSize)
.build()
homeViewModel.hotRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
homeViewModel.getHotRoom(page, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,135 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.appbar.AppBarLayout
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomLikeBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeConcernsAdapter
import com.nnbc123.app.home.adapter.RoomLikeAdapter
import com.nnbc123.app.ui.relation.AttentionListActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomLikeFragment : BaseViewBindingFragment<FragmentRoomLikeBinding>() {
companion object {
fun newInstance(): RoomLikeFragment {
val args = Bundle()
val fragment = RoomLikeFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var concernsAdapter : HomeConcernsAdapter
private lateinit var likeRvDelegate: RVDelegate<HomeRoomInfo>
private lateinit var mAdapter : RoomLikeAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private var pageNum = 1
private val pageSize = 20
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
binding.appBarLayout.addOnOffsetChangedListener(
AppBarLayout.OnOffsetChangedListener { _, verticalOffset ->
binding.refreshLayout.isEnabled = verticalOffset == 0
})
concernsAdapter = HomeConcernsAdapter()
likeRvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(concernsAdapter)
.setRecyclerView(binding.rvLike)
.setLayoutManager(GridLayoutManager(mContext,5, GridLayoutManager.VERTICAL, false))
.build()
homeViewModel.concernsLiveData.observe(this) {
likeRvDelegate.setNewData(it)
val isGone = concernsAdapter.data.isNullOrEmpty()
binding.tvMore.isGone = isGone
binding.tvLike.isGone = isGone
binding.rvLike.isGone = isGone
}
mAdapter = RoomLikeAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(pageSize)
.setRefreshLayout(binding.refreshLayout)
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无收藏"))
.setRecyclerView(binding.rvCollect)
.build()
homeViewModel.collectLiveData.observe(this) {
rvDelegate.loadData(it)
}
mAdapter.setOnLoadMoreListener({
loadData(false)
}, binding.rvCollect)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.emptyLiveData.observe(this) {
it?.let {
binding.refreshLayout.isRefreshing = false
binding.clEmpty.isVisible = it
binding.coordinatorLayout.isVisible = !it
}
}
binding.tvGoPlay.setOnClickListener {
(parentFragment as PartyFragment).onItemSelect(1, null)
}
binding.tvMore.setOnClickListener {
AttentionListActivity.start(context)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
if (isRefresh) {
pageNum = 1
binding.refreshLayout.isRefreshing = true
} else {
pageNum++
}
homeViewModel.getCollectRoom(pageNum, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,45 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomHotBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomNewFriendsAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.user.bean.UserInfo
class RoomNewFriendsFragment : BaseViewBindingFragment<FragmentRoomHotBinding>() {
companion object {
fun newInstance(): RoomNewFriendsFragment {
val args = Bundle()
val fragment = RoomNewFriendsFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter: RoomNewFriendsAdapter
private lateinit var rvDelegate: RVDelegate<UserInfo>
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomNewFriendsAdapter()
rvDelegate = RVDelegate.Builder<UserInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无新朋友"))
.setLayoutManager(LinearLayoutManager(mContext))
.build()
homeViewModel.getNewFriendList()
homeViewModel.newFriendLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
}

View File

@@ -1,86 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomSingleBinding
import com.nnbc123.app.home.RoomSingleViewModel
import com.nnbc123.app.home.adapter.MoreSingleAnchorAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.utils.CurrentTimeUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomSingleFragment : BaseViewBindingFragment<FragmentRoomSingleBinding>() {
companion object {
fun newInstance(id: Long?): RoomSingleFragment {
val args = Bundle()
if (id != null) {
args.putLong("id", id)
}
val fragment = RoomSingleFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var adapter: MoreSingleAnchorAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val pageSize = Int.MAX_VALUE
private val roomSingleViewModel: RoomSingleViewModel by viewModels()
private var lastLoadDataTime = 0L
private val id: Long? by lazy { requireArguments().getLong("id") }
override fun init() {
adapter = MoreSingleAnchorAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(binding.recyclerView)
.setRefreshLayout(binding.refreshLayout)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(GridLayoutManager(mContext, 2))
.setPageSize(pageSize)
.build()
binding.refreshLayout.setOnRefreshListener { loadData(true) }
roomSingleViewModel.singleAnchorMoreLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(false)
}
private fun loadData(isForce: Boolean) {
if (!isForce && CurrentTimeUtils.getCurrentTime() - lastLoadDataTime < 15 * 1000) return
lastLoadDataTime = CurrentTimeUtils.getCurrentTime()
binding.refreshLayout.isRefreshing = true
roomSingleViewModel.getMoreSingleAnchorList(id)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(false)
}
}

View File

@@ -0,0 +1,114 @@
package com.nnbc123.app.home.fragment.home
import android.graphics.Color
import android.view.Gravity
import android.widget.LinearLayout
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.chuhai.utils.ktx.singleClick
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomeFragmentBinding
import com.nnbc123.app.home.adapter.HomeMagicIndicatorAdapter
import com.nnbc123.app.home.fragment.home.friends.FriendsFragment
import com.nnbc123.app.home.fragment.home.party.PartyFragment
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.ui.search.SearchActivity
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.DemoCache
import com.nnbc123.core.UriProvider
import com.nnbc123.core.initial.InitialModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
/**
* Created by Max on 2023/12/18 17:51
* Desc:首页
**/
@ActLayoutRes(R.layout.home_fragment)
class HomeFragment : BaseBindingFragment<HomeFragmentBinding>() {
override fun initiate() {
ImmersionBar.with(this).titleBarMarginTop(mBinding.vTitleBarTop).init()
initTab()
initEvent()
}
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "首页")
}
}
private fun initEvent() {
mBinding.ivMyRoom.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MY_ROOM_CLICK)
OpenRoomHelper.openRoom(baseActivity)
}
mBinding.ivRanking.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_RANK_CLICK)
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
}
mBinding.tvSearch.singleClick {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_SEARCH_CLICK)
SearchActivity.start(activity)
//为啥触发条件这么恶心 我也不知道啊
if (DemoCache.readAnchorCardView() == 0) {
DemoCache.saveAnchorCardView(1)
}
}
}
private fun initTab() {
val tagList = arrayListOf("派对", "交友")
val fragmentList = listOf(PartyFragment(), FriendsFragment())
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL)
val magicIndicatorAdapter = HomeMagicIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setOnItemSelectListener { position, view ->
mBinding.viewPager.currentItem = position
}
magicIndicatorAdapter.normalColor = Color.parseColor("#696D7A")
magicIndicatorAdapter.selectedColor = Color.parseColor("#2B2D33")
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
mBinding.viewPager.offscreenPageLimit = 5
mBinding.viewPager.adapter =
RoomVPAdapter(childFragmentManager, fragmentList)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
mBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_TBA_CLICK, "${position + 1}")
}
override fun onPageScrollStateChanged(state: Int) {
}
})
InitialModel.get().cacheInitInfo?.defaultTab?.let {
val tab = it - 1
if (it >= 0 && it < tagList.size) {
mBinding.viewPager.currentItem = tab
}
}
}
}

View File

@@ -0,0 +1,236 @@
package com.nnbc123.app.home.fragment.home.friends
import android.view.Gravity
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.widget.dialog.DialogManager
import com.nnbc123.app.databinding.HomeFriendsFragmentBinding
import com.nnbc123.app.home.FriendsViewModel
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeFriendsGameTabAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.NewFriendsFilterWindow
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.pay.PayModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
/**
* Created by Max on 2023/12/18 17:59
* Desc:交友
**/
@ActLayoutRes(R.layout.home_friends_fragment)
class FriendsFragment : BaseBindingFragment<HomeFriendsFragmentBinding>() {
private val homeViewModel: HomeViewModel by activityViewModels()
private val viewModel: FriendsViewModel by activityViewModels()
private val tabAdapter = HomeFriendsGameTabAdapter()
// 过滤条件:性别
private var filterGender: Int? = null
// 过滤条件游戏ID
private val filterGameId: Long? get() = tabAdapter.selectGameId
private var genderPopup: NewFriendsFilterWindow? = null
override fun initiate() {
initResource()
initFilterTab()
mBinding.tvGender.singleClick {
showFilterGender()
}
mBinding.tvRefresh.singleClick {
viewModel.getNewFriendList(filterGender, filterGameId)
}
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
mBinding.refreshLayout.setOnRefreshListener { view ->
mBinding.refreshLayout.finishRefresh()
loadData(true)
childFragmentManager.fragments.forEach {
if (it is OnRefreshListener) {
it.onRefresh(view)
}
}
}
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, FriendsListFragment())
.commitAllowingStateLoss()
}
private fun initFilterTab() {
mBinding.rvTab.adapter = tabAdapter
tabAdapter.setOnItemClickListener { adapter, view, position ->
tabAdapter.selectItem(position)
refreshListData()
}
viewModel.gameTabLiveData.observe(viewLifecycleOwner)
{
if (!it.isNullOrEmpty()) {
tabAdapter.setNewData(it)
}
}
}
private fun initResource() {
mBinding.ivResourceMatch.singleClick {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MATCH_CLICK)
dialogManager.showProgressDialog(mContext)
viewModel.getHomeChatPick()
}
viewModel.resourceJumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : DialogManager.AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@FriendsFragment.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
viewModel.homeChatPickLiveData.observe(viewLifecycleOwner) {
dialogManager.dismissDialog()
it?.let {
if (it.isNotEmpty()) {
NimP2PMessageActivity.start(context, it)
}
}
}
homeViewModel.resourceLiveData.observe(this) {
// 资源位5
it.getOrNull(4)?.let { item ->
mBinding.groupResource.isVisible = true
mBinding.ivResource0.load(item.icon)
mBinding.ivResource0.singleClick {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_TOP_RESOURCE_CLICK,
"E"
)
when (item.resourceType) {
5 -> {
CommonWebViewActivity.start(context, item.resourceContent)
}
else -> {
dialogManager.showProgressDialog(mContext)
viewModel.getResourceJumpInfo(item.id)
}
}
}
}
}
}
private fun showFilterGender() {
genderPopup = NewFriendsFilterWindow(
mContext,
mBinding.tvGender.text.toString()
).apply {
setOnClickListener {
dismiss()
when (it.id) {
R.id.tv_all -> {
updateGender(null)
refreshListData()
}
R.id.tv_man -> {
updateGender(1)
refreshListData()
}
R.id.tv_woman -> {
updateGender(2)
refreshListData()
}
}
}
}
genderPopup?.show(mBinding.tvGender, Gravity.BOTTOM)
}
private fun updateGender(gender: Int?) {
filterGender = gender
when (gender) {
1 -> {
mBinding.tvGender.text = "男生"
}
2 -> {
mBinding.tvGender.text = "女生"
}
else -> {
mBinding.tvGender.text = "全部"
}
}
}
override fun onResume() {
super.onResume()
loadData(false)
}
override fun onDestroy() {
super.onDestroy()
if (genderPopup?.isShowing == true) {
genderPopup?.dismiss()
genderPopup = null
}
}
private fun loadData(resetFilter: Boolean) {
if (resetFilter) {
// 重置条件
updateGender(null)
tabAdapter.selectItem(null)
}
if (viewModel.gameTabLiveData.value.isNullOrEmpty()) {
viewModel.getHomeGameTab()
}
if (homeViewModel.resourceLiveData.value.isNullOrEmpty()) {
// 和派对页共用数据了,派对页会刷新,这里不需要再刷新了
homeViewModel.getHomeResource()
}
refreshListData()
}
private fun refreshListData() {
viewModel.getNewFriendList(filterGender, filterGameId)
}
}

View File

@@ -0,0 +1,134 @@
package com.nnbc123.app.home.fragment.home.friends
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chuhai.utils.UiUtils
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomeFriendsListFragmentBinding
import com.nnbc123.app.home.FriendsViewModel
import com.nnbc123.app.home.adapter.HomeFriendsUserAdapter
import com.nnbc123.app.ui.user.UserInfoActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.library.annatation.ActLayoutRes
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_friends_list_fragment)
class FriendsListFragment : BaseBindingFragment<HomeFriendsListFragmentBinding>(),
OnRefreshListener {
private val adapter = HomeFriendsUserAdapter()
private val viewModel: FriendsViewModel by activityViewModels()
private var rvDelegate: RVDelegate<UserInfo>? = null
private var headerEmptyView: View? = null
private val recommendTitleView get() = headerEmptyView?.findViewById<View>(R.id.layout_title)
override fun initiate() {
initView()
initEvent()
initObserve()
}
private fun initView() {
val spanCount = 2
val listLeftRightPadding = UiUtils.dip2px(15f)
val itemLeftRightMargin = UiUtils.dip2px(4.5f)
mBinding.recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val pos = parent.getChildAdapterPosition(view) - adapter.headerLayoutCount
val remainder = pos % spanCount
if (pos < 0) {
outRect.set(0, 0, 0, 0)
} else if (remainder == 0) {
// 第一列
outRect.set(listLeftRightPadding, 0, itemLeftRightMargin, 0)
} else if (remainder == (spanCount - 1)) {
// 最后一列
outRect.set(itemLeftRightMargin, 0, listLeftRightPadding, 0)
} else {
// 中间
outRect.set(itemLeftRightMargin, 0, itemLeftRightMargin, 0)
}
}
})
rvDelegate = RVDelegate.Builder<UserInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setLayoutManager(GridLayoutManager(mContext, spanCount))
.build()
initEmptyView()
}
private fun initEmptyView() {
headerEmptyView = LayoutInflater.from(requireContext())
.inflate(R.layout.home_friends_list_item_empty, null)
}
private fun initEvent() {
adapter.setOnItemClickListener { adapter, view, position ->
(adapter.getItem(position) as? UserInfo)?.let { item ->
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_MORE_GAME_USER_CLICK,
item.uid.toString()
)
UserInfoActivity.Companion.start(mContext, item.uid)
}
}
}
private fun initObserve() {
viewModel.newFriendLiveData.observe(this) {
if (it.data.isNullOrEmpty()) {
if (adapter.headerLayoutCount == 0) {
adapter.addHeaderView(headerEmptyView)
adapter.headerLayout.clipChildren = false
}
val list = viewModel.friendRecommendModeLiveData.value?.data?.toMutableList()
recommendTitleView?.isVisible = !list.isNullOrEmpty()
adapter.setNewData(list)
} else {
adapter.removeAllHeaderView()
rvDelegate?.loadData(it)
}
}
viewModel.friendRecommendModeLiveData.observe(this) {
if (adapter.headerLayoutCount != 0) {
recommendTitleView?.isVisible = !it.data.isNullOrEmpty()
adapter.setNewData(it.data?.toMutableList())
}
}
}
override fun onResume() {
super.onResume()
if (viewModel.friendRecommendModeLiveData.value?.data.isNullOrEmpty()) {
viewModel.getFriendRecommendMore()
}
}
override fun onRefresh(refreshlayout: RefreshLayout?) {
if (isVisible && lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
// 刷新下更多推荐
viewModel.getFriendRecommendMore()
}
}
}

View File

@@ -0,0 +1,207 @@
package com.nnbc123.app.home.fragment.home.party
import android.os.Bundle
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.viewpager2.widget.ViewPager2
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.widget.dialog.DialogManager
import com.nnbc123.app.databinding.HomePartyFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.game_room.GameRoomActivity
import com.nnbc123.app.home.PartyViewModel
import com.nnbc123.app.home.adapter.HomePartyMessageAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.home.bean.BannerInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.im.custom.bean.RouterType
import com.nnbc123.core.pay.PayModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
import com.nnbc123.library.utils.JavaUtil
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 17:58
* Desc:派对
**/
@ActLayoutRes(R.layout.home_party_fragment)
class PartyFragment : BaseBindingFragment<HomePartyFragmentBinding>() {
private val homeViewModel: HomeViewModel by activityViewModels()
private val viewModel: PartyViewModel by activityViewModels()
//仅埋点使用,不影响业务逻辑
private val abcArray = arrayOf("A", "B", "C", "D")
private var currMatchClick = abcArray[0]
override fun initiate() {
initResource()
initHotMessage()
initBanner()
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
mBinding.refreshLayout.setOnRefreshListener {
mBinding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, PartyHotRoomFragment())
.commitAllowingStateLoss()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
override fun onResume() {
super.onResume()
loadData()
}
private fun loadData() {
homeViewModel.getHomeResource()
viewModel.getBannerInfo()
viewModel.getServiceGiftRecord()
}
private fun initHotMessage() {
val adapter = HomePartyMessageAdapter()
adapter.clickListener = {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_INFORM_CLICK,
it.roomUid.toString()
)
AVRoomActivity.start(mContext, it.roomUid)
}
mBinding.hotMessage.apply {
setOrientation(ViewPager2.ORIENTATION_VERTICAL)
setAdapter(adapter)
registerLifecycleObserver(lifecycle)
setUserInputEnabled(false)
}.create()
viewModel.giftServiceLiveData.observe(viewLifecycleOwner) {
if (it.isSuccess && !it.data.isNullOrEmpty()) {
mBinding.hotMessage.isVisible = true
mBinding.hotMessage.refreshData(it.data)
}
}
}
private fun initResource() {
mBinding.ivResourceMore.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MORE_ROOM_CLICK)
GameRoomActivity.start(requireContext())
}
homeViewModel.resourceLiveData.observe(this) {
if (it.isNullOrEmpty()) {
mBinding.groupResource.isVisible = false
return@observe
}
mBinding.groupResource.isVisible = true
val resourceViews = arrayOf(
mBinding.ivResource0,
mBinding.ivResource1,
mBinding.ivResource2,
mBinding.ivResource3
)
for (i in resourceViews.indices) {
resourceViews[i].load(it[i].icon)
resourceViews[i].singleClick { _ ->
currMatchClick = abcArray[i]
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_TOP_RESOURCE_CLICK,
currMatchClick
)
when (it[i].resourceType) {
5 -> {
CommonWebViewActivity.start(context, it[i].resourceContent)
}
else -> {
dialogManager.showProgressDialog(mContext)
viewModel.getResourceJumpInfo(it[i].id)
}
}
}
}
}
viewModel.resourceJumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : DialogManager.AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@PartyFragment.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
}
private fun initBanner() {
viewModel.bannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, data ->
var roomId: Long? = null
if (data.skipType == BannerInfo.SKIP_TYPE_ROUTER) {
if (JavaUtil.str2int(data.routerType) == RouterType.ROOM) {
roomId = JavaUtil.str2long(data.routerValue)
}
} else if (data.skipType == BannerInfo.SKIP_TYP_CHAT_ROOM) {
roomId = JavaUtil.str2long(data.skipUri)
}
if (roomId != null) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BANNER_CLICK, roomId.toString())
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -0,0 +1,75 @@
package com.nnbc123.app.home.fragment.home.party
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.HomePartyRoomFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomePartyRoomAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_party_room_fragment)
class PartyHotRoomFragment : BaseBindingFragment<HomePartyRoomFragmentBinding>() {
private val adapter = HomePartyRoomAdapter()
private val homeViewModel: HomeViewModel by activityViewModels()
override fun initiate() {
val rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(GridLayoutManager(context, 2))
.build()
adapter.setOnItemClickListener { _, _, position ->
adapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_ROOM_CLICK, it.uid.toString())
}
}
homeViewModel.hotRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
homeViewModel.getHotRoom(1, Int.MAX_VALUE)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onResume() {
super.onResume()
loadData(true)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -0,0 +1,107 @@
package com.nnbc123.app.home.refresh
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
import com.chuhai.utils.UiUtils
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.loadFromAssets
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.scwang.smartrefresh.layout.api.RefreshHeader
import com.scwang.smartrefresh.layout.api.RefreshKernel
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.constant.RefreshState
import com.scwang.smartrefresh.layout.constant.SpinnerStyle
/**
* Created by Max on 2023/12/26 19:35
* Desc:
**/
class HomeRefreshHeader : FrameLayout, RefreshHeader {
private var svgaView: SVGAImageView? = null
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
constructor(
context: Context,
attrs: AttributeSet?,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attrs, defStyleAttr, defStyleRes)
init {
svgaView = SVGAImageView(context)
svgaView?.setImageResource(R.drawable.base_ic_refresh_header)
val size = UiUtils.dip2px(34f)
val layoutParams = LayoutParams(size, size)
layoutParams.gravity = Gravity.CENTER
addView(svgaView, layoutParams)
}
override fun onStateChanged(
refreshLayout: RefreshLayout?,
oldState: RefreshState?,
newState: RefreshState?
) {
}
override fun getView(): View {
return this
}
override fun getSpinnerStyle(): SpinnerStyle {
return SpinnerStyle.Translate
}
override fun setPrimaryColors(vararg colors: Int) {
}
override fun onInitialized(kernel: RefreshKernel?, height: Int, extendHeight: Int) {
}
override fun onHorizontalDrag(percentX: Float, offsetX: Int, offsetMax: Int) {
}
override fun onStartAnimator(layout: RefreshLayout?, height: Int, extendHeight: Int) {
if (svgaView?.drawable is SVGADrawable) {
svgaView?.startAnimation()
} else {
svgaView?.loadFromAssets("svga/refresh_header.svga")
}
}
override fun onFinish(layout: RefreshLayout?, success: Boolean): Int {
svgaView?.stopAnimation()
return 500
}
override fun isSupportHorizontalDrag(): Boolean {
return false
}
override fun onPullingDown(
percent: Float,
offset: Int,
headerHeight: Int,
extendHeight: Int
) {
}
override fun onReleasing(
percent: Float,
offset: Int,
headerHeight: Int,
extendHeight: Int
) {
}
}

View File

@@ -193,7 +193,8 @@ class AnchorCardView @JvmOverloads constructor(
}
}
private fun toggleAudio(list: List<String?>) {
private fun toggleAudio(list: List<String?>?) {
if (list == null) return
if (ListUtils.isListEmpty(list)) return
var url: String? = ""
for (s in list) {

View File

@@ -0,0 +1,24 @@
package com.nnbc123.app.home.widget
import android.content.Context
import android.util.AttributeSet
import com.zhpan.bannerview.BannerViewPager
/**
* Created by Max on 2023/12/21 17:52
* Desc:修复BannerViewPager高度模式为MeasureSpec.UNSPECIFIED导致的未复用问题
**/
class HomeBannerViewPager<T> : BannerViewPager<T> {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val hSize = MeasureSpec.getSize(heightMeasureSpec)
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(hSize, MeasureSpec.EXACTLY))
}
}

View File

@@ -12,6 +12,7 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -670,6 +671,9 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
if (limitInfo == null) {
return;
}
if (inputPanel == null) {
return;
}
int model = limitInfo.getModel();
if (model == 2) {
isChat = limitInfo.isChat();

View File

@@ -66,6 +66,7 @@ import com.nnbc123.app.vip.VipHelper;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.im.friend.IMFriendModel;
import com.nnbc123.core.level.UserLevelVo;
import com.nnbc123.core.noble.NobleUtil;
import com.nnbc123.core.praise.PraiseModel;
import com.nnbc123.core.praise.event.IsLikedEvent;
import com.nnbc123.core.praise.event.PraiseEvent;
@@ -86,6 +87,7 @@ import com.nnbc123.library.annatation.ActLayoutRes;
import com.nnbc123.library.utils.ListUtils;
import com.nnbc123.library.utils.SingleToastUtil;
import com.nnbc123.library.utils.SizeUtils;
import com.nnbc123.library.utils.StringUtils;
import com.nnbc123.xchat_android_constants.XChatConstants;
import org.greenrobot.eventbus.EventBus;
@@ -144,7 +146,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
getUserInfo();
initAttentionView();
initNestScrollView();
setEditButton(identityState, true);
setEditButton(identityState, false);
setTitleVisible(false);
// initViewPager(true);
if (userId != AuthModel.get().getCurrentUid() && !VipHelper.isHideLookUser()) {
@@ -207,19 +209,40 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.ivEdit.setOnClickListener(this);
mBinding.flAvatar.setOnClickListener(this);
mBinding.tvErbanId.setOnClickListener(this);
mBinding.layoutRoom.setOnClickListener(this);
}
/**
* 找到TA, 主态不展示
*/
private void setWhereVisible() {
if (viewModel.getMRoomUid() != 0) {
mBinding.flLiving.setVisibility(View.VISIBLE);
ImageLoadKt.loadFromAssets(mBinding.svgaLiving, "svga/living_black.svga");
mBinding.ivAvatar.setBorderColor(Color.parseColor("#FFE710"));
private void loadRoomInfo(UserDetailInfo.DataBean info){
if (info != null && info.getRoomUid() > 0) {
mBinding.layoutRoom.setVisibility(View.VISIBLE);
ImageLoadKt.loadFromAssets(mBinding.svgaRoom, "svga/user_in_live.svga");
mBinding.tvRoomName.setText(info.getRoomTitle());
} else {
mBinding.flLiving.setVisibility(View.GONE);
mBinding.svgaRoom.stopAnimation();
mBinding.layoutRoom.setVisibility(View.GONE);
}
}
private void loadUserAvatar(UserDetailInfo.DataBean info) {
if (info == null) {
return;
}
String avatar = info.getAvatar();
String avatarBorder = null;
if (info.getUserHeadwear() != null) {
avatarBorder = info.getUserHeadwear().getEffect();
if (StringUtils.isEmpty(avatarBorder)) {
avatarBorder = info.getUserHeadwear().getPic();
}
}
ImageLoadKt.loadAvatar(mBinding.ivAvatar, avatar);
if (StringUtils.isEmpty(avatarBorder)) {
mBinding.ivAvatar.setBorderColor(Color.WHITE);
mBinding.ivAvatarBorder.setVisibility(View.GONE);
} else {
mBinding.ivAvatar.setBorderColor(Color.TRANSPARENT);
NobleUtil.loadHeadWear(avatarBorder, mBinding.ivAvatarBorder);
mBinding.ivAvatarBorder.setVisibility(View.VISIBLE);
}
}
@@ -308,7 +331,13 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
isShowPage = true;
}
initPhoto(dataBean.getPrivatePhoto());
setWhereVisible();
loadRoomInfo(dataBean);
loadUserAvatar(dataBean);
if (dataBean.isInOnline()) {
mBinding.layoutOnline.setVisibility(View.VISIBLE);
} else {
mBinding.layoutOnline.setVisibility(View.GONE);
}
});
}
@@ -386,7 +415,6 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
VipHelper.loadVipIcon(mBinding.ivVipIcon, userInfo.getUserVipInfoVO());
ImageLoadKt.loadAvatar(mBinding.ivAvatar, userInfo.getAvatar());
}
}
@@ -536,6 +564,17 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.layout_room:
if (userInfo == null) {
toast("用户信息为空。");
return;
}
if (viewModel.getMRoomUid() != 0) {
AVRoomActivity.startForFromType(this, viewModel.getMRoomUid(),
AVRoomActivity.FROM_TYPE_USER, userInfo.getNick(), String.valueOf(userInfo.getUid()));
}
break;
case R.id.iv_user_back:
finish();
break;
@@ -602,14 +641,6 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
break;
case R.id.fl_avatar:
if (userInfo == null) {
toast("用户信息为空。");
return;
}
if (viewModel.getMRoomUid() != 0) {
AVRoomActivity.startForFromType(this, viewModel.getMRoomUid(),
AVRoomActivity.FROM_TYPE_USER, userInfo.getNick(), String.valueOf(userInfo.getUid()));
}
break;
case R.id.tv_erban_id:
if (userInfo == null) {

View File

@@ -26,12 +26,12 @@ class SkillCardAdapter(private val context: Context) :
helper.setText(R.id.tv_desc, buffer.toString())
val radius = UIUtil.dip2px(context, 8.0)
val drawable = when (item?.cardId) {
1 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#EEF2FF"))
2 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#FEF5E8"))
3 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#F9ECFF"))
4 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#E9FFF4"))
5 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#F2FFE0"))
6 -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#FFE7EF"))
1L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#EEF2FF"))
2L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#FEF5E8"))
3L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#F9ECFF"))
4L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#E9FFF4"))
5L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#F2FFE0"))
6L -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#FFE7EF"))
else -> GradientDrawableCreator.createDrawable(radius, Color.parseColor("#FFE4FB"))
}
helper.itemView.background = drawable

View File

@@ -82,7 +82,7 @@ class UserInfoInfoFragment : BaseViewBindingFragment<FragmentUserinfoUserinfoBin
* 技能卡
*/
private fun initSkillCardList(list: List<UserInfoSkillEntity>) {
val audio = list.find { it.cardId == 8 }
val audio = list.find { it.cardId == 8L }
val newList: MutableList<UserInfoSkillEntity> = list.toMutableList()
if (audio != null) {
(activity as? UserInfoActivity)?.initVoiceShow(audio)

View File

@@ -34,21 +34,27 @@ import java.net.URL
fun ImageView.load(
url: String?,
@Dimension(unit = DP) round: Float = 0f,
@DrawableRes defaultRes: Int = R.drawable.default_cover
@DrawableRes defaultRes: Int? = R.drawable.default_cover
) {
if (context.isDestroyed()) return
if (url.isNullOrEmpty()) {
load(defaultRes)
if (defaultRes != null) {
load(defaultRes)
} else {
setImageDrawable(null)
}
return
}
GlideApp.with(context).load(url)
.dontAnimate()
.placeholder(defaultRes)
.error(defaultRes)
.apply {
if (defaultRes != null) {
placeholder(defaultRes)
error(defaultRes)
}
if (round != 0f) transform(CenterCrop(), RoundedCorners(ScreenUtil.dip2px(round)))
}
.into(this)

View File

@@ -147,9 +147,9 @@ public class MainRedPointTab extends RelativeLayout {
case MainTabType.TAB_TYPE_SQUARE:
resId = select ? R.mipmap.ic_main_tab_find_pressed : R.mipmap.ic_main_tab_find;
break;
case MainTabType.TAB_TYPE_PARTY:
resId = select ? R.mipmap.ic_main_tab_party_pressed : R.mipmap.ic_main_tab_party;
break;
// case MainTabType.TAB_TYPE_PARTY:
// resId = select ? R.mipmap.ic_main_tab_party_pressed : R.mipmap.ic_main_tab_party;
// break;
case MainTabType.TAB_TYPE_MSG:
resId = select ? R.mipmap.ic_main_tab_msg_pressed : R.mipmap.ic_main_tab_msg;
break;

View File

@@ -25,9 +25,9 @@ import java.util.List;
*/
public class MainTabLayout extends LinearLayout implements View.OnClickListener {
private final List<MainRedPointTab> tabViewList = new ArrayList<>(5);
private final List<MainRedPointTab> tabViewList = new ArrayList<>(4);
private MainRedPointTab homeTab;
private MainRedPointTab partyTab;
// private MainRedPointTab partyTab;
private MainRedPointTab squareTab;
private MainRedPointTab msgTab;
private MainRedPointTab meTab;
@@ -60,24 +60,24 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener
squareTab = findViewById(R.id.main_square_tab);
msgTab = findViewById(R.id.main_msg_tab);
partyTab = findViewById(R.id.main_party_tab);
// partyTab = findViewById(R.id.main_party_tab);
homeTab = findViewById(R.id.main_home_tab);
meTab = findViewById(R.id.main_me_tab);
homeTab.setOnClickListener(this);
meTab.setOnClickListener(this);
partyTab.setOnClickListener(this);
// partyTab.setOnClickListener(this);
squareTab.setOnClickListener(this);
msgTab.setOnClickListener(this);
tabViewList.add(homeTab);
tabViewList.add(partyTab);
// tabViewList.add(partyTab);
tabViewList.add(squareTab);
tabViewList.add(msgTab);
tabViewList.add(meTab);
}
public void setMainTabInfoList(@NonNull @Size(5) List<MainTabInfo> mainTabInfoList) {
public void setMainTabInfoList(@NonNull @Size(4) List<MainTabInfo> mainTabInfoList) {
this.mainTabInfoList = mainTabInfoList;
for (int i = 0; i < mainTabInfoList.size(); i++) {
MainTabInfo mainTabInfo = mainTabInfoList.get(i);
@@ -110,22 +110,22 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener
switch (v.getId()) {
case R.id.main_home_tab:
select(mainTabInfoList.get(0).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOME_FIRST_TAB, "首页tab");
break;
case R.id.main_party_tab:
select(mainTabInfoList.get(1).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BAR_CLICK, "首页");
break;
// case R.id.main_party_tab:
// select(mainTabInfoList.get(1).getTabType());
// break;
case R.id.main_square_tab:
select(mainTabInfoList.get(2).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_SQUARE_DONG_TAI_CLICK, "点击广场动态页");
select(mainTabInfoList.get(1).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BAR_CLICK, "广场");
break;
case R.id.main_msg_tab:
select(mainTabInfoList.get(3).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_MESSAGE, "消息");
select(mainTabInfoList.get(2).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BAR_CLICK, "消息");
break;
case R.id.main_me_tab:
select(mainTabInfoList.get(4).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOME_MINE_TAB, "我的tab");
select(mainTabInfoList.get(3).getTabType());
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BAR_CLICK, "我的");
break;
}
}
@@ -135,7 +135,7 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener
if (mLastPosition == tabType) return;
squareTab.select(tabType == MainTabType.TAB_TYPE_SQUARE);
msgTab.select(tabType == MainTabType.TAB_TYPE_MSG);
partyTab.select(tabType == MainTabType.TAB_TYPE_PARTY);
// partyTab.select(tabType == MainTabType.TAB_TYPE_PARTY);
homeTab.select(tabType == MainTabType.TAB_TYPE_HOME);
meTab.select(tabType == MainTabType.TAB_TYPE_ME);
if (mOnTabClickListener != null) {

View File

@@ -22,6 +22,8 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
private boolean isAlwaysBold;
private boolean autoResetPivot;
public ScaleTransitionPagerTitleView(Context context, boolean selectedBold) {
super(context);
this.selectedBold = selectedBold;
@@ -34,6 +36,10 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
@Override
public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
super.onEnter(index, totalCount, enterPercent, leftToRight);
if (autoResetPivot) {
setPivotX(getWidth() / 2f);
setPivotY(getHeight() / 2f);
}
// 实现颜色渐变
setScaleX(mMinScale + (1.0f - mMinScale) * enterPercent);
setScaleY(mMinScale + (1.0f - mMinScale) * enterPercent);
@@ -42,6 +48,10 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
@Override
public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
super.onLeave(index, totalCount, leavePercent, leftToRight);
if (autoResetPivot) {
setPivotX(getWidth() / 2f);
setPivotY(getHeight() / 2f);
}
// 实现颜色渐变
setScaleX(1.0f + (mMinScale - 1.0f) * leavePercent);
setScaleY(1.0f + (mMinScale - 1.0f) * leavePercent);
@@ -82,4 +92,8 @@ public class ScaleTransitionPagerTitleView extends ColorTransitionPagerTitleView
invalidate();
}
public void setAutoResetPivot(boolean state) {
autoResetPivot = state;
}
}

View File

@@ -184,7 +184,7 @@ public class CommonNavigator extends FrameLayout implements IPagerNavigator, Nav
if (mAdapter != null) {
mIndicator = mAdapter.getIndicator(getContext());
if (mIndicator instanceof View) {
LayoutParams lp = (LayoutParams) ((View) mIndicator).getLayoutParams();
ViewGroup.LayoutParams lp = ((View) mIndicator).getLayoutParams();
if (lp == null) {
lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

View File

@@ -0,0 +1,177 @@
package com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import com.nnbc123.app.ui.widget.magicindicator.FragmentContainerHelper;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.model.PositionData;
import java.util.List;
public class DrawableIndicator extends View implements IPagerIndicator {
public static final int MODE_MATCH_EDGE = 0; // drawable宽度 == title宽度 - 2 * mXOffset
public static final int MODE_WRAP_CONTENT = 1; // drawable宽度 == title内容宽度 - 2 * mXOffset
public static final int MODE_EXACTLY = 2;
private int mMode; // 默认为MODE_MATCH_EDGE模式
private Drawable mIndicatorDrawable;
// 控制动画
private Interpolator mStartInterpolator = new LinearInterpolator();
private Interpolator mEndInterpolator = new LinearInterpolator();
private float mDrawableHeight;
private float mDrawableWidth;
private float mYOffset;
private float mXOffset;
private List<PositionData> mPositionDataList;
private Rect mDrawableRect = new Rect();
public DrawableIndicator(Context context) {
super(context);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (mIndicatorDrawable == null) {
return;
}
if (mPositionDataList == null || mPositionDataList.isEmpty()) {
return;
}
// 计算锚点位置
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
float leftX;
float nextLeftX;
float rightX;
float nextRightX;
if (mMode == MODE_MATCH_EDGE) {
leftX = current.mLeft + mXOffset;
nextLeftX = next.mLeft + mXOffset;
rightX = current.mRight - mXOffset;
nextRightX = next.mRight - mXOffset;
mDrawableRect.top = (int) mYOffset;
mDrawableRect.bottom = (int) (getHeight() - mYOffset);
} else if (mMode == MODE_WRAP_CONTENT) {
leftX = current.mContentLeft + mXOffset;
nextLeftX = next.mContentLeft + mXOffset;
rightX = current.mContentRight - mXOffset;
nextRightX = next.mContentRight - mXOffset;
mDrawableRect.top = (int) (current.mContentTop - mYOffset);
mDrawableRect.bottom = (int) (current.mContentBottom + mYOffset);
} else { // MODE_EXACTLY
leftX = current.mLeft + (current.width() - mDrawableWidth) / 2;
nextLeftX = next.mLeft + (next.width() - mDrawableWidth) / 2;
rightX = current.mLeft + (current.width() + mDrawableWidth) / 2;
nextRightX = next.mLeft + (next.width() + mDrawableWidth) / 2;
mDrawableRect.top = (int) (getHeight() - mDrawableHeight - mYOffset);
mDrawableRect.bottom = (int) (getHeight() - mYOffset);
}
mDrawableRect.left = (int) (leftX + (nextLeftX - leftX) * mStartInterpolator.getInterpolation(positionOffset));
mDrawableRect.right = (int) (rightX + (nextRightX - rightX) * mEndInterpolator.getInterpolation(positionOffset));
mIndicatorDrawable.setBounds(mDrawableRect);
invalidate();
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
protected void onDraw(Canvas canvas) {
if (mIndicatorDrawable != null) {
mIndicatorDrawable.draw(canvas);
}
}
@Override
public void onPositionDataProvide(List<PositionData> dataList) {
mPositionDataList = dataList;
}
public Drawable getIndicatorDrawable() {
return mIndicatorDrawable;
}
public void setIndicatorDrawable(Drawable indicatorDrawable) {
mIndicatorDrawable = indicatorDrawable;
}
public Interpolator getStartInterpolator() {
return mStartInterpolator;
}
public void setStartInterpolator(Interpolator startInterpolator) {
mStartInterpolator = startInterpolator;
}
public Interpolator getEndInterpolator() {
return mEndInterpolator;
}
public void setEndInterpolator(Interpolator endInterpolator) {
mEndInterpolator = endInterpolator;
}
public int getMode() {
return mMode;
}
public void setMode(int mode) {
if (mode == MODE_EXACTLY || mode == MODE_MATCH_EDGE || mode == MODE_WRAP_CONTENT) {
mMode = mode;
} else {
throw new IllegalArgumentException("mode " + mode + " not supported.");
}
}
public float getDrawableHeight() {
return mDrawableHeight;
}
public void setDrawableHeight(float drawableHeight) {
mDrawableHeight = drawableHeight;
}
public float getDrawableWidth() {
return mDrawableWidth;
}
public void setDrawableWidth(float drawableWidth) {
mDrawableWidth = drawableWidth;
}
public float getYOffset() {
return mYOffset;
}
public void setYOffset(float yOffset) {
mYOffset = yOffset;
}
public float getXOffset() {
return mXOffset;
}
public void setXOffset(float xOffset) {
mXOffset = xOffset;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 584 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show More