token
dans Api
en variable nullable et l'initialiser à null
checkNotNull(token)
dans l'interceptornull
build.gradle
: implementation("io.github.kalinjul.kotlin.multiplatform:oidc-appsupport:0.12.1")
<activity
android:name="org.publicvalue.multiplatform.oidc.appsupport.HandleRedirectActivity"
android:exported="true">
<intent-filter tools:node="removeAll" />
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="cyrilfind.kodo"
android:scheme="https"
android:path="/redirect_uri" />
</intent-filter>
</activity>
val codeAuthFlowFactory = AndroidCodeAuthFlowFactory()
val oAuthClient = OpenIdConnectClient {
endpoints {
authorizationEndpoint = "https://todoist.com/oauth/authorize"
tokenEndpoint = "https://todoist.com/oauth/access_token"
}
clientId = "a9400191c656400fb31a043e530c5522"
clientSecret = "198815c02ac94f029a00338135a45123"
scope = "task:add,data:read_write,data:delete"
redirectUri = "https://cyrilfind.kodo/redirect_uri"
}
fun login() {
// ...
val tokenResponse = codeAuthFlowFactory.createAuthFlow(oAuthClient).getAccessToken()
val token = tokenResponse.access_token
// ...
}
Api
puis naviguez vers l'écran qui liste les tâchesPour l'instant le soucis c'est que vous devez vous reconnecter à chaque lancement de l'app, on va y remédier en utilisant un stockage qui dure au delà d'une session d'utilisation de l'app.
build.gradle
: implementation("androidx.datastore:datastore-preferences:1.1.1")
TokenRepository
et une instance de DataStore
globale et complétez:private val Context.userDatastore by preferencesDataStore("user")
class TokenRepository(val context: Context) {
private val key = stringPreferencesKey("token")
val tokenFlow = context.userDatastore.data.map { ... }
suspend fun store(token: String) {
context.userDatastore.edit { ... }
}
suspend fun clear() {
context.userDatastore.edit { ... }
}
}
TokenRepository
et collectez le tokenFlow
Api
et déclencher un refresh des tasks, sauf si la valeur est nulle, dans ce cas il faut naviguer vers le loginTokenRepository
et enregistrez le token avec quand il est récupéréTokenRepository
, ajouter un bouton logout et effacer le token quand on clique dessus.setContentView
par un setContent {}
et ajouter un NavHost
ComposeAndroidFragment
build.gradle
et suivez les étapes de configurationappModule
et y ajoutez la classe TokenRepository
en single
et vos ViewModelsRefactorisez toute l'app pour que vos écrans ne récupèrent qu'un objet "state", et remontent seulement des évènements vers des ViewModel qui eux même interrogent des Repository partagés.
TaskRepository
en TaskRepositoryImpl
et créez une nouvelle interface TaskRepository
LoginViewModelTest
et ajoutez des tests unitaires avec Mockk pour remplacer les implémentations concrètes des Repository