diff --git a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/ConferenceMainFragment.java b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/ConferenceMainFragment.java index c171c72c7..63e49c07d 100644 --- a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/ConferenceMainFragment.java +++ b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/ConferenceMainFragment.java @@ -74,6 +74,10 @@ public void startConference(ConferenceDefine.StartConferenceParams startConferen mViewModel.startConference(startConferenceParams, new ConferenceMainViewModel.GetConferenceInfoCallback() { @Override public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) { + if (!isAdded()) { + Log.w(TAG, "startConference onSuccess but fragment not attached"); + return; + } Map param = new HashMap<>(3); param.put(KEY_CONFERENCE_INFO, roomInfo); param.put(KEY_CONFERENCE_ERROR, SUCCESS); @@ -83,6 +87,10 @@ public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) { @Override public void onError(TUIRoomDefine.RoomInfo roomInfo, TUICommonDefine.Error error, String message) { + if (!isAdded()) { + Log.w(TAG, "startConference onError but fragment not attached, error=" + error); + return; + } onDismiss(); Map param = new HashMap<>(3); param.put(KEY_CONFERENCE_INFO, roomInfo); @@ -103,6 +111,10 @@ public void joinConference(ConferenceDefine.JoinConferenceParams joinConferenceP mViewModel.joinConference(joinConferenceParams, new ConferenceMainViewModel.GetConferenceInfoCallback() { @Override public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) { + if (!isAdded()) { + Log.w(TAG, "joinConference onSuccess but fragment not attached"); + return; + } Map param = new HashMap<>(3); param.put(KEY_CONFERENCE_INFO, roomInfo); param.put(KEY_CONFERENCE_ERROR, SUCCESS); @@ -112,6 +124,10 @@ public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) { @Override public void onError(TUIRoomDefine.RoomInfo roomInfo, TUICommonDefine.Error error, String message) { + if (!isAdded()) { + Log.w(TAG, "joinConference onError but fragment not attached, error=" + error); + return; + } if (error == TUICommonDefine.Error.NEED_PASSWORD) { popEnterPasswordView(joinConferenceParams); } else { @@ -139,7 +155,9 @@ public void onCancel() { @Override public void onConfirm(String password) { if (TextUtils.isEmpty(password)) { - RoomToast.toastShortMessageCenter(getContext().getString(R.string.tuiroomkit_password_is_empty)); + if (isAdded()) { + RoomToast.toastShortMessageCenter(getString(R.string.tuiroomkit_password_is_empty)); + } return; } mPasswordPopView.enableJoinRoomButton(false); @@ -152,19 +170,31 @@ public void enterEncryptRoom(ConferenceDefine.JoinConferenceParams joinConferenc mViewModel.joinEncryptRoom(joinConferenceParams, password, new ConferenceMainViewModel.GetConferenceInfoCallback() { @Override public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) { + if (!isAdded()) { + Log.w(TAG, "joinEncryptRoom onSuccess but fragment not attached"); + return; + } Map param = new HashMap<>(3); param.put(KEY_CONFERENCE_INFO, roomInfo); param.put(KEY_CONFERENCE_ERROR, SUCCESS); param.put(KEY_CONFERENCE_MESSAGE, ""); TUICore.notifyEvent(KEY_CONFERENCE, KEY_CONFERENCE_JOINED, param); - mPasswordPopView.dismiss(); + if (mPasswordPopView != null) { + mPasswordPopView.dismiss(); + } } @Override public void onError(TUIRoomDefine.RoomInfo roomInfo, TUICommonDefine.Error error, String message) { + if (!isAdded()) { + Log.w(TAG, "joinEncryptRoom onError but fragment not attached, error=" + error); + return; + } if (error == TUICommonDefine.Error.WRONG_PASSWORD) { - mPasswordPopView.enableJoinRoomButton(true); - RoomToast.toastShortMessageCenter(getContext().getString(R.string.tuiroomkit_room_password_error)); + if (mPasswordPopView != null) { + mPasswordPopView.enableJoinRoomButton(true); + } + RoomToast.toastShortMessageCenter(getString(R.string.tuiroomkit_room_password_error)); } else { Map param = new HashMap<>(3); param.put(KEY_CONFERENCE_INFO, roomInfo); @@ -279,6 +309,10 @@ public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { } public void onDismiss() { + if (mActivity == null) { + Log.w(TAG, "onDismiss but activity already released"); + return; + } mActivity.finish(); release(); } @@ -327,6 +361,10 @@ private void release() { } private String transErrorMessage(TUICommonDefine.Error error, String message) { + if (!isAdded()) { + Log.w(TAG, "transErrorMessage fragment not attached, error=" + error); + return message; + } String errorMessage = ""; switch (error) { case ROOM_ID_NOT_EXIST: @@ -361,6 +399,10 @@ private String transErrorMessage(TUICommonDefine.Error error, String message) { } private void showErrorToast(TUICommonDefine.Error error) { + if (!isAdded()) { + Log.w(TAG, "showErrorToast fragment not attached, error=" + error); + return; + } String errorMessage = ""; switch (error) { case ROOM_ID_NOT_EXIST: diff --git a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewAdapter.java b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewAdapter.java index 31fc94c53..0595e3a08 100644 --- a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewAdapter.java +++ b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewAdapter.java @@ -52,13 +52,19 @@ public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType @Override public void onBindViewHolder(@NonNull UserViewHolder holder, int position) { + if (mUserList == null || position < 0 || position >= mUserList.size()) { + return; + } UserState.UserInfo user = mUserList.get(position); + if (user == null || user.userId == null) { + return; + } holder.bindData(user); } @Override public int getItemCount() { - return mUserList.size(); + return mUserList == null ? 0 : mUserList.size(); } public static class UserViewHolder extends RecyclerView.ViewHolder { @@ -109,7 +115,13 @@ public void onClick(View v) { } private boolean hasAbilityToManageUser(UserState.UserInfo user) { + if (user == null) { + return false; + } UserState.UserInfo localUser = ConferenceController.sharedInstance().getUserState().selfInfo.get(); + if (localUser == null) { + return false; + } if (TextUtils.equals(localUser.userId, user.userId) || localUser.role.get() == TUIRoomDefine.Role.ROOM_OWNER) { return true; } diff --git a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewStateHolder.java b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewStateHolder.java index 142d55c20..4dbae462d 100644 --- a/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewStateHolder.java +++ b/Android/tuiroomkit/src/main/java/com/tencent/cloud/tuikit/roomkit/view/main/usercontrolpanel/UserRecyclerViewStateHolder.java @@ -181,7 +181,12 @@ private void notifyInRoomUserRemoved(UserState.UserInfo user) { private void notifySeatUserInserted(String userId) { if (mSelectedUserListType == ON_SEAT) { - mSelectedUserList.insert(mUserState.allUsers.find(new UserState.UserInfo(userId)), mUserListComparator); + UserState.UserInfo user = mUserState.allUsers.find(new UserState.UserInfo(userId)); + if (user == null) { + Log.w(TAG, "notifySeatUserInserted ON_SEAT user not found in allUsers, userId=" + userId); + return; + } + mSelectedUserList.insert(user, mUserListComparator); return; } if (mSelectedUserListType == OFF_SEAT) { @@ -195,7 +200,12 @@ private void notifySeatUserRemoved(String userId) { return; } if (mSelectedUserListType == OFF_SEAT) { - mSelectedUserList.insert(mUserState.allUsers.find(new UserState.UserInfo(userId)), mUserListComparator); + UserState.UserInfo user = mUserState.allUsers.find(new UserState.UserInfo(userId)); + if (user == null) { + Log.w(TAG, "notifySeatUserRemoved OFF_SEAT user not found in allUsers, userId=" + userId); + return; + } + mSelectedUserList.insert(user, mUserListComparator); } } @@ -218,6 +228,10 @@ private void notifyUserMediaStateChanged(String userId) { return; } UserState.UserInfo user = mUserState.allUsers.find(new UserState.UserInfo(userId)); + if (user == null) { + Log.w(TAG, "notifyUserMediaStateChanged user not found in allUsers, userId=" + userId); + return; + } mSelectedUserList.move(user, mUserListComparator); } @@ -289,6 +303,9 @@ private List filterUserOutRoom() { List userList = new LinkedList<>(); List invitationList = mInvitationState.invitationList.getList(); for (InvitationState.Invitation invitation : invitationList) { + if (invitation == null || invitation.invitee == null) { + continue; + } if (!isContainsSearchWord(invitation.invitee.userName)) { continue; }