From c8a2bfc7385db9fb79c6035f6acf5458701fcfe4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 13 Jul 2022 21:01:28 +0200 Subject: [PATCH] Always start MainActivity to ensure that current session is set. --- .../im/vector/app/features/MainActivity.kt | 34 ++++++++++++++----- .../app/features/call/VectorCallActivity.kt | 2 +- .../vector/app/features/home/HomeActivity.kt | 4 ++- .../home/room/detail/RoomDetailActivity.kt | 10 ++++-- .../home/room/detail/TimelineFragment.kt | 6 ++-- .../features/navigation/DefaultNavigator.kt | 6 ++-- .../notifications/NotificationUtils.kt | 11 +++--- 7 files changed, 51 insertions(+), 22 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt index 6bc0a2ca86..c0af9f9e70 100644 --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt @@ -17,6 +17,7 @@ package im.vector.app.features import android.app.Activity +import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable @@ -76,6 +77,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity companion object { private const val EXTRA_ARGS = "EXTRA_ARGS" + private const val EXTRA_NEXT_INTENT = "EXTRA_NEXT_INTENT" // Special action to clear cache and/or clear credentials fun restartApp(activity: Activity, args: MainActivityArgs) { @@ -85,6 +87,12 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity intent.putExtra(EXTRA_ARGS, args) activity.startActivity(intent) } + + fun getIntentWithNextIntent(context: Context, nextIntent: Intent): Intent { + val intent = Intent(context, MainActivity::class.java) + intent.putExtra(EXTRA_NEXT_INTENT, nextIntent) + return intent + } } private val mainViewModel: MainViewModel by viewModel() @@ -123,15 +131,21 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity } private fun handleAppStarted() { - args = parseArgs() - if (args.clearCredentials || args.isUserLoggedOut || args.clearCache) { - clearNotifications() - } - // Handle some wanted cleanup - if (args.clearCache || args.clearCredentials) { - doCleanUp() + if (intent.hasExtra(EXTRA_NEXT_INTENT)) { + // Start the next Activity + val nextIntent = intent.getParcelableExtra(EXTRA_NEXT_INTENT) + startIntentAndFinish(nextIntent) } else { - startNextActivityAndFinish() + args = parseArgs() + if (args.clearCredentials || args.isUserLoggedOut || args.clearCache) { + clearNotifications() + } + // Handle some wanted cleanup + if (args.clearCache || args.clearCredentials) { + doCleanUp() + } else { + startNextActivityAndFinish() + } } } @@ -273,6 +287,10 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity null } } + startIntentAndFinish(intent) + } + + private fun startIntentAndFinish(intent: Intent?) { intent?.let { startActivity(it) } finish() } diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index 9d7ada9d63..f8a4c5eeca 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -604,7 +604,7 @@ class VectorCallActivity : private fun returnToChat() { val roomId = withState(callViewModel) { it.roomId } val args = TimelineArgs(roomId) - val intent = RoomDetailActivity.newIntent(this, args).apply { + val intent = RoomDetailActivity.newIntent(this, args, false).apply { flags = FLAG_ACTIVITY_CLEAR_TOP } startActivity(intent) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 926c1eb113..0eb136fc10 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -623,10 +623,12 @@ class HomeActivity : inviteNotificationRoomId = inviteNotificationRoomId ) - return Intent(context, HomeActivity::class.java) + val intent = Intent(context, HomeActivity::class.java) .apply { putExtra(Mavericks.KEY_ARG, args) } + + return MainActivity.getIntentWithNextIntent(context, intent) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt index f1e06dd5ef..a58eed42e1 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailActivity.kt @@ -35,6 +35,7 @@ import im.vector.app.core.extensions.keepScreenOn import im.vector.app.core.extensions.replaceFragment import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityRoomDetailBinding +import im.vector.app.features.MainActivity import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.ViewRoom import im.vector.app.features.home.room.breadcrumbs.BreadcrumbsFragment @@ -191,10 +192,15 @@ class RoomDetailActivity : const val EXTRA_ROOM_ID = "EXTRA_ROOM_ID" const val ACTION_ROOM_DETAILS_FROM_SHORTCUT = "ROOM_DETAILS_FROM_SHORTCUT" - fun newIntent(context: Context, timelineArgs: TimelineArgs): Intent { - return Intent(context, RoomDetailActivity::class.java).apply { + fun newIntent(context: Context, timelineArgs: TimelineArgs, firstStartMainActivity: Boolean): Intent { + val intent = Intent(context, RoomDetailActivity::class.java).apply { putExtra(EXTRA_ROOM_DETAIL_ARGS, timelineArgs) } + return if (firstStartMainActivity) { + MainActivity.getIntentWithNextIntent(context, intent) + } else { + intent + } } // Shortcuts can't have intents with parcelables diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index 31c1004ef9..562f2d4aea 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -1206,9 +1206,9 @@ class TimelineFragment @Inject constructor( getRootThreadEventId()?.let { val newRoom = timelineArgs.copy(threadTimelineArgs = null, eventId = it) context?.let { con -> - val int = RoomDetailActivity.newIntent(con, newRoom) - int.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK - con.startActivity(int) + val intent = RoomDetailActivity.newIntent(con, newRoom, false) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK + con.startActivity(intent) } } } diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index 291eee307f..7680b40506 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -173,7 +173,7 @@ class DefaultNavigator @Inject constructor( } val args = TimelineArgs(roomId = roomId, eventId = eventId, isInviteAlreadyAccepted = isInviteAlreadyAccepted) - val intent = RoomDetailActivity.newIntent(context, args) + val intent = RoomDetailActivity.newIntent(context, args, false) startActivity(context, intent, buildTask) } @@ -203,7 +203,7 @@ class DefaultNavigator @Inject constructor( eventId = null, openShareSpaceForId = spaceId.takeIf { postSwitchSpaceAction.showShareSheet } ) - val intent = RoomDetailActivity.newIntent(context, args) + val intent = RoomDetailActivity.newIntent(context, args, false) startActivity(context, intent, false) } } @@ -290,7 +290,7 @@ class DefaultNavigator @Inject constructor( override fun openRoomForSharingAndFinish(activity: Activity, roomId: String, sharedData: SharedData) { val args = TimelineArgs(roomId, null, sharedData) - val intent = RoomDetailActivity.newIntent(activity, args) + val intent = RoomDetailActivity.newIntent(activity, args, false) activity.startActivity(intent) activity.finish() } diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index 71c8167788..0066fab5ce 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -53,6 +53,7 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.core.services.CallAndroidService import im.vector.app.core.time.Clock import im.vector.app.core.utils.startNotificationChannelSettingsIntent +import im.vector.app.features.MainActivity import im.vector.app.features.call.VectorCallActivity import im.vector.app.features.call.service.CallHeadsUpActionReceiver import im.vector.app.features.call.webrtc.WebRtcCall @@ -241,7 +242,8 @@ class NotificationUtils @Inject constructor( // build the pending intent go to the home screen if this is clicked. val i = HomeActivity.newIntent(context) i.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP - val pi = PendingIntent.getActivity(context, 0, i, PendingIntentCompat.FLAG_IMMUTABLE) + val mainIntent = MainActivity.getIntentWithNextIntent(context, i) + val pi = PendingIntent.getActivity(context, 0, mainIntent, PendingIntentCompat.FLAG_IMMUTABLE) val accentColor = ContextCompat.getColor(context, R.color.notification_accent_color) @@ -531,7 +533,7 @@ class NotificationUtils @Inject constructor( val contentPendingIntent = TaskStackBuilder.create(context) .addNextIntentWithParentStack(HomeActivity.newIntent(context)) - .addNextIntent(RoomDetailActivity.newIntent(context, TimelineArgs(callInformation.nativeRoomId))) + .addNextIntent(RoomDetailActivity.newIntent(context, TimelineArgs(callInformation.nativeRoomId), true)) .getPendingIntent(clock.epochMillis().toInt(), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE) builder.setContentIntent(contentPendingIntent) @@ -828,7 +830,7 @@ class NotificationUtils @Inject constructor( } private fun buildOpenRoomIntent(roomId: String): PendingIntent? { - val roomIntentTap = RoomDetailActivity.newIntent(context, TimelineArgs(roomId = roomId, switchToParentSpace = true)) + val roomIntentTap = RoomDetailActivity.newIntent(context, TimelineArgs(roomId = roomId, switchToParentSpace = true), true) roomIntentTap.action = TAP_TO_VIEW_ACTION // pending intent get reused by system, this will mess up the extra params, so put unique info to avoid that roomIntentTap.data = createIgnoredUri("openRoom?$roomId") @@ -847,10 +849,11 @@ class NotificationUtils @Inject constructor( val intent = HomeActivity.newIntent(context, clearNotification = true) intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP intent.data = createIgnoredUri("tapSummary") + val mainIntent = MainActivity.getIntentWithNextIntent(context, intent) return PendingIntent.getActivity( context, Random.nextInt(1000), - intent, + mainIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) }