Skip to content

Commit c90db40

Browse files
committed
Move most of LoginActivity's onAuthFlowSuccess to AuthenticationUtlities onAuthFlowComplete so code is not repeated for Native Login or IDP.
1 parent e07be19 commit c90db40

3 files changed

Lines changed: 56 additions & 60 deletions

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/AuthenticationUtilities.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@
2626
*/
2727
package com.salesforce.androidsdk.auth
2828

29+
import android.content.Intent
30+
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
2931
import com.salesforce.androidsdk.R.string.sf__generic_authentication_error
3032
import com.salesforce.androidsdk.R.string.sf__generic_authentication_error_title
3133
import com.salesforce.androidsdk.R.string.sf__managed_app_error
3234
import com.salesforce.androidsdk.accounts.UserAccount
3335
import com.salesforce.androidsdk.accounts.UserAccountBuilder
3436
import 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
3540
import com.salesforce.androidsdk.analytics.EventBuilderHelper.createAndStoreEventSync
41+
import com.salesforce.androidsdk.analytics.SalesforceAnalyticsManager
3642
import com.salesforce.androidsdk.app.Features.FEATURE_BIOMETRIC_AUTH
3743
import com.salesforce.androidsdk.app.Features.FEATURE_SCREEN_LOCK
3844
import 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

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/NativeLoginManager.kt

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ package com.salesforce.androidsdk.auth
2828

2929
import android.accounts.AccountManager.KEY_INTENT
3030
import android.content.Intent
31-
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
3231
import android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP
3332
import android.os.Bundle
3433
import android.util.Base64.NO_PADDING
@@ -76,6 +75,8 @@ import com.salesforce.androidsdk.security.BiometricAuthenticationManager.Compani
7675
import com.salesforce.androidsdk.security.SalesforceKeyGenerator.getRandom128ByteKey
7776
import com.salesforce.androidsdk.security.SalesforceKeyGenerator.getSHA256Hash
7877
import com.salesforce.androidsdk.util.SalesforceSDKLogger
78+
import kotlinx.coroutines.Dispatchers
79+
import kotlinx.coroutines.withContext
7980
import okhttp3.MediaType.Companion.toMediaTypeOrNull
8081
import okhttp3.RequestBody
8182
import okhttp3.RequestBody.Companion.toRequestBody
@@ -192,33 +193,26 @@ internal class NativeLoginManager(
192193
}
193194

