Add Spreadsheet API to the project.
This commit is contained in:
parent
f2357c6151
commit
6cfd673335
11 changed files with 274 additions and 143 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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 lorsqu’elle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. D’un 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 qu’elle considère plus faibles qu’elle. D’une 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 d’un manque d’éducation et d’une capacité limitée à gérer ses émotions qu’à une débilité congénitale. Elle voue à la force un culte car c’est par son expression qu’elle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux qu’elle 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 lorsqu’elle est en bonne santé. Elle a les cheveux châtains, les yeux noisettes et la peau couleur gris-vert typique de son espèce. D’un 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 qu’elle considère plus faibles qu’elle. D’une 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 d’un manque d’éducation et d’une capacité limitée à gérer ses émotions qu’à une débilité congénitale. Elle voue à la force un culte car c’est par son expression qu’elle se sent vraiment vivante et éprouve de grandes difficultés vis à vis de ceux qu’elle 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,
|
||||
),
|
||||
)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue