Compare commits

...

67 Commits

Author SHA1 Message Date
eggmanQQQ
691d19b502 feat: 清單文件 添加 舊版本 PhotoPick 服務支持 2024-10-25 14:04:27 +08:00
max
f51bd9815c feat:子模块更新(BillingService2) 2024-07-12 16:49:05 +08:00
max
cea25c7497 feat:调整重名类命名 2024-07-12 14:25:32 +08:00
max
47d2bfd145 feat:替换登录页-logo图片 2024-07-12 11:21:44 +08:00
max
047e1454bd feat:适配Android14 2024-07-12 09:55:16 +08:00
max
714d5baec6 fix:修复个播粉丝团RTL适配问题 2024-07-11 18:56:09 +08:00
max
b20ee8064c fix:修复房间音乐音量无法调节bug 2024-07-11 18:24:50 +08:00
max
711135ae90 feat:移除不必要的debug-toast 2024-07-11 17:21:32 +08:00
max
ecf42e368e feat:完成游戏开黑翻译
fix:UI问题修复
2024-07-11 16:06:05 +08:00
max
205e1180e7 feat:首页-房间列表 麦位头像改为动态数据 2024-07-11 15:41:02 +08:00
max
bc48cc86a9 fix:礼物名称 动态适配多语言 2024-07-11 11:24:18 +08:00
max
e7b73a2961 feat:完成游戏开黑功能 2024-07-10 19:57:20 +08:00
max
5070e21d16 feat:【开黑】完成部分UI 2024-07-10 19:57:19 +08:00
max
049006aa8b feat:补充异常信息展示 2024-07-10 19:56:04 +08:00
max
86b498c00e feat:删除测试代码,删除不必要的log
fix:完善销毁逻辑
2024-07-09 15:57:11 +08:00
max
6df95cf11f feat:适配BillingService2,完善支付回调 2024-07-09 15:57:10 +08:00
max
3b407c0bd6 feat:初步实现H5唤起支付逻辑(不完善,用于打内测包验证) 2024-07-09 15:57:10 +08:00
max
83af08076a fix:头条UI微调 2024-07-09 15:56:20 +08:00
max
cdc1c51fec feat:调整版本号 2024-07-08 11:27:30 +08:00
max
a8191616a3 feat:私聊、公聊、房间、支持垃圾字检测 2024-07-08 11:27:11 +08:00
max
410832690f feat:调整启动背景-logo 2024-07-08 11:27:11 +08:00
max
b1d2f0515b fix:修复麦位空指针异常 2024-07-05 18:26:14 +08:00
max
82c2d8c25d feat:修改启动页背景 2024-07-04 19:17:35 +08:00
max
549088c99e feat:完成公聊厅-头条UI调整 2024-07-04 19:01:24 +08:00
max
5910e7c5fd feat:配置云信-安全通ID 2024-07-04 17:52:42 +08:00
max
53aed7599a feat:头条间距微调 2024-07-04 16:46:12 +08:00
max
8aebb7c2c2 feat:调整房间公聊-头条UI 2024-07-04 16:38:32 +08:00
max
3a120bf5f0 fix:修复反馈-联系客服-排序问题 2024-07-04 16:13:38 +08:00
max
2a0d8f06fa feat:头饰支持SVGA(个人资料页、房间个人资料弹窗、动态列表、动态详情、我的头饰列表、公聊厅、房间麦位) 2024-07-04 15:19:11 +08:00
max
495bae0d00 fix:修复反馈-bug 2024-07-03 19:40:59 +08:00
max
2af7cec8dd feat:完成反馈功能 2024-07-03 16:47:14 +08:00
max
e9e4da8d60 feat:补充启动时更新ticket逻辑 2024-07-02 17:36:08 +08:00
max
14c1805a2b feat:完成部分页面主题UI修改 2024-07-02 15:28:16 +08:00
max
066fc4056b feat:固化最新混淆配置 2024-07-01 09:38:36 +08:00
max
f8ad0d3961 feat:个人资料页UI微调
feat:首页房间列表-背景-阿语调整
2024-06-28 17:37:16 +08:00
max
0d974866c8 feat:调整首页-房间列表-背景多语言资源 2024-06-28 16:38:46 +08:00
max
b4f3c4f3e3 feat:补充混淆忽略 2024-06-28 16:24:53 +08:00
max
f74b744f56 fix:调整房间公告icon 2024-06-28 16:04:32 +08:00
max
b8f73ec0d5 feat:新增动态相关混淆配置 2024-06-28 14:44:16 +08:00
max
3ff80994f1 fix:调整动态部分翻译 2024-06-28 14:32:58 +08:00
max
c1426b39c4 fix:动态部分UI微调 2024-06-28 14:32:58 +08:00
max
3b28974919 feat:初步恢复动态 2024-06-28 14:32:57 +08:00
max
63a28bc142 fix:调整个人资源页部分文案翻译 2024-06-28 11:53:50 +08:00
max
729d626006 fix:修复个播-小麦位头像框大小比例问题 2024-06-28 10:50:06 +08:00
max
a407268be1 fix:修复房间麦位魅力icon 展示不完整bug 2024-06-28 09:47:08 +08:00
max
f4808e8acf fix:补充房间底部加号红点刷新时机 2024-06-28 09:34:07 +08:00
max
3e49dae43b feat:调整房间类型切换图片资源 2024-06-28 09:23:08 +08:00
max
35d53ccdb2 fix:调整已关注 翻译文案 2024-06-28 09:19:26 +08:00
max
2a20d75ffd feat:调整个人资料页 关注按钮 文案 2024-06-27 19:47:07 +08:00
max
5f157d8454 feat:聚会房、狂欢房 开放PK功能 2024-06-27 16:40:48 +08:00
max
5fbee068dc fix:调整切换房间页面部分图片资源 2024-06-27 16:18:01 +08:00
max
046c7d66cd fix:调整房间底部加号-红点提示逻辑:单独处理房间类型的功能提示
fix:修复游戏房未能返回之前房间类型问题
2024-06-27 16:18:01 +08:00
max
accf4562b1 fix:修复普通房麦位索引展示问题(1-8) 2024-06-27 16:18:00 +08:00
max
5b90524144 feat:适配房间类型切换-多语言翻译 2024-06-27 16:18:00 +08:00
max
1284a6e8a2 feat:调整房间公告位置 2024-06-27 16:18:00 +08:00
max
afdf3093a1 feat:新增聚会房、狂欢房; 2024-06-27 16:17:27 +08:00
max
843a37ed97 feat:初步完成房间类型切换页面 2024-06-27 16:14:52 +08:00
max
f99c6d8b37 fix:修复个人资料页UI问题 2024-06-27 14:49:13 +08:00
max
7add521040 feat:调整首页分页大小:50 2024-06-27 11:08:18 +08:00
max
b673f5603f fix:调整个人资料相册数据源 2024-06-27 11:06:03 +08:00
max
a4f9559ad9 fix:修复个人资料页部分UI细节问题 2024-06-27 10:07:10 +08:00
max
3226109442 fix:修复个人资料页部分BUG 2024-06-27 10:07:10 +08:00
max
3c60225e35 feat:调整个性签名默认值展示 2024-06-27 10:07:10 +08:00
max
0a70c6a478 feat:删除用户信息页不必要的请求 2024-06-27 10:06:53 +08:00
max
16a8f9a52a fix:调整翻译
feat:完成勋章展示
2024-06-27 10:06:27 +08:00
max
2a1983aa46 feat:完成个人资料页-UI改版 2024-06-27 10:06:26 +08:00
max
eb187ebc56 feat:调整首页列表分页大小
fix:修复首页列表底部间距问题(被遮挡)
2024-06-25 17:10:46 +08:00
517 changed files with 16262 additions and 2181 deletions

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "modules/module_google"]
path = modules/module_google
url = https://e.coding.net/chwllive/peko/peko-android-gms.git

View File

