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
@@ -87,6 +93,7 @@ internal fun onAuthFlowComplete(
8793 nativeLogin : Boolean = false,
8894) {
8995 val context = SalesforceSDKManager .getInstance().appContext
96+ val userAccountManager = SalesforceSDKManager .getInstance().userAccountManager
9097 val blockIntegrationUser = SalesforceSDKManager .getInstance().shouldBlockSalesforceIntegrationUser &&
9198 fetchIsSalesforceIntegrationUser(tokenResponse, loginServer)
9299
@@ -148,7 +155,7 @@ internal fun onAuthFlowComplete(
148155 if (existingUsers.contains(account)) {
149156 val duplicateUserAccount = existingUsers.removeAt(existingUsers.indexOf(account))
150157 clearCaches()
151- UserAccountManager .getInstance() .clearCachedCurrentUser()
158+ userAccountManager .clearCachedCurrentUser()
152159
153160 // Revoke existing refresh token
154161 if (account.refreshToken != duplicateUserAccount.refreshToken) {
@@ -179,7 +186,7 @@ internal fun onAuthFlowComplete(
179186 existingUsers.forEach(Consumer { existingUser ->
180187 if (isBiometricAuthenticationEnabled(existingUser)) {
181188 // This is an unexpected logout(s) because we only support one Bio Auth user.
182- SalesforceSDKManager .getInstance(). userAccountManager.signoutUser(
189+ userAccountManager.signoutUser(
183190 existingUser, null , false , OAuth2 .LogoutReason .UNEXPECTED
184191 )
185192 }
@@ -190,8 +197,35 @@ internal fun onAuthFlowComplete(
190197 // Save the user account
191198 addAccount(account)
192199
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+
193219 // Kickoff the end of the flow before storing mobile policy to prevent launching
194220 // 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
195229 onAuthFlowSuccess(account)
196230
197231 // Screen lock required by mobile policy
0 commit comments