Skip to content

Commit

Permalink
- add support for tenant switch
Browse files Browse the repository at this point in the history
- fix example project
  • Loading branch information
frontegg-david committed Aug 15, 2023
1 parent 4919ee5 commit b3502c7
Show file tree
Hide file tree
Showing 34 changed files with 664 additions and 261 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,16 @@ following command:

For Debug mode, run the following command and copy the `SHA-256` value

NOTE: make sure to choose the Variant and Config equals to `debug`

```bash
./gradlew signingReport

###################
# Example Output:
###################

# Variant: debugAndroidTest
# Variant: debug
# Config: debug
# Store: /Users/davidfrontegg/.android/debug.keystore
# Alias: AndroidDebugKey
Expand Down
17 changes: 17 additions & 0 deletions android/src/main/java/com/frontegg/android/FronteggAuth.kt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ class FronteggAuth(
credentialManager.clear()
val handler = Handler(Looper.getMainLooper())
handler.post {
isLoading.value = false
callback()
}
}
Expand All @@ -174,4 +175,20 @@ class FronteggAuth(
fun login(activity: Activity) {
AuthenticationActivity.authenticateUsingBrowser(activity)
}


fun switchTenant(tenantId: String, callback: () -> Unit = {}) {
GlobalScope.launch(Dispatchers.IO) {

isLoading.value = true
api.switchTenant(tenantId)
refreshTokenIfNeeded()

val handler = Handler(Looper.getMainLooper())
handler.post {
isLoading.value = false
callback()
}
}
}
}
27 changes: 27 additions & 0 deletions android/src/main/java/com/frontegg/android/services/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,26 @@ open class Api(
return this.httpClient.newCall(request)
}

private fun buildPutRequest(
path: String,
body: JsonObject,
additionalHeaders: Map<String, String> = mapOf()
): Call {
val url = "${this.baseUrl}/$path".toHttpUrl()
val requestBuilder = Request.Builder()
val bodyRequest =
body.toString()
.toRequestBody("application/json; charset=utf-8".toMediaType())
val headers = this.prepareHeaders(additionalHeaders);

requestBuilder.method("PUT", bodyRequest)
requestBuilder.headers(headers);
requestBuilder.url(url)

val request = requestBuilder.build()
return this.httpClient.newCall(request)
}

private fun buildGetRequest(path: String): Call {
val url = "$baseUrl/$path".toHttpUrl()
val requestBuilder = Request.Builder()
Expand Down Expand Up @@ -160,4 +180,11 @@ open class Api(
call.execute()
}
}

fun switchTenant(tenantId: String) {
val data = JsonObject()
data.addProperty("tenantId", tenantId)
val call = buildPutRequest(ApiConstants.switchTenant, data)
call.execute()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package com.frontegg.android.utils

import com.frontegg.android.FronteggApp


class ApiConstants {
companion object {
const val me: String = "identity/resources/users/v2/me"
const val tenants: String = "identity/resources/users/v3/me/tenants"
const val refreshToken: String = "oauth/token"
const val exchangeToken: String = "oauth/token"
const val logout: String = "identity/resources/auth/v1/logout"
const val switchTenant: String = "identity/resources/users/v1/tenant"
}
}

Expand All @@ -19,7 +21,10 @@ class Constants {
fun oauthCallbackUrl(baseUrl: String): String {

val host = baseUrl.substring("https://".length)
return "comfronteggdemo://${host}/android/oauth/callback"
val packageName = FronteggApp.getInstance().packageName

val protocol = packageName.replace(Regex("\\."), "")
return "${protocol}://${host}/android/oauth/callback"
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.frontegg.android.utils

import android.os.Handler
import android.os.Looper
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.functions.Consumer
import io.reactivex.rxjava3.subjects.PublishSubject
Expand All @@ -25,6 +27,7 @@ class ObservableValue<T>(value: T) {
}

fun subscribe(onNext: Consumer<NullableObject<T>>): Disposable {
observable.subscribe()
val disposable = observable.subscribe(onNext)
onNext.accept(nullableObject)
return disposable
Expand Down
5 changes: 4 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ dependencies {
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation 'androidx.tracing:tracing:1.1.0'
implementation project(path: ':android')

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation 'com.github.bumptech.glide:glide:4.12.0'

androidTestImplementation 'org.jetbrains.kotlin:kotlin-stdlib:' + rootProject.kotlinVersion
androidTestImplementation 'androidx.test:core:' + rootProject.coreVersion
Expand Down
18 changes: 13 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,28 @@
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">

<activity
android:name="com.frontegg.demo.MainActivity"
android:name=".NavigationActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApplication.NoActionBar">
android:label="@string/title_activity_navigation" >

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- <activity-->
<!-- android:name=".MainActivity"-->
<!-- android:exported="true"-->
<!-- android:label="@string/app_name"-->
<!-- android:theme="@style/Theme.MyApplication.NoActionBar">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->


<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
</application>

</manifest>
4 changes: 4 additions & 0 deletions app/src/main/java/com/frontegg/demo/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@ import com.frontegg.android.FronteggApp

class App : Application() {

companion object {
public lateinit var instance: App
}
override fun onCreate() {
super.onCreate()
instance = this
FronteggApp.init(
BuildConfig.FRONTEGG_DOMAIN,
BuildConfig.FRONTEGG_CLIENT_ID,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package com.frontegg.demo

import android.content.Intent
import android.app.Activity
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import androidx.appcompat.app.AppCompatActivity
import com.frontegg.android.FronteggAuth
import com.frontegg.demo.databinding.FragmentFirstBinding
import com.frontegg.demo.databinding.FragmentAuthBinding
import io.reactivex.rxjava3.disposables.Disposable

/**
* A simple [Fragment] subclass as the default destination in the navigation.
*/
class FirstFragment : Fragment() {
class AuthFragment : Fragment() {

private var _binding: FragmentFirstBinding? = null
private var _binding: FragmentAuthBinding? = null

// This property is only valid between onCreateView and
// onDestroyView.
Expand All @@ -28,30 +28,18 @@ class FirstFragment : Fragment() {
savedInstanceState: Bundle?
): View {

_binding = FragmentFirstBinding.inflate(inflater, container, false)
_binding = FragmentAuthBinding.inflate(inflater, container, false)

return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)


binding.logoutButton.setOnClickListener {

FronteggAuth.instance.logout()
}

binding.loginButton.setOnClickListener {

FronteggAuth.instance.login(requireActivity())
}
val tenantIds = FronteggAuth.instance.user.value?.tenantIds ?: listOf()
disposables.add(FronteggAuth.instance.user.subscribe {
activity?.runOnUiThread {
binding.textviewFirst.text = it.value?.email
}
})
}

override fun onDestroyView() {
Expand Down
64 changes: 0 additions & 64 deletions app/src/main/java/com/frontegg/demo/MainActivity.kt

This file was deleted.

Loading

0 comments on commit b3502c7

Please sign in to comment.