Skip to content

Commit b38f198

Browse files
authored
Merge pull request #2834 from wmathurin/dev
New feature flag for welcome discovery (WD)
2 parents d42772e + 68cfc80 commit b38f198

3 files changed

Lines changed: 112 additions & 1 deletion

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/app/Features.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ public class Features {
4444
public static final String FEATURE_BIOMETRIC_AUTH = "BA";
4545
public static final String FEATURE_NATIVE_LOGIN = "NL";
4646
public static final String FEATURE_QR_CODE_LOGIN = "QR";
47+
public static final String FEATURE_WELCOME_DISCOVERY_LOGIN = "WD";
4748
}

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ import com.salesforce.androidsdk.R.string.sf__ssl_unknown_error
125125
import com.salesforce.androidsdk.R.string.sf__ssl_untrusted
126126
import com.salesforce.androidsdk.accounts.UserAccount
127127
import com.salesforce.androidsdk.app.Features.FEATURE_QR_CODE_LOGIN
128+
import com.salesforce.androidsdk.app.Features.FEATURE_WELCOME_DISCOVERY_LOGIN
128129
import com.salesforce.androidsdk.app.SalesforceSDKManager
129130
import com.salesforce.androidsdk.app.SalesforceSDKManager.Theme.DARK
130131
import com.salesforce.androidsdk.auth.HttpAccess
@@ -198,20 +199,22 @@ open class LoginActivity : FragmentActivity() {
198199
webViewClient = this@LoginActivity.webViewClient
199200
webChromeClient = this@LoginActivity.webChromeClient
200201
setBackgroundColor(Color.Transparent.toArgb())
202+
this@LoginActivity.baseUserAgentString = settings.userAgentString ?: ""
201203
settings.apply {
202204
domStorageEnabled = true /* Salesforce Welcome Discovery requires this */
203205
@SuppressLint("SetJavaScriptEnabled")
204206
javaScriptEnabled = true
205207
userAgentString = format(
206208
"%s %s",
207209
SalesforceSDKManager.getInstance().userAgent,
208-
userAgentString ?: "",
210+
this@LoginActivity.baseUserAgentString
209211
)
210212
}
211213
}
212214
}
213215

