Skip to content

Commit 70c7c9e

Browse files
@W-20858906: [Android] Cherry pick welcome toggle to 13.1.1 (#2817)
1 parent 7682fb1 commit 70c7c9e

4 files changed

Lines changed: 111 additions & 12 deletions

File tree

libs/SalesforceSDK/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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>
1112

1213
<!-- 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 -->
1314
<string name="oauth_display_type">touch</string>

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,13 @@ open class SalesforceSDKManager protected constructor(
372372
@set:Synchronized
373373
var useWebServerAuthentication = true
374374

375+
376+
/**
377+
* Whether or not the app supports welcome discovery. This should only be
378+
* enabled if the connected app is supported.
379+
*/
380+
var supportsWelcomeDiscovery = false
381+
375382
/**
376383
* Optionally, enables the hybrid authentication flow. Defaults to true
377384
*/
@@ -728,7 +735,7 @@ open class SalesforceSDKManager protected constructor(
728735
* Cleans cached credentials and data.
729736
*
730737
* @param frontActivity The front activity
731-
* @param account The user account
738+
* @param userAccount The user account
732739
* @param shouldDismissActivity Dismisses the current activity if true; does
733740
* nothing otherwise
734741
*/

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

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ 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
114115
import com.salesforce.androidsdk.R.string.sf__biometric_opt_in_title
115116
import com.salesforce.androidsdk.R.string.sf__generic_authentication_error_title
116117
import com.salesforce.androidsdk.R.string.sf__jwt_authentication_error
@@ -133,7 +134,6 @@ import com.salesforce.androidsdk.auth.OAuth2.TokenEndpointResponse
133134
import com.salesforce.androidsdk.auth.OAuth2.swapJWTForTokens
134135
import com.salesforce.androidsdk.auth.idp.interfaces.SPManager.Status
135136
import com.salesforce.androidsdk.auth.idp.interfaces.SPManager.StatusUpdateCallback
136-
import com.salesforce.androidsdk.config.BootConfig.getBootConfig
137137
import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.ManagedAppCertAlias
138138
import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.RequireCertAuth
139139
import com.salesforce.androidsdk.config.RuntimeConfig.getRuntimeConfig
@@ -305,7 +305,7 @@ open class LoginActivity : FragmentActivity() {
305305
super.onNewIntent(intent)
306306

307307
// If the intent is a callback from Chrome and not another recognized intent URL, process it and do nothing else.
308-
if (isCustomTabAuthFinishedCallback(intent) && intent.data?.let { (isQrCodeLoginUrlIntent(intent) || isSalesforceWelcomeDiscoveryMobileUrl(this, it)) } != true) {
308+
if (isCustomTabAuthFinishedCallback(intent) && intent.data?.let { (isQrCodeLoginUrlIntent(intent) || isSalesforceWelcomeDiscoveryMobileUrl(it)) } != true) {
309309
completeAdvAuthFlow(intent)
310310
return
311311
}
@@ -913,6 +913,26 @@ open class LoginActivity : FragmentActivity() {
913913
}
914914
}
915915

916+
/**
917+
* Alerts the user if Salesforce Welcome Discovery is disabled.
918+
* @param supportsWelcomeDiscovery Indicates if Salesforce Welcome Discovery
919+
* is supported.
920+
* @return Boolean true if the alert was displayed, false otherwise
921+
*/
922+
@VisibleForTesting
923+
internal fun displayWelcomeUnsupportedToastIfNeeded(
924+
supportsWelcomeDiscovery: Boolean
925+
) = if (!supportsWelcomeDiscovery) {
926+
runOnUiThread {
927+
makeText(
928+
this,
929+
getString(salesforce_welcome_is_disabled),
930+
LENGTH_LONG
931+
).show()
932+
}
933+
true
934+
} else false
935+
916936
/**
917937
* Creates a Salesforce Welcome Discovery mobile URL using the provided
918938
* Salesforce Welcome Discovery host and path URL.
@@ -1007,7 +1027,8 @@ open class LoginActivity : FragmentActivity() {
10071027
* Salesforce Welcome Discovery mobile URL
10081028
*/
10091029
private fun useSalesforceWelcomeDiscoveryMobileUrl(uri: Uri) {
1010-
if (isSalesforceWelcomeDiscoveryMobileUrl(this, uri)) {
1030+
if (isSalesforceWelcomeDiscoveryMobileUrl(uri)) {
1031+
displayWelcomeUnsupportedToastIfNeeded(SalesforceSDKManager.getInstance().supportsWelcomeDiscovery)
10111032
viewModel.loginUrl.postValue(uri.toString())
10121033
}
10131034
}
@@ -1404,16 +1425,20 @@ open class LoginActivity : FragmentActivity() {
14041425
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_CALLBACK_URL_QUERY_PARAMETER_KEY_MY_DOMAIN = "my_domain"
14051426

14061427
/** The Salesforce Welcome Discovery mobile URL's callback URL query string parameter name */
1407-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL = "callback_url"
1428+
@VisibleForTesting
1429+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL = "callback_url"
14081430

14091431
/** The Salesforce Welcome Discovery mobile URL's client id (consumer key) query string parameter name */
1410-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID = "client_id"
1432+
@VisibleForTesting
1433+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID = "client_id"
14111434

14121435
/** The Salesforce Welcome Discovery mobile URL's client version query string parameter name */
1413-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION = "client_version"
1436+
@VisibleForTesting
1437+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION = "client_version"
14141438

14151439
/** The URL path used by Salesforce Welcome Discovery URLs */
1416-
private const val SALESFORCE_WELCOME_DISCOVERY_URL_PATH = "/discovery"
1440+
@VisibleForTesting
1441+
const val SALESFORCE_WELCOME_DISCOVERY_URL_PATH = "/discovery"
14171442

14181443
/**
14191444
* Determines if the provided URL has the Salesforce Welcome Discovery
@@ -1440,23 +1465,42 @@ open class LoginActivity : FragmentActivity() {
14401465
* consumer key or false otherwise
14411466
*/
14421467
fun isSalesforceWelcomeDiscoveryMobileUrl(
1443-
context: Context,
14441468
uri: Uri,
14451469
): Boolean {
14461470
if (!uri.isHierarchical) return false
1447-
val clientIdParameter = uri.getQueryParameter(SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID)
1471+
14481472
val isDiscovery = isSalesforceWelcomeDiscoveryUrlPath(uri)
1473+
val discoveryEnabled = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
1474+
1475+
if (isDiscovery && !discoveryEnabled) {
1476+
w(TAG, "'${uri}' is a discovery domain, but welcome discovery isn't enabled.")
1477+
}
14491478

14501479
return isDiscovery && uri.queryParameterNames.contains(
14511480
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID
14521481
) && uri.queryParameterNames.contains(
14531482
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION
14541483
) && uri.queryParameterNames.contains(
14551484
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL
1456-
) && clientIdParameter == getBootConfig(context).remoteAccessConsumerKey &&
1457-
(clientIdParameter == "SfdcMobileChatterAndroid" || clientIdParameter == "SfdcMobileChatteriOS") // TODO: Keep this list of client ids up to date with those supported by Salesforce Welcome Discovery or remove it when no longer required.
1485+
)
14581486
}
14591487

1488+
/**
1489+
* Determines if the provided URL has the Salesforce Welcome Discovery
1490+
* path and parameters for mobile callback. The client id (consumer
1491+
* key) of the URL must match the boot config's consumer key.
1492+
* @param url The URL to examine for the Salesforce Welcome Discovery
1493+
* path and parameters for mobile callback
1494+
* @return Boolean true if the URL has the Salesforce Welcome Discovery
1495+
* path and parameters for mobile callback and matches the boot config's
1496+
* consumer key or false otherwise
1497+
*/
1498+
@Deprecated(message = "Deprecated in 13.1.1. Will be removed in 14.0.0. Use isSalesforceWelcomeDiscoveryMobileUrl(Uri).")
1499+
fun isSalesforceWelcomeDiscoveryMobileUrl(
1500+
@Suppress("unused") context: Context,
1501+
uri: Uri,
1502+
) = isSalesforceWelcomeDiscoveryMobileCallbackUrl(uri)
1503+
14601504
/**
14611505
* Determines if the provided URL is a Salesforce Welcome Discovery
14621506
* mobile callback URL.

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
3636
import com.salesforce.androidsdk.app.SalesforceSDKManager
3737
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HINT
3838
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HOST
39+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL
40+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID
41+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION
42+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_URL_PATH
43+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.isSalesforceWelcomeDiscoveryMobileUrl
3944
import org.junit.Assert.assertEquals
4045
import org.junit.Assert.assertFalse
4146
import org.junit.Assert.assertTrue
@@ -187,4 +192,46 @@ class LoginActivityTest {
187192
}
188193
}
189194
}
195+
196+
@Test
197+
fun testIsWelcomeDiscoveryUri() {
198+
val supportWelcomeDiscovery = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
199+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = false
200+
201+
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"
202+
203+
assertTrue(isSalesforceWelcomeDiscoveryMobileUrl(validUrl.toUri()))
204+
205+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = true
206+
207+
val nonHierarchicalUri = "mailto:test@example.com"
208+
209+
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"
210+
val emptyPathUrl = "https://welcome.salesforce.com?/$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"
211+
val missingPathUrl = "https://welcome.salesforce.com?$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"
212+
213+
val missingClientIdUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
214+
val missingClientVersionUrl = "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_CALLBACK_URL=Z"
215+
val missingCallbackUrl = "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"
216+
217+
val otherUrl = "https://login.salesforce.com"
218+
219+
assertTrue("Valid URI should return true", isSalesforceWelcomeDiscoveryMobileUrl(validUrl.toUri()))
220+
221+
assertFalse("Non-hierarchical URI should return false", isSalesforceWelcomeDiscoveryMobileUrl(nonHierarchicalUri.toUri()))
222+
223+
assertFalse("Incorrect path URI should return false", isSalesforceWelcomeDiscoveryMobileUrl(incorrectPathUrl.toUri()))
224+
assertFalse("Empty path URI should return false", isSalesforceWelcomeDiscoveryMobileUrl(emptyPathUrl.toUri()))
225+
assertFalse("Missing path URI should return false", isSalesforceWelcomeDiscoveryMobileUrl(missingPathUrl.toUri()))
226+
227+
assertFalse("Missing client id parameter should return false", isSalesforceWelcomeDiscoveryMobileUrl(missingClientIdUrl.toUri()))
228+
229+
assertFalse("Missing client version parameter should return false", isSalesforceWelcomeDiscoveryMobileUrl(missingClientVersionUrl.toUri()))
230+
231+
assertFalse("Missing callback URL parameter should return false", isSalesforceWelcomeDiscoveryMobileUrl(missingCallbackUrl.toUri()))
232+
233+
assertFalse("Non-welcome URL should return false", isSalesforceWelcomeDiscoveryMobileUrl(otherUrl.toUri()))
234+
235+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = supportWelcomeDiscovery
236+
}
190237
}

0 commit comments

Comments
 (0)