Skip to content

Commit 34936ea

Browse files
committed
fix: navigate back to primary task when leaving permanent call room
When multiple app instances run in separate tasks (e.g. opened via a notification), leaving a voice/permanent call room previously started a new ConversationsListActivity on top of the call task instead of returning to the existing app task. This caused duplicate task stacks. Now the call task finds the existing primary task (preferring one rooted at MainActivity) and navigates it to ConversationsListActivity, removes any stray non-call tasks, and uses finishAndRemoveTask() to fully clean up the call task. Falls back to launching MainActivity fresh if no existing task is found. AI-assistant: Claude Code v2.1.142 (Claude Sonnet 4.6) Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
1 parent 726b20b commit 34936ea

1 file changed

Lines changed: 52 additions & 3 deletions

File tree

app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package com.nextcloud.talk.activities
1111

1212
import android.Manifest
1313
import android.annotation.SuppressLint
14+
import android.app.ActivityManager
1415
import android.app.PendingIntent
1516
import android.app.RemoteAction
1617
import android.content.BroadcastReceiver
@@ -78,6 +79,7 @@ import com.nextcloud.talk.camera.BackgroundBlurFrameProcessor
7879
import com.nextcloud.talk.camera.BlurBackgroundViewModel
7980
import com.nextcloud.talk.camera.BlurBackgroundViewModel.BackgroundBlurOn
8081
import com.nextcloud.talk.chat.ChatActivity
82+
import com.nextcloud.talk.callnotification.CallNotificationActivity
8183
import com.nextcloud.talk.conversationlist.ConversationsListActivity
8284
import com.nextcloud.talk.data.user.model.User
8385
import com.nextcloud.talk.databinding.CallActivityBinding
@@ -2049,9 +2051,8 @@ class CallActivity : CallBaseActivity() {
20492051
}
20502052

20512053
if (conversationModel?.checkIfVoiceRoom() == true) {
2052-
val intent = Intent(context, ConversationsListActivity::class.java)
2053-
startActivity(intent)
2054-
finish()
2054+
openConversationListInPrimaryTask()
2055+
finishAndRemoveTask()
20552056
} else if (switchToRoomToken.isNotEmpty()) {
20562057
val intent = Intent(context, ChatActivity::class.java)
20572058
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
@@ -2083,6 +2084,54 @@ class CallActivity : CallBaseActivity() {
20832084
})
20842085
}
20852086

2087+
private fun openConversationListInPrimaryTask() {
2088+
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
2089+
val appTasks = activityManager
2090+
?.appTasks
2091+
?.filter { appTask -> appTask.taskInfo?.baseActivity?.packageName == packageName }
2092+
.orEmpty()
2093+
2094+
val primaryTask = appTasks.firstOrNull { appTask ->
2095+
val taskInfo = appTask.taskInfo
2096+
val baseActivityName = taskInfo?.baseActivity?.className
2097+
taskInfo != null &&
2098+
taskInfo.taskId != taskId &&
2099+
baseActivityName == MainActivity::class.java.name
2100+
} ?: appTasks.firstOrNull { appTask ->
2101+
val taskInfo = appTask.taskInfo
2102+
val baseActivityName = taskInfo?.baseActivity?.className
2103+
taskInfo != null &&
2104+
taskInfo.taskId != taskId &&
2105+
baseActivityName != CallActivity::class.java.name &&
2106+
baseActivityName != CallNotificationActivity::class.java.name
2107+
}
2108+
2109+
if (primaryTask != null) {
2110+
val intent = Intent(context, ConversationsListActivity::class.java).apply {
2111+
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
2112+
}
2113+
primaryTask.startActivity(context, intent, null)
2114+
primaryTask.moveToFront()
2115+
val primaryTaskId = primaryTask.taskInfo?.taskId
2116+
appTasks
2117+
.filter { appTask ->
2118+
val taskInfo = appTask.taskInfo
2119+
val baseActivityName = taskInfo?.baseActivity?.className
2120+
val isCallTask = baseActivityName == CallActivity::class.java.name ||
2121+
baseActivityName == CallNotificationActivity::class.java.name
2122+
taskInfo != null && !isCallTask && taskInfo.taskId != primaryTaskId && taskInfo.taskId != taskId
2123+
}
2124+
.forEach { it.finishAndRemoveTask() }
2125+
} else {
2126+
val mainIntent = Intent(context, MainActivity::class.java).apply {
2127+
action = Intent.ACTION_MAIN
2128+
addCategory(Intent.CATEGORY_LAUNCHER)
2129+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
2130+
}
2131+
startActivity(mainIntent)
2132+
}
2133+
}
2134+
20862135
private fun startVideoCapture(isPortrait: Boolean) {
20872136
val (width, height) = if (isPortrait) {
20882137
WIDTH_4_TO_3_RATIO to HEIGHT_4_TO_3_RATIO

0 commit comments

Comments
 (0)