214216
// Private variables
217+
private var baseUserAgentString = "";
215218
private var wasBackgrounded = false
216219
private var accountAuthenticatorResponse: AccountAuthenticatorResponse? = null
217220
private var accountAuthenticatorResult: Bundle? = null
@@ -901,6 +904,24 @@ open class LoginActivity : FragmentActivity() {
901904
*/
902905
private fun applySalesforceWelcomeDiscoveryIntent(intent: Intent) {
903906

907+
// Set welcome discovery feature flag if applicable
908+
if (isLoginWithWelcomeDiscovery(intent)) {
909+
SalesforceSDKManager.getInstance()
910+
.registerUsedAppFeature(FEATURE_WELCOME_DISCOVERY_LOGIN);
911+
}
912+
else {
913+
SalesforceSDKManager.getInstance().unregisterUsedAppFeature(
914+
FEATURE_WELCOME_DISCOVERY_LOGIN
915+
);
916+
}
917+
918+
// Re-apply user agent to WebView
919+
webView.settings.userAgentString = format(
920+
"%s %s",
921+
SalesforceSDKManager.getInstance().userAgent,
922+
baseUserAgentString
923+
)
924+
904925
// Apply the intent extras' Salesforce Welcome Login hint and host for use in the OAuth authorize URL, if applicable.
905926
applySalesforceWelcomeLoginHintAndHost(intent)
906927

@@ -929,6 +950,19 @@ open class LoginActivity : FragmentActivity() {
929950
}
930951
}
931952

953+
/**
954+
* Returns true if intent is for a login with Welcome discovery
955+
* - either because the the login url is Welcome discovery (part 1 of the flow)
956+
* - there is a login hint (part 2 of the flow)
957+
*
958+
* @return true when the intent is for a login with Welcome discovery
959+
*/
960+
private fun isLoginWithWelcomeDiscovery(intent: Intent): Boolean {
961+
val isWelcomeDiscoveryUrl = intent.data?.let { isSalesforceWelcomeDiscoveryMobileUrl(it) } == true
962+
val hasLoginHint = intent.getStringExtra(EXTRA_KEY_LOGIN_HOST) != null
963+
return isWelcomeDiscoveryUrl || hasLoginHint
964+
}
965+
932966
/**
933967
* Creates a Salesforce Welcome Discovery mobile URL using the provided
934968
* Salesforce Welcome Discovery host and path URL.

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import androidx.lifecycle.Lifecycle.State.STARTED
3636
import androidx.test.core.app.ActivityScenario.launch
3737
import androidx.test.core.app.ApplicationProvider.getApplicationContext
3838
import androidx.test.ext.junit.runners.AndroidJUnit4
39+
import com.salesforce.androidsdk.app.Features
3940
import com.salesforce.androidsdk.app.SalesforceSDKManager
4041
import com.salesforce.androidsdk.config.LoginServerManager.PRODUCTION_LOGIN_URL
4142
import com.salesforce.androidsdk.config.LoginServerManager.WELCOME_LOGIN_URL
@@ -46,6 +47,7 @@ import io.mockk.mockk
4647
import io.mockk.verify
4748
import org.junit.Assert.assertEquals
4849
import org.junit.Assert.assertFalse
50+
import org.junit.Assert.assertNotNull
4951
import org.junit.Assert.assertTrue
5052
import org.junit.Test
5153
import org.junit.runner.RunWith
@@ -375,4 +377,78 @@ class LoginActivityScenarioTest {
375377
assertTrue(activity.switchDefaultOrSalesforceWelcomeDiscoveryLogin(PRODUCTION_LOGIN_URL.toUri()))
376378
}
377379
}
380+
381+
@Test
382+
fun userAgent_hasWelcomeDiscoveryFlag_withWelcomeDiscoveryLoginServer() {
383+
val uri = "https://welcome.salesforce.com/discovery?client_id=aaa&callback_url=bbb&client_version=ccc".toUri()
384+
385+
launch<LoginActivity>(
386+
Intent(
387+
getApplicationContext(),
388+
LoginActivity::class.java
389+
).apply {
390+
data = uri
391+
}).use { activityScenario ->
392+
393+
activityScenario.onActivity { activity ->
394+
val userAgentString = activity.webView.settings.userAgentString
395+
val featureFlags = extractFeatureFlags(userAgentString)
396+
assertTrue(
397+
"WD (Welcome Discovery) should be present in $userAgentString",
398+
featureFlags.contains(Features.FEATURE_WELCOME_DISCOVERY_LOGIN)
399+
)
400+
}
401+
}
402+
}
403+
404+
@Test
405+
fun userAgent_hasWelcomeDiscoveryFlag_withLoginHostHint() {
406+
launch<LoginActivity>(
407+
Intent(
408+
getApplicationContext(),
409+
LoginActivity::class.java
410+
).apply {
411+
putExtra(EXTRA_KEY_LOGIN_HOST, "mobilesdk.my.salesforce.com")
412+
}).use { activityScenario ->
413+
414+
activityScenario.onActivity { activity ->
415+
val userAgentString = activity.webView.settings.userAgentString
416+
val featureFlags = extractFeatureFlags(userAgentString)
417+
assertTrue(
418+
"WD (Welcome Discovery) should be present in $userAgentString",
419+
featureFlags.contains(Features.FEATURE_WELCOME_DISCOVERY_LOGIN)
420+
)
421+
}
422+
}
423+
}
424+
425+
@Test
426+
fun userAgent_doesNotHaveWelcomeDiscoveryFlag_withMyDomainLoginServer() {
427+
val uri = "https://mobilesdk.my.salesforce.com".toUri()
428+
429+
launch<LoginActivity>(
430+
Intent(
431+
getApplicationContext(),
432+
LoginActivity::class.java
433+
).apply {
434+
data = uri
435+
}).use { activityScenario ->
436+
437+
activityScenario.onActivity { activity ->
438+
val userAgentString = activity.webView.settings.userAgentString
439+
val featureFlags = extractFeatureFlags(userAgentString)
440+
assertFalse(
441+
"WD (Welcome Discovery) should NOT be present in $userAgentString",
442+
featureFlags.contains(Features.FEATURE_WELCOME_DISCOVERY_LOGIN)
443+
)
444+
}
445+
}
446+
}
447+
448+
fun extractFeatureFlags(userAgentString: String): List<String> {
449+
val ftrMatch = Regex("ftr_([^\\s]*)").find(userAgentString)
450+
assertNotNull("User agent should contain ftr_ field: $userAgentString", ftrMatch)
451+
val ftrValue = ftrMatch!!.groupValues[1]
452+
return ftrValue.split(".")
453+
}
378454
}

0 commit comments

Comments
 (0)