2626 */
2727package com.salesforce.androidsdk.auth
2828
29+ import android.content.Intent
30+ import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
2931import com.salesforce.androidsdk.R.string.sf__generic_authentication_error
3032import com.salesforce.androidsdk.R.string.sf__generic_authentication_error_title
3133import com.salesforce.androidsdk.R.string.sf__managed_app_error
3234import com.salesforce.androidsdk.accounts.UserAccount
3335import com.salesforce.androidsdk.accounts.UserAccountBuilder
3436import com.salesforce.androidsdk.accounts.UserAccountManager
37+ import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_DEFAULT
38+ import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_FIRST_LOGIN
39+ import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_LOGIN
3540import com.salesforce.androidsdk.analytics.EventBuilderHelper.createAndStoreEventSync
41+ import com.salesforce.androidsdk.analytics.SalesforceAnalyticsManager
3642import com.salesforce.androidsdk.app.Features.FEATURE_BIOMETRIC_AUTH
3743import com.salesforce.androidsdk.app.Features.FEATURE_SCREEN_LOCK
3844import com.salesforce.androidsdk.app.SalesforceSDKManager
@@ -46,7 +52,6 @@ import com.salesforce.androidsdk.rest.RestClient.clearCaches
4652import com.salesforce.androidsdk.security.BiometricAuthenticationManager
4753import com.salesforce.androidsdk.security.BiometricAuthenticationManager.Companion.isBiometricAuthenticationEnabled
4854import com.salesforce.androidsdk.security.ScreenLockManager
49- import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.MUST_BE_MANAGED_APP_PERM
5055import com.salesforce.androidsdk.util.SalesforceSDKLogger.e
5156import com.salesforce.androidsdk.util.SalesforceSDKLogger.w
5257import kotlinx.coroutines.CoroutineScope
@@ -60,6 +65,12 @@ import org.json.JSONObject
6065import java.net.URI
6166import java.util.function.Consumer
6267
68+ /* *
69+ * Set a custom permission on the connected application with that name
70+ * for the application to be restricted to managed devices
71+ */
72+ private const val MUST_BE_MANAGED_APP_PERM = " must_be_managed_app"
73+
6374private const val TAG = " AuthenticationUtilities"
6475
6576/* *
@@ -79,8 +90,10 @@ internal fun onAuthFlowComplete(
7990 onAuthFlowError : (error: String , errorDesc: String? , e: Throwable ? ) -> Unit ,
8091 onAuthFlowSuccess : (userAccount: UserAccount ) -> Unit ,
8192 buildAccountName : (username: String? , instanceServer: String? ) -> String = ::defaultBuildAccountName,
93+ nativeLogin : Boolean = false,
8294) {
8395 val context = SalesforceSDKManager .getInstance().appContext
96+ val userAccountManager = SalesforceSDKManager .getInstance().userAccountManager
8497 val blockIntegrationUser = SalesforceSDKManager .getInstance().shouldBlockSalesforceIntegrationUser &&
8598 fetchIsSalesforceIntegrationUser(tokenResponse, loginServer)
8699
@@ -124,6 +137,7 @@ internal fun onAuthFlowComplete(
124137 .accountName(buildAccountName(userIdentity?.username, tokenResponse.instanceUrl))
125138 .loginServer(loginServer)
126139 .clientId(consumerKey)
140+ .nativeLogin(nativeLogin)
127141 .build()
128142 account.downloadProfilePhoto()
129143
@@ -141,7 +155,7 @@ internal fun onAuthFlowComplete(
141155 if (existingUsers.contains(account)) {
142156 val duplicateUserAccount = existingUsers.removeAt(existingUsers.indexOf(account))
143157 clearCaches()
144- UserAccountManager .getInstance() .clearCachedCurrentUser()
158+ userAccountManager .clearCachedCurrentUser()
145159
146160 // Revoke existing refresh token
147161 if (account.refreshToken != duplicateUserAccount.refreshToken) {
@@ -172,7 +186,7 @@ internal fun onAuthFlowComplete(
172186 existingUsers.forEach(Consumer { existingUser ->
173187 if (isBiometricAuthenticationEnabled(existingUser)) {
174188 // This is an unexpected logout(s) because we only support one Bio Auth user.
175- SalesforceSDKManager .getInstance(). userAccountManager.signoutUser(
189+ userAccountManager.signoutUser(
176190 existingUser, null , false , OAuth2 .LogoutReason .UNEXPECTED
177191 )
178192 }
@@ -183,8 +197,35 @@ internal fun onAuthFlowComplete(
183197 // Save the user account
184198 addAccount(account)
185199
200+ // Init user logging
201+ SalesforceAnalyticsManager .getInstance(account)?.updateLoggingPrefs()
202+
203+ // Send User Switch Intent, create user and switch to user.
204+ val numAuthenticatedUsers = userAccountManager.authenticatedUsers?.size ? : 0
205+ val userSwitchType = when {
206+ // We've already authenticated the first user, so there should be one
207+ numAuthenticatedUsers == 1 -> USER_SWITCH_TYPE_FIRST_LOGIN
208+
209+ // Otherwise we're logging in with an additional user
210+ numAuthenticatedUsers > 1 -> USER_SWITCH_TYPE_LOGIN
211+
212+ // This should never happen but if it does, pass in the "unknown" value
213+ else -> USER_SWITCH_TYPE_DEFAULT
214+ }
215+ userAccountManager.sendUserSwitchIntent(userSwitchType, null )
216+ userAccountManager.createAccount(account)
217+ userAccountManager.switchToUser(account)
218+
186219 // Kickoff the end of the flow before storing mobile policy to prevent launching
187220 // the main activity over/after the screen lock.
221+ with (SalesforceSDKManager .getInstance()) {
222+ appContext.startActivity(Intent (appContext, mainActivityClass).apply {
223+ setPackage(appContext.packageName)
224+ flags = FLAG_ACTIVITY_NEW_TASK
225+ })
226+ }
227+
228+ // Let the calling process resume
188229 onAuthFlowSuccess(account)
189230
190231 // Screen lock required by mobile policy
0 commit comments