Skip to content

Commit cbdf7fa

Browse files
committed
Merge branch 'dev' of github.com:forcedotcom/SalesforceMobileSDK-Android into token-migration
2 parents 9275eb3 + d42772e commit cbdf7fa

10 files changed

Lines changed: 219 additions & 9 deletions

File tree

external/shared

libs/MobileSync/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:versionCode="91"
4+
android:versionCode="92"
55
android:versionName="13.2.0.dev">
66

77
<application />

libs/SalesforceAnalytics/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:versionCode="91"
4+
android:versionCode="92"
55
android:versionName="13.2.0.dev">
66

77
<uses-permission android:name="android.permission.INTERNET" />

libs/SalesforceHybrid/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:versionCode="91"
4+
android:versionCode="92"
55
android:versionName="13.2.0.dev">
66

77
<application>

libs/SalesforceReact/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:versionCode="91"
4+
android:versionCode="92"
55
android:versionName="13.2.0.dev">
66

77
<application>

libs/SalesforceSDK/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:tools="http://schemas.android.com/tools"
5-
android:versionCode="91"
5+
android:versionCode="92"
66
android:versionName="13.2.0.dev">
77

88
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

libs/SalesforceSDK/src/com/salesforce/androidsdk/ui/LoginActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,6 +1548,7 @@ open class LoginActivity : FragmentActivity() {
15481548
if (activity.viewModel.singleServerCustomTabActivity) {
15491549
// Show blank page and spinner until PKCE is done.
15501550
activity.viewModel.loginUrl.value = ABOUT_BLANK
1551+
finish()
15511552
} else {
15521553
// Don't show server picker if we are re-authenticating with cookie.
15531554
activity.clearWebView(showServerPicker = !activity.sharedBrowserSession)

libs/SalesforceSDK/src/com/salesforce/androidsdk/ui/LoginViewModel.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ open class LoginViewModel(val bootConfig: BootConfig) : ViewModel() {
583583
private val scope: CoroutineScope = viewModelScope,
584584
) : Observer<String?> {
585585
override fun onChanged(value: String?) {
586-
if (!sdkManager.isBrowserLoginEnabled && !viewModel.isUsingFrontDoorBridge && value != null) {
586+
if (!sdkManager.isBrowserLoginEnabled && !singleServerCustomTabActivity && !viewModel.isUsingFrontDoorBridge && value != null) {
587587
val valueUrl = value.toUri()
588588
val loginUrl = viewModel.loginUrl.value?.toUri()
589589

@@ -634,7 +634,8 @@ open class LoginViewModel(val bootConfig: BootConfig) : ViewModel() {
634634
private val scope: CoroutineScope = viewModelScope,
635635
) : Observer<String> {
636636
override fun onChanged(value: String) {
637-
if (sdkManager.isBrowserLoginEnabled && !viewModel.isUsingFrontDoorBridge) {
637+
val useBrowserCustomTab = sdkManager.isBrowserLoginEnabled || singleServerCustomTabActivity
638+
if (useBrowserCustomTab && !viewModel.isUsingFrontDoorBridge) {
638639
scope.launch {
639640
viewModel.browserCustomTabUrl.value = viewModel.getAuthorizationUrl(
640641
server = value,

libs/SmartStore/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

33
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:versionCode="91"
4+
android:versionCode="92"
55
android:versionName="13.2.0.dev">
66

77
<application>

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/auth/LoginViewModelTest.kt

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,132 @@ class LoginViewModelTest {
778778
}
779779
}
780780

781+
@Test
782+
fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginEnabledAndSingleServerCustomTabActivityEnabled() = runTest {
783+
784+
val dispatcher = StandardTestDispatcher(testScheduler)
785+
val scope = CoroutineScope(dispatcher)
786+
787+
val valueOld = null
788+
val valueNew = "https://www.example.com" // IETF-Reserved Test Domain
789+
790+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
791+
every { sdkManager.isBrowserLoginEnabled } returns true
792+
val viewModel = mockk<LoginViewModel>(relaxed = true)
793+
val loginUrl = mockk<MediatorLiveData<String>>(relaxed = true)
794+
every { loginUrl.value } returns valueOld
795+
every { viewModel.singleServerCustomTabActivity } returns true
796+
every { viewModel.loginUrl } returns loginUrl
797+
val observer = viewModel.LoginUrlSource(sdkManager, viewModel, scope)
798+
799+
observer.onChanged(valueNew)
800+
801+
advanceUntilIdle()
802+
803+
coVerify(exactly = 0) {
804+
viewModel.getAuthorizationUrl(
805+
valueNew,
806+
any(),
807+
any(),
808+
)
809+
}
810+
}
811+
812+
@Test
813+
fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabled() = runTest {
814+
815+
val dispatcher = StandardTestDispatcher(testScheduler)
816+
val scope = CoroutineScope(dispatcher)
817+
818+
val valueOld = null
819+
val valueNew = "https://www.example.com" // IETF-Reserved Test Domain
820+
821+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
822+
every { sdkManager.isBrowserLoginEnabled } returns false
823+
val viewModel = mockk<LoginViewModel>(relaxed = true)
824+
val loginUrl = mockk<MediatorLiveData<String>>(relaxed = true)
825+
every { loginUrl.value } returns valueOld
826+
every { viewModel.singleServerCustomTabActivity } returns true
827+
every { viewModel.loginUrl } returns loginUrl
828+
val observer = viewModel.LoginUrlSource(sdkManager, viewModel, scope)
829+
830+
observer.onChanged(valueNew)
831+
832+
advanceUntilIdle()
833+
834+
coVerify(exactly = 0) {
835+
viewModel.getAuthorizationUrl(
836+
valueNew,
837+
any(),
838+
any(),
839+
)
840+
}
841+
}
842+
843+
@Test
844+
fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabledAndFrontDoorBridgeActive() = runTest {
845+
846+
val dispatcher = StandardTestDispatcher(testScheduler)
847+
val scope = CoroutineScope(dispatcher)
848+
849+
val valueOld = null
850+
val valueNew = "https://www.example.com" // IETF-Reserved Test Domain
851+
852+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
853+
every { sdkManager.isBrowserLoginEnabled } returns false
854+
val viewModel = mockk<LoginViewModel>(relaxed = true)
855+
val loginUrl = mockk<MediatorLiveData<String>>(relaxed = true)
856+
every { loginUrl.value } returns valueOld
857+
every { viewModel.singleServerCustomTabActivity } returns true
858+
every { viewModel.isUsingFrontDoorBridge } returns true
859+
every { viewModel.loginUrl } returns loginUrl
860+
val observer = viewModel.LoginUrlSource(sdkManager, viewModel, scope)
861+
862+
observer.onChanged(valueNew)
863+
864+
advanceUntilIdle()
865+
866+
coVerify(exactly = 0) {
867+
viewModel.getAuthorizationUrl(
868+
valueNew,
869+
any(),
870+
any(),
871+
)
872+
}
873+
}
874+
875+
@Test
876+
fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabledAndFrontDoorBridgeActiveAndValueNull() = runTest {
877+
878+
val dispatcher = StandardTestDispatcher(testScheduler)
879+
val scope = CoroutineScope(dispatcher)
880+
881+
val valueOld = null
882+
val valueNew = "https://www.example.com" // IETF-Reserved Test Domain
883+
884+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
885+
every { sdkManager.isBrowserLoginEnabled } returns false
886+
val viewModel = mockk<LoginViewModel>(relaxed = true)
887+
val loginUrl = mockk<MediatorLiveData<String>>(relaxed = true)
888+
every { loginUrl.value } returns valueOld
889+
every { viewModel.singleServerCustomTabActivity } returns true
890+
every { viewModel.isUsingFrontDoorBridge } returns true
891+
every { viewModel.loginUrl } returns loginUrl
892+
val observer = viewModel.LoginUrlSource(sdkManager, viewModel, scope)
893+
894+
observer.onChanged(null)
895+
896+
advanceUntilIdle()
897+
898+
coVerify(exactly = 0) {
899+
viewModel.getAuthorizationUrl(
900+
valueNew,
901+
any(),
902+
any(),
903+
)
904+
}
905+
}
906+
781907
@Test
782908
fun loginViewModel_loginUrlObserver_ignoresWhenBrowserLoginEnabled() = runTest {
783909

@@ -918,6 +1044,88 @@ class LoginViewModelTest {
9181044
) }
9191045
}
9201046

1047+
@Test
1048+
fun loginViewModel_browserCustomTabObserver_setsBrowserCustomTabUrl_whenSingleServerCustomTabActivityEnabledAndNotUsingFrontDoorBridge() = runTest {
1049+
1050+
val dispatcher = StandardTestDispatcher(testScheduler)
1051+
val scope = CoroutineScope(dispatcher)
1052+
1053+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
1054+
every { sdkManager.isBrowserLoginEnabled } returns false
1055+
val viewModel = mockk<LoginViewModel>(relaxed = true)
1056+
every { viewModel.singleServerCustomTabActivity } returns true
1057+
val observer = viewModel.BrowserCustomTabUrlSource(sdkManager, viewModel, scope)
1058+
1059+
val value = "https://www.example.com" // IETF-Reserved Test Domain
1060+
1061+
observer.onChanged(value)
1062+
1063+
advanceUntilIdle()
1064+
1065+
coVerify(exactly = 1) {
1066+
viewModel.getAuthorizationUrl(
1067+
value,
1068+
any(),
1069+
any(),
1070+
)
1071+
}
1072+
}
1073+
1074+
@Test
1075+
fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenBrowserLoginDisabledAndSingleServerCustomTabActivityDisabledAndNotUsingFrontDoorBridge() = runTest {
1076+
1077+
val dispatcher = StandardTestDispatcher(testScheduler)
1078+
val scope = CoroutineScope(dispatcher)
1079+
1080+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
1081+
every { sdkManager.isBrowserLoginEnabled } returns false
1082+
val viewModel = mockk<LoginViewModel>(relaxed = true)
1083+
every { viewModel.singleServerCustomTabActivity } returns false
1084+
val observer = viewModel.BrowserCustomTabUrlSource(sdkManager, viewModel, scope)
1085+
1086+
val value = "https://www.example.com" // IETF-Reserved Test Domain
1087+
1088+
observer.onChanged(value)
1089+
1090+
advanceUntilIdle()
1091+
1092+
coVerify(exactly = 0) {
1093+
viewModel.getAuthorizationUrl(
1094+
value,
1095+
any(),
1096+
any(),
1097+
)
1098+
}
1099+
}
1100+
1101+
@Test
1102+
fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenBrowserLoginDisabledAndSingleServerCustomTabActivityDisabledAndUsingFrontDoorBridge() = runTest {
1103+
1104+
val dispatcher = StandardTestDispatcher(testScheduler)
1105+
val scope = CoroutineScope(dispatcher)
1106+
1107+
val sdkManager = mockk<SalesforceSDKManager>(relaxed = true)
1108+
every { sdkManager.isBrowserLoginEnabled } returns false
1109+
val viewModel = mockk<LoginViewModel>(relaxed = true)
1110+
every { viewModel.singleServerCustomTabActivity } returns false
1111+
every { viewModel.isUsingFrontDoorBridge } returns true
1112+
val observer = viewModel.BrowserCustomTabUrlSource(sdkManager, viewModel, scope)
1113+
1114+
val value = "https://www.example.com" // IETF-Reserved Test Domain
1115+
1116+
observer.onChanged(value)
1117+
1118+
advanceUntilIdle()
1119+
1120+
coVerify(exactly = 0) {
1121+
viewModel.getAuthorizationUrl(
1122+
value,
1123+
any(),
1124+
any(),
1125+
)
1126+
}
1127+
}
1128+
9211129
@Test
9221130
fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenIsBrowserLoginEnabledAndUsingFrontDoorBridge() {
9231131

0 commit comments

Comments
 (0)