Skip to content

Commit

Permalink
Merge pull request #20071 from wordpress-mobile/issue/20061-site-moni…
Browse files Browse the repository at this point in the history
…tor-deep-link

Site Monitor: App links
  • Loading branch information
AjeshRPai authored Jan 30, 2024
2 parents 7ee869c + bc6452d commit e0e84ab
Show file tree
Hide file tree
Showing 10 changed files with 132 additions and 3 deletions.
12 changes: 11 additions & 1 deletion WordPress/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -482,13 +482,23 @@
<data
android:host="wordpress.com"
android:pathPattern="/media/.*"
android:scheme="http" />
android:scheme="https" />

<data
android:host="wordpress.com"
android:pathPattern="/domains/manage"
android:scheme="https" />

<data
android:host="wordpress.com"
android:pathPattern="/site-monitoring/.*"
android:scheme="https" />

<data
android:host="wordpress.com"
android:pathPattern="/site-monitoring/.*"
android:scheme="http" />

</intent-filter>
</activity-alias>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import org.wordpress.android.ui.mysite.menu.MenuActivity
import org.wordpress.android.ui.mysite.personalization.PersonalizationActivity
import org.wordpress.android.ui.quickstart.QuickStartEvent
import org.wordpress.android.ui.sitemonitor.SiteMonitorParentActivity
import org.wordpress.android.ui.sitemonitor.SiteMonitorType
import org.wordpress.android.util.ToastUtils
import org.wordpress.android.util.analytics.AnalyticsUtils
import javax.inject.Inject
Expand Down Expand Up @@ -163,5 +164,27 @@ class ActivityNavigator @Inject constructor() {
intent.putExtra(WordPress.SITE, site)
context.startActivity(intent)
}

