From 39ac5e9ea0e67e1354ec2af9b9501d96fa55a58f Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 25 Sep 2026 07:21:49 -0400 Subject: [PATCH 1/2] Open rs post and page "View" in a Custom Tab Keeps the user in the app instead of handing off to the external browser, matching how New Stats opens URLs. --- .../org/wordpress/android/ui/pagesrs/PagesRsListActivity.kt | 4 +++- .../org/wordpress/android/ui/postsrs/PostRsListActivity.kt | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pagesrs/PagesRsListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/pagesrs/PagesRsListActivity.kt index 73c0f8e8b5ed..a15c77d940f0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pagesrs/PagesRsListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pagesrs/PagesRsListActivity.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.launch import org.wordpress.android.R import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.ui.ActivityLauncher +import org.wordpress.android.ui.ActivityNavigator import org.wordpress.android.ui.stats.StatsConstants import org.wordpress.android.ui.stats.refresh.lists.detail.StatsDetailActivity import org.wordpress.android.ui.PagePostCreationSourcesDetail.PAGE_FROM_PAGES_LIST @@ -43,6 +44,7 @@ class PagesRsListActivity : BaseAppCompatActivity() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var buildConfigWrapper: BuildConfigWrapper @Inject lateinit var experimentalFeatures: ExperimentalFeatures + @Inject lateinit var activityNavigator: ActivityNavigator private val viewModel: PagesRsListViewModel by viewModels() private lateinit var mlpViewModel: ModalLayoutPickerViewModel @@ -132,7 +134,7 @@ class PagesRsListActivity : BaseAppCompatActivity() { is PageRsListEvent.EditPage -> ActivityLauncher.editPostOrPageForResult(this, event.site, event.page) is PageRsListEvent.CreateNewPage -> startCreatePageFlow() - is PageRsListEvent.ViewPage -> ActivityLauncher.openUrlExternal(this, event.url) + is PageRsListEvent.ViewPage -> activityNavigator.openInCustomTab(this, event.url) is PageRsListEvent.SharePage -> ActivityLauncher.openShareIntent(this, event.url, event.title) is PageRsListEvent.CopyPageUrl -> copyUrlToClipboard(event.url) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/postsrs/PostRsListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/postsrs/PostRsListActivity.kt index cc3ca4ff5e2b..4bfb40ea1f73 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/postsrs/PostRsListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/postsrs/PostRsListActivity.kt @@ -13,6 +13,7 @@ import androidx.lifecycle.repeatOnLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.wordpress.android.ui.ActivityLauncher +import org.wordpress.android.ui.ActivityNavigator import org.wordpress.android.ui.PagePostCreationSourcesDetail import org.wordpress.android.ui.blaze.BlazeFlowSource import org.wordpress.android.ui.compose.theme.AppThemeM3 @@ -33,6 +34,9 @@ class PostRsListActivity : BaseAppCompatActivity() { @Inject lateinit var experimentalFeatures: ExperimentalFeatures + @Inject + lateinit var activityNavigator: ActivityNavigator + private val viewModel: PostRsListViewModel by viewModels() private val settingsLauncher = registerForActivityResult( @@ -126,7 +130,7 @@ class PostRsListActivity : BaseAppCompatActivity() { this, event.site, false, PagePostCreationSourcesDetail.POST_FROM_POSTS_LIST, -1, null ) - is PostRsListEvent.ViewPost -> ActivityLauncher.openUrlExternal(this, event.url) + is PostRsListEvent.ViewPost -> activityNavigator.openInCustomTab(this, event.url) is PostRsListEvent.ReadPost -> ReaderActivityLauncher.showReaderPostDetail(this, event.blogId, event.postId) is PostRsListEvent.SharePost -> From 6c1266f4788467a7d32d743e36d44dfc377c811e Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 25 Sep 2026 10:43:19 -0400 Subject: [PATCH 2/2] Target the browser when opening a Custom Tab Without a package, the Custom Tab intent resolves to our own WPComPostReaderActivity alias for WP.com date-based post URLs, so "View" opened the Reader instead of the tab. --- .../main/java/org/wordpress/android/ui/ActivityNavigator.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt index 5aa90f063d78..05b015c932c6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/ActivityNavigator.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import androidx.browser.customtabs.CustomTabsClient import androidx.browser.customtabs.CustomTabsIntent import androidx.core.app.TaskStackBuilder import androidx.core.net.toUri @@ -276,6 +277,8 @@ class ActivityNavigator @Inject constructor( @Suppress("TooGenericExceptionCaught") fun openInCustomTab(activity: Activity, url: String) { val intent = getCustomTabsIntent(activity) + // Target the browser directly, otherwise our own deep-link aliases can claim WP.com post URLs + CustomTabsClient.getPackageName(activity, null)?.let { intent.intent.setPackage(it) } try { intent.launchUrl(activity, url.toUri()) } catch (e: RuntimeException) {