@@ -117,6 +117,7 @@ android {
'src/module_treasure_box/java',
'src/module_public_chat/java',
'src/module_game/java',
'src/module_community/java',
]
@@ -133,6 +134,7 @@ android {
'src/module_treasure_box/res',
'src/module_public_chat/res',
'src/module_game/res',
'src/module_community/res',
]
@@ -219,7 +221,6 @@ dependencies {
api "com.jzxiang.pickerview:TimePickerDialog:1.0.1"
api "com.github.zyyoona7:EasyPopup:1.0.2"
api "com.github.donkingliang:LabelsView:1.6.5"
api "com.github.yyued:SVGAPlayer-Android:2.6.1"
api "com.ms-square:expandableTextView:0.1.4"
annotationProcessor 'androidx.annotation:annotation:1.6.0'
@@ -337,6 +338,16 @@ xmlClassGuard {
"com.chwl.core": "com.hhchu.core",
"com.chwl.library": "com.hhchu.library"]
moveDir = [
"com.chwl.app.community.dynamic" : "ffefcef.ddbccaec",
"com.chwl.app.community.helper" : "eaeecbea.ccefdeaf",
"com.chwl.app.community.holder" : "aafebee.febeeba",
"com.chwl.app.community.im" : "eedadfa.cccedea",
"com.chwl.app.community.publish" : "ddae.cfdb",
"com.chwl.app.community.square" : "bddfb.eedde",
"com.chwl.app.community.user_dynamic" : "ddcdbcbc.acbfcfba",
"com.chwl.app.community.utils" : "cceaf.cbdcdb",
"com.chwl.app.community.widget" : "bdfaa.beeefc",
"com.chwl.app.community" : "cadfd.aeddb",
"com.chwl.app.avroom.headline" : "eefce.eecad",
"com.chwl.core.bean.game" : "caeccd.fdedac",
"com.chwl.core.bean.room" : "afceec.aaafbc",

View File

@@ -82,7 +82,8 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />
<application
android:name=".application.App"
android:allowBackup="false"
@@ -265,6 +266,9 @@
android:name=".avroom.activity.RoomSettingActivity"
android:label="@string/main_androidmanifest_07"
android:screenOrientation="portrait" />
<activity
android:name=".avroom.activity.RoomTypeSwitchActivity"
android:screenOrientation="portrait" />
<activity
android:name=".avroom.activity.RoomBgSettingActivity"
android:screenOrientation="portrait" />
@@ -873,19 +877,38 @@
<service
android:name="com.netease.nimlib.service.NimService"
android:foregroundServiceType="remoteMessaging"
android:process=":core" />
<service
android:name="com.netease.nimlib.service.NimService$Aux"
android:foregroundServiceType="remoteMessaging"
android:process=":core" />
<service
android:name="com.netease.nimlib.job.NIMJobService"
android:foregroundServiceType="remoteMessaging"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":core" />
<service android:name="com.netease.nimlib.service.ResponseService" />
<service android:name="com.netease.nimlib.service.ResponseService"
android:foregroundServiceType="remoteMessaging"/>
<service
android:name=".service.DaemonService"
android:foregroundServiceType="mediaPlayback"
android:enabled="true" />
<!-- Trigger Google Play services to install the backported photo picker module. -->
<service
android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false"
tools:ignore="MissingClass">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data
android:name="photopicker_activity:0:required"
android:value="" />
</service>
<activity android:name=".avroom.room_album.RoomAlbumActivity" />
<activity android:name=".ui.language.LanguageActivity" />
@@ -931,6 +954,23 @@
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".community.dynamic.view.DynamicDetailActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".community.publish.view.PublishActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustNothing" />
<activity
android:windowSoftInputMode="adjustPan"
android:name=".ui.feedback.FeedbackActivity"
android:screenOrientation="portrait" />
<activity android:name=".ui.debug.DebugActivity"
android:screenOrientation="portrait"/>
<activity android:name=".ui.game_team.record.GameTeamRecordActivity"
android:screenOrientation="portrait"/>
</application>
</manifest>

View File

@@ -25,6 +25,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.chwl.app.base.GlobalViewModelOwner;
import com.chwl.app.common.widget.dialog.DialogManager;
import com.chwl.app.community.square.SquareFragment;
import com.chwl.app.game.core.GameStateAbility;
import com.chwl.app.game.data.GameModel2;
import com.chwl.app.game.ui.game.GameActivity;
@@ -143,7 +144,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private MainTabLayout mMainTabLayout;
private AnchorCardView anchorCardView;
private View viewClose;
private int mCurrentTabType = MainTabType.TAB_TYPE_STAR;
private int mCurrentTabType = MainTabType.TAB_TYPE_HOME;
/**
* 房间最小化动画换成属性动画原先的补间动画影响了activity的生命周期
*/
@@ -162,9 +163,9 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private Runnable touchRunnable;
{
fragmentArray.put(MainTabType.TAB_TYPE_STAR, new StarFragment());
fragmentArray.put(MainTabType.TAB_TYPE_GAME, new GameHomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_GAME, new GameHomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_SQUARE, new SquareFragment());
fragmentArray.put(MainTabType.TAB_TYPE_MSG, new ContactsListFragment());
fragmentArray.put(MainTabType.TAB_TYPE_ME, new MeFragment());
}

View File

@@ -84,7 +84,6 @@ import com.chwl.library.common.file.FileHelper;
import com.chwl.library.net.rxnet.RxNet;
import com.chwl.library.net.rxnet.converter.GsonConverterPlugins;
import com.chwl.library.utils.AppMetaDataUtil;
import com.chwl.library.utils.AppUtils;
import com.chwl.library.utils.DeviceUuidFactory;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
@@ -417,7 +416,7 @@ public class App extends BaseApp {
httpParams.put("netType", String.valueOf(SystemUtils.getNetworkType(context)));
httpParams.put("model", SystemUtils.getPhoneModel());
httpParams.put("appVersion", VersionUtil.getLocalName(context));
httpParams.put("appVersionCode", String.valueOf(AppUtils.getVersionCode(context)));
httpParams.put("appVersionCode", String.valueOf(VersionUtil.getVersionCode(context)));
httpParams.put("deviceId", DeviceUuidFactory.getDeviceId(context));
httpParams.put("androidId", MD5Utils.getMD5String(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)));
httpParams.put("channel", AppMetaDataUtil.getChannelID());
@@ -484,7 +483,6 @@ public class App extends BaseApp {
ChannelModel.get();
MarketVerifyModel.get();
GiftModel.get();
GiftModel.get().tryLoadGiftList();
// 模厅
HallDataManager.get().application();
//全局处理

View File

@@ -42,6 +42,7 @@ import com.alibaba.fastjson.JSONObject;
import com.chwl.app.notify.RoomNotifyManager;
import com.chwl.app.ui.webview.baishun.BaiShunGameWebFragment;
import com.chwl.app.ui.webview.baishun.IBaiShunGameListener;
import com.chwl.library.widget.SVGAView;
import com.chwl.core.monsterhunting.bean.MonsterDataBean;
import com.chwl.core.room.game.bean.BaiShunGameConfig;
import com.chwl.core.support.room.AudioRoomContext;
@@ -177,6 +178,15 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
private static final String TAG = "AVRoomActivity";
private static final int SHOW_RED_DIALOG_MAX = 10;
public static boolean isPKModel = false;
private static SVGAView.SVGACache svgaCache;
public static SVGAView.SVGACache getSvgaCache() {
if (svgaCache == null) {
svgaCache = SVGAView.newCache(20);
}
return svgaCache;
}
/**
* 管理限制进房
*/
@@ -899,6 +909,10 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
GiftModel.get().cancelCountDownTimer();
EventBus.getDefault().unregister(this);
DemoCache.saveBoolean("FirstCharge", false);
if (svgaCache != null) {
svgaCache.clear();
}
svgaCache = null;
super.onDestroy();
}

View File

@@ -0,0 +1,142 @@
package com.chwl.app.avroom.activity
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.view.View
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.RoomTypeSwitchActivityBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.super_admin.util.SuperAdminUtil
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.ktx.singleClick
import com.netease.nim.uikit.StatusBarUtil
class RoomTypeSwitchActivity : BaseViewBindingActivity<RoomTypeSwitchActivityBinding>() {
private var currentType: Int? = null
private var selectType: Int? = null
companion object {
fun isCanSwitch(): Boolean {
if (SuperAdminUtil.isSuperAdmin()) {
return false
}
if (AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_HOME_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_REVELRY) {
return false
}
if (AvRoomDataManager.get().isDatingMode) {
return false
}
val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo
if (roomInfo == null || roomInfo.isPermitRoom == 1) {
return false
}
return AvRoomDataManager.get().isManager
}
fun start(context: Context) {
context.startActivity(Intent(context, RoomTypeSwitchActivity::class.java))
}
}
override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.room_type))
initEvent()
this.currentType = AvRoomDataManager.get().mCurrentRoomInfo?.type
updateSelectView(currentType)
}
private fun initEvent() {
binding.tvSubmit.singleClick {
selectType?.let {
if (currentType != it) {
trySwitchRoomType(it)
}
}
}
addTypeSelectClick(binding.iv9, RoomInfo.ROOMTYPE_HOME_PARTY)
addTypeSelectClick(binding.iv10, RoomInfo.ROOMTYPE_PARTY)
addTypeSelectClick(binding.iv15, RoomInfo.ROOMTYPE_REVELRY)
}
private fun addTypeSelectClick(view: View, type: Int) {
view.setOnClickListener {
updateSelectView(type)
}
}
private fun updateSelectView(type: Int?) {
this.selectType = type
val views = mapOf(
RoomInfo.ROOMTYPE_HOME_PARTY to binding.iv9Border,
RoomInfo.ROOMTYPE_PARTY to binding.iv10Border,
RoomInfo.ROOMTYPE_REVELRY to binding.iv15Border
)
val displayRes = mapOf(
RoomInfo.ROOMTYPE_HOME_PARTY to R.drawable.room_type_bg_9,
RoomInfo.ROOMTYPE_PARTY to R.drawable.room_type_bg_10,
RoomInfo.ROOMTYPE_REVELRY to R.drawable.room_type_bg_15
)
views.forEach {
it.value.isVisible = it.key == type
}
val resId = displayRes.get(type)
if (resId != null) {
binding.ivSelected.setImageResource(resId)
} else {
binding.ivSelected.setImageDrawable(null)
}
if (type == currentType) {
binding.tvSubmit.setText(R.string.room_type_using)
} else {
binding.tvSubmit.setText(R.string.room_type_use)
}
}
private fun trySwitchRoomType(type: Int) {
val currentType = this.currentType
if (currentType != null && currentType > type) {
dialogManager.showOkCancelDialog(
ResUtil.getString(R.string.switch_room_type_tips),
ResUtil.getString(R.string.login_fragment_adduserinfofragment_04)
) {
requestSwitchRoomType(type)
}
} else {
requestSwitchRoomType(type)
}
}
@SuppressLint("CheckResult")
private fun requestSwitchRoomType(type: Int) {
dialogManager.showProgressDialog(context)
OpenRoomHelper.updateRoomInfoRx(
AvRoomDataManager.get().mCurrentRoomInfo,
type,
0
).compose(bindToLifecycle()).subscribe({
dialogManager.dismissDialog()
finish()
}, {
SingleToastUtil.showToast(it.message)
dialogManager.dismissDialog()
})
}
override fun needSteepStateBar(): Boolean {
return true
}
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -15,8 +15,12 @@ import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.avroom.activity.AVRoomActivity;
import com.chwl.app.utils.AvatarHelper;
import com.chwl.library.widget.SVGAView;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.coorchice.library.SuperTextView;
import com.example.lib_utils.StringUtils2;
import com.netease.nim.uikit.common.util.string.StringUtil;
import com.opensource.svgaplayer.SVGAImageView;
import com.chwl.app.R;
@@ -55,6 +59,9 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
public static final String MICRO_TYPE_DATING = "dating";
public static final String MICRO_TYPE_DATING_VIP = "dating_vip";
public static final String MICRO_TYPE_SINGLE = "single";
public static final String MICRO_TYPE_PARTY = "party";
public static final String MICRO_TYPE_REVELRY = "revelry";
protected static final int TYPE_KING = 2;
protected static final int TYPE_BOSS = 1;
protected static final int TYPE_NORMAL = 0;
@@ -76,11 +83,16 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByMicPosition(position - 1);
if (roomQueueInfo == null) return;
NormalMicroViewHolder holder = (NormalMicroViewHolder) viewHolder;
holder.micPositionNameOffset = getMicPositionNameOffset();
holder.bind(roomQueueInfo, position - 1);
}
public abstract String microType();
protected int getMicPositionNameOffset() {
return 2;
}
@Override
public int getItemCount() {
return 9;
@@ -137,7 +149,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
SVGAImageView ivHalo;
@Nullable
ImageView ivHeadWear;
SVGAView ivHeadWear;
@Nullable
ImageView ivCharmLevelTag;
@@ -146,6 +158,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
RoomQueueInfo info;
int position = TYPE_INVALID;
int micPositionNameOffset = 2;
NormalMicroViewHolder(View itemView) {
super(itemView);
@@ -162,6 +175,9 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
ivUpImage.setOnClickListener(this);
ivLockImage.setOnClickListener(this);
ivAvatar.setOnClickListener(this);
if (ivHeadWear != null) {
ivHeadWear.bindCache(AVRoomActivity.getSvgaCache());
}
}
public void clear() {
@@ -267,6 +283,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
private void clearHeadWear() {
if (ivHeadWear == null) return;
ivHeadWear.clearAnimation();
ivHeadWear.stopAnimation();
ivHeadWear.setImageDrawable(null);
ivHeadWear.setTag(R.id.mic_item_head_wear, null);
ivHeadWear.setVisibility(View.GONE);
@@ -274,7 +291,11 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
protected void setDefalutText(int index) {
tvNick.setTextColor(Color.WHITE);
tvNick.setText("NO."+ (index + 1));
tvNick.setText(getMicPositionName(index));
}
protected String getMicPositionName(int index) {
return "NO." + (index + micPositionNameOffset);
}
protected void setSelectText(int index, String nick, int gender) {
@@ -286,10 +307,13 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
private void updateNobleView(MicMemberInfo chatRoomMember) {
if (ivHeadWear == null) return;
String headWear = chatRoomMember.getHeadWearUrl();
int headWearType = chatRoomMember.getHeadWearType();
if (TextUtils.isEmpty(headWear)) {
headWear = NobleUtil.getHeadResource(HeadWearInfo.EFFECT, chatRoomMember) != null ?
NobleUtil.getHeadResource(HeadWearInfo.EFFECT, chatRoomMember) :
NobleUtil.getHeadResource(HeadWearInfo.PIC, chatRoomMember);
String type = NobleUtil.getHeadResource(HeadWearInfo.TYPE, chatRoomMember);
headWearType = StringUtils2.INSTANCE.toInt(type);
}
String nobleHeadWear = (String) NobleUtil.getResource(NobleResourceType.KEY_HEAD_WEAR, chatRoomMember);
if (!TextUtils.isEmpty(headWear)) {
@@ -297,7 +321,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
//只有头饰发生改变才更新,防止闪烁
if (!headWear.equals(ivHeadWear.getTag(R.id.mic_item_head_wear))) {
ivHeadWear.setTag(R.id.mic_item_head_wear, headWear);
NobleUtil.loadMicHeadWear(headWear, ivHeadWear, R.id.mic_item_head_wear, headWear);
AvatarHelper.loadAvatarFrame(ivHeadWear, headWear, headWearType);
}
} else if (!TextUtils.isEmpty(nobleHeadWear)) {
// 头饰
@@ -478,10 +502,10 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter<Recycler
//控制最高最低头饰
Observer<Integer> headWearObserver = headWearValue -> {
if (ivCharmLevelTag == null) return;
ivCharmLevelTag.setVisibility(View.GONE);
if (headWearValue == 1) {
ivCharmLevelTag.setVisibility(View.VISIBLE);
ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min));
ivCharmLevelTag.setVisibility(View.GONE);
// ivCharmLevelTag.setVisibility(View.VISIBLE);
// ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min));
} else if (headWearValue == 2) {
ivCharmLevelTag.setVisibility(View.VISIBLE);
ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_max));

View File

@@ -27,6 +27,11 @@ public class CpMicroViewAdapter extends BaseMicroViewAdapter {
return BaseMicroViewAdapter.MICRO_TYPE_CP;
}
@Override
protected int getMicPositionNameOffset() {
return 1;
}
@Override
public void bindToRecyclerView(RecyclerView recyclerView) {
GridLayoutManager layoutManager = new GridLayoutManager(context, 3);

View File

@@ -27,6 +27,9 @@ import com.chwl.library.utils.ResUtil
* @date 2017/12/18
*/
class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) {
override fun getMicPositionNameOffset(): Int {
return 1
}
/**
* Set LayoutManager and bind this to RecyclerView

View File

@@ -2,7 +2,6 @@ package com.chwl.app.avroom.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,8 +12,6 @@ import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.R;
import com.chwl.core.bean.RoomQueueInfo;
import com.chwl.core.manager.AvRoomDataManager;
import com.chwl.library.utils.ResUtil;
/**
* @author xiaoyu
@@ -27,6 +24,11 @@ public class MicroViewAdapter extends BaseMicroViewAdapter {
super(context);
}
@Override
protected int getMicPositionNameOffset() {
return 1;
}
/**
* Set LayoutManager and bind this to RecyclerView
*/
@@ -62,15 +64,6 @@ public class MicroViewAdapter extends BaseMicroViewAdapter {
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByMicPosition(position - 1);
if (roomQueueInfo == null) {
return;
}
NormalMicroViewHolder holder = (NormalMicroViewHolder) viewHolder;
holder.bind(roomQueueInfo, position - 1);
}
@Override
public String microType() {

View File

@@ -0,0 +1,79 @@
package com.chwl.app.avroom.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.R;
import com.chwl.core.bean.RoomQueueInfo;
import com.chwl.core.manager.AvRoomDataManager;
/**
* @author xiaoyu
* @date 2017/12/18
*/
public class PartyMicroViewAdapter extends BaseMicroViewAdapter {
public PartyMicroViewAdapter(Context context) {
super(context);
}
/**
* Set LayoutManager and bind this to RecyclerView
*/
@Override
public void bindToRecyclerView(RecyclerView recyclerView) {
GridLayoutManager layoutManager = new GridLayoutManager(context, 5);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(this);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View item;
item = LayoutInflater.from(parent.getContext()).
inflate(R.layout.list_item_micro, parent, false);
return new MicroViewHolder(item);
}
@Override
public String microType() {
return BaseMicroViewAdapter.MICRO_TYPE_PARTY;
}
@Override
public int getItemViewType(int position) {
return TYPE_NORMAL;
}
@Override
public int getItemCount() {
return 10;
}
class MicroViewHolder extends GiftValueViewHolder {
MicroViewHolder(View itemView) {
super(itemView);
}
@Override
public void bind(RoomQueueInfo info, int position) {
super.bind(info, position);
ivUpImage.setImageResource(R.drawable.icon_room_up_micro);
}
@SuppressLint("SetTextI18n")
@Override
public void setDefalutText(int index) {
super.setDefalutText(index);
}
}
}

View File

@@ -0,0 +1,79 @@
package com.chwl.app.avroom.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.R;
import com.chwl.core.bean.RoomQueueInfo;
import com.chwl.core.manager.AvRoomDataManager;
/**
* @author xiaoyu
* @date 2017/12/18
*/
public class RevelryMicroViewAdapter extends BaseMicroViewAdapter {
public RevelryMicroViewAdapter(Context context) {
super(context);
}
/**
* Set LayoutManager and bind this to RecyclerView
*/
@Override
public void bindToRecyclerView(RecyclerView recyclerView) {
GridLayoutManager layoutManager = new GridLayoutManager(context, 5);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(this);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View item;
item = LayoutInflater.from(parent.getContext()).
inflate(R.layout.list_item_micro, parent, false);
return new MicroViewHolder(item);
}
@Override
public String microType() {
return BaseMicroViewAdapter.MICRO_TYPE_REVELRY;
}
@Override
public int getItemViewType(int position) {
return TYPE_NORMAL;
}
@Override
public int getItemCount() {
return 15;
}
class MicroViewHolder extends GiftValueViewHolder {
MicroViewHolder(View itemView) {
super(itemView);
}
@Override
public void bind(RoomQueueInfo info, int position) {
super.bind(info, position);
ivUpImage.setImageResource(R.drawable.icon_room_up_micro);
}
@SuppressLint("SetTextI18n")
@Override
public void setDefalutText(int index) {
super.setDefalutText(index);
}
}
}

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class RoomPkFinishDialog : BaseDialog<DialogRoomPkFinishBinding>() {
class RoomPkFinishDialog : BaseDialogFragment<DialogRoomPkFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkForceFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class RoomPkForceFinishDialog : BaseDialog<DialogRoomPkForceFinishBinding>() {
class RoomPkForceFinishDialog : BaseDialogFragment<DialogRoomPkForceFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,7 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkReceivedBinding
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.manager.AvRoomDataManager
@@ -16,7 +16,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class RoomPkReceivedDialog : BaseDialog<DialogRoomPkReceivedBinding>() {
class RoomPkReceivedDialog : BaseDialogFragment<DialogRoomPkReceivedBinding>() {
companion object {

View File

@@ -1,9 +1,9 @@
package com.chwl.app.avroom.anotherroompk
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkRuleBinding
class RoomPkRuleDialog : BaseDialog<DialogRoomPkRuleBinding>() {
class RoomPkRuleDialog : BaseDialogFragment<DialogRoomPkRuleBinding>() {
companion object {

View File

@@ -6,7 +6,7 @@ import android.view.WindowManager
import androidx.recyclerview.widget.GridLayoutManager
import com.chwl.app.avroom.adapter.CreateRoomGameGuideAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogCreateGameRoomBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.app.ui.utils.RVDelegate
@@ -14,7 +14,7 @@ import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.game.bean.GameInfo
import com.chwl.core.room.game.GameModel
class CreateGameRoomDialog : BaseDialog<DialogCreateGameRoomBinding>() {
class CreateGameRoomDialog : BaseDialogFragment<DialogCreateGameRoomBinding>() {
private lateinit var rvDelegate: RVDelegate<GameInfo>
private val gameAdapter = CreateRoomGameGuideAdapter()

View File

@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.R
import com.chwl.app.avroom.adapter.CreateRoomGameAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogCreateRoomBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.app.ui.utils.RVDelegate
@@ -19,7 +19,7 @@ import com.chwl.core.room.game.GameModel
import com.chwl.core.utils.extension.toast
import com.chwl.library.utils.ResUtil
class CreateRoomDialog : BaseDialog<DialogCreateRoomBinding>() {
class CreateRoomDialog : BaseDialogFragment<DialogCreateRoomBinding>() {
private lateinit var rvDelegate: RVDelegate<GameInfo>
private val gameAdapter = CreateRoomGameAdapter()

View File

@@ -1,12 +1,12 @@
package com.chwl.app.avroom.dialog
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogNewUserGiftBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.gift.bean.GiftInfo
class NewUserGiftDialog(val giftInfo: GiftInfo) :
BaseDialog<DialogNewUserGiftBinding>() {
BaseDialogFragment<DialogNewUserGiftBinding>() {
override fun init() {
binding?.ivClose?.setOnClickListener {

View File

@@ -95,7 +95,10 @@ public class PKSelectPeopleDialog extends BaseDialog implements View.OnClickList
keys[i] = micQueue.keyAt(i);
}
Arrays.sort(keys);
for (int i = 0; i < keys.length; i++) {
for (int i = 0; i < micEntityList.size(); i++) {
if (i >= micQueue.size()) {
continue;
}
RoomQueueInfo roomQueueInfo = micQueue.get(keys[i]);
MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember;
if (chatRoomMember != null) {

View File

@@ -25,6 +25,7 @@ import com.chwl.core.auth.AuthModel
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.core.room.anotherroompk.SingleRoomPKModel
import com.chwl.core.room.bean.RoomIcon
import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.core.RoomDataService
import com.chwl.core.room.game.bean.BaiShunGameConfig
import com.chwl.core.room.model.AvRoomModel
@@ -261,10 +262,7 @@ class RoomGameplayDialog :
if (SuperAdminUtil.isSuperAdmin()) {
return null
}
if (AvRoomDataManager.get().isOpenGame) {
return null
}
if (AvRoomDataManager.get().isSingleRoom) {
if (AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_HOME_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_REVELRY) {
return null
}
val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo
@@ -299,10 +297,7 @@ class RoomGameplayDialog :
if (SuperAdminUtil.isSuperAdmin()) {
return null
}
if (AvRoomDataManager.get().isOpenGame) {
return null
}
if (AvRoomDataManager.get().isSingleRoom) {
if (AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_HOME_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_PARTY && AvRoomDataManager.get().roomType != RoomInfo.ROOMTYPE_REVELRY) {
return null
}
val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo

View File

@@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.coorchice.library.utils.LogUtils;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.hjq.toast.ToastUtils;
@@ -131,6 +132,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
// addGiftValueAction(optAdapter);
addSuperAdminAction(optAdapter);
addShieldReportAction(optAdapter);
addRoomTypeSwitchAction(optAdapter);
rvOPtList.setAdapter(optAdapter);
}
@@ -286,10 +288,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
if (SuperAdminUtil.isSuperAdmin()) {
return;
}
if (AvRoomDataManager.get().isOpenGame()) {
return;
}
if (AvRoomDataManager.get().isSingleRoom()) {
if (AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
return;
}
if (AvRoomDataManager.get().isManager() && !AvRoomDataManager.get().isCpRoom()) {
@@ -556,6 +555,18 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
}
/**
* 房间类型切换
*
* @param optAdapter
*/
private void addRoomTypeSwitchAction(OptAdapter optAdapter) {
if (RoomTypeSwitchActivity.Companion.isCanSwitch()) {
optAdapter.addData(new OptAction(R.drawable.icon_room_type_switch,
getContext().getResources().getString(R.string.room_type), () -> RoomTypeSwitchActivity.Companion.start(getContext())));
}
}
/**
* 超管管理
*/

View File

@@ -5,7 +5,7 @@ import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.RoomTeamPkDialogBinding
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.app.ui.widget.dialog.CommonTipDialog
@@ -28,7 +28,7 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.Locale
class RoomTeamPkDialog : BaseDialog<RoomTeamPkDialogBinding>() {
class RoomTeamPkDialog : BaseDialogFragment<RoomTeamPkDialogBinding>() {
private var compositeDisposable: CompositeDisposable? = null

View File

@@ -9,7 +9,7 @@ import android.view.WindowManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.avroom.adapter.SendBroadcastAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSendBroadcastBinding
import com.chwl.app.ui.utils.RVDelegate
import com.chwl.app.utils.SpannableBuilder
@@ -24,7 +24,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class SendBroadcastDialog : BaseDialog<DialogSendBroadcastBinding>() {
class SendBroadcastDialog : BaseDialogFragment<DialogSendBroadcastBinding>() {
private lateinit var rvDelegate: RVDelegate<String>
private lateinit var adapter: SendBroadcastAdapter

View File

@@ -2,11 +2,11 @@ package com.chwl.app.avroom.dialog
import android.annotation.SuppressLint
import android.view.WindowManager
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomTipBinding
class SingleRoomTipDialog :
BaseDialog<DialogSingleRoomTipBinding>() {
BaseDialogFragment<DialogSingleRoomTipBinding>() {
@SuppressLint("ClickableViewAccessibility")
override fun init() {
binding?.root?.setOnClickListener {

View File

@@ -650,6 +650,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
open fun updateView() {
// 更新底欄
showBottomViewForDifRole()
bottomView.notifyStateChanged()
}
/**

View File

@@ -116,10 +116,14 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
dialogManager.showOkCancelDialog(
getString(R.string.room_switch_standard_room_tips)
) {
var type = AvRoomDataManager.get().mCurrentRoomInfo?.oldType
if (type == null || type <= 0) {
type = RoomInfo.ROOMTYPE_HOME_PARTY
}
OpenRoomHelper.updateRoomInfo(
baseActivity,
AvRoomDataManager.get().mCurrentRoomInfo,
RoomInfo.ROOMTYPE_HOME_PARTY,
type,
0,
false
)

View File

@@ -15,8 +15,10 @@ import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import com.chwl.app.avroom.activity.RoomTitleEditActivity;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.GiftDialog;
import com.chwl.app.ui.widget.UserInfoDialog;
@@ -117,7 +119,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
if (roomFragment instanceof HomePartyRoomFragment) {
((HomePartyRoomFragment) roomFragment).onNewIntent(intent);
}
}
@Override
@@ -193,6 +194,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
@Override
public void onSetListener() {
gameMainBinding.ivRoomNotice.setOnClickListener(this);
roomMore.setOnClickListener(this);
ivFollowRoom.setOnClickListener(this);
// ivRoomShare.setOnClickListener(this);
@@ -359,8 +361,18 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
tempFragment = SingleRoomFragment.newInstance();
}
break;
case RoomInfo.ROOMTYPE_PARTY:
if (!(tempFragment instanceof PartyRoomFragment)) {
tempFragment = PartyRoomFragment.Companion.newInstance();
}
break;
case RoomInfo.ROOMTYPE_REVELRY:
if (!(tempFragment instanceof RevelryRoomFragment)) {
tempFragment = RevelryRoomFragment.Companion.newInstance();
}
break;
default:
if (!(tempFragment instanceof HomePartyRoomFragment)) {
if (tempFragment == null || !(tempFragment.getClass().getSimpleName().equals(HomePartyRoomFragment.class.getSimpleName()))) {
tempFragment = HomePartyRoomFragment.newInstance();
}
break;
@@ -390,6 +402,12 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
ivFollowRoom.setImageResource(AvRoomDataManager.get().isRoomFans ? R.drawable.room_ic_collect_yes : R.drawable.room_ic_collect_no);
setIdOnlineData();
if (AvRoomDataManager.get().getRoomType() != RoomInfo.ROOMTYPE_GAME) {
gameMainBinding.ivRoomNotice.setVisibility(View.VISIBLE);
} else {
gameMainBinding.ivRoomNotice.setVisibility(View.GONE);
}
}
}
@@ -411,6 +429,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_room_notice:
showRoomIntroduction(AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isRoomAdmin());
break;
case R.id.room_more:
int gravity = Gravity.END;
if(UiUtils.INSTANCE.isRtl(requireContext())){
@@ -572,4 +593,22 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
}
}
private void showRoomIntroduction(Boolean modify) {
var isModify = modify;
RoomInfo info = AvRoomDataManager.get().mCurrentRoomInfo;
if (info == null) {
return;
}
if (SuperAdminUtil.isSuperAdmin()) {
isModify = false;
}
if (isModify) {
RoomTitleEditActivity.startForResult(getActivity(), info.getRoomDesc(), info.getIntroduction());
} else {
DialogFragment dialogFragment =
RoomTitleDialogFragment.getInstance(info.getRoomDesc(), info.getIntroduction());
dialogFragment.show(requireActivity().getSupportFragmentManager(), "roomTitle");
}
}
}

View File

@@ -467,6 +467,17 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
gameBinding.ivQueuingMicro.setVisibility(View.GONE);
gameBinding.bottomView.updateQueuingMicButton();
}
updateMicroView();
changeModelShowView();
refreshDatingNextStatus();
if (AvRoomDataManager.get().isDatingMode()) {
gameBinding.ivGame.setVisibility(View.GONE);
} else {
gameBinding.ivGame.setVisibility(View.VISIBLE);
}
}
protected void updateMicroView(){
String microType = microView.getAdapter() == null ? BaseMicroViewAdapter.MICRO_TYPE_NULL : microView.getAdapter().microType();
if (AvRoomDataManager.get().isCpRoom()) {
if (!microType.equals(BaseMicroViewAdapter.MICRO_TYPE_CP)) {
@@ -484,16 +495,8 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
if (microView.getAdapter() != null) {
microView.getAdapter().notifyDataSetChanged();
}
changeModelShowView();
refreshDatingNextStatus();
if (AvRoomDataManager.get().isDatingMode()) {
gameBinding.ivGame.setVisibility(View.GONE);
} else {
gameBinding.ivGame.setVisibility(View.VISIBLE);
}
}
public void updateMicBtn() {
super.updateMicBtn();
refreshDatingNextStatus();

View File

@@ -0,0 +1,34 @@
package com.chwl.app.avroom.fragment
import com.chwl.app.avroom.adapter.BaseMicroViewAdapter
import com.chwl.app.avroom.adapter.PartyMicroViewAdapter
import com.example.lib_utils.UiUtils
import com.example.lib_utils.ktx.setMargin
/**
* 聚会房
*/
class PartyRoomFragment : HomePartyRoomFragment() {
companion object {
fun newInstance(): PartyRoomFragment {
return PartyRoomFragment()
}
}
override fun onFindViews() {
super.onFindViews()
microView.setMargin(0,UiUtils.dip2px(30f),0,0)
}
override fun updateMicroView() {
val microType =
if (microView.adapter == null) BaseMicroViewAdapter.MICRO_TYPE_NULL else microView.adapter.microType()
if (microType != BaseMicroViewAdapter.MICRO_TYPE_PARTY) {
microView.bindAdapter(PartyMicroViewAdapter(mContext))
}
if (microView.adapter != null) {
microView.adapter.notifyDataSetChanged()
}
}
}

View File

@@ -0,0 +1,34 @@
package com.chwl.app.avroom.fragment
import com.chwl.app.avroom.adapter.BaseMicroViewAdapter
import com.chwl.app.avroom.adapter.RevelryMicroViewAdapter
import com.example.lib_utils.UiUtils
import com.example.lib_utils.ktx.setMargin
/**
* 狂欢房
*/
class RevelryRoomFragment : HomePartyRoomFragment() {
companion object {
fun newInstance(): RevelryRoomFragment {
return RevelryRoomFragment()
}
}
override fun onFindViews() {
super.onFindViews()
microView.setMargin(0, UiUtils.dip2px(30f),0,0)
}
override fun updateMicroView() {
val microType =
if (microView.adapter == null) BaseMicroViewAdapter.MICRO_TYPE_NULL else microView.adapter.microType()
if (microType != BaseMicroViewAdapter.MICRO_TYPE_REVELRY) {
microView.bindAdapter(RevelryMicroViewAdapter(mContext))
}
if (microView.adapter != null) {
microView.adapter.notifyDataSetChanged()
}
}
}

View File

@@ -2,6 +2,7 @@ package com.chwl.app.avroom.headline
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
@@ -9,12 +10,15 @@ import com.chwl.app.R
import com.chwl.app.databinding.RoomHeadlineWidgetBinding
import com.chwl.app.public_chat.core.ChatRoomClient
import com.chwl.app.public_chat.core.ChatRoomClientManager
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.im.custom.bean.CustomAttachment
import com.chwl.core.im.custom.bean.HeadlineChangedAttachment
import com.chwl.core.public_chat_hall.bean.HeadlineBean
import com.chwl.core.public_chat_hall.model.PublicChatModel
import com.chwl.core.support.room.FrameLayoutRoomWidget
import com.chwl.core.support.room.RoomView
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum
@@ -44,6 +48,12 @@ class RoomHeadlineWidget : FrameLayoutRoomWidget {
defStyleRes: Int
) : super(context, attrs, defStyleAttr, defStyleRes)
init {
if (UiUtils.isRtl(AppUtils.getApp())) {
binding.tvHeadlineContent.gravity = Gravity.RIGHT
}
}
override fun onStart(roomView: RoomView) {
super.onStart(roomView)
if (!isInEditMode) {
@@ -89,13 +99,11 @@ class RoomHeadlineWidget : FrameLayoutRoomWidget {
}
private fun updateHeadline(data: HeadlineBean?) {
val content = data?.content
if (data?.isValid() == true && !content.isNullOrEmpty()) {
binding.tvHeadlineContent.text = content
this.isVisible = true
} else {
this.isVisible = false
}
binding.tvHeadlineContent.text = data?.content ?: ""
binding.ivAvatar.loadAvatar(data?.avatar)
binding.tvName.text = "${data?.nick ?: ""} :"
binding.tvMoney.text = data?.payMoneyNum?.toString() ?: "0"
this.isVisible = data?.isValid() == true && !data.content.isNullOrEmpty()
}
override fun onStop() {

View File

@@ -9,6 +9,7 @@ import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.chwl.core.manager.RoomMicQueueModel;
import com.chwl.core.support.room.AudioRoomContext;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
@@ -121,11 +122,11 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
AvRoomDataManager.get().updateServiceRoomInfo(roomInfo);
mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid)
.flatMap(this::dealServerMicInfo)
.map(this::dealMicMemberFromIMNet)
.flatMap(this::dealMicChatRoomMemberFromIMNet)
.flatMap((Function<SparseArray<RoomQueueInfo>, ObservableSource<SparseArray<RoomQueueInfo>>>) roomQueue -> RoomMicQueueModel.INSTANCE.queueMicQueue(roomInfo.getRoomId(),roomQueue))
.compose(bindUntilEvent(PresenterEvent.DESTROY))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(roomQueueInfoSparseArray -> {
AvRoomDataManager.get().replaceMicQueue(roomQueueInfoSparseArray);
long uid = AuthModel.get().getCurrentUid();
AudioEngineManager.get().startRtcEngine(uid, roomInfo.getAudioSdkType());
// TODO 临时方案后续逐步完善整个房间的RoomContext替换计划
@@ -220,52 +221,12 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.ROOM_EXIT));
}
/**
* 处理网易云信队列上人员的信息
*/
private Observable<SparseArray<RoomQueueInfo>> dealMicChatRoomMemberFromIMNet(List<String> accounts) {
if (ListUtils.isListEmpty(accounts))
return Observable.just(AvRoomDataManager.get().mMicQueueMemberMap);
return IMNetEaseManager.get().fetchRoomMembersByIds(accounts).observeOn(AndroidSchedulers.mainThread())
.flatMap(chatRoomMembers -> {
for (ChatRoomMember chatRoomMember : chatRoomMembers) {
AvRoomDataManager.get().updateQueueChatRoomMemberExtension(chatRoomMember);
}
return Single.just(AvRoomDataManager.get().mMicQueueMemberMap);
}).toObservable();
}
/**
* 处理网易云信坑位信息
*/
private List<String> dealMicMemberFromIMNet(List<Entry<String, String>> entries) {
List<String> accounts = new ArrayList<>();
if (!ListUtils.isListEmpty(entries)) {
JsonParser jsonParser = new JsonParser();
MicMemberInfo chatRoomMember;
for (Entry<String, String> entry : entries) {
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key));
if (roomQueueInfo != null) {
JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject();
if (valueJsonObj != null) {
chatRoomMember = mGson.fromJson(valueJsonObj, MicMemberInfo.class);
accounts.add(chatRoomMember.getAccount());
roomQueueInfo.mChatRoomMember = chatRoomMember;
}
AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.key), roomQueueInfo);
}
}
}
return accounts;
}
/**
* 处理服务端坑位信息
*/
@Nullable
private ObservableSource<List<Entry<String, String>>> dealServerMicInfo(EnterChatRoomResultData enterChatRoomResultData) {
private ObservableSource<SparseArray<RoomQueueInfo>> dealServerMicInfo(EnterChatRoomResultData enterChatRoomResultData) {
AvRoomDataManager.get().mEnterChatRoomResultData = enterChatRoomResultData;
if (enterChatRoomResultData == null)
return Observable.error(new Throwable(GET_ROOM_FROM_IMNET_ERROR));
@@ -295,11 +256,12 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
//初始化所有坑位
Map<String, String> micMapStr = mGson.fromJson(roomMicStr, new TypeToken<Map<String, String>>() {
}.getType());
SparseArray<RoomQueueInfo> queue = new SparseArray<>();
for (Map.Entry<String, String> entry : micMapStr.entrySet()) {
AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.getKey()),
queue.put(Integer.valueOf(entry.getKey()),
new RoomQueueInfo(mGson.fromJson(entry.getValue(), RoomMicInfo.class), null));
}
return mAvRoomModel.queryRoomMicInfo(roomInfo.getRoomId());
return Observable.just(queue);
}
}
return Observable.error(new Throwable(GET_ROOM_FROM_IMNET_ERROR));

View File

@@ -3,13 +3,13 @@ package com.chwl.app.avroom.room_album
import android.annotation.SuppressLint
import android.os.Bundle
import com.hjq.toast.ToastUtils
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogLockRoomAlbumPhotoBinding
import com.chwl.app.ui.utils.ImageLoadUtilsV2
import com.chwl.core.gift.bean.GiftReceiveInfo
import com.chwl.core.manager.AvRoomDataManager
class UnlockRoomAlbumPhotoDialog : BaseDialog<DialogLockRoomAlbumPhotoBinding>(){
class UnlockRoomAlbumPhotoDialog : BaseDialogFragment<DialogLockRoomAlbumPhotoBinding>(){
var onUnlockRoomPhotoListener: OnUnlockRoomPhotoListener? = null

View File

@@ -5,7 +5,7 @@ import android.os.Bundle
import android.view.WindowManager
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkFinishBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.im.custom.bean.RoomPkBean
@@ -14,7 +14,7 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
class SingleRoomPkFinishDialog : BaseDialog<DialogSingleRoomPkFinishBinding>() {
class SingleRoomPkFinishDialog : BaseDialogFragment<DialogSingleRoomPkFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkForceFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class SingleRoomPkForceFinishDialog : BaseDialog<DialogSingleRoomPkForceFinishBinding>() {
class SingleRoomPkForceFinishDialog : BaseDialogFragment<DialogSingleRoomPkForceFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,7 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkReceivedBinding
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.manager.AvRoomDataManager
@@ -17,7 +17,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class SingleRoomPkReceivedDialog : BaseDialog<DialogSingleRoomPkReceivedBinding>() {
class SingleRoomPkReceivedDialog : BaseDialogFragment<DialogSingleRoomPkReceivedBinding>() {
companion object {

View File

@@ -1,12 +1,12 @@
package com.chwl.app.avroom.singleroompk
import android.text.method.ScrollingMovementMethod
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkRuleBinding
import com.chwl.core.room.anotherroompk.SingleRoomPKModel
import com.chwl.core.utils.extension.toast
class SingleRoomPkRuleDialog : BaseDialog<DialogSingleRoomPkRuleBinding>() {
class SingleRoomPkRuleDialog : BaseDialogFragment<DialogSingleRoomPkRuleBinding>() {
companion object {

View File

@@ -20,6 +20,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.chwl.app.avroom.dialog.RoomGameplayDialog;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.netease.nim.uikit.api.NimUIKit;
@@ -59,6 +60,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
*/
private static final int NEW_OPTION = 1;
private static final String SH_NEW_OPTION = "sh_new_option";
private static final String NEW_OPTION_ROOM_TYPE = "new_option_room_type";
private BottomViewListenerWrapper wrapper;
private ImageView openMic;
@@ -156,8 +158,11 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
if (newOption == NEW_OPTION) {
sendMagic.setImageResource(R.drawable.room_menu_ic_more);
if (isRemindOptionForRoomType()) {
sendMagic.setImageResource(R.drawable.room_menu_ic_more_new);
}
} else {
sendMagic.setImageResource(R.drawable.room_menu_ic_more);
sendMagic.setImageResource(R.drawable.room_menu_ic_more_new);
}
sendMagic.setClickable(true);
sendMagic.setOnClickListener(this);
@@ -168,6 +173,29 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
}
private boolean isRemindOptionForRoomType() {
boolean isReminded = (boolean) SharedPreferenceUtils.get(NEW_OPTION_ROOM_TYPE, false);
if (isReminded) {
return false;
}
if (RoomTypeSwitchActivity.Companion.isCanSwitch()) {
return true;
}
return false;
}
private boolean updateOptionForRoomType() {
boolean isReminded = (boolean) SharedPreferenceUtils.get(NEW_OPTION_ROOM_TYPE, false);
if (isReminded) {
return false;
}
if (RoomTypeSwitchActivity.Companion.isCanSwitch()) {
SharedPreferenceUtils.put(NEW_OPTION_ROOM_TYPE, true);
return true;
}
return false;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveRecentContactChanged(List<RecentContact> imMessages) {
setRoomMessageUnread(IMMessageManager.get().queryUnreadMsg());
@@ -215,6 +243,10 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
}
public void notifyStateChanged() {
setMagicBtnEnable(true);
}
public void showHomePartyUpMicBottom() {
faceLayout.setVisibility(VISIBLE);
micLayout.setVisibility(VISIBLE);
@@ -295,12 +327,14 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
break;
case R.id.icon_room_send_magic:
int newOption = (int) SharedPreferenceUtils.get(SH_NEW_OPTION, 0);
if (newOption != NEW_OPTION) {
SharedPreferenceUtils.put(SH_NEW_OPTION, NEW_OPTION);
setMagicBtnEnable(true);
}
if (updateOptionForRoomType()) {
setMagicBtnEnable(true);
}
if (wrapper != null) {
wrapper.onMoreBtnClick();

View File

@@ -6,7 +6,6 @@ import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
@@ -14,7 +13,7 @@ import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import com.chwl.core.helper.PathHelper;
import com.chwl.library.utils.PathHelper;
import com.chwl.library.download.DownloadException;
import com.chwl.library.download.DownloadManager;
import com.chwl.library.download.DownloadRequest;

View File

@@ -2286,7 +2286,7 @@ public class MessageView extends FrameLayout {
})
.append(ResUtil.getString(R.string.gift_message_01), new ForegroundColorSpan(getResources().getColor(R.color.white)));
text.append(luckyGiftInfo.getGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
text.append(luckyGiftInfo.getFirstGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
.append(luckyGiftInfo.getUser().getNick(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
@@ -2341,7 +2341,7 @@ public class MessageView extends FrameLayout {
})
.append(ResUtil.getString(R.string.gift_message_01), new ForegroundColorSpan(getResources().getColor(R.color.white)));
text.append(luckyGiftInfo.getGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
text.append(luckyGiftInfo.getFirstGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
.append(luckyGiftInfo.getUser().getNick(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {

View File

@@ -17,7 +17,7 @@ import com.trello.rxlifecycle3.components.support.RxDialogFragment
import kotlinx.coroutines.launch
import java.lang.reflect.ParameterizedType
abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
abstract class BaseDialogFragment<T : ViewBinding> : RxDialogFragment() {
val isViewLoaded: Boolean get() = _binding != null
protected var _binding: T? = null

View File

@@ -17,7 +17,6 @@ import com.chwl.app.databinding.PhotoDialogBinding
import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.library.common.base.BaseDialogFragment
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.photo.PhotoProviderNew
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback
@@ -84,7 +83,7 @@ class PhotoDialog : BaseDialogFragment<PhotoDialogBinding>(), EasyPermissions.Pe
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProviderNew.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
}
}
@@ -118,7 +117,7 @@ class PhotoDialog : BaseDialogFragment<PhotoDialogBinding>(), EasyPermissions.Pe
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProviderNew.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER)
PhotoProvider.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER)
}
}

View File

@@ -1,72 +0,0 @@
package com.chwl.app.decoration.adapter;
import android.view.View;
import com.chwl.app.R;
import com.chwl.app.bindadapter.BaseAdapter;
import com.chwl.app.bindadapter.BindingViewHolder;
import com.chwl.app.databinding.ItemHeadWearBinding;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.chwl.core.noble.NobleUtil;
import com.chwl.library.utils.ListUtils;
/**
* Created by huangmeng1 on 2018/5/10.
*/
public class HeadWearShopAdapter extends BaseAdapter<HeadWearInfo> {
private int selectPosition;
public int getSelectPosition() {
return selectPosition;
}
public void setSelectPosition(int selectPosition) {
notifyItemChanged(this.selectPosition);
this.selectPosition = selectPosition;
notifyItemChanged(this.selectPosition);
}
public HeadWearShopAdapter(int layoutResId, int brid) {
super(layoutResId, brid);
}
@Override
protected void convert(BindingViewHolder helper, HeadWearInfo item) {
super.convert(helper, item);
ItemHeadWearBinding binding = (ItemHeadWearBinding) helper.getBinding();
binding.llRoot.setSelected(selectPosition == helper.getAdapterPosition());
NobleUtil.loadHeadWears(item.getPic(), binding.ivHeadWear);
binding.setSelectPosition(selectPosition == helper.getAdapterPosition());
if (item.getLabelType() == HeadWearInfo.LABEL_TYPE_NORMAL) {
binding.ivTag.setVisibility(View.GONE);
} else if (HeadWearInfo.LABEL_TYPE_NEW == item.getLabelType()) {
binding.ivTag.setVisibility(View.VISIBLE);
binding.ivTag.setImageResource(R.drawable.ic_mark_new);
} else if (HeadWearInfo.LABEL_TYPE_DISCOUNT == item.getLabelType()) {
binding.ivTag.setVisibility(View.VISIBLE);
binding.ivTag.setImageResource(R.drawable.ic_mark_discount);
} else if (HeadWearInfo.LABEL_TYPE_LIMIT == item.getLabelType()) {
binding.ivTag.setVisibility(View.VISIBLE);
binding.ivTag.setImageResource(R.drawable.ic_mark_limit);
} else if (HeadWearInfo.LABEL_TYPE_EXCLUSIVE == item.getLabelType()) {
binding.ivTag.setVisibility(View.VISIBLE);
binding.ivTag.setImageResource(R.drawable.ic_mark_exclusive);
}
binding.tvHeadName.setText(item.getName() + "");
}
public void setCarInfoHasBeenBought(HeadWearInfo carInfo) {
if (carInfo.getHeadwearId() <= 0 || ListUtils.isListEmpty(mData)) return;
int index = mData.indexOf(carInfo);
if (index == -1) return;
mData.get(index).setStatus(HeadWearInfo.STATUS_IN_USED);
notifyItemChanged(index);
}
}

View File

@@ -6,9 +6,11 @@ import com.chwl.app.R;
import com.chwl.app.bindadapter.BaseAdapter;
import com.chwl.app.bindadapter.BindingViewHolder;
import com.chwl.app.databinding.ItemMyHeadWearBinding;
import com.chwl.app.utils.AvatarHelper;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.chwl.core.noble.NobleUtil;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.widget.SVGAView;
/**
* Created by huangmeng1 on 2018/5/11.
@@ -20,11 +22,14 @@ public class MyHeadWearAdapter extends BaseAdapter<HeadWearInfo> {
super(layoutResId, brid);
}
private SVGAView.SVGACache svgaCache = SVGAView.newCache(10);
@Override
protected void convert(BindingViewHolder helper, HeadWearInfo item) {
super.convert(helper, item);
ItemMyHeadWearBinding binding = (ItemMyHeadWearBinding) helper.getBinding();
NobleUtil.loadHeadWears(item.getPic(), binding.ivCarCover);
binding.ivCarCover.bindCache(svgaCache);
AvatarHelper.loadAvatarFrame(binding.ivCarCover, item.getFirstUrl(), item.getType());
helper.addOnClickListener(R.id.tv_used);
if (item.getLabelType() == HeadWearInfo.LABEL_TYPE_NORMAL) {

View File

@@ -19,25 +19,25 @@ class HomeMeViewModel : BaseViewModel() {
}
}
fun getHomeHistoryList(pageNum: Int) {
fun getHomeHistoryList(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
historyRoomListLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getHomeHistoryRoomList(pageNum, 10)
val result = HomeModel.getHomeHistoryRoomList(pageNum, pageSize)
historyRoomListLiveData.value = ListResult.success(result, pageNum)
}
)
}
fun getHomeCollectList(pageNum: Int) {
fun getHomeCollectList(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
collectRoomListLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getHomeMyCollectRoomList(pageNum, 10)
val result = HomeModel.getHomeMyCollectRoomList(pageNum, pageSize)
collectRoomListLiveData.value = ListResult.success(result, pageNum)
}
)

View File

@@ -27,13 +27,13 @@ class HomeViewModel : BaseViewModel() {
val homeTabLiveData: MutableLiveData<List<HomeTagInfo>> = MutableLiveData<List<HomeTagInfo>>()
val homeRankListLiveData = MutableLiveData<List<List<HomeRankBean>>>()
fun getTabRoomList(tabId: Int, pageNum: Int) {
fun getTabRoomList(tabId: Int, pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
tabRoomListLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getHomeTabHome(tabId, pageNum, 10)
val result = HomeModel.getHomeTabHome(tabId, pageNum, pageSize)
tabRoomListLiveData.value = ListResult.success(result, pageNum)
}
)

View File

@@ -1,6 +1,8 @@
package com.chwl.app.home.adapter;
import android.text.TextUtils;
import android.widget.TextView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
@@ -59,7 +61,8 @@ public class CommunityNoticeAdapter extends BaseQuickAdapter<CommunityNoticeInfo
}
helper.setGone(R.id.tv_label_community_notice_list, false);
helper.setText(R.id.tv_content_community_notice_list, item.getMessage());
TextView textView = helper.getView(R.id.tv_content_community_notice_list);
textView.setText(item.getMessage());
switch (item.getActionType()) {
case 1: // 评论
if (item.getTargetUid() == AuthModel.get().getCurrentUid()) {

View File

@@ -39,8 +39,8 @@ public class HomeIndicatorAdapter extends CommonNavigatorAdapter {
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white_transparent_60));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_FFFFFF));
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.color_990C1D18));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_0C1D18));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 13);
@@ -59,10 +59,10 @@ public class HomeIndicatorAdapter extends CommonNavigatorAdapter {
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(UIUtil.dip2px(mContext, 2.5));
indicator.setRoundRadius(UIUtil.dip2px(mContext, 1.5));
indicator.setLineWidth(UIUtil.dip2px(mContext, 10));
indicator.setColors(context.getResources().getColor(R.color.color_10ECD6));
indicator.setLineHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_4));
indicator.setRoundRadius(context.getResources().getDimensionPixelOffset(R.dimen.dp_2));
indicator.setLineWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_13));
indicator.setColors(context.getResources().getColor(R.color.color_002512));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// lp.bottomMargin = mBottomMargin;
indicator.setLayoutParams(lp);

View File

@@ -1,9 +1,13 @@
package com.chwl.app.home.adapter
import android.graphics.Rect
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
@@ -11,14 +15,54 @@ import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadFromAssets
import com.chwl.core.home.bean.HomeRoomInfo
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
/**
* create by lvzebiao @2019/11/13
*/
class HomeRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_item_room) {
class HomeRoomAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_item_room) {
private var micUserItemViewPool = RecycledViewPool().apply {
setMaxRecycledViews(0, 50)
}
private val isRTL = UiUtils.isRtl(AppUtils.getApp())
override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateDefViewHolder(parent, viewType).apply {
val micUserRecyclerView = this.getView<RecyclerView>(R.id.recycler_view_users)
micUserRecyclerView.setOnTouchListener { v, event -> true }
micUserRecyclerView.setRecycledViewPool(micUserItemViewPool)
micUserRecyclerView.setHasFixedSize(true)
micUserRecyclerView.layoutManager =
LinearLayoutManager(parent.context, RecyclerView.HORIZONTAL, false).apply {
this.recycleChildrenOnDetach = true
this.isSmoothScrollbarEnabled
}
micUserRecyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
val offset = AppUtils.getApp().resources.getDimensionPixelOffset(R.dimen.dp_4) * -1
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val position = parent.getChildAdapterPosition(view)
if (position != 0) {
if (isRTL) {
outRect.right = offset
} else {
outRect.left = offset
}
}
}
})
micUserRecyclerView.adapter = HomeRoomUserAdapter()
}
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
@@ -28,18 +72,10 @@ class HomeRoomAdapter :
setText(R.id.tv_desc, item.roomDesc)
}
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].isInvisible = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
val micUserRecyclerView = helper.getView<RecyclerView>(R.id.recycler_view_users)
val userAdapter = micUserRecyclerView.adapter as HomeRoomUserAdapter
userAdapter.setNewData(item.micUsers)
val topView = helper.getView<ImageView>(R.id.iv_top)
if (item.isHourTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_hour_top)

View File

@@ -0,0 +1,16 @@
package com.chwl.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.home.bean.MicUsersBean
class HomeRoomUserAdapter :
BaseQuickAdapter<MicUsersBean, BaseViewHolder>(R.layout.home_item_room_user) {
override fun convert(helper: BaseViewHolder, item: MicUsersBean?) {
val avatarView = helper.getView<ImageView>(R.id.iv_avatar)
avatarView.loadAvatar(item?.avatar)
}
}

View File

@@ -7,14 +7,14 @@ import android.view.WindowManager
import android.widget.ImageView
import androidx.core.view.isGone
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogHelloMessageBinding
import com.chwl.app.ui.utils.load
import com.chwl.app.room_chat.activity.RoomMsgActivity
import com.chwl.core.channel_page.bean.HelloMessageInfo
import com.chwl.library.utils.ResUtil
class HelloMessageDialog : BaseDialog<DialogHelloMessageBinding>() {
class HelloMessageDialog : BaseDialogFragment<DialogHelloMessageBinding>() {
companion object {

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogNewUserHelloBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.channel_page.bean.NewUserHelloInfo
import com.chwl.core.utils.extension.subAndReplaceDot
class NewUserHelloDialog : BaseDialog<DialogNewUserHelloBinding>() {
class NewUserHelloDialog : BaseDialogFragment<DialogNewUserHelloBinding>() {
companion object {

View File

@@ -3,12 +3,12 @@ package com.chwl.app.home.dialog
import android.annotation.SuppressLint
import android.os.Bundle
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRecommendRoomBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.home.bean.HomeRoomInfo
class RecommendRoomDialog : BaseDialog<DialogRecommendRoomBinding>() {
class RecommendRoomDialog : BaseDialogFragment<DialogRecommendRoomBinding>() {
companion object {

View File

@@ -26,6 +26,7 @@ import com.chwl.app.support.FragmentVisibleStateHelper
import com.chwl.app.ui.im.friend.FriendListFragment
import com.chwl.app.ui.im.recent.RecentListFragment
import com.chwl.app.ui.relation.FansListFragment
import com.chwl.app.ui.user.adapter.ContactsIndicatorAdapter
import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.chwl.core.Constants
@@ -85,7 +86,7 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
tagList.add(getString(R.string.layout_fragment_contact_list_04))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
val magicIndicatorAdapter = UserInfoIndicatorAdapter(context, tagList)
val magicIndicatorAdapter = ContactsIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.viewPager.currentItem = position
}
@@ -138,7 +139,7 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
}
override fun onScroll(
e1: MotionEvent,
e1: MotionEvent?,
e2: MotionEvent,
distanceX: Float,
distanceY: Float
@@ -150,7 +151,7 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
}
override fun onFling(
e1: MotionEvent,
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float

View File

@@ -198,7 +198,7 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
override fun createFragment(position: Int): Fragment {
val itemId = getItemId(position)
return HomeTabRoomFragment.newInstance(itemId.toInt()).apply {
autoRefreshOnVisible = true
this.autoRefreshOnVisible = true
}
}

View File

@@ -29,6 +29,7 @@ class HomeRoomCollectListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
private val viewModel: HomeMeViewModel by viewModels()
private var pageNum = 1
private val pageSize = 50
companion object {
fun newInstance(): HomeRoomCollectListFragment {
@@ -58,7 +59,7 @@ class HomeRoomCollectListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
}
}
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setPageSize(10)
.setPageSize(pageSize)
.setAdapter(adapter)
.setRecyclerView(binding.mRecyclerRoom)
.setEmptyView(
@@ -90,7 +91,7 @@ class HomeRoomCollectListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
} else {
pageNum++
}
viewModel.getHomeCollectList(pageNum)
viewModel.getHomeCollectList(pageNum, pageSize)
}
override fun onRefresh() {

View File

@@ -29,6 +29,7 @@ class HomeRoomHistoryListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
private val viewModel: HomeMeViewModel by viewModels()
private var pageNum = 1
private val pageSize = 50
companion object {
fun newInstance(): HomeRoomHistoryListFragment {
@@ -58,7 +59,7 @@ class HomeRoomHistoryListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
}
}
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setPageSize(10)
.setPageSize(pageSize)
.setAdapter(adapter)
.setRecyclerView(binding.mRecyclerRoom)
.setEmptyView(
@@ -90,7 +91,7 @@ class HomeRoomHistoryListFragment : BaseViewBindingFragment<HomeTabRoomFragmentB
} else {
pageNum++
}
viewModel.getHomeHistoryList(pageNum)
viewModel.getHomeHistoryList(pageNum, pageSize)
}
override fun onRefresh() {

View File

@@ -1,7 +1,6 @@
package com.chwl.app.home.fragment
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
@@ -33,6 +32,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
var autoRefreshOnVisible = false
private var pageNum = 1
private val pageSize = 50
private var tabId: Int? = null
companion object {
@@ -70,7 +70,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
}
}
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setPageSize(10)
.setPageSize(pageSize)
.setAdapter(adapter)
.setRecyclerView(binding.mRecyclerRoom)
.setEmptyView(
@@ -102,7 +102,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
} else {
pageNum++
}
homeViewModel.getTabRoomList(tabId ?: 0, pageNum)
homeViewModel.getTabRoomList(tabId ?: 0, pageNum, pageSize)
}
override fun onRefresh() {

View File

@@ -35,6 +35,8 @@ import com.chwl.core.utils.net.RxHelper;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import io.reactivex.Single;
public class OpenRoomHelper {
public static void openRoom(BaseActivity activity) {
@@ -135,6 +137,25 @@ public class OpenRoomHelper {
}
public static Single<RoomInfo> updateRoomInfoRx(RoomInfo roomInfo, int type, long gameId) {
RoomSettingModel roomSettingModel = new RoomSettingModel();
return roomSettingModel.updateRoomInfo(
roomInfo.getTitle(),
roomInfo.getRoomDesc(),
roomInfo.getIntroduction(),
roomInfo.roomPwd,
roomInfo.getRoomTypeLable(),
roomInfo.tagId,
roomInfo.getUid(),
AuthModel.get().getTicket(),
roomInfo.isHasAnimationEffect(),
roomInfo.getAudioQuality(),
roomInfo.getLimitType(),
roomInfo.isPureMode(),
type,
gameId);
}
public static void updateRoomInfo(BaseActivity activity, RoomInfo roomInfo, int type, long gameId, boolean needOpen) {
RoomSettingModel roomSettingModel = new RoomSettingModel();
roomSettingModel.updateRoomInfo(

View File

@@ -15,7 +15,12 @@ import androidx.databinding.DataBindingUtil;
import com.bumptech.glide.request.RequestOptions;
import com.chwl.app.ui.login.LoginPasswordActivity;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.bean.response.result.TicketResult;
import com.chwl.core.gift.GiftModel;
import com.chwl.library.language.LanguageHelper;
import com.chwl.library.utils.SingleToastUtil;
import com.example.lib_utils.log.LogUtil;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.chwl.app.MainActivity;
@@ -32,6 +37,10 @@ import com.chwl.core.utils.OaidUtil;
import com.chwl.core.utils.SharedPreferenceUtils;
import com.chwl.library.common.util.DeviceUtil;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
/**
* @author xiaoyu
* @date 2017/12/30
@@ -43,8 +52,15 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
private ActivitySplashBinding mBinding;
private SplashComponent mLocalSplashVo;
private CompositeDisposable disposable = new CompositeDisposable();
// ticket状态 -1:加载失败、0:加载中、1:加载成功
private int ticketState = 0;
private volatile boolean needJump = false;
private Runnable jumpRunnable;
public static void start(Context context) {
Intent starter = new Intent(context, SplashActivity.class);
context.startActivity(starter);
@@ -72,9 +88,10 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
// 从堆栈恢复不再重复解析之前的intent
setIntent(new Intent());
}
initiate();
StatusBarUtil.transparencyBar(this);
StatusBarUtil.StatusBarLightMode(this);
initTicket();
initiate();
}
@Override
@@ -145,8 +162,12 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
}
public void jumpActivity(Intent intent) {
AccountInfo currentAccountInfo = DemoCache.readCurrentAccountInfo();
if (currentAccountInfo == null || TextUtils.isEmpty(currentAccountInfo.getAccess_token())) {
jumpRunnable = () -> jumpActivityImpl(intent);
next();
}
public void jumpActivityImpl(Intent intent) {
if (!AuthModel.get().isLogin()) {
NimMiddleActivity.openCommunity = false;
LoginPasswordActivity.start(this);
finish();
@@ -190,4 +211,53 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
}
private void initTicket() {
ticketState = 0;
if (!AuthModel.get().isLogin()) {
ticketState = -1;
next();
return;
}
AuthModel.get().refreshTicket().subscribe(new SingleObserver<TicketResult>() {
@Override
public void onSubscribe(Disposable d) {
disposable.add(d);
}
@Override
public void onSuccess(TicketResult ticketResult) {
LogUtil.d("SplashActivity", "initTicket onSuccess", false);
onTicketSuccess();
ticketState = 1;
next();
}
@Override
public void onError(Throwable throwable) {
LogUtil.d("SplashActivity", "initTicket throwable:" + throwable.getMessage(), false);
SingleToastUtil.showToast(throwable.getMessage());
AuthModel.get().reset();
ticketState = -1;
next();
}
});
}
private void onTicketSuccess() {
GiftModel.get().tryLoadGiftList();
}
private void next() {
if (ticketState != 0 && jumpRunnable != null) {
jumpRunnable.run();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
}

View File

@@ -15,6 +15,7 @@ import com.chwl.library.common.util.AlbumUtils;
import com.chwl.library.common.util.ExecutorCenter;
import com.chwl.library.utils.ResUtil;
import com.example.matisse.internal.entity.CustomItem;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.log.LogUtil;
import java.util.ArrayList;
@@ -192,4 +193,16 @@ public class BigPhotoActivity extends BaseViewBindingActivity<ActivityBigPhotoBi
super.finish();
}
@Override
protected boolean needSteepStateBar() {
return true;
}
@Override
protected void setStatusBar() {
super.setStatusBar();
StatusBarUtil.transparencyBar(this);
StatusBarUtil.StatusBarLightMode(this);
}
}

View File

@@ -0,0 +1,76 @@
package com.chwl.app.photo;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chwl.app.R;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.core.community.bean.DynamicMedia;
import com.chwl.library.utils.ScreenUtils;
import com.chwl.library.utils.config.BasicConfig;
import java.util.List;
import lombok.Setter;
public class DynamicImageAdapter extends BaseQuickAdapter<DynamicMedia, BaseViewHolder> {
private Context context;
@Setter
private int mTwoImageHeight;
@Setter
private int mThreeImageHeight;
private int imageWidth;
private int bigImageWidth;
@Setter
private int singleImageHeight;
public DynamicImageAdapter(int layoutResId, @Nullable List<DynamicMedia> data) {
super(layoutResId, data);
context = BasicConfig.INSTANCE.getAppContext();
imageWidth = UIUtil.getScreenWidth(context) * 2 / 5;
bigImageWidth = UIUtil.getScreenWidth(context);
mTwoImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 50F)) / 2;
mThreeImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 60F)) / 3;
}
@Override
protected void convert(BaseViewHolder helper, DynamicMedia item) {
ImageView ivPhoto = helper.getView(R.id.riv_photo);
helper.setGone(R.id.iv_gif_tag, item.isGif());
ViewGroup.LayoutParams layoutParams = ivPhoto.getLayoutParams();
if (helper.itemView instanceof ConstraintLayout && getData().size() > 1) {
ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth);
} else {
switch (getData().size()) {
case 1:
layoutParams.height = singleImageHeight;
ivPhoto.setLayoutParams(layoutParams);
ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), bigImageWidth);
break;
case 2:
layoutParams.height = mTwoImageHeight;
ivPhoto.setLayoutParams(layoutParams);
ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth);
break;
case 3:
default:
layoutParams.height = mThreeImageHeight;
ivPhoto.setLayoutParams(layoutParams);
ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth);
break;
}
}
}
}

View File

@@ -3,7 +3,7 @@ package com.chwl.app.support
import androidx.lifecycle.viewModelScope
import com.chwl.app.BuildConfig
import com.chwl.app.base.BaseViewModel
import com.chwl.core.helper.PathHelper
import com.chwl.library.utils.PathHelper
import com.chwl.core.home.model.HomeModel
import com.chwl.library.common.util.SPUtils
import com.chwl.library.download.DownloadException

View File

@@ -0,0 +1,50 @@
package com.chwl.app.ui.debug
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.DebugActivityBinding
import com.netease.nim.uikit.StatusBarUtil
class DebugActivity : BaseViewBindingActivity<DebugActivityBinding>() {
override fun init() {
initWhiteTitleBar("调试")
initSVGAList()
}
private fun initSVGAList() {
val adapter = DebugAdapter()
binding.recyclerView.adapter = adapter
// binding.recyclerView.setItemViewCacheSize(-1)
val svgaList = listOf(
"https://image.pekolive.com/花和玫瑰.svga",
"https://image.pekolive.com/firecrown.svga",
"https://image.pekolive.com/ningtangchengbaoqietu.svga",
"https://image.pekolive.com/xunmengfengche.svga",
"https://image.pekolive.com/tonghuaqiyuan1334.svga",
"https://image.pekolive.com/mengquyinhe.svga",
"https://image.pekolive.com/duqinghuashu.svga",
"https://image.pekolive.com/juzhijingling.svga",
"https://image.pekolive.com/3121_aixintouwei.svga",
"https://image.pekolive.com/4051_langmanyewan.svga"
)
val list = ArrayList<String>()
list.addAll(svgaList)
list.addAll(svgaList)
adapter.setNewData(list)
binding.btnRefreshAll.setOnClickListener {
adapter.notifyDataSetChanged()
}
binding.btnRefresh.setOnClickListener {
adapter.notifyItemChanged(5, true)
}
}
override fun needSteepStateBar(): Boolean {
return true
}
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -0,0 +1,47 @@
package com.chwl.app.ui.debug
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.library.widget.SVGAView
import com.example.lib_utils.log.ILog
class DebugAdapter : BaseQuickAdapter<String, BaseViewHolder>(R.layout.debug_item_svga), ILog {
private val svgaCache = SVGAView.newCache(10)
override fun convertPayloads(
helper: BaseViewHolder,
item: String?,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
logD("convertPayloads holder:${helper.absoluteAdapterPosition} #${helper.hashCode()} SVGAView")
val svgaView = helper.getView<SVGAView>(R.id.svga_view)
svgaView.loadUrl(item)
}
override fun convert(helper: BaseViewHolder, item: String?) {
logD("convert holder:${helper.absoluteAdapterPosition} #${helper.hashCode()} SVGAView")
helper.setText(R.id.tv_name, helper.absoluteAdapterPosition.toString())
val item = getItem(helper.bindingAdapterPosition)
val svgaView = helper.getView<SVGAView>(R.id.svga_view)
svgaView.bindCache(svgaCache)
svgaView.setLogTag(helper.absoluteAdapterPosition.toString())
svgaView.loadUrl(item)
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
logD("onViewAttachedToWindow holder:${holder.absoluteAdapterPosition} #${holder.hashCode()} SVGAView")
// val item = getItem(holder.bindingAdapterPosition)
// val svgaView = holder.getView<SVGAView>(R.id.svga_view)
// svgaView.bindCache(SVGAView.newCache(10))
// svgaView.setLogTag(holder.absoluteAdapterPosition.toString())
// svgaView.loadUrl(item)
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
super.onViewDetachedFromWindow(holder)
logD("onViewDetachedFromWindow holder:${holder.absoluteAdapterPosition} #${holder.hashCode()} SVGAView")
}
}

View File

@@ -0,0 +1,61 @@
package com.chwl.app.ui.feedback
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseBindingDialog
import com.chwl.app.databinding.FeedbackCustomerServiceDialogBinding
import com.chwl.app.ui.widget.recyclerview.decoration.SpacingDecoration
import com.chwl.library.annatation.ActLayoutRes
import com.chwl.library.utils.SingleToastUtil
@ActLayoutRes(R.layout.feedback_customer_service_dialog)
class CustomerServiceDialog(context: Context, val map: Map<String, String?>) :
BaseBindingDialog<FeedbackCustomerServiceDialogBinding>(context, R.style.dialog) {
private val adapter = CustomerServiceItemAdapter()
override fun onStart() {
width = WindowManager.LayoutParams.MATCH_PARENT
super.onStart()
}
override fun init() {
binding.layoutRoot.setOnClickListener {
dismiss()
}
binding.tvNext.setOnClickListener {
dismiss()
}
binding.recyclerView.addItemDecoration(
SpacingDecoration(
0,
context.resources.getDimensionPixelOffset(R.dimen.dp_10),
false
)
)
binding.recyclerView.adapter = adapter
val list = map.map {
it
}
adapter.setNewData(list)
adapter.setOnItemChildClickListener { adapter, view, position ->
val text = this.adapter.getItem(position)?.value
if (text != null) {
copyText(text)
}
}
}
private fun copyText(text: String) {
try {
val cm =
context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
cm.setPrimaryClip(ClipData.newPlainText("text", text))
SingleToastUtil.showToast(R.string.have_copy)
} catch (e: Exception) {
SingleToastUtil.showToast(e.toString())
}
}
}

View File

@@ -0,0 +1,34 @@
package com.chwl.app.ui.feedback
import android.annotation.SuppressLint
import android.view.Gravity
import android.view.ViewGroup
import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
class CustomerServiceItemAdapter :
BaseQuickAdapter<Map.Entry<String, String?>, BaseViewHolder>(R.layout.feedback_customer_service_item) {
private var isRTL = UiUtils.isRtl(AppUtils.getApp())
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateViewHolder(parent, viewType).apply {
this.addOnClickListener(R.id.layout_copy)
val textView = getView<TextView>(R.id.tv_content)
if (isRTL) {
textView.gravity = Gravity.RIGHT
}
}
}
@SuppressLint("SetTextI18n")
override fun convert(helper: BaseViewHolder, item: Map.Entry<String, String?>) {
val textView = helper.getView<TextView>(R.id.tv_content)
textView.text = "${item.key}: ${item.value ?: ""}"
}
}

View File

@@ -0,0 +1,353 @@
package com.chwl.app.ui.feedback
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Build
import android.widget.ImageView.ScaleType
import androidx.activity.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.FeedbackActivityBinding
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.core.file.FileModel
import com.chwl.core.home.bean.FeedbackTypeBean
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.photo.PhotoProvider.photoProvider
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.easypermisssion.EasyPermissions
import com.chwl.library.easyphoto.utils.settings.SettingsUtils
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.SolveEditTextScrollClash
import com.example.lib_utils.ktx.getColorById
import com.example.lib_utils.ktx.setOnInputChangedListener
import com.example.lib_utils.ktx.singleClick
import com.example.lib_utils.spannable.SpannableTextBuilder
import com.google.android.flexbox.FlexDirection
import com.google.android.flexbox.FlexWrap
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.StatusBarUtil
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
EasyPermissions.PermissionCallbacks {
private val PERMISSION_CODE_STORAGE = 12
private val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
private val viewModel: FeedbackViewModel by viewModels()
private val adapter = FeedbackTypeAdapter()
private var compressJob: Job? = null
private var wantShowCustomerService = false
private var imagePath: String? = null
private var imageUrl: String? = null
override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.feedback_title))
initView()
initEvent()
initObserve()
refreshSubmitState()
}
private fun initView() {
val flexBoxLayoutManager = FlexboxLayoutManager(context)
flexBoxLayoutManager.flexDirection = FlexDirection.ROW
flexBoxLayoutManager.flexWrap = FlexWrap.WRAP
flexBoxLayoutManager.justifyContent = JustifyContent.FLEX_START
binding.recyclerViewType.layoutManager = flexBoxLayoutManager
binding.recyclerViewType.adapter = adapter
binding.etContent.setOnTouchListener(SolveEditTextScrollClash(binding.etContent))
}
private fun initEvent() {
adapter.setOnItemClickListener { adapter, view, position ->
this.adapter.selectItem(this.adapter.getItem(position))
refreshSubmitState()
}
binding.tvSubmit.singleClick {
dialogManager.showProgressDialog(this)
submit()
}
binding.ivImage.singleClick {
checkStoragePermission()
}
binding.ivCustomerService.singleClick {
showCustomerServiceDialog()
}
binding.etContent.setOnInputChangedListener {
updateContentInputTips(this)
refreshSubmitState()
true
}
binding.etContact.setOnInputChangedListener {
refreshSubmitState()
true
}
}
private fun initObserve() {
viewModel.loadingLiveData.observe(this) {
if (it) dialogManager.showProgressDialog(this)
else dialogManager.dismissDialog()
}
viewModel.configLiveData.observe(this) {
if (it?.isSuccess == true) {
loadTypeList(it.data?.typeEnumList)
if (wantShowCustomerService) {
showCustomerServiceDialog(it.data?.customContactMap)
}
} else if (it?.message != null) {
toast(it.message ?: "")
}
wantShowCustomerService = false
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
viewModel.submitStateFlow.collectLatest {
dialogManager.dismissDialog()
if (it.isSuccess) {
toast(R.string.home_model_homemodel_01)
finish()
} else if (it.message != null) {
toast(it.message)
}
}
}
}
}
private fun updateContentInputTips(length: Int) {
if (length > 0) {
SpannableTextBuilder(binding.tvContentCount)
.appendText(
text = length.toString(),
textColor = getColorById(R.color.color_3FDDAC)
)
.appendText(text = "/300")
.apply()
} else {
binding.tvContentCount.text = "${length}/300"
}
}
private fun showCustomerServiceDialog() {
val config = viewModel.configLiveData.value?.data
if (config == null) {
wantShowCustomerService = true
viewModel.getConfig()
return
}
showCustomerServiceDialog(config.customContactMap)
}
private fun showCustomerServiceDialog(info: Map<String, String>?) {
if (info.isNullOrEmpty()) {
return
}
CustomerServiceDialog(this, info).show()
}
private fun loadTypeList(type: List<FeedbackTypeBean>?) {
adapter.setNewData(type)
}
private fun onAddImage(path: String?) {
if (path.isNullOrEmpty()) {
imagePath = null
imageUrl = null
binding.ivImage.scaleType = ScaleType.CENTER_INSIDE
binding.ivImage.setImageResource(R.drawable.feedback_ic_add)
} else {
imagePath = path
imageUrl = null
binding.ivImage.load(path)
binding.ivImage.scaleType = ScaleType.CENTER_CROP
}
refreshSubmitState()
}
private fun refreshSubmitState() {
binding.tvSubmit.isEnabled = canSubmit()
}
private fun canSubmit(): Boolean {
if (binding.etContent.text.isNullOrEmpty()) {
return false
}
if (binding.etContact.text.isNullOrEmpty()) {
return false
}
if (adapter.getSelectItem() == null) {
return false
}
return true
}
private fun submit() {
val content = binding.etContent.text.trim().toString()
val contact = binding.etContact.text.trim().toString()
val type = adapter.getSelectItem()?.type ?: ""
val imagePath = imagePath
if (imagePath != null && imageUrl == null) {
uploadImage(imagePath, {
imageUrl = it
submit()
}, {
if (it != null) {
toast(ResUtil.getString(R.string.ui_user_userinfomodifyactivity_08) + ":${it.message}")
}
dialogManager.dismissDialog()
})
} else {
viewModel.submitFeedback(
type = type,
content = content,
image = imageUrl ?: "",
contact = contact
)
}
}
@SuppressLint("CheckResult")
private fun uploadImage(path: String, success: (String) -> Unit, failed: (Throwable?) -> Unit) {
FileModel.get()
.uploadFile(path)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (url != null) {
success.invoke(url)
} else {
failed.invoke(throwable)
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE_OPEN_PHOTO_PROVIDER) {
if (data == null) {
return
}
PhotoProvider.getResultPathListAsync(data) { list ->
if (list.isNullOrEmpty()) {
SingleToastUtil.showToastShort(com.netease.nim.uikit.R.string.picker_image_error)
return@getResultPathListAsync
}
val paths = list.map { it.path }.toMutableList()
compressPhotos(paths)
}
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String?>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
photoProvider(
this,
1,
true,
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
true,
true
)
}
}
private fun compressPhotos(paths: MutableList<String>) {
compressJob?.cancel(null)
compressJob = PhotoCompressUtil.compress(
this, paths,
PhotoCompressUtil.getCompressCachePath(),
object : PhotosCompressCallback {
override fun onSuccess(compressedImgList: ArrayList<String>) {
val firstItem = compressedImgList.firstOrNull() ?: return
onAddImage(firstItem)
}
override fun onFail(e: Throwable) {
ToastUtils.show(getString(R.string.picker_image_error))
}
}
)
}
override fun needSteepStateBar(): Boolean {
return true
}
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
checkStoragePermission()
}
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
val requestTip = getString(R.string.permission_storage_denied)
val mPrivacyDialog = CommonTipDialog(context)
mPrivacyDialog.setTipMsg(requestTip)
mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update))
mPrivacyDialog.setOnActionListener(object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
SettingsUtils.startMyApplicationDetailsForResult(
this@FeedbackActivity,
packageName
)
}
override fun onCancel() {
super.onCancel()
//取消跳到应用详情页面
ToastUtils.show(getString(R.string.permission_storage_refused))
}
})
mPrivacyDialog.show()
}
}
override fun onResume() {
super.onResume()
if (viewModel.configLiveData.value?.data == null) {
viewModel.getConfig()
}
}
}

View File

@@ -0,0 +1,42 @@
package com.chwl.app.ui.feedback
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.core.home.bean.FeedbackTypeBean
class FeedbackTypeAdapter : BaseQuickAdapter<FeedbackTypeBean, BaseViewHolder>(R.layout.feedback_item_type) {
private var selectItem: FeedbackTypeBean? = null
override fun convertPayloads(
helper: BaseViewHolder,
item: FeedbackTypeBean?,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
override fun convert(helper: BaseViewHolder, item: FeedbackTypeBean?) {
helper.setText(R.id.tv_name, item?.desc ?: "")
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: FeedbackTypeBean?) {
if (selectItem == item) {
helper.setBackgroundRes(R.id.tv_name, R.drawable.shape_85f6d3_15dp)
} else {
helper.setBackgroundRes(R.id.tv_name, R.drawable.shape_f3f5fa_15dp)
}
}
fun selectItem(item: FeedbackTypeBean?) {
this.selectItem = item
notifyItemRangeChanged(0, itemCount, true)
}
fun getSelectItem(): FeedbackTypeBean? {
return selectItem
}
}

View File

@@ -0,0 +1,36 @@
package com.chwl.app.ui.feedback
import androidx.lifecycle.MutableLiveData
import com.chwl.app.base.BaseViewModel
import com.chwl.core.bean.response.BeanResult
import com.chwl.core.home.bean.FeedbackConfigBean
import com.chwl.core.home.model.HomeModel
import kotlinx.coroutines.flow.MutableSharedFlow
class FeedbackViewModel : BaseViewModel() {
val configLiveData = MutableLiveData<BeanResult<FeedbackConfigBean>?>()
val submitStateFlow = MutableSharedFlow<BeanResult<Any?>>()
fun getConfig() {
safeLaunch(
needLoading = true,
onError = {
configLiveData.postValue(BeanResult.failed(it))
}) {
val value = HomeModel.getFeedbackConfig()
configLiveData.postValue(BeanResult.success(value))
}
}
fun submitFeedback(type: String, content: String, image: String, contact: String) {
safeLaunch(
needLoading = true,
onError = {
submitStateFlow.emit(BeanResult.failed(it))
}) {
val value = HomeModel.commitFeedback(contact, content, image, type)
submitStateFlow.emit(BeanResult.success(value))
}
}
}

View File

@@ -0,0 +1,202 @@
package com.chwl.app.ui.game_team.invite
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Gravity
import android.view.WindowManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.chwl.app.R
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.databinding.GameTeamInviteDialogBinding
import com.chwl.app.ui.pay.ChargeActivity
import com.chwl.app.ui.utils.load
import com.chwl.core.game_team.UserGameTeamInfo
import com.chwl.core.pay.PayModel
import com.chwl.core.pay.bean.WalletInfo
import com.chwl.core.utils.net.BalanceNotEnoughExeption
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.ktx.singleClick
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.math.BigDecimal
import java.math.RoundingMode
class GameTeamInviteDialog : BaseDialogFragment<GameTeamInviteDialogBinding>() {
private val viewModel: GameTeamInviteViewModel by viewModels()
override var width = WindowManager.LayoutParams.MATCH_PARENT
override var gravity = Gravity.CENTER
private var gameId: Long = 0
private var gameUid: Long = 0
private var gameBackground: String? = null
private var gamePrice: Long = 0
private var gameInning: Long = 1
private var dialogManager: DialogManager? = null
var successListener: (() -> Unit)? = null
companion object {
fun newInstance(info: UserGameTeamInfo): GameTeamInviteDialog {
return newInstance(info.uid ?: 0, info.gameId ?: 0, info.pic, info.price ?: 0, 1)
}
fun newInstance(
targetUid: Long,
gameId: Long,
gameBackground: String?,
gamePrice: Long,
gameInning: Long,
): GameTeamInviteDialog {
return GameTeamInviteDialog().apply {
arguments = Bundle().apply {
putLong("targetUid", targetUid)
putLong("gameId", gameId)
putSerializable("gameBackground", gameBackground)
putLong("gamePrice", gamePrice)
putLong("gameInning", gameInning)
}
}
}
}
override fun init() {
gameUid = arguments?.getLong("targetUid") ?: 0
gameId = arguments?.getLong("gameId") ?: 0
gameBackground = arguments?.getString("gameBackground")
gamePrice = arguments?.getLong("gamePrice") ?: 0
gameInning = arguments?.getLong("gameInning") ?: 1
dialogManager = DialogManager(requireContext())
initView()
initEvent()
initObserve()
}
override fun onResume() {
super.onResume()
updateBalance()
}
private fun initView() {
binding.ivGameImage.load(gameBackground)
updateInning(0)
requestBalance()
}
private fun initEvent() {
binding.ivClose.setOnClickListener {
safeDismiss()
}
binding.tvPay.singleClick {
pay()
}
binding.layoutRecharge.setOnClickListener {
ChargeActivity.start(context)
}
binding.ivCountAdd.setOnClickListener {
updateInning(1)
}
binding.ivCountSubtract.setOnClickListener {
updateInning(-1)
}
}
private fun initObserve() {
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.payResultFlow.collectLatest {
dialogManager?.dismissDialog()
if (it.isSuccess) {
successListener?.invoke()
SingleToastUtil.showToast(R.string.game_team_19)
safeDismiss()
} else if (it.code == BalanceNotEnoughExeption.code) {
showBalanceNotEnoughDialog()
} else {
it.message?.let { msg ->
SingleToastUtil.showToast(msg)
}
}
}
}
}
}
private fun showBalanceNotEnoughDialog() {
dialogManager?.showOkCancelDialog(
ResUtil.getString(R.string.widget_dialog_dialoguihelper_04),
ResUtil.getString(R.string.treasure_to_charge)
) {
ChargeActivity.start(context)
}
}
private fun pay() {
dialogManager?.showProgressDialog(requireContext())
viewModel.pay(gameId, gameUid, gameInning)
}
private fun updateInning(add: Int) {
var newInning = gameInning + add
if (newInning <= 0) {
newInning = 1
}
gameInning = newInning
if (gameInning <= 1L) {
binding.ivCountSubtract.setImageResource(R.drawable.game_team_invite_ic_subtract_disabled)
binding.ivCountSubtract.isEnabled = false
} else {
binding.ivCountSubtract.setImageResource(R.drawable.game_team_invite_ic_subtract)
binding.ivCountSubtract.isEnabled = true
}
binding.tvCount.text = gameInning.toString()
updateMoney()
}
private fun updateMoney() {
val total = gamePrice * gameInning
binding.tvMoney.text = total.toString()
}
@SuppressLint("SetTextI18n")
private fun updateBalance() {
if (_binding == null) {
return
}
val balanceTitle = getString(R.string.gift_wallet_overage)
val balanceValue = PayModel.get().currentWalletInfo?.diamondNum ?: 0.0
var balanceBigDecimal = BigDecimal.valueOf(balanceValue)
balanceBigDecimal = balanceBigDecimal.setScale(0, RoundingMode.DOWN)
binding.tvBalance.text = "$balanceTitle${balanceBigDecimal.toPlainString()}"
}
@SuppressLint("CheckResult")
private fun requestBalance() {
PayModel.get().myRemoteWalletInfo.compose<WalletInfo>(bindToLifecycle())
.subscribe { info: WalletInfo ->
updateBalance()
}
}
override fun onDestroyView() {
super.onDestroyView()
dialogManager?.dismissDialog()
dialogManager = null
}
override fun onDestroy() {
super.onDestroy()
successListener = null
}
}

View File

@@ -0,0 +1,22 @@
package com.chwl.app.ui.game_team.invite
import com.chwl.app.base.BaseViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.response.BeanResult
import com.chwl.core.room.game.GameModel
import kotlinx.coroutines.flow.MutableSharedFlow
class GameTeamInviteViewModel : BaseViewModel() {
var payResultFlow = MutableSharedFlow<BeanResult<Any>>()
fun pay(gameId: Long, gameUid: Long, inning: Long) {
safeLaunch(onError = {
payResultFlow.emit(BeanResult.failed(it))
}) {
val result =
GameModel.startGameTeam(gameId, gameUid, inning, AuthModel.get().currentUid)
payResultFlow.emit(BeanResult.success(result))
}
}
}

View File

@@ -0,0 +1,63 @@
package com.chwl.app.ui.game_team.record
import android.content.Context
import android.content.Intent
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.chwl.app.R
import com.chwl.app.avroom.adapter.CommonVPAdapter
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.GameTeamRecordActivityBinding
import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.chwl.library.utils.ResUtil
import com.netease.nim.uikit.StatusBarUtil
class GameTeamRecordActivity : BaseViewBindingActivity<GameTeamRecordActivityBinding>() {
companion object {
fun start(context: Context) {
context.startActivity(Intent(context, GameTeamRecordActivity::class.java))
}
}
override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.game_team_09))
initTab()
}
private fun initTab() {
val fragmentList = ArrayList<Fragment>()
fragmentList.add(GameTeamRecordFragment.newInstance(GameTeamRecordFragment.TYPE_INITIATOR))
fragmentList.add(GameTeamRecordFragment.newInstance(GameTeamRecordFragment.TYPE_RECEIVER))
val titleList = ArrayList<String>()
titleList.add(getString(R.string.game_team_10))
titleList.add(getString(R.string.game_team_11))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
val magicIndicatorAdapter = GameTeamRecordIndicatorAdapter(context, titleList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.viewPager.currentItem = position
}
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
binding.viewPager.offscreenPageLimit = 2
binding.viewPager.adapter = CommonVPAdapter(
supportFragmentManager,
lifecycle,
fragmentList
)
binding.viewPager.isUserInputEnabled = false
ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
}
override fun needSteepStateBar(): Boolean {
return true
}
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -0,0 +1,38 @@
package com.chwl.app.ui.game_team.record
import android.view.View
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.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.game_team.GameTeamRecordBean
class GameTeamRecordAdapter :
BaseQuickAdapter<GameTeamRecordBean, BaseViewHolder>(R.layout.game_team_record_item) {
var isInitiator = false
override fun convert(helper: BaseViewHolder, item: GameTeamRecordBean?) {
helper.addOnClickListener(R.id.tv_repurchase, R.id.tv_chat, R.id.iv_order_id_copy)
val userAvatarView = helper.getView<ImageView>(R.id.iv_user_avatar)
val repurchaseView = helper.getView<View>(R.id.tv_repurchase)
if (isInitiator) {
repurchaseView.isVisible = true
helper.setText(R.id.tv_user_name, item?.toNick ?: "")
helper.setText(R.id.tv_user_id, item?.toErBanNo?.toString() ?: "")
userAvatarView.load(item?.toAvatar)
} else {
repurchaseView.isVisible = false
helper.setText(R.id.tv_user_name, item?.fromNick ?: "")
helper.setText(R.id.tv_user_id, item?.fromErBanNo?.toString() ?: "")
userAvatarView.load(item?.fromAvatar)
}
helper.setText(R.id.tv_game_name, item?.gameName ?: "")
helper.setText(R.id.tv_order_money, item?.amount?.toString())
helper.setText(R.id.tv_order_time, item?.orderTime)
helper.setText(R.id.tv_order_id, item?.orderNo)
}
}

View File

@@ -0,0 +1,154 @@
package com.chwl.app.ui.game_team.record
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.common.EmptyViewHelper
import com.chwl.app.databinding.GameTemaRecordFragmentBinding
import com.chwl.app.ui.game_team.invite.GameTeamInviteDialog
import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity
import com.chwl.app.ui.utils.RVDelegate
import com.chwl.app.utils.ClipboardUtils
import com.chwl.core.game_team.GameTeamRecordBean
import com.chwl.library.utils.SingleToastUtil
class GameTeamRecordFragment : BaseViewBindingFragment<GameTemaRecordFragmentBinding>() {
companion object {
const val TYPE_INITIATOR = 0
const val TYPE_RECEIVER = 1
fun newInstance(type: Int): GameTeamRecordFragment {
return GameTeamRecordFragment().apply {
arguments = Bundle().apply {
putInt("type", type)
}
}
}
}
private val viewModel: GameTeamRecordViewModel by viewModels()
private val adapter = GameTeamRecordAdapter()
private var type: Int = TYPE_INITIATOR
private var rvDelegate: RVDelegate<GameTeamRecordBean>? = null
private var pageNum = 1
private val pageSize = 20
override fun init() {
type = arguments?.getInt("type", TYPE_INITIATOR) ?: TYPE_INITIATOR
initView()
initEvent()
initObserve()
binding.swipeRefresh.isRefreshing = true
loadData(true)
}
private fun initView() {
adapter.isInitiator = type == TYPE_INITIATOR
binding.recyclerView.adapter = adapter
rvDelegate = RVDelegate.Builder<GameTeamRecordBean>()
.setPageSize(pageSize)
.setAdapter(adapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(
EmptyViewHelper.createEmptyTextViewHeight(
context,
getString(R.string.data_empty)
)
)
.setLayoutManager(LinearLayoutManager(mContext))
.build()
}
private fun initEvent() {
adapter.setOnItemChildClickListener { adapter, view, position ->
val item = (adapter.getItem(position) as? GameTeamRecordBean)
?: return@setOnItemChildClickListener
when (view.id) {
R.id.tv_repurchase -> {
jumpRepurchase(item)
}
R.id.tv_chat -> {
jumpChat(item)
}
R.id.iv_order_id_copy -> {
ClipboardUtils.copyText(item.orderNo ?: "")
toast(getString(R.string.have_copy))
}
}
}
binding.swipeRefresh.setOnRefreshListener {
loadData(true)
}
adapter.setOnLoadMoreListener({
loadData(false)
}, binding.recyclerView)
}
private fun initObserve() {
viewModel.listLiveData.observe(this) {
binding.swipeRefresh.isRefreshing = false
rvDelegate?.loadData(it)
if (!it.isSuccess && it.message != null) {
toast(it.message)
}
}
}
private fun jumpRepurchase(item: GameTeamRecordBean) {
val uid = getTargetUidByItem(item)
val gameId = item.gameId
val gameBackground = item.gamePic
val gamePrice = item.price ?: 0
val gameInning = item.inning ?: 1
if (uid == null || gameId == null) {
toast(R.string.data_parsing_exception)
return
}
GameTeamInviteDialog.newInstance(
targetUid = uid,
gameId = gameId,
gameBackground = gameBackground,
gamePrice = gamePrice,
gameInning = gameInning
).apply {
this.successListener = {
loadData(true)
}
}.safeShow(requireActivity().supportFragmentManager, requireActivity())
}
private fun jumpChat(item: GameTeamRecordBean) {
val targetUid = getTargetUidByItem(item)?.toString()
if (targetUid.isNullOrEmpty()) {
return
}
NimP2PMessageActivity.start(requireContext(), targetUid)
}
private fun getTargetUidByItem(item: GameTeamRecordBean): Long? {
val targetUid = if (type == TYPE_INITIATOR) {
item.toUid
} else {
item.fromUid
}
return targetUid
}
private fun loadData(isRefresh: Boolean) {
if (isRefresh) {
pageNum = 1
} else {
pageNum++
}
viewModel.getRecordList(type, pageNum, pageSize)
}
}

View File

@@ -0,0 +1,103 @@
package com.chwl.app.ui.game_team.record;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.chwl.app.R;
import com.chwl.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import java.util.List;
public class GameTeamRecordIndicatorAdapter extends CommonNavigatorAdapter {
private final Context mContext;
private final List<? extends CharSequence> mTitleList;
private int textSize = 14;
private float minScale = 1f;
private boolean showIndicator = true;
private OnItemSelectListener mOnItemSelectListener;
public GameTeamRecordIndicatorAdapter(Context context, List<? extends CharSequence> charSequences) {
this.mContext = context;
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(ContextCompat.getColor(context, R.color.color_66000000));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_000000));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 13);
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) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_3));
indicator.setRoundRadius(context.getResources().getDimensionPixelOffset(R.dimen.dp_2));
indicator.setLineWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_13));
indicator.setColors(context.getResources().getColor(R.color.color_0FCA81));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// lp.bottomMargin = mBottomMargin;
indicator.setLayoutParams(lp);
return indicator;
}
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 boolean isShowIndicator() {
return showIndicator;
}
public void setShowIndicator(boolean showIndicator) {
this.showIndicator = showIndicator;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -0,0 +1,23 @@
package com.chwl.app.ui.game_team.record
import androidx.lifecycle.MutableLiveData
import com.chwl.app.base.BaseViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.response.ListResult
import com.chwl.core.game_team.GameTeamRecordBean
import com.chwl.core.room.game.GameModel
class GameTeamRecordViewModel : BaseViewModel() {
val listLiveData = MutableLiveData<ListResult<GameTeamRecordBean>>()
fun getRecordList(type: Int, pageNum: Int, pageSize: Int) {
safeLaunch(onError = {
listLiveData.postValue(ListResult.failed(pageNum, it))
}) {
val list =
GameModel.getGameTeamRecordList(type, pageNum, pageSize, AuthModel.get().currentUid)
listLiveData.postValue(ListResult.success(list, pageNum))
}
}
}

View File

@@ -71,6 +71,11 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
*/
public boolean isSuperLuckyGift;
/**
* 礼物名称
*/
public String giftName;
public GiftInfoVm(Context context, GiftInfo data, boolean select, boolean isKnap) {
super(context, data);
this.isSelect.set(select);
@@ -110,6 +115,7 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
SimpleVipInfo vipInfo = data.getGiftVipInfo();
isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel();
vipIcon = vipInfo == null ? "" : vipInfo.getVipIcon();
giftName = data.getFirstGiftName();
}
@Override

View File

@@ -2,7 +2,13 @@ package com.chwl.app.ui.im;
import android.content.Context;
import com.chwl.app.community.holder.DynamicSysHolder;
import com.chwl.app.community.im.WorldDynamicShareViewHolder;
import com.chwl.app.module_hall.im.msgholder.FamilyMsgViewHolder;
import com.chwl.app.ui.im.chat.GameTeamInviteViewHolder;
import com.chwl.core.community.attachment.DynamicSysAttachment;
import com.chwl.core.community.im.WorldDynamicAttachment;
import com.chwl.core.im.custom.bean.GameTeamInviteAttachment;
import com.chwl.core.module_hall.im.FamilyAttachment;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.api.model.contact.ContactEventListener;
@@ -151,6 +157,10 @@ public class ImInitHelper {
//瓜分钻石 三级
NimUIKit.registerMsgItemViewHolder(CarveUpGoldThirdLevelAttachment.class, MsgViewHolderText.class);
// 社区动态
NimUIKit.registerMsgItemViewHolder(DynamicSysAttachment.class, DynamicSysHolder.class);
NimUIKit.registerMsgItemViewHolder(WorldDynamicAttachment.class, WorldDynamicShareViewHolder.class);
NimUIKit.registerMsgItemViewHolder(ChatHintAttachment.class, MsgViewHolderChatHint.class);
//技能卡
@@ -161,6 +171,9 @@ public class ImInitHelper {
// 客服充值
NimUIKit.registerMsgItemViewHolder(P2PContactRechargeAttachment.class, MsgViewHolderP2PContactRecharge.class);
// 游戏组队 - 邀请
NimUIKit.registerMsgItemViewHolder(GameTeamInviteAttachment.class, GameTeamInviteViewHolder.class);
NimUIKit.setSessionListener(listener);
NimUIKit.setContactEventListener(listener1);
}

View File

@@ -41,6 +41,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter
import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView;
import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener;
import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.sys.ClipboardUtil;
import com.netease.nim.uikit.common.util.sys.NetworkUtil;
@@ -449,19 +450,12 @@ public class MessageListPanelEx {
int index = getItemIndex(message.getUuid());
if (index >= 0 && index < items.size()) {
IMMessage item = items.get(index);
String antiSpamRes = message.getYidunAntiSpamRes();
if (!TextUtils.isEmpty(antiSpamRes)) {
JSONObject jsonObject = JSON.parseObject(antiSpamRes);
if (jsonObject.getIntValue("suggestion") == 2) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
if (AntiSpamUtil.isAntiSpam(message)) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
item.setAttachStatus(message.getAttachStatus());
// 处理语音、音视频通话
@@ -1052,6 +1046,9 @@ public class MessageListPanelEx {
if (message.getDirect() == MsgDirectionEnum.Out) {
// 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载
if (message.getStatus() == MsgStatusEnum.fail) {
if (AntiSpamUtil.isAntiSpam(message)) {
return;
}
resendMessage(message); // 重发
} else {
if (message.getAttachment() instanceof FileAttachment) {

View File

@@ -2,10 +2,13 @@ package com.chwl.app.ui.im;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import com.chwl.app.decoration.view.DecorationStoreActivity;
import com.chwl.app.earn.activity.EarnRecordActivity;
import com.chwl.app.pay.activity.GiveGoldActivity;
import com.chwl.app.ui.feedback.FeedbackActivity;
import com.chwl.app.ui.game_team.record.GameTeamRecordActivity;
import com.chwl.core.module_hall.hall.bean.H5FamilyInfo;
import com.chwl.core.module_hall.hall.bean.UserClanInfo;
import com.trello.rxlifecycle3.components.support.RxAppCompatActivity;
@@ -32,13 +35,11 @@ import com.chwl.app.team.view.NimTeamMessageActivity;
import com.chwl.app.ui.login.BindPhoneActivity;
import com.chwl.app.ui.login.ShowBindPhoneActivity;
import com.chwl.app.ui.pay.ChargeActivity;
import com.chwl.app.ui.setting.FeedbackActivity;
import com.chwl.app.ui.setting.ModifyPwdActivity;
import com.chwl.app.ui.user.activity.UserInfoActivity;
import com.chwl.app.ui.webview.CommonWebViewActivity;
import com.chwl.app.vip.VipMainActivity;
import com.chwl.core.DemoCache;
import com.chwl.core.UriProvider;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.community.event.SquareTaskEvent;
import com.chwl.core.im.custom.bean.RouterType;
@@ -209,7 +210,7 @@ public class RouterHandler {
break;
case RouterType.FEED_BACK:
FeedbackActivity.start(context);
context.startActivity(new Intent(context, FeedbackActivity.class));
break;
case RouterType.SET_PASSWORD:
ModifyPwdActivity.start(context, ModifyPwdActivity.LOGIN_PWD);
@@ -293,6 +294,9 @@ public class RouterHandler {
case RouterType.MY_DONATION:
GiveGoldActivity.Companion.start(context);
break;
case RouterType.GAME_TEAM_RECORD:
GameTeamRecordActivity.Companion.start(context);
break;
default:
SingleToastUtil.showToast(ResUtil.getString(R.string.ui_im_routerhandler_07));
return false;

View File

@@ -0,0 +1,118 @@
package com.chwl.app.ui.im.chat
import android.content.Context
import android.graphics.Color
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.Keep
import com.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.core.im.custom.bean.GameTeamInviteAttachment
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.ShapeAppearanceModel
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter
@Keep
class GameTeamInviteViewHolder(adapter: BaseMultiItemFetchLoadAdapter<*, *>) :
MsgViewHolderBase(adapter) {
private val isRTL = UiUtils.isRtl(AppUtils.getApp())
private val leftShapeAppearance: ShapeAppearanceModel by lazy(LazyThreadSafetyMode.NONE) {
buildBackgroundShapeAppearance(context ?: AppUtils.getApp(), true)
}
private val rightShapeAppearance: ShapeAppearanceModel by lazy(LazyThreadSafetyMode.NONE) {
buildBackgroundShapeAppearance(context ?: AppUtils.getApp(), false)
}
override fun getContentResId(): Int {
return R.layout.layout_msg_view_holder_game_team_invite
}
override fun inflateContentView() {
}
override fun leftBackground(): Int {
return R.color.transparent
}
override fun rightBackground(): Int {
return R.color.transparent
}
override fun bindContentView() {
val attachment = message?.attachment as? GameTeamInviteAttachment
val data = attachment?.msgData
val gameNameView = findViewById<TextView>(R.id.tv_game_name)
val gameInningView = findViewById<TextView>(R.id.tv_game_inning)
val gameIconView = findViewById<ImageView>(R.id.iv_icon)
val gameBackgroundView = findViewById<ShapeableImageView>(R.id.iv_image)
val gameBackgroundMaskView = findViewById<ShapeableImageView>(R.id.iv_image_mask)
val shapeAppearance = getBackgroundShapeAppearance()
gameBackgroundView.shapeAppearanceModel = shapeAppearance
gameBackgroundMaskView.shapeAppearanceModel = shapeAppearance
gameNameView.text = data?.gameName ?: ""
gameInningView.text =
context?.getString(R.string.game_team_18)?.format(data?.inning?.toString() ?: "0") ?: ""
gameIconView.load(data?.gameLogo)
gameBackgroundView.load(data?.gamePic, defaultRes = R.color.color_33000000)
}
private fun getBackgroundShapeAppearance(): ShapeAppearanceModel {
return if (isReceivedMessage) {
if (isRTL) {
rightShapeAppearance
} else {
leftShapeAppearance
}
} else {
if (isRTL) {
leftShapeAppearance
} else {
rightShapeAppearance
}
}
}
private fun buildBackgroundShapeAppearance(
context: Context,
isLeft: Boolean
): ShapeAppearanceModel {
val cornerA = context.resources.getDimension(R.dimen.dp_12)
val cornerB = context.resources.getDimension(R.dimen.dp_2)
val topLeftCorner: Float
val topRightCorner: Float
if (isLeft) {
topLeftCorner = cornerB
topRightCorner = cornerA
} else {
topLeftCorner = cornerA
topRightCorner = cornerB
}
return ShapeAppearanceModel.Builder().apply {
this.setTopLeftCorner(
CornerFamily.ROUNDED,
topLeftCorner
)
this.setTopRightCorner(
CornerFamily.ROUNDED,
topRightCorner
)
this.setBottomLeftCorner(
CornerFamily.ROUNDED,
cornerA
)
this.setBottomRightCorner(
CornerFamily.ROUNDED,
cornerA
)
}.build()
}
}

View File

@@ -1,24 +1,10 @@
package com.chwl.app.ui.im.chat;
import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
import com.chwl.app.R;
import com.chwl.app.common.widget.OriginalDrawStatusClickSpan;
import com.chwl.app.ui.webview.SimpleWebViewActivity;
import com.chwl.core.UriProvider;
import com.chwl.core.im.custom.bean.ChatHintAttachment;
import com.chwl.library.utils.ResUtil;
public class MsgViewHolderChatHint extends MsgViewHolderBase {
@@ -58,30 +44,7 @@ public class MsgViewHolderChatHint extends MsgViewHolderBase {
ChatHintAttachment attachment = (ChatHintAttachment) message.getAttachment();
if (attachment != null) {
String content = attachment.getContent();
String restoreTitle = ResUtil.getString(R.string.im_chat_msgviewholderchathint_01);
if (TextUtils.isEmpty(content) || !content.contains(restoreTitle)) {
tvContent.setText(content);
} else {
SpannableString ss = new SpannableString(content);
int restoreTitleIndex = content.indexOf(restoreTitle);
ss.setSpan(
new ForegroundColorSpan(Color.parseColor("#FB486A")),
restoreTitleIndex,
restoreTitleIndex + restoreTitle.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ss.setSpan(
new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
SimpleWebViewActivity.start(context, UriProvider.getLiveAgreement());
}
},
restoreTitleIndex,
restoreTitleIndex + restoreTitle.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tvContent.setText(ss);
tvContent.setMovementMethod(new LinkMovementMethod());
}
tvContent.setText(content);
}
}

View File

@@ -29,7 +29,6 @@ import com.netease.nim.uikit.business.session.constant.Extras;
import com.netease.nim.uikit.business.session.module.Container;
import com.netease.nim.uikit.business.session.module.ModuleProxy;
import com.netease.nim.uikit.business.session.module.input.InputPanel;
import com.netease.nim.uikit.business.session.module.input.NimAudioChatEvent;
import com.netease.nim.uikit.business.session.module.input.NimImageActionEvent;
import com.netease.nim.uikit.common.fragment.TFragment;
import com.netease.nim.uikit.impl.NimUIKitImpl;

View File

@@ -27,6 +27,7 @@ import androidx.core.content.ContextCompat;
import com.chwl.app.BuildConfig;
import com.chwl.app.common.widget.OriginalDrawStatusClickSpan;
import com.chwl.app.ui.feedback.FeedbackActivity;
import com.chwl.app.ui.setting.LabActivity;
import com.chwl.app.ui.webview.CommonWebViewActivity;
import com.chwl.core.UriProvider;
@@ -275,7 +276,9 @@ public class LoginPasswordActivity extends BaseActivity {
});
setProtocol();
findViewById(R.id.layout_google).setOnClickListener(v -> googleLogin());
findViewById(R.id.tv_feedback).setOnClickListener(v -> {
startActivity(new Intent(this, FeedbackActivity.class));
});
if (BuildConfig.DEBUG) {
findViewById(R.id.iv_logo).setOnClickListener(v -> {
startActivity(new Intent(this, LabActivity.class));

View File

@@ -64,7 +64,7 @@ public class LogoutHelper {
String text = ResUtil.getString(R.string.login_helper_logouthelper_09) + simpleDateFormat.format(new Date(exception.getCancelDate()));
int end = text.length();
text += ResUtil.getString(R.string.login_helper_logouthelper_010);
text += ResUtil.getString(R.string.login_helper_logouthelper_010);
SpannableString spannableString = new SpannableString(text);
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(activity, R.color.appColor)),
0, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

View File

@@ -1,100 +0,0 @@
package com.chwl.app.ui.setting;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import com.netease.nim.uikit.StatusBarUtil;
import com.trello.rxlifecycle3.android.ActivityEvent;
import com.chwl.app.R;
import com.chwl.app.base.BaseActivity;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.home.model.HomeModel;
import com.chwl.library.utils.ResUtil;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
public class FeedbackActivity extends BaseActivity {
private EditText edtContent;
private EditText edtContact;
private Button btnCommit;
public static void start(Context context) {
Intent intent = new Intent(context, FeedbackActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feedback);
initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_feedbackactivity_01));
initView();
initData();
SetListener();
}
private void SetListener() {
btnCommit.setOnClickListener(v ->
HomeModel.INSTANCE.commitFeedback(AuthModel.get().getCurrentUid(),
edtContent.getText().toString(),
edtContact.getText().toString()
)
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String s) {
onCommitFeedback();
}
@Override
public void onError(Throwable e) {
onCommitFeedbackFail(e.getMessage());
}
})
);
}
private void initData() {
}
private void initView() {
edtContent = findViewById(R.id.edt_content);
edtContact = findViewById(R.id.edt_contact);
btnCommit = findViewById(R.id.btn_commit);
}
public void onCommitFeedback(){
getDialogManager().showProgressDialog(FeedbackActivity.this, ResUtil.getString(R.string.ui_setting_feedbackactivity_02));
toast(ResUtil.getString(R.string.ui_setting_feedbackactivity_03));
finish();
}
public void onCommitFeedbackFail(String error){
// toast(error);
}
@Override
protected boolean needSteepStateBar() {
return true;
}
@Override
protected void setStatusBar() {
super.setStatusBar();
StatusBarUtil.transparencyBar(this);
StatusBarUtil.StatusBarLightMode(this);
}
}

View File

@@ -13,6 +13,8 @@ import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
import com.chwl.app.databinding.ActivitySettingBinding
import com.chwl.app.notify.RoomNotifyManager
import com.chwl.app.ui.debug.DebugActivity
import com.chwl.app.ui.game_team.record.GameTeamRecordActivity
import com.chwl.app.ui.im.avtivity.BlackListManageActivity
import com.chwl.app.ui.language.LanguageActivity
import com.chwl.app.ui.login.BindPhoneActivity
@@ -221,7 +223,8 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
}
private fun debug() {
// CommonWebViewActivity.start(this,"https://api.molistar.xyz/molistar/activity/2024-invitationFission/index.html")
startActivity(Intent(this, GameTeamRecordActivity::class.java))
// CommonWebViewActivity.start(this,"http://beta.api.molistar.xyz/molistar/modules/order/index.html")
// PublicChatRoomMessageActivity.start(this)
// MyDecorationActivity.start(this,0)
}

View File

@@ -7,21 +7,31 @@ import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
import com.chwl.app.avroom.adapter.CommonVPAdapter;
import com.chwl.app.ui.user.adapter.UserInfoTopAlbumAdapter;
import com.chwl.app.ui.user.fragment.UserInfoDataFragment;
import com.chwl.app.ui.user.fragment.UserInfoDynamicFragment;
import com.chwl.app.utils.AppBarStateChangeListener;
import com.chwl.app.utils.AvatarHelper;
import com.chwl.library.widget.SVGAView;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.example.lib_utils.UiUtils;
import com.google.android.material.appbar.AppBarLayout;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.sys.TimeUtil;
import com.netease.nim.uikit.impl.cache.NimUserInfoCache;
import com.netease.nimlib.sdk.RequestCallbackWrapper;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
@@ -32,7 +42,6 @@ import com.opensource.svgaplayer.SVGAVideoEntity;
import com.chwl.app.R;
import com.chwl.app.UIHelper;
import com.chwl.app.audio.helper.AudioPlayerHelper;
import com.chwl.app.audio.helper.OnPlayListener;
import com.chwl.app.avroom.ButtonItemFactory;
import com.chwl.app.avroom.activity.AVRoomActivity;
import com.chwl.app.base.BaseBindingActivity;
@@ -41,28 +50,19 @@ import com.chwl.app.common.widget.dialog.DialogManager;
import com.chwl.app.databinding.ActivityUserInfoBinding;
import com.chwl.app.ui.im.avtivity.NimFriendModel;
import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity;
import com.chwl.app.ui.user.adapter.SelfPhotoAdapter;
import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter;
import com.chwl.app.ui.user.adapter.UserInfoPhotoAdapter;
import com.chwl.app.ui.user.adapter.UserPhotoAdapter;
import com.chwl.app.ui.user.fragment.UserInfoGiftWallFragment;
import com.chwl.app.ui.user.fragment.UserInfoInfoFragment;
import com.chwl.app.ui.user.viewmodel.UserInfoViewModel;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.ButtonItem;
import com.chwl.app.ui.widget.ObservableScrollView;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator;
import com.chwl.app.ui.widget.rollviewpager.adapter.StaticPagerAdapterWrapper;
import com.chwl.app.utils.RegexUtil;
import com.chwl.core.XConstants;
import com.chwl.core.Constants;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.bean.RoomQueueInfo;
import com.chwl.core.im.friend.IMFriendModel;
import com.chwl.core.level.UserLevelVo;
import com.chwl.core.manager.AudioEngineManager;
import com.chwl.core.manager.AvRoomDataManager;
import com.chwl.core.praise.PraiseModel;
import com.chwl.core.praise.event.IsLikedEvent;
import com.chwl.core.praise.event.PraiseEvent;
@@ -72,12 +72,9 @@ import com.chwl.core.user.bean.UserDetailInfo;
import com.chwl.core.user.bean.UserInfo;
import com.chwl.core.user.bean.UserPhoto;
import com.chwl.core.user.event.LoginUserInfoUpdateEvent;
import com.chwl.core.utils.LogUtils;
import com.chwl.core.utils.CoreLogger;
import com.chwl.library.annatation.ActLayoutRes;
import com.chwl.library.utils.ListUtils;
import com.chwl.library.utils.SingleToastUtil;
import com.chwl.library.utils.SizeUtils;
import com.zhpan.bannerview.constants.IndicatorGravity;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -107,24 +104,20 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private ImageView ivOfficialMask;
private TextView tvOfficialMask;
private StaticPagerAdapterWrapper bannerAdapter;
private UserInfoViewModel viewModel;
private boolean audioPlaying = false;
private boolean isRemoteMute = false;//是否静音
private boolean isMute = true;//是否开麦
@SuppressLint("CheckResult")
@Override
protected void init() {
mActivity = this;
userId = getIntent().getLongExtra("userId", 0);
viewModel = new ViewModelProvider(this).get(UserInfoViewModel.class);
viewModel.setUserId(userId);
UserInfoUiMgr.get().setUid(userId);
onFindViews();
onSetListener();
initTopAlbumView();
EventBus.getDefault().register(this);
initUserInfoDetailObserver();
initAttentionView();
@@ -146,22 +139,11 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
super.onResume();
viewModel.getUserInfo();
viewModel.getUserInfoDetail();
viewModel.getUserHallAndClan();
}
private void initAttentionView() {
if (AvRoomDataManager.get().mCurrentRoomInfo != null) {
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(String.valueOf(AuthModel.get().getCurrentUid()));
if (roomQueueInfo != null && roomQueueInfo.mRoomMicInfo != null) {
isMute = AudioEngineManager.get().isMute();
}
isRemoteMute = AudioEngineManager.get().isRemoteMute();
}
if (AuthModel.get().getCurrentUid() == userId) {
identityState = OWN;
mBinding.tvFansCount.setOnClickListener(this);
mBinding.layoutLive.setVisibility(View.GONE);
if (bottomViewLayout != null)
bottomViewLayout.setVisibility(View.GONE);
@@ -223,11 +205,11 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void initViewPager() {
List<Fragment> fragmentList = new ArrayList<>(2);
fragmentList.add(new UserInfoInfoFragment());
fragmentList.add(new UserInfoGiftWallFragment());
fragmentList.add(new UserInfoDataFragment());
fragmentList.add(new UserInfoDynamicFragment());
final List<String> tagList = new ArrayList<>(2);
tagList.add(getString(R.string.me_data));
tagList.add(getString(R.string.me_gift_wall));
tagList.add(getString(R.string.me_dynamic));
CommonNavigator commonNavigator = new CommonNavigator(context);
commonNavigator.setTitleWrapContent(false);
UserInfoIndicatorAdapter magicIndicatorAdapter = new UserInfoIndicatorAdapter(context, tagList);
@@ -236,9 +218,8 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
});
commonNavigator.setAdapter(magicIndicatorAdapter);
mBinding.magicIndicator.setNavigator(commonNavigator);
commonNavigator.getTitleContainer().setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
mBinding.viewPager.setOffscreenPageLimit(2);
mBinding.viewPager.setAdapter(new CommonVPAdapter(getSupportFragmentManager(),getLifecycle(),fragmentList));
mBinding.viewPager.setOffscreenPageLimit(fragmentList.size());
mBinding.viewPager.setAdapter(new CommonVPAdapter(getSupportFragmentManager(), getLifecycle(), fragmentList));
mBinding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
@@ -256,10 +237,10 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.magicIndicator.onPageScrollStateChanged(state);
}
});
mBinding.viewPager.setUserInputEnabled(false);
}
private void initUserInfoDetailObserver() {
viewModel = new ViewModelProvider(this).get(UserInfoViewModel.class);
viewModel.getUserInfoDetailData().observe(this, dataBean -> {
initPhoto(dataBean.getPrivatePhoto());
setWhereVisible();
@@ -274,6 +255,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.tbUserInfo.setTitle("");
ivOfficialMask = mBinding.inOfficialMask.findViewById(R.id.iv_official_mask);
tvOfficialMask = mBinding.inOfficialMask.findViewById(R.id.tv_official_mask);
mBinding.ivHeadWear.bindCache(SVGAView.newCache(1));
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -287,19 +269,55 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void initData(UserInfo userInfo) {
if (null != userInfo) {
ImageLoadUtilsV2.loadImage(mBinding.ivUserHead, userInfo.getAvatar());
HeadWearInfo headWearInfo = userInfo.getUserHeadwear();
if (headWearInfo != null && headWearInfo.getFirstUrl() != null) {
AvatarHelper.loadAvatarFrame(mBinding.ivHeadWear, headWearInfo.getFirstUrl(), headWearInfo.getType());
mBinding.ivUserHead.setPadding(0, 0, 0, 0);
mBinding.ivUserHead.setStrokeWidth(0);
} else {
int padding = getResources().getDimensionPixelOffset(R.dimen.dp_0_5);
mBinding.ivUserHead.setPadding(padding, padding, padding, padding);
mBinding.ivUserHead.setStrokeWidth(getResources().getDimensionPixelOffset(R.dimen.dp_1));
mBinding.ivHeadWear.setVisibility(View.GONE);
}
//设置昵称
String nick = RegexUtil.getPrintableString(userInfo.getNick());
mBinding.tvNick.setText(nick);
//设置签名
UserInfoUiMgr.get().setValue(userInfo);
mBinding.tvDesc.setText(userInfo.getUserDesc() != null ? userInfo.getUserDesc() : getResources().getString(R.string.msg_no_user_desc));
mBinding.tvDesc.setText(userInfo.getUserDesc() != null ? userInfo.getUserDesc() : "");
mBinding.tvGenderAge.setGender(userInfo.getGender());
mBinding.tvGenderAge.setBirthDay(userInfo.getBirth());
mBinding.tvFansCount.setText(String.valueOf(userInfo.getFansNum()));
mBinding.tvErbanId.setText(getString(R.string.me_user_id, userInfo.getErbanNo()));
mBinding.ivGoodNumber.setVisibility(userInfo.isHasPrettyErbanNo() ? View.VISIBLE : View.GONE);
mBinding.tvFollowCount.setText(String.valueOf(userInfo.getFollowNum()));
mBinding.tvErbanId.setText(String.valueOf(userInfo.getErbanNo()));
if (userInfo.isHasPrettyErbanNo()) {
mBinding.ivId.setVisibility(View.GONE);
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.color_FEFFBF));
mBinding.tvErbanId.setBackgroundResource(R.drawable.user_info_bg_good_id);
setMarginTop(mBinding.layoutRegion, getResources().getDimensionPixelOffset(R.dimen.dp_5));
} else {
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.color_CC191919));
mBinding.tvErbanId.setBackgroundDrawable(null);
mBinding.ivId.setVisibility(View.VISIBLE);
setMarginTop(mBinding.layoutRegion, getResources().getDimensionPixelOffset(R.dimen.dp_8));
}
String birth = TimeUtil.getChinaDateTimeString(userInfo.getBirth(), "yyyy-MM-dd");
mBinding.tvRegion.setText(userInfo.getRegion());
mBinding.tvBirthday.setText(birth);
if (mBinding.tvRegion.getText().length() == 0 || mBinding.tvBirthday.getText().length() == 0) {
mBinding.vRegionBirthdayLine.setVisibility(View.GONE);
} else {
mBinding.vRegionBirthdayLine.setVisibility(View.VISIBLE);
}
if (mBinding.tvRegion.getText().length() == 0 && mBinding.tvBirthday.getText().length() == 0) {
mBinding.layoutRegion.setVisibility(View.GONE);
} else {
mBinding.layoutRegion.setVisibility(View.VISIBLE);
}
//等级魅力值
setUserLevel(userInfo.getUserLevelVo());
@@ -311,19 +329,20 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.ivChargeAgent.setVisibility(userInfo.isRechargeUser() ? View.VISIBLE : View.GONE);
// VipHelper.loadVipIcon(mBinding.ivVipIcon, userInfo.getUserVipInfoVO());
initVoiceShow(userInfo.getAudioCard());
// initLabel(userInfo.getLabels());
mBinding.tvErbanId.setOnLongClickListener(view -> {
mBinding.llId.setOnClickListener(view -> {
copyName();
return true;
});
}
}
private void setMarginTop(View view, int top) {
if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin, top, layoutParams.rightMargin, layoutParams.bottomMargin);
view.requestLayout();
}
}
private void copyName() {
try {
ClipboardManager cm = (ClipboardManager) UserInfoActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
@@ -369,36 +388,34 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
// userInfoLabelAdapter.setNewData(labels);
// }
private void initTopAlbumView() {
UserInfoTopAlbumAdapter adapter = new UserInfoTopAlbumAdapter(viewModel.isMe());
int width = context.getResources().getDimensionPixelOffset(R.dimen.dp_5);
boolean isRTL = UiUtils.INSTANCE.isRtl(this);
int marginEnd = context.getResources().getDimensionPixelOffset(R.dimen.dp_8);
mBinding.bannerView
.setLifecycleRegistry(getLifecycle())
.setOnPageClickListener((clickedView, position) -> {
showUserPhoto(position);
})
.setRTLMode(isRTL)
.setIndicatorHeight(width)
.setIndicatorGravity(isRTL ? IndicatorGravity.START : IndicatorGravity.END)
.setIndicatorSliderWidth(width, width * 2)
.setIndicatorSliderGap(context.getResources().getDimensionPixelOffset(R.dimen.dp_6))
.setIndicatorMargin(isRTL ? marginEnd : 0, 0, isRTL ? 0 : marginEnd, context.getResources().getDimensionPixelOffset(R.dimen.dp_71))
.setAdapter(adapter).create();
}
/**
* 相册
*/
private void initPhoto(List<UserDetailInfo.DataBean.PrivatePhotoBean> list) {
if (ListUtils.isListEmpty(list)) {
return;
if (list == null) {
mBinding.bannerView.refreshData(new ArrayList());
} else {
mBinding.bannerView.refreshData(list);
}
if (bannerAdapter == null) {
// mBinding.rollView.setHintViewDelegate(new RollPagerView.HintViewDelegate() {
// @SuppressLint("SetTextI18n")
// @Override
// public void setCurrentPosition(int position, HintView hintView) {
// if (mBinding.rollView.getAdapter() != null) {
// mBinding.tvRollHint.setText((position + 1) + "/" + mBinding.rollView.getAdapter().getCount());
// }
// }
//
// @Override
// public void initView(int length, int gravity, HintView hintView) {
//
// }
// });
bannerAdapter = identityState == OWN ? new SelfPhotoAdapter(list, this)
: new UserInfoPhotoAdapter(list, this);
mBinding.rollView.setAdapter(bannerAdapter);
//设置透明度
mBinding.rollView.setAnimationDurtion(500);
}
bannerAdapter.setData(list);
bannerAdapter.notifyDataSetChanged();
}
private void setUserLevel(UserLevelVo userLevelVo) {
@@ -424,24 +441,45 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
private void initNestScrollView() {
mBinding.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {
LogUtils.d("verticalOffset=" + verticalOffset);
if (flag == 0 && Math.abs(verticalOffset) > SizeUtils.dp2px(context, 200)) {
//展开
flag = 1;
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back_black);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.white));
setTitleVisible(true);
setEditButton(identityState, true);
} else if (flag == 1 && Math.abs(verticalOffset) <= 200) {
//合起来
flag = 0;
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.transparent));
setTitleVisible(false);
setEditButton(identityState, false);
mBinding.appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() {
@Override
protected float getBias() {
return 0.6f;
}
@Override
public void onStateChanged(AppBarLayout appBarLayout, State state) {
if (state == State.COLLAPSED) {
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back_black);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.white));
setTitleVisible(true);
setEditButton(identityState, true);
}else{
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.transparent));
setTitleVisible(false);
setEditButton(identityState, false);
}
}
});
// mBinding.appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> {
// LogUtils.d("verticalOffset=" + verticalOffset);
// if (flag == 0 && Math.abs(verticalOffset) > SizeUtils.dp2px(context, 200)) {
// //展开
// flag = 1;
// mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back_black);
// mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.white));
// setTitleVisible(true);
// setEditButton(identityState, true);
// } else if (flag == 1 && Math.abs(verticalOffset) <= 200) {
// //合起来
// flag = 0;
// mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back);
// mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.transparent));
// setTitleVisible(false);
// setEditButton(identityState, false);
// }
// });
}
private void setEditButton(int identityState, boolean isExpanded) {
@@ -480,9 +518,15 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
private void showUserPhoto(int position) {
if (userInfo == null) {
return;
}
//创建一个集合拿来做用户所有照片信息
ArrayList<UserPhoto> userPhotos = new ArrayList<>();
List<UserPhoto> realmList = userInfo.getPrivatePhoto();
if (realmList == null) {
return;
}
for (UserPhoto photo : realmList) {
UserPhoto newPhoto = new UserPhoto();
newPhoto.setPid(photo.getPid());
@@ -598,7 +642,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void setLikedText(boolean isliked) {
mIslike = isliked;
attentionLayout.setText(getString((isliked) ? R.string.already_attention : R.string.attention));
attentionLayout.setText(getString((isliked) ? R.string.already_attention : R.string.follow));
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -629,138 +673,9 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
}
public void initVoiceShow(UserInfo.SoundBean audioCard) {
if (audioCard != null && !TextUtils.isEmpty(audioCard.getAudioUrl())) {
if (AuthModel.get().getCurrentUid() == userId) {//主态
if (audioCard.getStatus() == 2) {
showSoundCard(audioCard);
} else {
mBinding.llAudio.setVisibility(View.GONE);
// mBinding.llAudioTip.setVisibility(View.VISIBLE);
}
} else if (audioCard.getStatus() == 2) {//客态
showSoundCard(audioCard);
}
} else {
if (AuthModel.get().getCurrentUid() == userId) {//主态
mBinding.llAudio.setVisibility(View.GONE);
// mBinding.llAudioTip.setVisibility(View.VISIBLE);
} else {
mBinding.llAudio.setVisibility(View.GONE);
// mBinding.llAudioTip.setVisibility(View.GONE);
}
}
// mBinding.llAudioTip.setOnClickListener(view -> {
// // 点击跳转到声音签名页面
// UIHelper.showSoundAct(
// this,
// UserInfoModifyActivity.Method.AUDIO,
// ResUtil.getString(R.string.ui_user_userinfomodifyactivity_07),
// audioCard);
// });
}
private void showSoundCard(UserInfo.SoundBean audioCard) {
mBinding.llAudio.setVisibility(View.VISIBLE);
// mBinding.llAudioTip.setVisibility(View.GONE);
mBinding.tvAudio.setText(audioCard.getSecond() + "s");
mBinding.livUser.stopAnimation();
mBinding.llAudio.setOnClickListener(v -> toggleAudio(audioCard));
}
private void toggleAudio(UserInfo.SoundBean audioCard) {
String url = "";
if (audioCard.getAudioUrl().contains("http")) {
url = audioCard.getAudioUrl();
}
if (TextUtils.isEmpty(url)) return;
if (!audioPlaying) {
playAudio(url, audioCard.getSecond());
} else {
stopAudio(audioCard.getSecond());
}
}
private CountDownTimer timer = null;
private void playAudio(String url, int second) {
if (audioPlaying) return;
audioPlaying = true;
playSvgaBg(mBinding.livUser, "svga/user_sound_play.svga");
mBinding.ivAudioControl.setImageResource(R.drawable.user_info_ic_audio_pause);
startCountDown(second);
if (AvRoomDataManager.get().mCurrentRoomInfo != null) {
AudioEngineManager.get().setRemoteMute(true);//設置靜音
AudioEngineManager.get().setMute(true);//不能説話
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
AudioPlayerHelper.get().playInThread(url, new OnPlayListener() {
@Override
public void onError(String error) {
SingleToastUtil.showToast(getString(R.string.me_error_playing));
stopAudio(second);
}
@Override
public void onPrepared() {
}
@Override
public void onPlaying(long currDuration) {
}
@Override
public void onCompletion() {
stopAudio(second);
}
});
}
private void startCountDown(int time) {
timer = new CountDownTimer((time + 1) * 1000L, 1000L) {
@Override
public void onTick(long millisUntilFinished) {
String time = String.valueOf(millisUntilFinished / 1000);
mBinding.tvAudio.setText(time + "s");
}
@Override
public void onFinish() {
}
};
timer.start();
}
private void stopCountDown(int second) {
if (timer != null) {
mBinding.tvAudio.setText(second+"s");
timer.cancel();
}
}
private void stopAudio(int second) {
stopCountDown(second);
if (!audioPlaying) return;
audioPlaying = false;
mBinding.livUser.stopAnimation();
mBinding.ivAudioControl.setImageResource(R.drawable.user_info_ic_audio_play);
AudioPlayerHelper.get().endPlay();
if (AvRoomDataManager.get().mCurrentRoomInfo != null) {
AudioEngineManager.get().setRemoteMute(isRemoteMute);//非靜音
AudioEngineManager.get().setMute(isMute);//能説話
AudioEngineManager.get().setRole(isMute ? Constants.CLIENT_ROLE_AUDIENCE : Constants.CLIENT_ROLE_BROADCASTER);
}
}
@Override
protected void onPause() {
super.onPause();
if (audioPlaying) {
stopAudio(userInfo.getAudioCard().getSecond());
}
}
@Override

View File

@@ -35,13 +35,12 @@ import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.app.utils.RegexUtil
import com.chwl.core.auth.AuthModel
import com.chwl.core.file.FileModel
import com.chwl.core.file.cos.CosException
import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.UserInfo
import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger
import com.chwl.library.common.file.FileHelper
import com.chwl.library.common.photo.PhotoProviderNew
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.easypermisssion.EasyPermissions
@@ -372,7 +371,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProviderNew.photoProvider(
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
@@ -430,7 +429,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
}
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProviderNew.getResultPhotoList(it)
val photos = PhotoProvider.getResultPhotoList(it)
if (!photos.isNullOrEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)

View File

@@ -32,7 +32,7 @@ import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger
import com.chwl.core.utils.net.BeanObserver
import com.chwl.library.common.file.FileHelper
import com.chwl.library.common.photo.PhotoProviderNew
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.easypermisssion.EasyPermissions
@@ -232,7 +232,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProviderNew.photoProvider(
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
@@ -252,7 +252,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
} else if (resultCode == RESULT_OK) {
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProviderNew.getResultPhotoList(data) ?: return
val photos = PhotoProvider.getResultPhotoList(data) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
crop(photo.uri, photo.size, mUri)

View File

@@ -0,0 +1,100 @@
package com.chwl.app.ui.user.adapter;
import android.content.Context;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.chwl.app.R;
import com.chwl.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import java.util.List;
public class ContactsIndicatorAdapter extends CommonNavigatorAdapter {
private final List<? extends CharSequence> mTitleList;
private int textSize = 16;
private float minScale = 1f;
private boolean showIndicator = true;
private OnItemSelectListener mOnItemSelectListener;
public ContactsIndicatorAdapter(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(ContextCompat.getColor(context, R.color.color_84868A));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_1E1E1F));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 16);
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_EXACTLY);
indicator.setDrawableWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_24));
indicator.setDrawableHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_7));
indicator.setIndicatorDrawable(context.getResources().getDrawable(R.drawable.base_ic_indicator));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.END;
indicator.setLayoutParams(lp);
return indicator;
}
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 boolean isShowIndicator() {
return showIndicator;
}
public void setShowIndicator(boolean showIndicator) {
this.showIndicator = showIndicator;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -63,8 +63,8 @@ public class HomeRecommendIndicatorAdapter extends CommonNavigatorAdapter {
if (!showIndicator) return null;
DrawableIndicator indicator = new DrawableIndicator(context);
indicator.setMode(DrawableIndicator.MODE_EXACTLY);
indicator.setDrawableWidth(UIUtil.dip2px(context, 24));
indicator.setDrawableHeight(UIUtil.dip2px(context, 8));
indicator.setDrawableWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_24));
indicator.setDrawableHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_7));
indicator.setIndicatorDrawable(context.getResources().getDrawable(R.drawable.base_ic_indicator));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.END;

View File

@@ -1,48 +0,0 @@
package com.chwl.app.ui.user.adapter
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import com.chwl.app.R
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil
import com.chwl.app.ui.widget.rollviewpager.adapter.StaticPagerAdapterWrapper
import com.chwl.core.user.bean.UserDetailInfo
class SelfPhotoAdapter(
photoBeans: List<UserDetailInfo.DataBean.PrivatePhotoBean>,
context: Context
) : StaticPagerAdapterWrapper<UserDetailInfo.DataBean.PrivatePhotoBean>(photoBeans, context) {
private val origin by lazy {
UserInfoPhotoAdapter(photoBeans, context)
}
override fun getView(container: ViewGroup?, position: Int): View {
val originView = origin.getView(container, position)
val flContainer = FrameLayout(context)
flContainer.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
flContainer.addView(originView)
//overlay
val statusView = ImageView(context)
statusView.setImageResource(R.drawable.ic_album_auditing)
statusView.scaleType = ImageView.ScaleType.CENTER_INSIDE
val statusViewLayoutParams =
FrameLayout.LayoutParams(UIUtil.dip2px(context, 86.0), UIUtil.dip2px(context, 51.0))
statusViewLayoutParams.gravity = Gravity.RIGHT
flContainer.addView(statusView, statusViewLayoutParams)
val isVisit = (dataList.getOrNull(position)?.isReview == true)
statusView.visibility = if (isVisit) View.VISIBLE else View.GONE
return flContainer
}
override fun setData(dataList: MutableList<UserDetailInfo.DataBean.PrivatePhotoBean>?) {
super.setData(dataList)
origin.setData(dataList)
}
}

View File

@@ -0,0 +1,17 @@
package com.chwl.app.ui.user.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.core.user.bean.UserDetailInfo
import com.chwl.core.user.bean.UserPhoto
class UserInfoAlbumAdapter :
BaseQuickAdapter<UserPhoto, BaseViewHolder>(R.layout.user_info_item_album) {
override fun convert(helper: BaseViewHolder, item: UserPhoto) {
val imageView = helper.getView<ImageView>(R.id.iv_image)
imageView.load(item.photoUrl)
}
}

View File

@@ -0,0 +1,249 @@
package com.chwl.app.ui.user.adapter;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chwl.app.R;
import com.chwl.app.community.dynamic.view.DynamicDetailActivity;
import com.chwl.app.community.helper.CalcSize;
import com.chwl.app.community.helper.DynamicUiHelper;
import com.chwl.app.community.helper.ImageUiHelper;
import com.chwl.app.photo.DynamicImageAdapter;
import com.chwl.app.community.utils.ObjectTypeHelper;
import com.chwl.app.community.widget.ExpandableTextView;
import com.chwl.app.photo.BigPhotoActivity;
import com.chwl.app.photo.PagerOption;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.app.utils.TimeUiUtils;
import com.chwl.core.community.bean.DynamicMedia;
import com.chwl.core.community.bean.WorldDynamicBean;
import com.chwl.core.community.dynamic.DynamicModel;
import com.chwl.core.utils.net.DontWarnObserver;
import com.chwl.core.utils.net.RxHelper;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import com.netease.nim.uikit.common.util.log.LogUtil;
import java.util.List;
/**
* create by lvzebiao @2019/11/13
*/
public class UserInfoDynamicAdapter extends BaseQuickAdapter<WorldDynamicBean, BaseViewHolder> {
private SparseBooleanArray mCollapsedStatus = new SparseBooleanArray();
private SparseIntArray mCollapsedHeightStatus = new SparseIntArray(2);
private Context context;
private long worldId;
private int iconWidth;
private int iconHeight;
/**
* 单图情况下的边界
*/
private int imageBorder;
/**
* 图片的边界值
*/
private int divider;
public UserInfoDynamicAdapter(Context context) {
super(R.layout.item_userinfo_dynamic);
this.context = context;
iconWidth = UIUtil.dip2px(context, 32);
iconHeight = UIUtil.dip2px(context, 15);
//0.68
imageBorder = UIUtil.getScreenWidth(context) * ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX;
divider = UIUtil.dip2px(context, 10);
}
@Override
protected void convert(BaseViewHolder helper, WorldDynamicBean item) {
//这个值有没有文本UI部分改变图片部分的margin
boolean noTextUi = TextUtils.isEmpty(item.getContent());
RecyclerView rvImage = helper.getView(R.id.rv_image);
List<DynamicMedia> dynamicMediaList = item.getDynamicResList();
if (item.getType() == WorldDynamicBean.TYPE_IMAGE
&& dynamicMediaList != null && dynamicMediaList.size() > 0) {
rvImage.setVisibility(View.VISIBLE);
initRecyclerView(rvImage, dynamicMediaList, noTextUi);
} else {
rvImage.setVisibility(View.GONE);
}
//时间
helper.setText(R.id.tv_time, TimeUiUtils.getDynamicUi(item.getPublishTime()));
ExpandableTextView etvContent = helper.getView(R.id.etv_content);
etvContent.setEventType(1);
if (noTextUi) {
etvContent.setVisibility(View.GONE);
} else {
etvContent.setVisibility(View.VISIBLE);
CharSequence formatText = DynamicUiHelper.formatFirstDynamicContent(
item, etvContent.mTv, iconWidth, iconHeight);
etvContent.setText(formatText, mCollapsedStatus, helper.getAdapterPosition(), mCollapsedHeightStatus);
}
helper.setGone(R.id.layout_root_mini_world, item.getTag() != null);
helper.setText(R.id.tv_mini_world_name, "#" + item.getTag());
//评论
setCommentCount(helper, item.getCommentCount());
//点赞
setLikeCount(helper, item.getLikeCount(), item.isLike(), false);
LinearLayout llLike = helper.getView(R.id.ll_like);
llLike.setEnabled(true);
llLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (item.getDynamicId() == 0) {
SingleToastUtil.showToast(ResUtil.getString(R.string.the_default_dynamic_cannot_be_liked));
return;
}
llLike.setEnabled(false);
int status = item.isLike() ? 0 : 1;
DynamicModel.get().like(worldId, item.getDynamicId(), item.getUid(), status, 1)
.compose(RxHelper.bindContext(context))
.subscribe(new DontWarnObserver<String>() {
@Override
public void accept(String s, String error) {
super.accept(s, error);
llLike.setEnabled(true);
if (error != null) {
SingleToastUtil.showToast(error);
} else {
LogUtil.print(mContext.getString(R.string.me_call_the_like_interface_to_complete));
if (status == 1) {
item.setLikeCount(item.getLikeCount() + 1);
} else {
item.setLikeCount(item.getLikeCount() - 1);
}
item.setLike(status == 1);
setLikeCount(helper, item.getLikeCount(), item.isLike(), true);
}
}
});
}
});
//评论
helper.getView(R.id.ll_comment).setOnClickListener(v -> {
if (item.getDynamicId() == 0) {
SingleToastUtil.showToast(ResUtil.getString(R.string.the_default_dynamic_cannot_be_commented));
return;
}
DynamicDetailActivity.start(context, item.getDynamicId(), worldId,
helper.getAdapterPosition(), true, 1);
}
);
helper.setVisible(R.id.iv_more, item.getDynamicId() != 0);
if (item.getDynamicId() != 0) {
helper.addOnClickListener(R.id.iv_more).addOnClickListener(R.id.ll_share);
}
View.OnClickListener toDetailListener = v -> {
if (item.getDynamicId() == 0) {
return;
}
DynamicDetailActivity.start(context, item.getDynamicId(), worldId,
helper.getAdapterPosition(), false, 1);
};
if (etvContent.mTv != null) {
etvContent.mTv.setOnClickListener(toDetailListener);
}
//跳转去详情
helper.itemView.setOnClickListener(toDetailListener);
helper.setGone(R.id.line_bottom, getItemCount() - 1 != helper.getLayoutPosition());
}
private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) {
TextView tvLike = helper.getView(R.id.tv_like);
String likeCountStr;
if (likeCount < 0) {
likeCountStr = "0";
} else if (likeCount >= 1000) {
likeCountStr = "999+";
} else {
likeCountStr = String.valueOf(likeCount);
}
tvLike.setText(likeCountStr);
ImageView ivLikeAnim = helper.getView(R.id.iv_like_pic);
if (isLike) {
ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like);
} else {
ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like_false);
}
}
private void initRecyclerView(RecyclerView rvImage, List<DynamicMedia> imageUrl, boolean noTextUi) {
if (imageUrl == null) {
return;
}
CalcSize calcSize = new CalcSize(imageBorder);
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams();
if (imageUrl.size() > 1) {
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
} else {
//单图的情况,按比例显示
DynamicMedia media = null;
if (imageUrl.size() > 0) {
media = imageUrl.get(0);
}
if (media == null) {
return;
}
calcSize = ImageUiHelper.calcImage(media, imageBorder);
params.width = calcSize.width + divider;
params.height = calcSize.height + divider;
}
rvImage.setLayoutParams(params);
rvImage.setNestedScrollingEnabled(false);
rvImage.setLayoutManager(new GridLayoutManager(mContext, imageUrl.size() > 2 ? 3 : imageUrl.size()));
DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_dynamic_image, imageUrl);
adapter.setSingleImageHeight(calcSize.height);
adapter.setOnItemClickListener((adapter1, view, position) -> {
PagerOption option = new PagerOption().setSave(true);
BigPhotoActivity.start((Activity) mContext, ObjectTypeHelper.mediaToCustomList(imageUrl),
position, option);
}
);
rvImage.setAdapter(adapter);
}
private void setCommentCount(BaseViewHolder helper, int commentCount) {
TextView tvComment = helper.getView(R.id.tv_comment);
String commentCountStr;
if (commentCount < 0) {
commentCountStr = "0";
} else if (commentCount >= 1000) {
commentCountStr = "999+";
} else {
commentCountStr = String.valueOf(commentCount);
}
tvComment.setText(commentCountStr);
}
}

View File

@@ -0,0 +1,31 @@
package com.chwl.app.ui.user.adapter
import android.view.View
import android.view.ViewGroup
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.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.core.game_team.UserGameTeamInfo
class UserInfoGameTeamAdapter(private val isMe: Boolean) :
BaseQuickAdapter<UserGameTeamInfo, BaseViewHolder>(R.layout.user_info_item_game_team) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateViewHolder(parent, viewType).apply {
addOnClickListener(R.id.layout_play)
getView<View>(R.id.layout_play).isVisible = !isMe
}
}
override fun convert(helper: BaseViewHolder, item: UserGameTeamInfo) {
helper.setText(R.id.tv_name, item.gameName)
helper.setText(R.id.tv_level, item.proficiency)
helper.setText(R.id.tv_price, item.price?.toString() ?: "")
helper.getView<ImageView>(R.id.iv_icon).load(item.logo)
helper.getView<ImageView>(R.id.iv_bg)
.load(item.background, defaultRes = R.color.color_66000000)
}
}

View File

@@ -0,0 +1,36 @@
package com.chwl.app.ui.user.adapter
import android.view.ViewGroup
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.core.bean.UserInfoItem
import com.chwl.core.user.bean.GiftWallInfo
class UserInfoGiftAdapter(private val itemBgRes: Int = R.drawable.user_info_bg_gift) :
BaseQuickAdapter<GiftWallInfo, BaseViewHolder>(R.layout.user_info_item_gift) {
override fun onCreateDefViewHolder(parent: ViewGroup?, viewType: Int): BaseViewHolder {
return super.onCreateDefViewHolder(parent, viewType).apply {
getView<ImageView>(R.id.iv_bg).setImageResource(itemBgRes)
}
}
override fun convert(helper: BaseViewHolder, item: GiftWallInfo) {
helper.setText(R.id.tv_name, item.giftName)
helper.setText(R.id.tv_count, "x${item.reciveCount}")
val iconView = helper.getView<ImageView>(R.id.iv_icon)
iconView.load(item.picUrl)
val rankView = helper.itemView.findViewById<ImageView>(R.id.iv_rank)
if (helper.bindingAdapterPosition == 0) {
rankView.setImageResource(R.drawable.ic_gift_one)
} else if (helper.bindingAdapterPosition == 1) {
rankView.setImageResource(R.drawable.ic_gift_two)
} else if (helper.bindingAdapterPosition == 2) {
rankView.setImageResource(R.drawable.ic_gift_three)
} else {
rankView.setImageDrawable(null)
}
}
}

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