Skip to content

Commit 8824101

Browse files
authored
Merge pull request #17239 from wordpress-mobile/feat/add-home-deep-link-intent
feat: Add Home deep link intent
2 parents ddb3976 + 3e71148 commit 8824101

9 files changed

Lines changed: 127 additions & 5 deletions

File tree

WordPress/src/jetpack/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
<data
3838
android:host="notifications"
3939
android:scheme="jetpack" />
40+
<data
41+
android:host="home"
42+
android:scheme="jetpack" />
4043
</intent-filter>
4144
</activity>
4245

WordPress/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,9 @@
400400
<data
401401
android:host="notifications"
402402
android:scheme="wordpress" />
403+
<data
404+
android:host="home"
405+
android:scheme="wordpress" />
403406
</intent-filter>
404407

405408
<intent-filter android:autoVerify="true">

WordPress/src/main/java/org/wordpress/android/ui/ActivityLauncher.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,4 +1751,9 @@ public static void startQRCodeAuthFlowInNewStack(@NonNull Context context, @NonN
17511751

17521752
taskStackBuilder.startActivities();
17531753
}
1754+
1755+
public static void showLoginPrologue(@NonNull Context context) {
1756+
Intent intent = new Intent(context, LoginActivity.class);
1757+
context.startActivity(intent);
1758+
}
17541759
}

WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkNavigator.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.Login
88
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenEditor
99
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenEditorForPost
1010
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenEditorForSite
11+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenMySite
1112
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenInBrowser
1213
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenInReader
14+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenLoginPrologue
1315
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenNotifications
1416
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenPages
1517
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenPagesForSite
@@ -74,6 +76,8 @@ class DeepLinkNavigator
7476
is OpenPagesForSite -> ActivityLauncher.viewPagesInNewStack(activity, navigateAction.site)
7577
OpenPages -> ActivityLauncher.viewPagesInNewStack(activity)
7678
is OpenQRCodeAuthFlow -> ActivityLauncher.startQRCodeAuthFlowInNewStack(activity, navigateAction.uri)
79+
OpenMySite -> ActivityLauncher.viewMySiteInNewStack(activity)
80+
OpenLoginPrologue -> ActivityLauncher.showLoginPrologue(activity)
7781
}
7882
if (navigateAction != LoginForResult) {
7983
activity.finish()
@@ -101,5 +105,7 @@ class DeepLinkNavigator
101105
data class OpenPagesForSite(val site: SiteModel) : NavigateAction()
102106
object OpenPages : NavigateAction()
103107
data class OpenQRCodeAuthFlow(val uri: String) : NavigateAction()
108+
object OpenMySite : NavigateAction()
109+
object OpenLoginPrologue : NavigateAction()
104110
}
105111
}

WordPress/src/main/java/org/wordpress/android/ui/deeplinks/DeepLinkingIntentReceiverViewModel.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.wordpress.android.modules.UI_THREAD
99
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction
1010
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.LoginForResult
1111
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenInBrowser
12+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenLoginPrologue
1213
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.ShowSignInFlow
1314
import org.wordpress.android.ui.deeplinks.handlers.DeepLinkHandlers
1415
import org.wordpress.android.ui.deeplinks.handlers.ServerTrackingHandler
@@ -69,14 +70,21 @@ class DeepLinkingIntentReceiverViewModel
6970
if (action != null) {
7071
deepLinkTrackingUtils.track(action, it, uriWrapper)
7172
}
72-
if (accountStore.hasAccessToken() || it is OpenInBrowser || it is ShowSignInFlow) {
73+
if (loginIsUnnecessary(it)) {
7374
_navigateAction.value = Event(it)
7475
} else {
7576
_navigateAction.value = Event(LoginForResult)
7677
}
7778
} != null
7879
}
7980