fun openSiteMonitoringInNewStack(
context: Context,
site: SiteModel?,
siteMonitorType: SiteMonitorType = SiteMonitorType.METRICS
) {
if (site == null) {
ToastUtils.showToast(context, R.string.site_monitoring_cannot_be_started, ToastUtils.Duration.SHORT)
return
}
val props = mutableMapOf("site_monitoring_type" to siteMonitorType.name as Any)
AnalyticsUtils.trackWithSiteDetails(AnalyticsTracker.Stat.OPENED_SITE_MONITORING, site, props)
val taskStackBuilder = TaskStackBuilder.create(context)
val mainActivityIntent = getMainActivityInNewStack(context)
val intent = Intent(context, SiteMonitorParentActivity::class.java)
intent.putExtra(WordPress.SITE, site)
intent.putExtra(SiteMonitorParentActivity.ARG_SITE_MONITOR_TYPE_KEY, siteMonitorType)
taskStackBuilder
.addNextIntent(mainActivityIntent)
.addNextIntent(intent)
.startActivities()
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.ShowS
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.StartCreateSiteFlow
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.ViewPostInReader
import org.wordpress.android.ui.sitecreation.misc.SiteCreationSource.DEEP_LINK
import org.wordpress.android.ui.sitemonitor.SiteMonitorType
import org.wordpress.android.ui.stats.StatsTimeframe
import org.wordpress.android.util.UriWrapper
import javax.inject.Inject
Expand Down Expand Up @@ -91,6 +92,11 @@ class DeepLinkNavigator
navigateAction.site
)
NavigateAction.DomainManagement -> ActivityLauncher.openDomainManagement(activity)
is NavigateAction.OpenSiteMonitoringForSite -> activityNavigator.openSiteMonitoringInNewStack(
activity,
navigateAction.site,
navigateAction.siteMonitorType
)
}
if (navigateAction != LoginForResult) {
activity.finish()
Expand Down Expand Up @@ -126,5 +132,7 @@ class DeepLinkNavigator
object OpenMedia : NavigateAction()
data class OpenMediaPickerForSite(val site: SiteModel) : NavigateAction()
object DomainManagement : NavigateAction()
data class OpenSiteMonitoringForSite(val site: SiteModel?, val siteMonitorType: SiteMonitorType) :
NavigateAction()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class DeepLinkHandlers
mediaLinkHandler: MediaLinkHandler,
domainManagementLinkHandler: DomainManagementLinkHandler,
qrCodeMediaLinkHandler: QRCodeMediaLinkHandler,
siteMonitorLinkHandler: SiteMonitorLinkHandler
) {
private val handlers = listOf(
editorLinkHandler,
Expand All @@ -33,6 +34,7 @@ class DeepLinkHandlers
mediaLinkHandler,
domainManagementLinkHandler,
qrCodeMediaLinkHandler,
siteMonitorLinkHandler
)

private val _toast by lazy {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package org.wordpress.android.ui.deeplinks.handlers

import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator
import org.wordpress.android.ui.deeplinks.DeepLinkUriUtils
import org.wordpress.android.ui.deeplinks.DeepLinkingIntentReceiverViewModel
import org.wordpress.android.ui.sitemonitor.SiteMonitorType
import org.wordpress.android.util.UriWrapper
import javax.inject.Inject

class SiteMonitorLinkHandler
@Inject constructor(private val deepLinkUriUtils: DeepLinkUriUtils) : DeepLinkHandler {
/**
* Returns true if the URI looks like `wordpress.com/SITE_MONITORING_PATH`
*/
override fun shouldHandleUrl(uri: UriWrapper): Boolean {
return (uri.host == DeepLinkingIntentReceiverViewModel.HOST_WORDPRESS_COM &&
uri.pathSegments.firstOrNull() == SITE_MONITORING_PATH) || uri.host == SITE_MONITORING_PATH
}

override fun buildNavigateAction(uri: UriWrapper): DeepLinkNavigator.NavigateAction {
val targetHost = extractHost(uri)
val site: SiteModel? = deepLinkUriUtils.hostToSite(targetHost)
val siteMonitorType = urlToType(uri.toString())
return DeepLinkNavigator.NavigateAction.OpenSiteMonitoringForSite(site, siteMonitorType)
}

private fun extractHost(uri: UriWrapper): String {
if (uri.pathSegments.size <= 1) return ""
return uri.pathSegments[1]
}

override fun stripUrl(uri: UriWrapper): String {
return buildString {
val offset = if (uri.host == SITE_MONITORING_PATH) {
append(DeepLinkingIntentReceiverViewModel.APPLINK_SCHEME)
0
} else {
append("${DeepLinkingIntentReceiverViewModel.HOST_WORDPRESS_COM}/")
1
}
append(SITE_MONITORING_PATH)
val pathSegments = uri.pathSegments
val size = pathSegments.size
val hasSiteUrl = if (size > offset + 1) pathSegments.getOrNull(offset + 1) != null else false
if (hasSiteUrl) {
append("/${DeepLinkingIntentReceiverViewModel.SITE_DOMAIN}")
}
}
}

private fun urlToType(url: String): SiteMonitorType {
return when {
url.contains(PHP_LOGS_PATTERN) -> SiteMonitorType.PHP_LOGS
url.contains(WEB_SERVER_LOGS_PATTERN) -> SiteMonitorType.WEB_SERVER_LOGS
else -> SiteMonitorType.METRICS
}
}

companion object {
private const val SITE_MONITORING_PATH = "site-monitoring"
private const val PHP_LOGS_PATTERN = "/php"
private const val WEB_SERVER_LOGS_PATTERN = "/web"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,13 @@ class SiteMonitorParentActivity: AppCompatActivity() {
return requireNotNull(intent.getSerializableExtraCompat(WordPress.SITE)) as SiteModel
}

private fun getInitialTab(): SiteMonitorType {
return intent?.getSerializableExtraCompat(ARG_SITE_MONITOR_TYPE_KEY) as SiteMonitorType?
?: SiteMonitorType.METRICS
}

companion object {
const val ARG_SITE_MONITOR_TYPE_KEY = "ARG_SITE_MONITOR_TYPE_KEY"
const val SAVED_STATE_CONTAINER_KEY = "ContainerKey"
const val SAVED_STATE_CURRENT_TAB_KEY = "CurrentTabKey"
}
Expand All @@ -90,7 +96,7 @@ class SiteMonitorParentActivity: AppCompatActivity() {
SiteMonitorTabNavigation(selectedTab) { selectedTab ->
val item = enumValues<SiteMonitorTabItem>().find {
it.route == selectedTab
} ?: SiteMonitorTabItem.Metrics
} ?: initialItem(getInitialTab())

SiteMonitorFragmentContainer(
modifier = Modifier.fillMaxSize(),
Expand All @@ -104,6 +110,12 @@ class SiteMonitorParentActivity: AppCompatActivity() {
}
}

private fun initialItem(type: SiteMonitorType): SiteMonitorTabItem {
return enumValues<SiteMonitorTabItem>().find {
it.siteMonitorType == type
} ?: SiteMonitorTabItem.Metrics
}

private fun getCommitFunction(
fragment : Fragment,
tag: String
Expand Down
1 change: 1 addition & 0 deletions WordPress/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4857,4 +4857,5 @@ translators: %s: Select control option value e.g: "Auto, 25%". -->
<string name="site_monitoring_tab_title_metrics">Metrics</string>
<string name="site_monitoring_tab_title_php_logs">PHP Logs</string>
<string name="site_monitoring_tab_title_web_server_logs">Web Server Logs</string>
<string name="site_monitoring_cannot_be_started">We cannot open site monitoring at the moment. Please try again later</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ class DeepLinkHandlersTest : BaseUnitTest() {
@Mock
lateinit var qrCodeMediaLinkHandler: QRCodeMediaLinkHandler

@Mock
lateinit var siteMonitorLinkHandler: SiteMonitorLinkHandler

@Mock
lateinit var uri: UriWrapper
private lateinit var deepLinkHandlers: DeepLinkHandlers
Expand All @@ -67,6 +70,7 @@ class DeepLinkHandlersTest : BaseUnitTest() {
mediaLinkHandler,
domainManagementLinkHandler,
qrCodeMediaLinkHandler,
siteMonitorLinkHandler
)
initDeepLinkHandlers()
}
Expand All @@ -84,6 +88,7 @@ class DeepLinkHandlersTest : BaseUnitTest() {
mediaLinkHandler,
domainManagementLinkHandler,
qrCodeMediaLinkHandler,
siteMonitorLinkHandler
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1101,7 +1101,8 @@ public enum Stat {
DYNAMIC_DASHBOARD_CARD_CTA_TAPPED,
DYNAMIC_DASHBOARD_CARD_HIDE_TAPPED,
DEEP_LINK_FAILED,
SITE_MONITORING_SCREEN_SHOWN
SITE_MONITORING_SCREEN_SHOWN,
OPENED_SITE_MONITORING,
}

private static final List<Tracker> TRACKERS = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2697,6 +2697,8 @@ public static String getEventNameForStat(AnalyticsTracker.Stat stat) {
return "deep_link_failed";
case SITE_MONITORING_SCREEN_SHOWN:
return "site_monitoring_screen_shown";
case OPENED_SITE_MONITORING:
return "opened_site_monitoring";
}
return null;
}
Expand Down

0 comments on commit e0e84ab

Please sign in to comment.