Skip to content

Commit

Permalink
FR-18338.3
Browse files Browse the repository at this point in the history
  • Loading branch information
“oleksii-minaiev” committed Oct 23, 2024
1 parent 5bb540b commit 8347692
Show file tree
Hide file tree
Showing 20 changed files with 805 additions and 556 deletions.
2 changes: 1 addition & 1 deletion android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
</activity>

<service
android:name="com.frontegg.android.services.RefreshTokenService"
android:name="com.frontegg.android.services.RefreshTokenJobService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE">
<intent-filter>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.browser.customtabs.CustomTabsIntent
import com.frontegg.android.services.FronteggAuthService
import com.frontegg.android.services.FronteggInnerStorage
import com.frontegg.android.utils.AuthorizeUrlGenerator

class AuthenticationActivity : Activity() {

var customTabLaunched = false
private val storage = FronteggInnerStorage()
private var customTabLaunched = false
private fun startAuth(url: String) {
val builder = CustomTabsIntent.Builder()
builder.setShowTitle(true)
Expand Down Expand Up @@ -58,10 +60,10 @@ class AuthenticationActivity : Activity() {
val code = intent.data?.getQueryParameter("code")
if (code != null) {
Log.d(TAG, "Got intent with oauth callback")
FronteggAuth.instance.isLoading.value = true
FronteggAuthService.instance.isLoading.value = true

FronteggAuth.instance.handleHostedLoginCallback(code, null, this)
if (FronteggApp.getInstance().useChromeCustomTabs && FronteggApp.getInstance().isEmbeddedMode) {
FronteggAuthService.instance.handleHostedLoginCallback(code, null, this)
if (storage.useChromeCustomTabs && storage.isEmbeddedMode) {
EmbeddedAuthActivity.afterAuthentication(this)
} else {
setResult(RESULT_OK)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ import android.view.View
import android.widget.LinearLayout
import com.frontegg.android.embedded.FronteggNativeBridge
import com.frontegg.android.embedded.FronteggWebView
import com.frontegg.android.services.FronteggAuthService
import com.frontegg.android.services.FronteggInnerStorage
import com.frontegg.android.utils.AuthorizeUrlGenerator
import com.frontegg.android.utils.NullableObject
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.functions.Consumer

class EmbeddedAuthActivity : Activity() {

lateinit var webView: FronteggWebView
private val storage = FronteggInnerStorage()
private lateinit var webView: FronteggWebView
private var webViewUrl: String? = null
private var directLoginLaunchedDone: Boolean = false
private var directLoginLaunched: Boolean = false
Expand All @@ -36,8 +38,8 @@ class EmbeddedAuthActivity : Activity() {

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(DIRECT_LOGIN_ACTION_LAUNCHED, this.directLoginLaunched);
outState.putBoolean(DIRECT_LOGIN_ACTION_LAUNCHED_DONE, this.directLoginLaunchedDone);
outState.putBoolean(DIRECT_LOGIN_ACTION_LAUNCHED, this.directLoginLaunched)
outState.putBoolean(DIRECT_LOGIN_ACTION_LAUNCHED_DONE, this.directLoginLaunchedDone)
}

private fun consumeIntent(intent: Intent) {
Expand Down Expand Up @@ -124,7 +126,7 @@ class EmbeddedAuthActivity : Activity() {
}

private fun navigateToAuthenticated() {
val mainActivityClass = FronteggApp.getInstance().mainActivityClass
val mainActivityClass = storage.mainActivityClass
if (mainActivityClass != null) {
val intent = Intent(this, mainActivityClass)
startActivity(intent)
Expand All @@ -144,8 +146,8 @@ class EmbeddedAuthActivity : Activity() {
if (directLoginLaunchedDone) {
onAuthFinishedCallback?.invoke()
onAuthFinishedCallback = null
FronteggAuth.instance.isLoading.value = false
FronteggAuth.instance.showLoader.value = false
FronteggAuthService.instance.isLoading.value = false
FronteggAuthService.instance.showLoader.value = false
setResult(RESULT_OK)
finish()
return
Expand Down
98 changes: 13 additions & 85 deletions android/src/main/java/com/frontegg/android/FronteggApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,31 @@ import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager.MATCH_ALL
import android.os.Handler
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.ProcessLifecycleOwner
import com.frontegg.android.exceptions.FronteggException
import com.frontegg.android.exceptions.FronteggException.Companion.FRONTEGG_APP_MUST_BE_INITIALIZED
import com.frontegg.android.regions.RegionConfig
import com.frontegg.android.services.*
import java.time.Instant
import com.frontegg.android.services.CredentialManager
import com.frontegg.android.services.FronteggAppService

class FronteggApp private constructor(
val context: Context,
var baseUrl: String,
var clientId: String,
var applicationId: String?,
val isEmbeddedMode: Boolean = true,
val regions: List<RegionConfig> = listOf(),
val selectedRegion: RegionConfig? = null,
var handleLoginWithSocialLogin: Boolean = true,
var customUserAgent: String? = null,
var handleLoginWithSSO: Boolean = false,
var shouldPromptSocialLoginConsent: Boolean = true,
val useAssetsLinks: Boolean = false,
var useChromeCustomTabs: Boolean = false,
var mainActivityClass: Class<*>? = null
) {

val credentialManager: CredentialManager = CredentialManager(context)
val auth: FronteggAuth =
FronteggAuth(baseUrl, clientId, applicationId, credentialManager, regions, selectedRegion)
val packageName: String = context.packageName
var appInForeground = true

var lastJobStart: Long = Instant.now().toEpochMilli();
interface FronteggApp {
val auth: FronteggAuth

companion object {

@SuppressLint("StaticFieldLeak")
private var instance: FronteggApp? = null

public val TAG: String = FronteggApp::class.java.simpleName
val TAG: String = FronteggApp::class.java.simpleName

public fun getInstance(): FronteggApp {
fun getInstance(): FronteggApp {
if (instance == null) {
throw FronteggException(FRONTEGG_APP_MUST_BE_INITIALIZED)
}
return instance!!
}

public fun init(
fun init(
fronteggDomain: String,
clientId: String,
context: Context,
Expand All @@ -71,9 +45,7 @@ class FronteggApp private constructor(

val isEmbeddedMode = isActivityEnabled(context, EmbeddedAuthActivity::class.java.name)



instance = FronteggApp(
instance = FronteggAppService(
context = context,
baseUrl = baseUrl,
clientId = clientId,
Expand All @@ -83,13 +55,9 @@ class FronteggApp private constructor(
useChromeCustomTabs = useChromeCustomTabs,
mainActivityClass = mainActivityClass
)

Handler(context.mainLooper).post {
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver)
}
}

public fun initWithRegions(
fun initWithRegions(
regions: List<RegionConfig>,
context: Context,
useAssetsLinks: Boolean = false,
Expand All @@ -103,7 +71,7 @@ class FronteggApp private constructor(
val regionConfig = regions.find { it.key == selectedRegion }

if (regionConfig != null) {
val newInstance = FronteggApp(
val newInstance = FronteggAppService(
context = context,
baseUrl = regionConfig.baseUrl,
clientId = regionConfig.clientId,
Expand All @@ -119,7 +87,7 @@ class FronteggApp private constructor(
return newInstance
}
}
val newInstance = FronteggApp(
val newInstance = FronteggAppService(
context = context,
baseUrl = "",
clientId = "",
Expand All @@ -134,24 +102,6 @@ class FronteggApp private constructor(
return newInstance
}

private var lifecycleEventObserver = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_STOP -> {
Log.d(TAG, "ON_STOP")
getInstance().appInForeground = false
getInstance().auth.refreshTokenWhenNeeded()
}

Lifecycle.Event.ON_START -> {
Log.d(TAG, "ON_START")
getInstance().appInForeground = true
getInstance().auth.refreshTokenWhenNeeded()
}

else -> {}
}
}

private fun isActivityEnabled(context: Context, activityClassName: String): Boolean {
return try {
val componentName = ComponentName(context, activityClassName)
Expand All @@ -163,27 +113,5 @@ class FronteggApp private constructor(
}
}

fun initWithRegion(regionKey: String) {
if (this.regions.isEmpty()) {
throw RuntimeException("illegal state. Frontegg.plist does not contains regions array")
}

val keys = this.regions.joinToString(",") { it.key }

val config = regions.find { it.key == regionKey }
?: throw RuntimeException("invalid region key ${regionKey}. available regions: $keys")


credentialManager.saveSelectedRegion(regionKey)

this.baseUrl = config.baseUrl
this.clientId = config.clientId
this.applicationId = config.applicationId
this.auth.reinitWithRegion(config)


Log.i(TAG, "Frontegg Initialized successfully (region: ${regionKey})")
}


}
fun initWithRegion(regionKey: String)
}
Loading

0 comments on commit 8347692

Please sign in to comment.