81+
private fun loginIsUnnecessary(action: NavigateAction): Boolean {
82+
return accountStore.hasAccessToken() ||
83+
action is OpenInBrowser ||
84+
action is ShowSignInFlow ||
85+
action is OpenLoginPrologue
86+
}
87+
8088
private fun buildNavigateAction(uri: UriWrapper, rootUri: UriWrapper = uri): NavigateAction? {
8189
return when {
8290
deepLinkUriUtils.isTrackingUrl(uri) -> getRedirectUriAndBuildNavigateAction(uri, rootUri)

WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/DeepLinkHandlers.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class DeepLinkHandlers
1515
readerLinkHandler: ReaderLinkHandler,
1616
pagesLinkHandler: PagesLinkHandler,
1717
notificationsLinkHandler: NotificationsLinkHandler,
18-
qrCodeAuthLinkHandler: QRCodeAuthLinkHandler
18+
qrCodeAuthLinkHandler: QRCodeAuthLinkHandler,
19+
homeLinkHandler: HomeLinkHandler
1920
) {
2021
private val handlers = listOf(
2122
editorLinkHandler,
@@ -24,7 +25,8 @@ class DeepLinkHandlers
2425
readerLinkHandler,
2526
pagesLinkHandler,
2627
notificationsLinkHandler,
27-
qrCodeAuthLinkHandler
28+
qrCodeAuthLinkHandler,
29+
homeLinkHandler
2830
)
2931

3032
private val _toast by lazy {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.wordpress.android.ui.deeplinks.handlers
2+
3+
import org.wordpress.android.fluxc.store.AccountStore
4+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction
5+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenMySite
6+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenLoginPrologue
7+
import org.wordpress.android.ui.deeplinks.DeepLinkingIntentReceiverViewModel
8+
import org.wordpress.android.util.UriWrapper
9+
import javax.inject.Inject
10+
11+
class HomeLinkHandler
12+
@Inject constructor(private val accountStore: AccountStore) : DeepLinkHandler {
13+
/**
14+
* Returns true if the URI looks like `wordpress://home`
15+
*/
16+
override fun shouldHandleUrl(uri: UriWrapper): Boolean {
17+
return uri.host == HOME_PATH
18+
}
19+
20+
override fun buildNavigateAction(uri: UriWrapper): NavigateAction {
21+
return if (accountStore.hasAccessToken()) {
22+
OpenMySite
23+
} else {
24+
OpenLoginPrologue
25+
}
26+
}
27+
28+
override fun stripUrl(uri: UriWrapper): String {
29+
return buildString {
30+
if (uri.host == HOME_PATH) {
31+
append(DeepLinkingIntentReceiverViewModel.APPLINK_SCHEME)
32+
}
33+
append(HOME_PATH)
34+
}
35+
}
36+
37+
companion object {
38+
private const val HOME_PATH = "home"
39+
}
40+
}

WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/DeepLinkHandlersTest.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class DeepLinkHandlersTest : BaseUnitTest() {
2020
@Mock lateinit var pagesLinkHandler: PagesLinkHandler
2121
@Mock lateinit var notificationsLinkHandler: NotificationsLinkHandler
2222
@Mock lateinit var qrCodeAuthLinkHandler: QRCodeAuthLinkHandler
23+
@Mock lateinit var homeLinkHandler: HomeLinkHandler
2324
@Mock lateinit var uri: UriWrapper
2425
private lateinit var deepLinkHandlers: DeepLinkHandlers
2526
private lateinit var handlers: List<DeepLinkHandler>
@@ -33,7 +34,8 @@ class DeepLinkHandlersTest : BaseUnitTest() {
3334
readerLinkHandler,
3435
pagesLinkHandler,
3536
notificationsLinkHandler,
36-
qrCodeAuthLinkHandler
37+
qrCodeAuthLinkHandler,
38+
homeLinkHandler
3739
)
3840
initDeepLinkHandlers()
3941
}
@@ -46,7 +48,8 @@ class DeepLinkHandlersTest : BaseUnitTest() {
4648
readerLinkHandler,
4749
pagesLinkHandler,
4850
notificationsLinkHandler,
49-
qrCodeAuthLinkHandler
51+
qrCodeAuthLinkHandler,
52+
homeLinkHandler
5053
)
5154
}
5255

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.wordpress.android.ui.deeplinks.handlers
2+
3+
import com.nhaarman.mockitokotlin2.mock
4+
import com.nhaarman.mockitokotlin2.whenever
5+
import org.assertj.core.api.Assertions.assertThat
6+
import org.junit.Before
7+
import org.junit.Test
8+
import org.junit.runner.RunWith
9+
import org.mockito.Mock
10+
import org.mockito.junit.MockitoJUnitRunner
11+
import org.wordpress.android.fluxc.store.AccountStore
12+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenMySite
13+
import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenLoginPrologue
14+
import org.wordpress.android.ui.deeplinks.buildUri
15+
16+
@RunWith(MockitoJUnitRunner::class)
17+
class HomeLinkHandlerTest {
18+
@Mock lateinit var accountStore: AccountStore
19+
private lateinit var homeLinkHandler: HomeLinkHandler
20+
21+
@Before
22+
fun setUp() {
23+
homeLinkHandler = HomeLinkHandler(accountStore)
24+
}
25+
26+
@Test
27+
fun `returns login prologue action when user is logged out`() {
28+
whenever(accountStore.hasAccessToken()).thenReturn(false)
29+
30+
val navigateAction = homeLinkHandler.buildNavigateAction(mock())
31+
32+
assertThat(navigateAction).isEqualTo(OpenLoginPrologue)
33+
}
34+
35+
@Test
36+
fun `returns my site action when user is logged in`() {
37+
whenever(accountStore.hasAccessToken()).thenReturn(true)
38+
39+
val navigateAction = homeLinkHandler.buildNavigateAction(mock())
40+
41+
assertThat(navigateAction).isEqualTo(OpenMySite)
42+
}
43+
44+
@Test
45+
fun `builds URL for tracking`() {
46+
val homeUri = buildUri("home")
47+
48+
val strippedUrl = homeLinkHandler.stripUrl(homeUri)
49+
50+
assertThat(strippedUrl).isEqualTo("wordpress://home")
51+
}
52+
}

0 commit comments

Comments
 (0)