Add Spreadsheet API to the project.

This commit is contained in:
Andres Gomez, Thomas (ITDV CC) - AF (ext) 2023-07-16 09:40:46 +02:00
parent f2357c6151
commit 6cfd673335
11 changed files with 274 additions and 143 deletions

View file

@ -0,0 +1,44 @@
package com.pixelized.rplexicon.repository
import android.content.Context
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
import com.google.api.client.util.ExponentialBackOff
import com.google.api.services.sheets.v4.SheetsScopes
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class AuthenticationRepository @Inject constructor(
@ApplicationContext private val context: Context,
) {
private val _isAuthenticated = mutableStateOf(account != null)
val isAuthenticated: State<Boolean> get() = _isAuthenticated
private val account: GoogleSignInAccount?
get() = GoogleSignIn.getLastSignedInAccount(context)
val credential: GoogleAccountCredential
get() {
val credential = GoogleAccountCredential
.usingOAuth2(
context, listOf(
SheetsScopes.SPREADSHEETS,
SheetsScopes.SPREADSHEETS_READONLY,
)
)
.setBackOff(ExponentialBackOff())
credential.selectedAccount = account?.account
return credential
}
fun updateAuthenticationState() {
_isAuthenticated.value = account != null
}
}

View file

@ -1,80 +1,115 @@
package com.pixelized.rplexicon.repository
import android.net.Uri
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import com.google.api.client.extensions.android.http.AndroidHttp
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.sheets.v4.Sheets
import com.google.api.services.sheets.v4.model.ValueRange
import com.pixelized.rplexicon.model.Lexicon
import com.pixelized.rplexicon.network.IGoogleSpreadSheet
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class LexiconRepository @Inject constructor(
private val spreadSheet: IGoogleSpreadSheet,
private val authenticationRepository: AuthenticationRepository
) {
private val scope = CoroutineScope(Dispatchers.IO)
private val sheetService: Sheets? by derivedStateOf {
when (authenticationRepository.isAuthenticated.value) {
true -> Sheets
.Builder(
AndroidHttp.newCompatibleTransport(),
GsonFactory(),
authenticationRepository.credential,
)
.setApplicationName("RP-Lexique")
.build()
else -> null
}
}
private val _data = MutableStateFlow<List<Lexicon>>(emptyList())
val data: StateFlow<List<Lexicon>> get() = _data
init {
scope.launch {
_data.emit(sample())
@Throws(ServiceNotReady::class, Exception::class)
suspend fun fetchLexicon(): ValueRange? {
val service = sheetService
return if (service == null) {
throw ServiceNotReady()
} else {
withContext(Dispatchers.IO) {
val request = service.spreadsheets().values().get(ID, LEXIQUE)
request.execute()
}
}
}
private fun sample(): List<Lexicon> {
return listOf(
Lexicon(
name = "Brulkhai",
diminutive = "Bru",
gender = Lexicon.Gender.FEMALE,
race = "Demi-Orc",
portrait = listOf(
Uri.parse("https://drive.google.com/file/d/1a31xJ6DQnzqmGBndG-uo65HNQHPEUJnI/view?usp=sharing"),
),
description = "Brulkhai, ou plus simplement Bru, est solidement bâti. Elle mesure 192 cm pour 110 kg de muscles lorsquelle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. Dun tempérament taciturne, elle parle peu et de façon concise. Elle est parfois brutale, aussi bien physiquement que verbalement, Elle ne prend cependant aucun plaisir à malmener ceux quelle considère plus faibles quelle. Dune nature simple et honnête, elle ne mâche pas ses mots et ne dissimule généralement pas ses pensées. Son intelligence modeste est plus le reflet dun manque déducation et dune capacité limitée à gérer ses émotions quà une débilité congénitale. Elle voue à la force un culte car cest par son expression quelle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux quelle nomme foshnu (bébé, chouineur en commun).",
history = null,
),
Lexicon(
name = "Léandre",
diminutive = null,
gender = Lexicon.Gender.MALE,
race = "Humain",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Nelia",
diminutive = null,
gender = Lexicon.Gender.FEMALE,
race = "Elfe",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Tigrane",
diminutive = null,
gender = Lexicon.Gender.MALE,
race = "Tieffelin",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Unathana",
diminutive = "Una",
gender = Lexicon.Gender.FEMALE,
race = "Demi-Elfe",
portrait = emptyList(),
description = null,
history = null,
),
)
companion object {
const val HOST = "https://docs.google.com/"
const val ID = "1oL9Nu5y37BPEbKxHre4TN9o8nrgy2JQoON4RRkdAHMs"
const val LEXICON_GID = 0
const val META_DATA_GID = "957635233"
const val LEXIQUE = "Lexique"
}
class ServiceNotReady : Exception()
}
private fun sample(): List<Lexicon> {
return listOf(
Lexicon(
name = "Brulkhai",
diminutive = "Bru",
gender = Lexicon.Gender.FEMALE,
race = "Demi-Orc",
portrait = listOf(
Uri.parse("https://drive.google.com/file/d/1a31xJ6DQnzqmGBndG-uo65HNQHPEUJnI/view?usp=sharing"),
),
description = "Brulkhai, ou plus simplement Bru, est solidement bâti. Elle mesure 192 cm pour 110 kg de muscles lorsquelle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. Dun tempérament taciturne, elle parle peu et de façon concise. Elle est parfois brutale, aussi bien physiquement que verbalement, Elle ne prend cependant aucun plaisir à malmener ceux quelle considère plus faibles quelle. Dune nature simple et honnête, elle ne mâche pas ses mots et ne dissimule généralement pas ses pensées. Son intelligence modeste est plus le reflet dun manque déducation et dune capacité limitée à gérer ses émotions quà une débilité congénitale. Elle voue à la force un culte car cest par son expression quelle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux quelle nomme foshnu (bébé, chouineur en commun).",
history = null,
),
Lexicon(
name = "Léandre",
diminutive = null,
gender = Lexicon.Gender.MALE,
race = "Humain",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Nelia",
diminutive = null,
gender = Lexicon.Gender.FEMALE,
race = "Elfe",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Tigrane",
diminutive = null,
gender = Lexicon.Gender.MALE,
race = "Tieffelin",
portrait = emptyList(),
description = null,
history = null,
),
Lexicon(
name = "Unathana",
diminutive = "Una",
gender = Lexicon.Gender.FEMALE,
race = "Demi-Elfe",
portrait = emptyList(),
description = null,
history = null,
),
)
}