diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/NewsMessageList.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/NewsMessageList.java index 46821105..08cbccdd 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/NewsMessageList.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/NewsMessageList.java @@ -10,7 +10,7 @@ import lombok.Data; @Data public class NewsMessageList { private int id; - private int type;//类型 1:系统消息 2:官方公告 3:活动中心 + private int type;//类型 1:系统消息 2:官方公告 3:活动中心 6:邀请加入公会 private int admin_id; private String title;//标题 private String content;//内容 @@ -22,4 +22,5 @@ public class NewsMessageList { private String createtime; private String updatetime; private String delete_time; + private int guild_invited_status; } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java index 030a920b..b73795a5 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -125,6 +125,9 @@ public interface ApiServer { @POST(Constants.POST_MESSAGE_LIST) Call>> getMessagetitle(@Field("type") String type, @Field("page") String page, @Field("page_limit") String page_limit); + @FormUrlEncoded + @POST(Constants.POST_INVITE) + Call> postInvite(@Field("apply_id") String apply_id, @Field("type") String type); @GET(Constants.GET_TEMP_KEY) Call> getTempKey(); diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java index 9a477f1e..36c18d04 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -518,6 +518,34 @@ public class RetrofitClient { }); } + public void postInvite(String apply_id,String type,BaseObserver observer) { + sApiServer.postInvite(apply_id,type).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel baseModel = response.body(); + if (baseModel.getCode() == 1) + observer.onNext(baseModel.getMsg()); + else if (baseModel.getCode() == 301) { + try { + ToastUtils.showShort(baseModel.getMsg()); + CommonAppContext.getInstance().clearLoginInfo(); + } catch (ClassNotFoundException e) { + } + } else { + observer.onNext(baseModel.getMsg()); + } + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("修改公会公告失败",t.fillInStackTrace()); + } + }); + } + public void singerAuth(String url, BaseObserver observer) { sApiServer.singerAuth(url).enqueue(new Callback>() { diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java index 98e5fa99..47d748bf 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -366,6 +366,7 @@ public class Constants { public static final String GET_APP_UPDATE = "/api/Version/get_app_version";//版本更新 public static final String POST_CLEAR_USER_CHARM = "/api/Room/clear_user_charm";//清除魅力值 public static final String POST_MESSAGE_LIST = "/api/UserMessage/get_user_message_list";//消息列表 + public static final String POST_INVITE = "/api/Guild/invite_apply_handle";//【新】受邀申请处理 public static final String POST_BIND_DETAIL = "/api/Bind/bind_detail";//绑定详情 public static final String POST_USER_WALL = "/api/User/user_gift_wall";//礼物墙 public static final String POST_USER_OLINE_STATUS = "/api/Room/user_online_status";//用户在线状态 diff --git a/BaseModule/src/main/res/mipmap-hdpi/jukebox_bj.webp b/BaseModule/src/main/res/mipmap-hdpi/jukebox_bj.webp new file mode 100644 index 00000000..a2481658 Binary files /dev/null and b/BaseModule/src/main/res/mipmap-hdpi/jukebox_bj.webp differ diff --git a/BaseModule/src/main/res/mipmap-xhdpi/jukebox_bj.webp b/BaseModule/src/main/res/mipmap-xhdpi/jukebox_bj.webp new file mode 100644 index 00000000..4aefb4d2 Binary files /dev/null and b/BaseModule/src/main/res/mipmap-xhdpi/jukebox_bj.webp differ diff --git a/BaseModule/src/main/res/mipmap-xxhdpi/jukebox_bj.webp b/BaseModule/src/main/res/mipmap-xxhdpi/jukebox_bj.webp new file mode 100644 index 00000000..f1e83e8b Binary files /dev/null and b/BaseModule/src/main/res/mipmap-xxhdpi/jukebox_bj.webp differ diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java index b3b39f2e..116c406a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java @@ -12,10 +12,14 @@ public class NewsContacts { public interface View extends IView { void showNews(List newsList); void finishRefresh(); + + void postInvite(); } public interface IHomePre extends IPresenter { void getMessagetitle(String type,String page,String pageLimit); + + void postInvite(String apply_id, String type); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java index 0a7753e7..54dc00f5 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java @@ -6,13 +6,16 @@ import com.xscm.moduleutil.bean.NewsMessageList; import com.xscm.moduleutil.http.BaseObserver; import com.xscm.moduleutil.presenter.BasePresenter; +import java.lang.ref.WeakReference; import java.util.List; import io.reactivex.disposables.Disposable; public class NewsPresenter extends BasePresenter implements NewsContacts.IHomePre { + NewsContacts.View mView; public NewsPresenter(NewsContacts.View view, Context context) { super(view, context); + mView = view; } @@ -27,9 +30,31 @@ public class NewsPresenter extends BasePresenter implements N @Override public void onNext(List newsMessageLists) { + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } MvpRef.get().showNews(newsMessageLists); MvpRef.get().finishRefresh(); } }); } + + @Override + public void postInvite(String apply_id, String type) { + api.postInvite(apply_id, type, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(String s) { + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } + MvpRef.get().postInvite(); + } + }); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java index 462b102e..11b84123 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java @@ -61,48 +61,78 @@ public class OfficialNoticeActivity extends BaseMvpActivity0){ - RoomManager.getInstance().fetchRoomDataAndEnter(getApplicationContext(), item.getRoom_id()+"","",null); -// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("roomId", item.getRoom_id() + "").navigation(); - }else if (item.getRoom_id() == 0 && item.getUrl() != null && !item.getUrl().isEmpty()){ - Intent intent = new Intent(OfficialNoticeActivity.this, WebViewActivity.class); - intent.putExtra("url", item.getUrl()); - startActivity(intent); -// ARouter.getInstance().build(ARouteConstants.H5).withString("url", item.getUrl()).navigation(); - } + if (item.getType() == 6) { + helper.getView(R.id.ll_system).setVisibility(GONE); + helper.getView(R.id.ll_gh).setVisibility(VISIBLE); + + helper.setText(R.id.tv_sys_cons, item.getContent()); + if (item.getGuild_invited_status()==0){ + helper.getView(R.id.ll_but).setVisibility(VISIBLE); + helper.getView(R.id.tv_cancel2).setVisibility(GONE); + }else if (item.getGuild_invited_status()==1){ + helper.getView(R.id.ll_but).setVisibility(GONE); + helper.getView(R.id.tv_cancel2).setVisibility(VISIBLE); + helper.setText(R.id.tv_cancel2,"已同意"); + }else if (item.getGuild_invited_status()==2){ + helper.getView(R.id.ll_but).setVisibility(GONE); + helper.getView(R.id.tv_cancel2).setVisibility(VISIBLE); + helper.setText(R.id.tv_cancel2,"已拒绝"); } - }); + helper.getView(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + MvpPre.postInvite(item.getId()+"","2"); + helper.getView(R.id.ll_but).setVisibility(GONE); + helper.getView(R.id.tv_cancel2).setVisibility(VISIBLE); + helper.setText(R.id.tv_cancel2,"已拒绝"); + } + }); + + helper.getView(R.id.tv_confirm).setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + MvpPre.postInvite(item.getId()+"","1"); + helper.getView(R.id.ll_but).setVisibility(GONE); + helper.getView(R.id.tv_cancel2).setVisibility(VISIBLE); + helper.setText(R.id.tv_cancel2,"已同意"); + MvpPre.getMessagetitle(type, "1", "10"); + } + }); -// if (item.getType().equals("1")) { -// helper.getView(R.id.ll_system_official).setVisibility(GONE); -// } else if (item.getType().equals("2")) { -// helper.getView(R.id.tv_sys_con).setVisibility(GONE); -// helper.getView(R.id.ll_system_official).setVisibility(VISIBLE); -// } else { -// helper.getView(R.id.ll_system_official).setVisibility(GONE); -// } + } else { + helper.getView(R.id.ll_system).setVisibility(VISIBLE); + helper.getView(R.id.ll_gh).setVisibility(GONE); + if (item.getImage() == null || item.getImage().isEmpty()) { + helper.getView(R.id.tv_sys_con).setVisibility(VISIBLE); + helper.setText(R.id.tv_sys_con, item.getContent()); + helper.getView(R.id.ll_system_official).setVisibility(GONE); + } else { + helper.getView(R.id.tv_sys_con).setVisibility(GONE); + helper.getView(R.id.ll_system_official).setVisibility(VISIBLE); + ImageUtils.loadHeadCC(item.getImage(), helper.getView(R.id.image)); + helper.setText(R.id.tv_cont, Html.fromHtml(item.getContent())); + } + helper.itemView.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + if (item.getRoom_id() > 0) { + RoomManager.getInstance().fetchRoomDataAndEnter(getApplicationContext(), item.getRoom_id() + "", "", null); +// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("roomId", item.getRoom_id() + "").navigation(); + } else if (item.getRoom_id() == 0 && item.getUrl() != null && !item.getUrl().isEmpty()) { + Intent intent = new Intent(OfficialNoticeActivity.this, WebViewActivity.class); + intent.putExtra("url", item.getUrl()); + startActivity(intent); + } + } + }); + + } -// helper.getView(R.id.image).setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// -// } -// }); } }; mBinding.recycleView.setAdapter(mAdapter); @@ -122,7 +152,18 @@ public class OfficialNoticeActivity extends BaseMvpActivity newsList) { - mAdapter.setNewData(newsList); + // 判断是否为第一页 + if (page == 1) { + // 第一页,使用setNewData替换所有数据 + mAdapter.setNewData(newsList); + } else { + // 非第一页(上拉加载),判断是否有数据 + if (newsList != null && !newsList.isEmpty()) { + // 有数据,添加到现有数据中 + mAdapter.addData(newsList); + } + // 如果没有数据,不做任何操作,保持原有数据不变 + } } @Override @@ -130,4 +171,9 @@ public class OfficialNoticeActivity extends BaseMvpActivity(), fun getRoomInfoResp(): List? { val roomPitBeans = mRoomInfoResp?.room_info?.pit_list.orEmpty().filter { - it.user_id != null && it.user_id != "0" && it.user_id.isNotEmpty()&& it.user_id.toInt() != SpUtil.getUserId() + it.user_id != null && it.user_id != "0" && it.user_id.isNotEmpty()&& it.user_id.toInt() != SpUtil.getUserId() && it.pit_number.toInt()<9 } return roomPitBeans.ifEmpty { null } } @@ -3692,7 +3692,7 @@ class RoomActivity : BaseMvpActivity(), return result } - + // TODO: 根据返回的在线列表获取对应的值,查看是否有在线用户 override fun getRoomOnline(onlineBean: RoomOnline?) { if (onlineBean != null) { val onlineBeans: MutableList = ArrayList() @@ -3818,7 +3818,12 @@ class RoomActivity : BaseMvpActivity(), } RoomType.JUKEBOX -> { - changeBackgroundColor(mRoomInfoResp!!.room_info.room_background) + if (mRoomInfoResp!!.room_info.room_background == null || mRoomInfoResp!!.room_info.room_background == "") { + changeBackground(com.xscm.moduleutil.R.mipmap.jukebox_bj) + } else { + changeBackgroundColor(mRoomInfoResp!!.room_info.room_background) + } +// changeBackgroundColor(mRoomInfoResp!!.room_info.room_background) setvisibTop(true) QXRoomSeatViewType.JUKEBOX } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java index f6b5e857..68659f38 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java @@ -4,9 +4,12 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import android.os.Bundle; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.PopupWindow; import android.widget.Switch; @@ -93,6 +96,7 @@ public class RoomJukeboxFragment extends BaseMvpFragment()); wheatPositionAdapter.setOnItemSelectedListener(position -> { - selectedWheatPosition = Integer.parseInt(position.getUser_id()); - updateSongList(selectedWheatPosition); + if (position != null && position.getUser_id() != null && !position.getUser_id().isEmpty()) { + selectedWheatPosition = Integer.parseInt(position.getUser_id()); + updateSongList(selectedWheatPosition); + } }); mBinding.rvWheatPositions.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java index 927268e6..a780478c 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java @@ -374,7 +374,7 @@ public class SingerVerificationActivity extends BaseMvpActivity 1) { - mergeAudioFiles(); + // 如果还没有合并文件,先进行合并 + if (mergedRecordingFile == null || !mergedRecordingFile.exists()) { + Log.d("SingerVerification", "提交前合并音频片段,共 " + recordingSegments.size() + " 个片段"); + mergeAudioFiles(); + } else { + Log.d("SingerVerification", "使用已合并的音频文件: " + mergedRecordingFile.getAbsolutePath()); + recordingFile = mergedRecordingFile; + } } else if (recordingSegments.size() == 1) { + // 只有一个片段,直接使用 recordingFile = recordingSegments.get(0); + Log.d("SingerVerification", "使用单个录音片段: " + recordingFile.getAbsolutePath()); } if (recordingFile == null || !recordingFile.exists()) { @@ -513,11 +522,13 @@ public class SingerVerificationActivity extends BaseMvpActivity { + cleanupSegments(processedSegments); + }, 30000); // 延迟30秒删除,确保用户有足够时间试听 } } @@ -646,6 +661,8 @@ public class SingerVerificationActivity extends BaseMvpActivity maxSampleTime) { - maxSampleTime = sampleTime; + // 记录第一个和最后一个样本时间 + if (firstSampleTime == Long.MAX_VALUE) { + firstSampleTime = sampleTime; } + lastSampleTime = sampleTime; + + // 重新计算时间戳,确保每个片段从baseTimeUs开始 + // 使用相对时间戳(相对于片段的第一个样本) + long relativeTime = sampleTime - firstFrameTime; bufferInfo.offset = 0; bufferInfo.size = sampleSize; - bufferInfo.presentationTimeUs = baseTimeUs + sampleTime; + bufferInfo.presentationTimeUs = baseTimeUs + relativeTime; bufferInfo.flags = extractor.getSampleFlags(); // 确保时间戳是递增的 @@ -696,10 +727,13 @@ public class SingerVerificationActivity extends BaseMvpActivity 0) { - // 添加最后一个样本的估计持续时间(假设20ms) - actualDuration = maxSampleTime + 20000; + // 计算实际持续时间 + if (lastSampleTime > firstSampleTime && firstSampleTime != Long.MAX_VALUE) { + // 使用实际的样本时间差 + actualDuration = lastSampleTime - firstSampleTime + 20000; // 添加最后一个样本的估计持续时间 + } else if (sampleCount > 0) { + // 如果没有有效的时间戳,使用样本数量估算 + actualDuration = sampleCount * 1000000 / 44100; // 假设44.1kHz } else { // 如果没有样本,使用格式的估计值 actualDuration = estimatedDuration; @@ -729,6 +763,7 @@ public class SingerVerificationActivity extends BaseMvpActivity 0) { recordingFile = mergedRecordingFile; Log.d("SingerVerification", "音频文件合并完成,文件大小: " + mergedRecordingFile.length() + " bytes"); + Log.d("SingerVerification", "设置当前播放文件为合并文件: " + mergedRecordingFile.getAbsolutePath()); } else { Log.e("SingerVerification", "合并文件不存在或为空,使用第一个录音片段"); if (!recordingSegments.isEmpty()) { @@ -736,8 +771,9 @@ public class SingerVerificationActivity extends BaseMvpActivity segments) { - // 延迟删除片段,确保合并文件已经完全写入 + // 延迟删除片段,确保合并文件已经完全写入且被使用 new Handler().postDelayed(() -> { for (File segment : segments) { try { @@ -776,6 +812,10 @@ public class SingerVerificationActivity extends BaseMvpActivity + app:layout_constraintTop_toTopOf="@+id/im_performer" + app:riv_oval="true"/> @@ -40,74 +40,151 @@ android:id="@+id/ll_system_official" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:layout_marginTop="@dimen/dp_16" - android:background="@drawable/bg_r16_fff"> + android:background="@drawable/bg_r16_fff" + android:orientation="vertical"> + app:corner_radius="@dimen/dp_8" /> + android:textSize="@dimen/sp_14" + tools:text="【某某传媒·粉丝狂欢】今晚22点已开启嗨玩三重奏,不仅有才艺舞台,还有分组pk,粉丝互动环节等你来~" /> + android:background="#E2E2E2" /> + android:layout_marginBottom="@dimen/dp_12"> + + android:textStyle="bold" /> + android:src="@drawable/detail_icon_go" /> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/room_view_jukebox_wheat.xml b/MainModule/src/main/res/layout/room_view_jukebox_wheat.xml index 4c979877..d44cc13a 100644 --- a/MainModule/src/main/res/layout/room_view_jukebox_wheat.xml +++ b/MainModule/src/main/res/layout/room_view_jukebox_wheat.xml @@ -59,11 +59,12 @@ android:adjustViewBounds="true" android:scaleType="fitCenter" android:visibility="gone" + app:layout_constraintWidth_percent="1.1" + app:layout_constraintHeight_percent="0.9" app:layout_constraintBottom_toBottomOf="@id/riv" app:layout_constraintEnd_toEndOf="@id/riv" app:layout_constraintStart_toStartOf="@id/riv" app:layout_constraintTop_toTopOf="@id/riv" - app:layout_constraintWidth_percent="1.15" tools:visibility="visible" />