Reimplement breakout rooms for usage of Activity instead of Controller

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2023-04-05 12:31:07 +02:00
parent 68b930a0d9
commit 48a4fbc3cc
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
6 changed files with 61 additions and 81 deletions

View File

@ -221,6 +221,7 @@
<activity
android:name=".chat.ChatActivity"
android:theme="@style/AppTheme"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
<receiver android:name=".receivers.PackageReplacedReceiver"

View File

@ -66,6 +66,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.call.CallParticipant;
import com.nextcloud.talk.call.CallParticipantList;
import com.nextcloud.talk.call.CallParticipantModel;
import com.nextcloud.talk.chat.ChatActivity;
import com.nextcloud.talk.data.user.model.User;
import com.nextcloud.talk.databinding.CallActivityBinding;
import com.nextcloud.talk.events.ConfigurationChangeEvent;
@ -182,7 +183,8 @@ import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_PARTICIPANT_PERMISS
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM_AND_START_CALL;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM;
import static com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY;
@AutoInjector(NextcloudTalkApplication.class)
@ -1917,8 +1919,8 @@ public class CallActivity extends CallBaseActivity {
removeCallParticipant(sessionId);
}
ApplicationWideCurrentRoomHolder.getInstance().clear();
hangupNetworkCalls(shutDownView);
ApplicationWideCurrentRoomHolder.getInstance().setInCall(false);
}
private void hangupNetworkCalls(boolean shutDownView) {
@ -1942,26 +1944,17 @@ public class CallActivity extends CallBaseActivity {
@Override
public void onNext(@io.reactivex.annotations.NonNull GenericOverall genericOverall) {
if (!switchToRoomToken.isEmpty()) {
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
Intent intent = new Intent(context, ChatActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle bundle = new Bundle();
bundle.putBoolean(KEY_SWITCH_TO_ROOM_AND_START_CALL, true);
bundle.putBoolean(KEY_SWITCH_TO_ROOM, true);
bundle.putBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, true);
bundle.putString(KEY_ROOM_TOKEN, switchToRoomToken);
bundle.putParcelable(KEY_USER_ENTITY, conversationUser);
bundle.putBoolean(KEY_CALL_VOICE_ONLY, isVoiceOnlyCall);
intent.putExtras(bundle);
startActivity(intent);
if (isBreakoutRoom) {
Toast.makeText(context, context.getResources().getString(R.string.switch_to_main_room),
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, context.getResources().getString(R.string.switch_to_breakout_room),
Toast.LENGTH_LONG).show();
}
finish();
} else if (shutDownView) {
finish();

View File

@ -349,24 +349,6 @@ class MainActivity : BaseActivity(), ActionBarProvider {
private fun handleIntent(intent: Intent) {
handleActionFromContact(intent)
if (intent.getBooleanExtra(BundleKeys.KEY_SWITCH_TO_ROOM_AND_START_CALL, false)) {
logRouterBackStack(router!!)
// remapChatController(
// router!!,
// intent.getParcelableExtra<User>(KEY_USER_ENTITY)!!.id!!,
// intent.getStringExtra(KEY_ROOM_TOKEN)!!,
// intent.extras!!,
// true,
// true
// )
val chatIntent = Intent(context, ChatActivity::class.java)
chatIntent.putExtras(intent.extras!!)
startActivity(chatIntent)
logRouterBackStack(router!!)
}
if (intent.hasExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL)) {
if (intent.getBooleanExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL, false)) {
if (!router!!.hasRootController()) {
@ -377,14 +359,6 @@ class MainActivity : BaseActivity(), ActionBarProvider {
startActivity(callNotificationIntent)
} else {
logRouterBackStack(router!!)
// remapChatController(
// router!!,
// intent.getParcelableExtra<User>(KEY_USER_ENTITY)!!.id!!,
// intent.getStringExtra(KEY_ROOM_TOKEN)!!,
// intent.extras!!,
// true,
// true
// )
val chatIntent = Intent(context, ChatActivity::class.java)
chatIntent.putExtras(intent.extras!!)

View File

@ -169,6 +169,7 @@ import com.nextcloud.talk.utils.ParticipantPermissions
import com.nextcloud.talk.utils.VibrationUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACTIVE_CONVERSATION
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CALL_VOICE_ONLY
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FILE_PATHS
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID
@ -177,6 +178,8 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_MODERATOR
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_RECORDING_STATE
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_START_CALL_AFTER_ROOM_SWITCH
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SWITCH_TO_ROOM
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
@ -295,7 +298,11 @@ class ChatActivity :
private val localParticipantMessageListener = object : SignalingMessageReceiver.LocalParticipantMessageListener {
override fun onSwitchTo(token: String?) {
if (token != null) {
switchToRoom(token)
if (CallActivity.active) {
Log.d(TAG, "CallActivity is running. Ignore to switch chat in ChatActivity...")
} else {
switchToRoom(token, false, false)
}
}
}
}
@ -309,6 +316,34 @@ class ChatActivity :
setupSystemColors()
setContentView(binding.root)
handleIntent(intent)
binding.progressBar.visibility = View.VISIBLE
initAdapter()
binding.messagesListView.setAdapter(adapter)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
val extras: Bundle? = intent.extras
val requestedRoomSwitch = extras?.getBoolean(KEY_SWITCH_TO_ROOM, false) == true
if (requestedRoomSwitch) {
val newRoomToken = extras?.getString(KEY_ROOM_TOKEN).orEmpty()
val startCallAfterRoomSwitch = extras?.getBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, false) == true
val isVoiceOnlyCall = extras?.getBoolean(KEY_CALL_VOICE_ONLY, false) == true
if (newRoomToken != roomToken) {
switchToRoom(newRoomToken, startCallAfterRoomSwitch, isVoiceOnlyCall)
}
} else {
handleIntent(intent)
}
}
private fun handleIntent(intent: Intent) {
val extras: Bundle? = intent.extras
conversationUser = extras?.getParcelable(KEY_USER_ENTITY)
@ -336,14 +371,9 @@ class ChatActivity :
}
startCallFromNotification = extras?.getBoolean(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL, false) == true
startCallFromRoomSwitch = extras?.getBoolean(BundleKeys.KEY_SWITCH_TO_ROOM_AND_START_CALL, false) == true
startCallFromRoomSwitch = extras?.getBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, false) == true
voiceOnly = extras?.getBoolean(BundleKeys.KEY_CALL_VOICE_ONLY, false) == true
binding.progressBar.visibility = View.VISIBLE
initAdapter()
binding.messagesListView.setAdapter(adapter)
voiceOnly = extras?.getBoolean(KEY_CALL_VOICE_ONLY, false) == true
}
override fun onStart() {
@ -1010,12 +1040,7 @@ class ChatActivity :
currentConversation?.type == Conversation.ConversationType
.ROOM_TYPE_ONE_TO_ONE_CALL
private fun switchToRoom(token: String) {
if (CallActivity.active) {
Log.d(TAG, "CallActivity is running. Ignore to switch chat in ChatController...")
return
}
private fun switchToRoom(token: String, startCallAfterRoomSwitch: Boolean, isVoiceOnlyCall: Boolean) {
if (conversationUser != null) {
runOnUiThread {
if (currentConversation?.objectType == Conversation.ObjectType.ROOM) {
@ -1037,6 +1062,11 @@ class ChatActivity :
bundle.putParcelable(KEY_USER_ENTITY, conversationUser)
bundle.putString(KEY_ROOM_TOKEN, token)
if (startCallAfterRoomSwitch) {
bundle.putBoolean(KEY_START_CALL_AFTER_ROOM_SWITCH, true)
bundle.putBoolean(KEY_CALL_VOICE_ONLY, isVoiceOnlyCall)
}
leaveRoom {
val chatIntent = Intent(context, ChatActivity::class.java)
chatIntent.putExtras(bundle)
@ -1926,7 +1956,7 @@ class ChatActivity :
override fun onPause() {
super.onPause()
logConversationInfos("onDetach")
logConversationInfos("onPause")
eventBus.unregister(this)
@ -1995,24 +2025,6 @@ class ChatActivity :
}
private fun joinRoomWithPassword() {
if (CallActivity.active &&
roomToken != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken
) {
Toast.makeText(
context,
context.getString(R.string.restrict_join_other_room_while_call),
Toast.LENGTH_LONG
).show()
Log.e(
TAG,
"Restricted to open chat controller because a call in another room is active. This is an " +
"edge case which is not properly handled yet."
)
finish()
return
}
// if ApplicationWideCurrentRoomHolder contains a session (because a call is active), then keep the sessionId
if (ApplicationWideCurrentRoomHolder.getInstance().currentRoomId ==
currentConversation!!.roomId
@ -2080,6 +2092,7 @@ class ChatActivity :
}
if (startCallFromRoomSwitch) {
startCallFromRoomSwitch = false
startACall(voiceOnly, true)
}
}
@ -2160,8 +2173,6 @@ class ChatActivity :
if (funToCallWhenLeaveSuccessful != null) {
Log.d(TAG, "a callback action was set and is now executed because room was left successfully")
funToCallWhenLeaveSuccessful()
} else {
Log.d(TAG, "remapChatController was not set")
}
}
@ -2872,7 +2883,7 @@ class ChatActivity :
)
if (isVoiceOnlyCall) {
bundle.putBoolean(BundleKeys.KEY_CALL_VOICE_ONLY, true)
bundle.putBoolean(KEY_CALL_VOICE_ONLY, true)
}
if (callWithoutNotification) {
bundle.putBoolean(BundleKeys.KEY_CALL_WITHOUT_NOTIFICATION, true)
@ -3509,7 +3520,7 @@ class ChatActivity :
private fun logConversationInfos(methodName: String) {
Log.d(TAG, " |-----------------------------------------------")
Log.d(TAG, " | method: $methodName")
Log.d(TAG, " | ChatController: " + System.identityHashCode(this).toString())
Log.d(TAG, " | ChatActivity: " + System.identityHashCode(this).toString())
Log.d(TAG, " | roomToken: $roomToken")
Log.d(TAG, " | currentConversation?.displayName: ${currentConversation?.displayName}")
Log.d(TAG, " | sessionIdAfterRoomJoined: $sessionIdAfterRoomJoined")
@ -3517,7 +3528,7 @@ class ChatActivity :
}
companion object {
private const val TAG = "ChatController"
private val TAG = ChatActivity::class.simpleName
private const val CONTENT_TYPE_SYSTEM_MESSAGE: Byte = 1
private const val CONTENT_TYPE_UNREAD_NOTICE_MESSAGE: Byte = 2
private const val CONTENT_TYPE_LOCATION: Byte = 3

View File

@ -80,7 +80,8 @@ object BundleKeys {
const val KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_AUDIO = "KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_AUDIO"
const val KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_VIDEO = "KEY_PARTICIPANT_PERMISSION_CAN_PUBLISH_VIDEO"
const val KEY_IS_MODERATOR = "KEY_IS_MODERATOR"
const val KEY_SWITCH_TO_ROOM_AND_START_CALL = "KEY_SWITCH_TO_ROOM_AND_START_CALL"
const val KEY_SWITCH_TO_ROOM = "KEY_SWITCH_TO_ROOM"
const val KEY_START_CALL_AFTER_ROOM_SWITCH = "KEY_START_CALL_AFTER_ROOM_SWITCH"
const val KEY_IS_BREAKOUT_ROOM = "KEY_IS_BREAKOUT_ROOM"
const val KEY_NOTIFICATION_RESTRICT_DELETION = "KEY_NOTIFICATION_RESTRICT_DELETION"
const val KEY_DISMISS_RECORDING_URL = "KEY_DISMISS_RECORDING_URL"

View File

@ -1,2 +1,2 @@
DO NOT TOUCH; GENERATED BY DRONE
<span class="mdl-layout-title">Lint Report: 108 warnings</span>
<span class="mdl-layout-title">Lint Report: 109 warnings</span>