Skip to content

Commit e0549ef

Browse files
@W-20978376: User Story - [Android] Remove supportWelcomeDiscovery flag in dev (#2823)
1 parent 7c821ad commit e0549ef

10 files changed

Lines changed: 65 additions & 129 deletions

File tree

.github/workflows/pr.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Pull Request
22

33
on:
4-
# Dangerious without Member Check setup!
4+
# Dangerous without Member Check setup!
55
pull_request_target:
66
branches: [dev, master]
77

libs/SalesforceSDK/res/values/sf__strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@
116116
<string name="sf__dev_support_login_options_title">Login Options</string>
117117
<string name="sf__login_options_webserver_toggle_content_description">Toggle Web Server</string>
118118
<string name="sf__login_options_hybrid_toggle_content_description">Toggle Hybrid Token</string>
119-
<string name="sf__login_options_welcome_toggle_content_description">Toggle Welcome Discovery</string>
120119
<string name="sf__login_options_dynamic_config_toggle_content_description">Toggle Dynamic Config</string>
121120
<string name="sf__login_options_consumer_key_field_content_description">Consumer Key Field</string>
122121
<string name="sf__login_options_redirect_uri_field_content_description">Redirect URI Field</string>

libs/SalesforceSDK/res/values/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
<string name="account_type">com.salesforce.androidsdk</string>
99
<string name="app_package">com.salesforce.androidsdk</string>
1010
<string name="cannot_use_another_apps_login_qr_code">Cannot use another app\'s login QR Code. Please log in to this app.</string>
11-
<string name="salesforce_welcome_is_disabled">This app doesn\'t support welcome.salesforce.com. Use another server.</string>
1211

1312
<!-- If you're only supporting recent versions of Android (e.g. 3.x and up), you can override this to be touch and get a better looking login UI -->
1413
<string name="oauth_display_type">touch</string>

libs/SalesforceSDK/src/com/salesforce/androidsdk/app/SalesforceSDKManager.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -393,12 +393,6 @@ open class SalesforceSDKManager protected constructor(
393393
@set:Synchronized
394394
var useWebServerAuthentication = true
395395

396-
/**
397-
* Whether or not the app supports welcome discovery. This should only be
398-
* enabled if the connected app is supported.
399-
*/
400-
var supportsWelcomeDiscovery = false
401-
402396
/**
403397
* Optionally, enables the hybrid authentication flow. Defaults to true
404398
*/
@@ -1371,7 +1365,6 @@ open class SalesforceSDKManager protected constructor(
13711365
"User Agent", userAgent,
13721366
"Use Web Server Authentication", "$useWebServerAuthentication",
13731367
"Use Hybrid Authentication Token", "$useHybridAuthentication",
1374-
"Support Welcome Discovery", "$supportsWelcomeDiscovery",
13751368
"Browser Login Enabled", "$isBrowserLoginEnabled",
13761369
"IDP Enabled", "$isIDPLoginFlowEnabled",
13771370
"Identity Provider", "$isIdentityProvider",

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

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ import com.salesforce.androidsdk.R.color.sf__background_dark
111111
import com.salesforce.androidsdk.R.color.sf__primary_color
112112
import com.salesforce.androidsdk.R.drawable.sf__action_back
113113
import com.salesforce.androidsdk.R.string.cannot_use_another_apps_login_qr_code
114-
import com.salesforce.androidsdk.R.string.salesforce_welcome_is_disabled
115114
import com.salesforce.androidsdk.R.string.sf__biometric_opt_in_title
116115
import com.salesforce.androidsdk.R.string.sf__generic_authentication_error_title
117116
import com.salesforce.androidsdk.R.string.sf__jwt_authentication_error
@@ -930,26 +929,6 @@ open class LoginActivity : FragmentActivity() {
930929
}
931930
}
932931

933-
/**
934-
* Alerts the user if Salesforce Welcome Discovery is disabled.
935-
* @param supportsWelcomeDiscovery Indicates if Salesforce Welcome Discovery
936-
* is supported.
937-
* @return Boolean true if the alert was displayed, false otherwise
938-
*/
939-
@VisibleForTesting
940-
internal fun displayWelcomeUnsupportedToastIfNeeded(
941-
supportsWelcomeDiscovery: Boolean
942-
) = if (!supportsWelcomeDiscovery) {
943-
runOnUiThread {
944-
makeText(
945-
this,
946-
getString(salesforce_welcome_is_disabled),
947-
LENGTH_LONG
948-
).show()
949-
}
950-
true
951-
} else false
952-
953932
/**
954933
* Creates a Salesforce Welcome Discovery mobile URL using the provided
955934
* Salesforce Welcome Discovery host and path URL.
@@ -1046,7 +1025,6 @@ open class LoginActivity : FragmentActivity() {
10461025
*/
10471026
private fun useSalesforceWelcomeDiscoveryMobileUrl(uri: Uri) {
10481027
if (isSalesforceWelcomeDiscoveryMobileUrl(uri)) {
1049-
displayWelcomeUnsupportedToastIfNeeded(SalesforceSDKManager.getInstance().supportsWelcomeDiscovery)
10501028
viewModel.loginUrl.postValue(uri.toString())
10511029
}
10521030
}
@@ -1489,11 +1467,6 @@ open class LoginActivity : FragmentActivity() {
14891467
if (!uri.isHierarchical) return false
14901468

14911469
val isDiscovery = isSalesforceWelcomeDiscoveryUrlPath(uri)
1492-
val discoveryEnabled = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
1493-
1494-
if (isDiscovery && !discoveryEnabled) {
1495-
w(TAG, "'${uri}' is a discovery domain, but welcome discovery isn't enabled.")
1496-
}
14971470

14981471
return isDiscovery && uri.queryParameterNames.contains(
14991472
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID
@@ -1621,9 +1594,16 @@ open class LoginActivity : FragmentActivity() {
16211594
private val activity: LoginActivity = this@LoginActivity
16221595
) : Observer<String> {
16231596
override fun onChanged(value: String) {
1624-
// Guard against observing a pending login server already provided by the intent data, such as a Salesforce Welcome Discovery mobile URL.
16251597
val pendingServerUri = value.toUri()
1626-
if (activity.intent.data?.host == pendingServerUri.host || activity.intent.getStringExtra(EXTRA_KEY_LOGIN_HOST) == pendingServerUri.host) {
1598+
val intent = activity.intent
1599+
val data = intent.data
1600+
1601+
// Guard against observing a pending login server already provided by the intent data, such as a Salesforce Welcome Discovery mobile URL.
1602+
val dataHostMatches = data?.host == pendingServerUri.host
1603+
val dataPathMatches = data?.path == pendingServerUri.path
1604+
val uriMatches = dataHostMatches && dataPathMatches
1605+
val extraMatches = intent.getStringExtra(EXTRA_KEY_LOGIN_HOST) == pendingServerUri.host
1606+
if (uriMatches || extraMatches) {
16271607
activity.viewModel.previousPendingServer = value
16281608
return
16291609
}

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ import com.salesforce.androidsdk.util.test.ExcludeFromJacocoGeneratedReport
6464
class LoginOptionsActivity: ComponentActivity() {
6565
val useWebServer = MutableLiveData(SalesforceSDKManager.getInstance().useWebServerAuthentication)
6666
val useHybridToken = MutableLiveData(SalesforceSDKManager.getInstance().useHybridAuthentication)
67-
val supportWelcomeDiscovery = MutableLiveData(SalesforceSDKManager.getInstance().supportsWelcomeDiscovery)
6867

6968
@OptIn(ExperimentalMaterial3Api::class)
7069
@Override
@@ -86,13 +85,6 @@ class LoginOptionsActivity: ComponentActivity() {
8685
value -> SalesforceSDKManager.getInstance().useHybridAuthentication = value
8786
},
8887
)
89-
supportWelcomeDiscovery.observe(
90-
/* owner = */ this,
91-
Observer<Boolean> {
92-
// onChanged lambda
93-
value -> SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = value
94-
},
95-
)
9688

9789
setContent {
9890
MaterialTheme(colorScheme = SalesforceSDKManager.getInstance().colorScheme()) {
@@ -110,7 +102,6 @@ class LoginOptionsActivity: ComponentActivity() {
110102
innerPadding,
111103
useWebServer,
112104
useHybridToken,
113-
supportWelcomeDiscovery,
114105
SalesforceSDKManager.getInstance().debugOverrideAppConfig,
115106
)
116107
}
@@ -131,7 +122,7 @@ fun OptionToggle(
131122
optionData: MutableLiveData<Boolean>,
132123
) {
133124
val checked by optionData.observeAsState(initial = false)
134-
125+
135126
Row(
136127
modifier = Modifier.fillMaxWidth().padding(PADDING_SIZE.dp),
137128
horizontalArrangement = Arrangement.SpaceBetween,
@@ -283,7 +274,6 @@ fun LoginOptionsScreen(
283274
innerPadding: PaddingValues,
284275
useWebServer: MutableLiveData<Boolean>,
285276
useHybridToken: MutableLiveData<Boolean>,
286-
supportWelcomeDiscovery: MutableLiveData<Boolean>,
287277
overrideConfig: OAuthConfig?,
288278
bootConfig: BootConfig = BootConfig.getBootConfig(LocalContext.current),
289279
) {
@@ -305,11 +295,6 @@ fun LoginOptionsScreen(
305295
stringResource(R.string.sf__login_options_hybrid_toggle_content_description),
306296
useHybridToken,
307297
)
308-
OptionToggle(
309-
"Support Welcome Discovery",
310-
stringResource(R.string.sf__login_options_welcome_toggle_content_description),
311-
supportWelcomeDiscovery,
312-
)
313298

314299
HorizontalDivider()
315300

@@ -401,7 +386,6 @@ fun LoginOptionsScreenPreview() {
401386
innerPadding = PaddingValues(0.dp),
402387
useWebServer = MutableLiveData(true),
403388
useHybridToken = MutableLiveData(false),
404-
supportWelcomeDiscovery = MutableLiveData(false),
405389
overrideConfig = null,
406390
bootConfig = object : BootConfig() {
407391
override fun getRemoteAccessConsumerKey() = consumerKey

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,10 @@ open class LoginViewModel(val bootConfig: BootConfig) : ViewModel() {
572572
) : Observer<String?> {
573573
override fun onChanged(value: String?) {
574574
if (!sdkManager.isBrowserLoginEnabled && !viewModel.isUsingFrontDoorBridge && value != null) {
575-
val isNewServer = viewModel.loginUrl.value?.startsWith(value) != true
575+
val valueUrl = value.toUri()
576+
val loginUrl = viewModel.loginUrl.value?.toUri()
577+
578+
val isNewServer = (loginUrl?.host?.equals(valueUrl.host) == false).or(!loginUrl?.path.equals(valueUrl.path))
576579
if (isNewServer) {
577580
scope.launch {
578581
viewModel.loginUrl.value = viewModel.getAuthorizationUrl(value)

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/LoginActivityScenarioTest.kt

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -356,23 +356,6 @@ class LoginActivityScenarioTest {
356356
}
357357
}
358358

359-
@Test
360-
fun loginActivity_displayWelcomeUnsupportedToastIfNeeded_supportsWelcomeDiscovery() {
361-
362-
val activityScenario = launch<LoginActivity>(
363-
Intent(
364-
getApplicationContext(),
365-
LoginActivity::class.java
366-
)
367-
)
368-
369-
activityScenario.onActivity { activity ->
370-
371-
assertFalse(activity.displayWelcomeUnsupportedToastIfNeeded(true))
372-
assertTrue(activity.displayWelcomeUnsupportedToastIfNeeded(false))
373-
}
374-
}
375-
376359
@Test
377360
fun loginActivity_startsWscDiscovery_onCreateWithSelectedServer() {
378361

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/LoginActivityTest.kt

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import androidx.activity.result.ActivityResultLauncher
3636
import androidx.core.net.toUri
3737
import androidx.lifecycle.MediatorLiveData
3838
import androidx.test.ext.junit.runners.AndroidJUnit4
39-
import com.salesforce.androidsdk.app.SalesforceSDKManager
4039
import com.salesforce.androidsdk.ui.LoginActivity.Companion.ABOUT_BLANK
4140
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HINT
4241
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HOST
@@ -121,15 +120,8 @@ class LoginActivityTest {
121120

122121
@Test
123122
fun testIsWelcomeDiscoveryUri() {
124-
val supportWelcomeDiscovery = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
125-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = false
126-
127123
val validUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
128124

129-
assertTrue(isSalesforceWelcomeDiscoveryMobileUrl(validUrl.toUri()))
130-
131-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = true
132-
133125
val nonHierarchicalUri = "mailto:test@example.com"
134126

135127
val incorrectPathUrl = "https://welcome.salesforce.com/other/path?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
@@ -157,8 +149,6 @@ class LoginActivityTest {
157149
assertFalse("Missing callback URL parameter should return false", isSalesforceWelcomeDiscoveryMobileUrl(missingCallbackUrl.toUri()))
158150

159151
assertFalse("Non-welcome URL should return false", isSalesforceWelcomeDiscoveryMobileUrl(otherUrl.toUri()))
160-
161-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = supportWelcomeDiscovery
162152
}
163153

164154
// region Salesforce Welcome Discovery
@@ -230,6 +220,56 @@ class LoginActivityTest {
230220
verify(exactly = 0) { viewModel.applyPendingServer(pendingLoginServer = any()) }
231221
}
232222

223+
@Test
224+
fun loginActivityPendingServerObserver_switchesDefaultOrSalesforceWelcomeDiscoveryLogin_onChangeIntentDataPathOnlyTogglesWelcomeDiscoveryUrlPath() {
225+
226+
val pendingServerWelcomeDiscoveryUrlPath = "https://welcome.example.com/discovery"
227+
val intent = mockk<Intent>(relaxed = true)
228+
every { intent.data } returns "https://welcome.example.com/other".toUri()
229+
val viewModel = mockk<LoginViewModel>(relaxed = true)
230+
val activity = mockk<LoginActivity>(relaxed = true)
231+
every { activity.intent } returns intent
232+
every { activity.viewModel } returns viewModel
233+
every { activity.switchDefaultOrSalesforceWelcomeDiscoveryLogin(any()) } returns true
234+
val observer = activity.PendingServerObserver(activity)
235+
observer.onChanged(pendingServerWelcomeDiscoveryUrlPath)
236+
verify(exactly = 0) { viewModel.applyPendingServer(pendingLoginServer = any()) }
237+
}
238+
239+
@Test
240+
fun loginActivityPendingServerObserver_switchesDefaultOrSalesforceWelcomeDiscoveryLogin_onChangeIntentDataHostOnlyTogglesWelcomeDiscoveryUrlPath() {
241+
242+
val pendingServerWelcomeDiscoveryUrlPath = "https://welcome.example.com/discovery"
243+
val intent = mockk<Intent>(relaxed = true)
244+
every { intent.data } returns "https://other.example.com/discovery".toUri()
245+
val viewModel = mockk<LoginViewModel>(relaxed = true)
246+
val activity = mockk<LoginActivity>(relaxed = true)
247+
every { activity.intent } returns intent
248+
every { activity.viewModel } returns viewModel
249+
every { activity.switchDefaultOrSalesforceWelcomeDiscoveryLogin(any()) } returns true
250+
val observer = activity.PendingServerObserver(activity)
251+
observer.onChanged(pendingServerWelcomeDiscoveryUrlPath)
252+
verify(exactly = 0) { viewModel.applyPendingServer(pendingLoginServer = any()) }
253+
}
254+
255+
@Test
256+
fun loginActivityPendingServerObserver_switchesDefaultOrSalesforceWelcomeDiscoveryLogin_onChangeIntentDataHostPlusLoginHintExtras() {
257+
258+
val pendingServerWelcomeDiscoveryUrlPath = "https://welcome.example.com/discovery"
259+
val intent = mockk<Intent>(relaxed = true)
260+
every { intent.getStringExtra(EXTRA_KEY_LOGIN_HINT) } returns "example_user@example.com"
261+
every { intent.getStringExtra(EXTRA_KEY_LOGIN_HOST) } returns "welcome.example.com"
262+
every { intent.data } returns "https://welcome.example.com/discovery".toUri()
263+
val viewModel = mockk<LoginViewModel>(relaxed = true)
264+
val activity = mockk<LoginActivity>(relaxed = true)
265+
every { activity.intent } returns intent
266+
every { activity.viewModel } returns viewModel
267+
every { activity.switchDefaultOrSalesforceWelcomeDiscoveryLogin(any()) } returns true
268+
val observer = activity.PendingServerObserver(activity)
269+
observer.onChanged(pendingServerWelcomeDiscoveryUrlPath)
270+
verify(exactly = 0) { viewModel.applyPendingServer(pendingLoginServer = any()) }
271+
}
272+
233273
@Test
234274
fun loginActivity_startsCorrectActivity_onStartDefaultLoginWithHintAndHost() {
235275

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/LoginOptionsActivityTest.kt

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -77,22 +77,19 @@ class LoginOptionsActivityTest {
7777

7878
private var originalUseWebServer: Boolean = false
7979
private var originalUseHybridToken: Boolean = false
80-
private var originalSupportsWelcomeDiscovery: Boolean = false
8180
private lateinit var dynamicToggle: SemanticsNodeInteraction
8281
private lateinit var consumerKeyField: SemanticsNodeInteraction
8382
private lateinit var redirectUriField: SemanticsNodeInteraction
8483
private lateinit var scopesField: SemanticsNodeInteraction
8584
private lateinit var webserverToggle: SemanticsNodeInteraction
8685
private lateinit var hybridToggle: SemanticsNodeInteraction
87-
private lateinit var welcomeToggle: SemanticsNodeInteraction
8886
private lateinit var saveButton: SemanticsNodeInteraction
8987

9088
@Before
9189
fun setup() {
9290
// Save original values
9391
originalUseWebServer = SalesforceSDKManager.getInstance().useWebServerAuthentication
9492
originalUseHybridToken = SalesforceSDKManager.getInstance().useHybridAuthentication
95-
originalSupportsWelcomeDiscovery = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
9693
SalesforceSDKManager.getInstance().loginDevMenuReload = false
9794

9895
dynamicToggle = composeTestRule.onNodeWithContentDescription(
@@ -113,9 +110,6 @@ class LoginOptionsActivityTest {
113110
hybridToggle = composeTestRule.onNodeWithContentDescription(
114111
composeTestRule.activity.getString(R.string.sf__login_options_hybrid_toggle_content_description),
115112
)
116-
welcomeToggle = composeTestRule.onNodeWithContentDescription(
117-
composeTestRule.activity.getString(R.string.sf__login_options_welcome_toggle_content_description),
118-
)
119113
saveButton = composeTestRule.onNodeWithText(
120114
composeTestRule.activity.getString(R.string.sf__server_url_save),
121115
)
@@ -126,7 +120,6 @@ class LoginOptionsActivityTest {
126120
// Restore original values
127121
SalesforceSDKManager.getInstance().useWebServerAuthentication = originalUseWebServer
128122
SalesforceSDKManager.getInstance().useHybridAuthentication = originalUseHybridToken
129-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = originalSupportsWelcomeDiscovery
130123
SalesforceSDKManager.getInstance().debugOverrideAppConfig = null
131124
SalesforceSDKManager.getInstance().loginDevMenuReload = false
132125
}
@@ -220,44 +213,6 @@ class LoginOptionsActivityTest {
220213
)
221214
}
222215

223-
@Test
224-
fun loginOptionsActivity_WelcomeDiscoveryToggle_UpdatesSdkManager() {
225-
// Set initial state via the activity's LiveData
226-
composeTestRule.activity.runOnUiThread {
227-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = false
228-
composeTestRule.activity.supportWelcomeDiscovery.value = false
229-
}
230-
composeTestRule.waitForIdle()
231-
232-
// Verify initial state
233-
assertFalse(
234-
"Support Welcome Discovery should be disabled initially",
235-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
236-
)
237-
238-
// Find and click the toggle
239-
welcomeToggle.assertIsDisplayed()
240-
welcomeToggle.assertIsOff()
241-
242-
// Verify reload flag is initially false
243-
assertFalse(
244-
"loginDevMenuReload should be false initially",
245-
SalesforceSDKManager.getInstance().loginDevMenuReload
246-
)
247-
248-
// Click
249-
welcomeToggle.performClick()
250-
composeTestRule.waitForIdle()
251-
252-
welcomeToggle.assertIsOn()
253-
254-
// Verify the SDK manager was updated
255-
assertTrue(
256-
"Support Welcome Discovery should be enabled",
257-
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
258-
)
259-
}
260-
261216
@Test
262217
fun loginOptionsActivity_InitialToggleStates_ReflectSdkManagerValues() {
263218
// Set known states via the activity's LiveData

0 commit comments

Comments
 (0)