194195
private suspend fun suspendFinishAuthFlow(tokenResponse: RestResponse): NativeLoginResult {
195-
val appContext = SalesforceSDKManager.getInstance().appContext
196196
val tokenEndpointResponse = TokenEndpointResponse(tokenResponse.rawResponse)
197197
tokenResponse.consumeQuietly()
198198

199-
return suspendCoroutine { continuation ->
200-
onAuthFlowComplete(
201-
tokenResponse = tokenEndpointResponse,
202-
loginServer = loginUrl,
203-
consumerKey = clientId,
204-
onAuthFlowError = { error, errorDesc, e ->
205-
SalesforceSDKLogger.e(TAG, "$error: $errorDesc", e)
206-
continuation.resume(UnknownError)
207-
},
208-
onAuthFlowSuccess = { userAccount ->
209-
accountManager.switchToUser(userAccount)
210-
// Start App's Main Activity
211-
appContext.startActivity(
212-
Intent(appContext, SalesforceSDKManager.getInstance().mainActivityClass).apply {
213-
setPackage(appContext.packageName)
214-
flags = FLAG_ACTIVITY_NEW_TASK
215-
}
216-
)
217-
218-
continuation.resume(Success)
219-
},
220-
nativeLogin = true,
221-
)
199+
return withContext(Dispatchers.IO) {
200+
suspendCoroutine { continuation ->
201+
onAuthFlowComplete(
202+
tokenResponse = tokenEndpointResponse,
203+
loginServer = loginUrl,
204+
consumerKey = clientId,
205+
onAuthFlowError = { error, errorDesc, e ->
206+
SalesforceSDKLogger.e(TAG, "$error: $errorDesc", e)
207+
continuation.resume(UnknownError)
208+
},
209+
onAuthFlowSuccess = { userAccount ->
210+
SalesforceSDKLogger.d(TAG, "onAuthFlowSuccess $userAccount")
211+
continuation.resume(Success)
212+
},
213+
nativeLogin = true,
214+
)
215+
}
222216
}
223217
}
224218

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

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import android.annotation.SuppressLint
3535
import android.app.Activity
3636
import android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD
3737
import android.content.Intent
38-
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
3938
import android.content.pm.PackageManager.FEATURE_FACE
4039
import android.content.pm.PackageManager.FEATURE_IRIS
4140
import android.graphics.Bitmap
@@ -116,10 +115,6 @@ import com.salesforce.androidsdk.R.string.sf__ssl_not_yet_valid
116115
import com.salesforce.androidsdk.R.string.sf__ssl_unknown_error
117116
import com.salesforce.androidsdk.R.string.sf__ssl_untrusted
118117
import com.salesforce.androidsdk.accounts.UserAccount
119-
import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_DEFAULT
120-
import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_FIRST_LOGIN
121-
import com.salesforce.androidsdk.accounts.UserAccountManager.USER_SWITCH_TYPE_LOGIN
122-
import com.salesforce.androidsdk.analytics.SalesforceAnalyticsManager
123118
import com.salesforce.androidsdk.app.Features.FEATURE_QR_CODE_LOGIN
124119
import com.salesforce.androidsdk.app.SalesforceSDKManager
125120
import com.salesforce.androidsdk.app.SalesforceSDKManager.Theme.DARK
@@ -507,34 +502,10 @@ open class LoginActivity : FragmentActivity() {
507502
* @param userAccount The newly created user account.
508503
*/
509504
protected open fun onAuthFlowSuccess(userAccount: UserAccount) {
510-
initAnalyticsManager(userAccount)
511-
val userAccountManager = SalesforceSDKManager.getInstance().userAccountManager
512-
val authenticatedUsers = userAccountManager.authenticatedUsers
513-
val numAuthenticatedUsers = authenticatedUsers?.size ?: 0
514-
val userSwitchType = when {
515-
// We've already authenticated the first user, so there should be one
516-
numAuthenticatedUsers == 1 -> USER_SWITCH_TYPE_FIRST_LOGIN
517-
518-
// Otherwise we're logging in with an additional user
519-
numAuthenticatedUsers > 1 -> USER_SWITCH_TYPE_LOGIN
520-
521-
// This should never happen but if it does, pass in the "unknown" value
522-
else -> USER_SWITCH_TYPE_DEFAULT
523-
}
524-
userAccountManager.sendUserSwitchIntent(userSwitchType, null)
525-
setResult(Activity.RESULT_OK)
526-
527505
// Create account and save result before switching to new user
528506
accountAuthenticatorResult = SalesforceSDKManager.getInstance().userAccountManager.createAccount(userAccount)
529507

530-
userAccountManager.switchToUser(userAccount)
531-
with(SalesforceSDKManager.getInstance()) {
532-
appContext.startActivity(Intent(appContext, mainActivityClass).apply {
533-
setPackage(packageName)
534-
flags = FLAG_ACTIVITY_NEW_TASK
535-
})
536-
}
537-
508+
setResult(Activity.RESULT_OK)
538509
finish()
539510
}
540511

@@ -632,9 +603,6 @@ open class LoginActivity : FragmentActivity() {
632603
}
633604
}
634605

635-
private fun initAnalyticsManager(account: UserAccount?) =
636-
SalesforceAnalyticsManager.getInstance(account)?.updateLoggingPrefs()
637-
638606
internal inner class SPStatusCallback : StatusUpdateCallback {
639607
override fun onStatusUpdate(status: Status) {
640608
runOnUiThread {

0 commit comments

Comments
 (0)