token dans Api en variable nullable et l'initialiser à nullcheckNotNull(token) dans l'interceptornullbuild.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 tokenFlowApi 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 ComposeAndroidFragmentbuild.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 TaskRepositoryLoginViewModelTest et ajoutez des tests unitaires avec Mockk pour remplacer les implémentations concrètes des Repository