Compare commits
21 Commits
Author | SHA1 | Date |
---|---|---|
|
35843b4334 | 2 years ago |
|
177758cfdd | 2 years ago |
|
d348da8055 | 2 years ago |
|
1cfdaab5b7 | 2 years ago |
|
3e3fbe2dd0 | 2 years ago |
|
cb95747e65 | 2 years ago |
|
5389b060eb | 2 years ago |
|
9e5dcb1681 | 2 years ago |
|
a5e07309ba | 2 years ago |
|
64d75971b0 | 2 years ago |
|
31d8f6d0cf | 2 years ago |
|
2438c71b96 | 2 years ago |
|
405f968c83 | 2 years ago |
|
81513146aa | 2 years ago |
|
a04b0c6f6a | 2 years ago |
|
ea68bbecef | 2 years ago |
|
a5ae9880ed | 2 years ago |
|
6e3d94a354 | 2 years ago |
|
50fd1ab44c | 2 years ago |
|
6157e60b12 | 2 years ago |
|
96f784ce68 | 2 years ago |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 35 KiB |
@ -0,0 +1,119 @@
|
|||||||
|
package uca.iut.clermont.api
|
||||||
|
|
||||||
|
import AreaManager
|
||||||
|
import CompetitionsManager
|
||||||
|
import DataManager
|
||||||
|
import MatchesManager
|
||||||
|
import PeopleManager
|
||||||
|
import TeamsManager
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import retrofit2.Retrofit
|
||||||
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
import uca.iut.clermont.model.*
|
||||||
|
|
||||||
|
val retrofit: Retrofit = Retrofit.Builder()
|
||||||
|
.baseUrl("https://api.football-data.org/v4/")
|
||||||
|
.addConverterFactory(GsonConverterFactory.create())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val footballApi: FootballApi = retrofit.create(FootballApi::class.java)
|
||||||
|
|
||||||
|
class ApiManager : DataManager() {
|
||||||
|
override val areaMgr: AreaManager = ApiAreaManager()
|
||||||
|
override val peopleMgr: PeopleManager = ApiPeopleManager()
|
||||||
|
override val matchesMgr: MatchesManager = ApiMatchesManager()
|
||||||
|
override val competitionsMgr: CompetitionsManager = ApiCompetitionsManager()
|
||||||
|
override val teamsMgr: TeamsManager = ApiTeamsManager()
|
||||||
|
|
||||||
|
class ApiAreaManager : AreaManager {
|
||||||
|
|
||||||
|
override suspend fun getItemsByName(substring: String): List<Area> = coroutineScope {
|
||||||
|
val areas = footballApi.getAreas()
|
||||||
|
return@coroutineScope areas.areas.filter { it.name.contains(substring) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItems(): List<Area> = coroutineScope {
|
||||||
|
val areas = footballApi.getAreas()
|
||||||
|
return@coroutineScope areas.areas
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItemById(id: Int): Area = coroutineScope {
|
||||||
|
val area = footballApi.getArea(id)
|
||||||
|
return@coroutineScope area
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ApiPeopleManager : PeopleManager {
|
||||||
|
|
||||||
|
override suspend fun getItems(): List<Personne> = listOf()
|
||||||
|
|
||||||
|
override suspend fun getItemById(id: Int): Personne? = coroutineScope {
|
||||||
|
val personne = footballApi.getPlayer(id)
|
||||||
|
return@coroutineScope personne.toModel()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ApiMatchesManager : MatchesManager {
|
||||||
|
|
||||||
|
override suspend fun getNbItemsByCompetition(id: Int): Int = coroutineScope {
|
||||||
|
val matches = footballApi.getMatchesByCompetition(id)
|
||||||
|
return@coroutineScope matches.matches.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItemsByCompetition(id: Int): List<Match> =
|
||||||
|
coroutineScope {
|
||||||
|
val matches = footballApi.getMatchesByCompetition(id)
|
||||||
|
return@coroutineScope matches.matches.map { it.toModel() }
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItems(): List<Match> = coroutineScope {
|
||||||
|
val matches = footballApi.getMatches()
|
||||||
|
return@coroutineScope matches.matches.map { matchResult -> matchResult.toModel() }
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItemById(id: Int): Match = coroutineScope {
|
||||||
|
val match = footballApi.getMatch(id)
|
||||||
|
return@coroutineScope match.toModel()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ApiCompetitionsManager : CompetitionsManager {
|
||||||
|
|
||||||
|
override suspend fun getItemsByName(substring: String): List<Competition> = coroutineScope {
|
||||||
|
val competitons = footballApi.getCompetitions()
|
||||||
|
return@coroutineScope competitons.competitions.map { competitionResult -> competitionResult.toModel() }
|
||||||
|
.filter { it.name == substring }
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItems(): List<Competition> = coroutineScope {
|
||||||
|
val competitons = footballApi.getCompetitions()
|
||||||
|
return@coroutineScope competitons.competitions.map { competitionResult -> competitionResult.toModel() }
|
||||||
|
.sortedBy { it.name }
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItemById(id: Int): Competition = coroutineScope {
|
||||||
|
val competition = footballApi.getCompetition(id)
|
||||||
|
return@coroutineScope competition.toModel()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ApiTeamsManager : TeamsManager {
|
||||||
|
|
||||||
|
override fun getItemsByName(substring: String): List<Team> {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItems(): List<Team> {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getItemById(id: Int): Team? {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package uca.iut.clermont.api
|
||||||
|
|
||||||
|
import retrofit2.http.GET
|
||||||
|
import retrofit2.http.Headers
|
||||||
|
import retrofit2.http.Path
|
||||||
|
import uca.iut.clermont.api.response.areaResponse.AreaResponse
|
||||||
|
import uca.iut.clermont.api.response.competitionResponse.CompetitionResponse
|
||||||
|
import uca.iut.clermont.api.response.competitionResponse.CompetitionResult
|
||||||
|
import uca.iut.clermont.api.response.matchResponse.MatchResponse
|
||||||
|
import uca.iut.clermont.api.response.matchResponse.MatchResult
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
import uca.iut.clermont.model.PlayerResponse
|
||||||
|
|
||||||
|
interface FootballApi {
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
|
||||||
|
@GET("areas/{id}")
|
||||||
|
suspend fun getArea(@Path("id") id: Int): Area
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
|
||||||
|
@GET("areas")
|
||||||
|
suspend fun getAreas(): AreaResponse
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
|
||||||
|
@GET("persons/{id}")
|
||||||
|
suspend fun getPlayer(@Path("id") playerId: Int): PlayerResponse
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 621ef06e148542f98b4993a5442421eb")
|
||||||
|
@GET("competitions")
|
||||||
|
suspend fun getCompetitions(): CompetitionResponse
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 8f51b43de0444026bd3ec3484f082575")
|
||||||
|
@GET("competitions/{id}")
|
||||||
|
suspend fun getCompetition(@Path("id") id: Int): CompetitionResult
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
|
||||||
|
@GET("matches")
|
||||||
|
suspend fun getMatches(): MatchResponse
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: 621ef06e148542f98b4993a5442421eb")
|
||||||
|
@GET("matches/{id}")
|
||||||
|
suspend fun getMatch(@Path("id") id: Int): MatchResult
|
||||||
|
|
||||||
|
@Headers("X-Auth-Token: b002ff114afa41a590e2baef63d8c689")
|
||||||
|
@GET("competitions/{id}/matches")
|
||||||
|
suspend fun getMatchesByCompetition(@Path("id") id: Int): MatchResponse
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package uca.iut.clermont.api.response.areaResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
|
||||||
|
data class AreaResponse(
|
||||||
|
val areas: List<Area>,
|
||||||
|
val count: Int
|
||||||
|
)
|
@ -0,0 +1,7 @@
|
|||||||
|
package uca.iut.clermont.api.response.competitionResponse
|
||||||
|
|
||||||
|
data class CompetitionResponse(
|
||||||
|
val competitions: List<CompetitionResult>,
|
||||||
|
val count: Int,
|
||||||
|
val filters: Filters
|
||||||
|
)
|
@ -0,0 +1,24 @@
|
|||||||
|
package uca.iut.clermont.api.response.competitionResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
|
||||||
|
class CompetitionResult(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val code: String,
|
||||||
|
val type: String,
|
||||||
|
val emblem: String,
|
||||||
|
val currentSeason: CurrentSeason,
|
||||||
|
val area: Area
|
||||||
|
) {
|
||||||
|
fun toModel() = Competition(
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
code,
|
||||||
|
type,
|
||||||
|
emblem,
|
||||||
|
currentSeason.toModel(),
|
||||||
|
area
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package uca.iut.clermont.api.response.competitionResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.model.Season
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
data class CurrentSeason(
|
||||||
|
val currentMatchday: Int,
|
||||||
|
val endDate: String,
|
||||||
|
val id: Int,
|
||||||
|
val startDate: String,
|
||||||
|
val winner: Any
|
||||||
|
) {
|
||||||
|
fun toModel(): Season {
|
||||||
|
val calendar = Calendar.getInstance()
|
||||||
|
val calendar2 = Calendar.getInstance()
|
||||||
|
return Season(
|
||||||
|
id,
|
||||||
|
calendar.apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(startDate) as Date
|
||||||
|
},
|
||||||
|
calendar2.apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(endDate) as Date
|
||||||
|
},
|
||||||
|
currentMatchday,
|
||||||
|
if (winner is Int) winner else null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package uca.iut.clermont.api.response.competitionResponse
|
||||||
|
|
||||||
|
data class Filters(
|
||||||
|
val client: String
|
||||||
|
)
|
@ -0,0 +1,7 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
data class Filters(
|
||||||
|
val dateFrom: String,
|
||||||
|
val dateTo: String,
|
||||||
|
val permission: String
|
||||||
|
)
|
@ -0,0 +1,23 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.api.response.competitionResponse.CurrentSeason
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
|
||||||
|
class MatchCompetitionResult(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val code: String,
|
||||||
|
val type: String,
|
||||||
|
val emblem: String
|
||||||
|
) {
|
||||||
|
fun toModel(season: CurrentSeason, area: Area) = Competition(
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
code,
|
||||||
|
type,
|
||||||
|
emblem,
|
||||||
|
season.toModel(),
|
||||||
|
area
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
data class MatchResponse(
|
||||||
|
val filters: Filters,
|
||||||
|
val matches: List<MatchResult>,
|
||||||
|
val resultSet: ResultSet
|
||||||
|
)
|
@ -0,0 +1,32 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.api.response.competitionResponse.CurrentSeason
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
import uca.iut.clermont.model.Match
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class MatchResult(
|
||||||
|
val id: Int,
|
||||||
|
val homeTeam: TeamResult,
|
||||||
|
val awayTeam: TeamResult,
|
||||||
|
val utcDate: String,
|
||||||
|
val status: String,
|
||||||
|
val score: ScoreResult,
|
||||||
|
val season: CurrentSeason,
|
||||||
|
val area: Area,
|
||||||
|
val competition: MatchCompetitionResult
|
||||||
|
) {
|
||||||
|
fun toModel() = Match(
|
||||||
|
id,
|
||||||
|
homeTeam.toModel(),
|
||||||
|
awayTeam.toModel(),
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).parse(utcDate) as Date
|
||||||
|
},
|
||||||
|
status,
|
||||||
|
score.toModel(),
|
||||||
|
competition.toModel(season, area)
|
||||||
|
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
data class ResultSet(
|
||||||
|
val competitions: String,
|
||||||
|
val count: Int,
|
||||||
|
val first: String,
|
||||||
|
val last: String,
|
||||||
|
val played: Int
|
||||||
|
)
|
@ -0,0 +1,16 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.model.Score
|
||||||
|
|
||||||
|
data class ScoreResult(
|
||||||
|
val duration: String,
|
||||||
|
val fullTime: Time,
|
||||||
|
val halfTime: Time,
|
||||||
|
val winner: String?
|
||||||
|
){
|
||||||
|
fun toModel() = Score(
|
||||||
|
fullTime.home,
|
||||||
|
fullTime.away,
|
||||||
|
winner
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
import uca.iut.clermont.model.Area
|
||||||
|
import uca.iut.clermont.model.Coach
|
||||||
|
import uca.iut.clermont.model.Contract
|
||||||
|
import uca.iut.clermont.model.Team
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class TeamResult(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val shortName: String,
|
||||||
|
val crest: String
|
||||||
|
) {
|
||||||
|
fun toModel() = Team(
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
shortName,
|
||||||
|
crest,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
Area(1, "", "", "", ""),
|
||||||
|
"",
|
||||||
|
Coach(
|
||||||
|
1, "", "", "", Calendar.getInstance()
|
||||||
|
.apply { set(2022, 12, 28) }, "",
|
||||||
|
Contract(
|
||||||
|
Calendar.getInstance().apply { set(2020, 7, 1) },
|
||||||
|
Calendar.getInstance().apply { set(2024, 7, 1) })
|
||||||
|
),
|
||||||
|
listOf(),
|
||||||
|
listOf()
|
||||||
|
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package uca.iut.clermont.api.response.matchResponse
|
||||||
|
|
||||||
|
data class Time(
|
||||||
|
val away: Int?,
|
||||||
|
val home: Int?
|
||||||
|
)
|
@ -0,0 +1,6 @@
|
|||||||
|
package uca.iut.clermont.api.response.playerResponse
|
||||||
|
|
||||||
|
data class ContractResponse(
|
||||||
|
val start: String,
|
||||||
|
val until: String
|
||||||
|
)
|
@ -0,0 +1,7 @@
|
|||||||
|
package uca.iut.clermont.api.response.playerResponse
|
||||||
|
|
||||||
|
data class CurrentTeamResponse(
|
||||||
|
val id: Int,
|
||||||
|
val name: String,
|
||||||
|
val contract: ContractResponse
|
||||||
|
)
|
@ -0,0 +1,38 @@
|
|||||||
|
package uca.iut.clermont.model
|
||||||
|
|
||||||
|
import uca.iut.clermont.api.response.playerResponse.CurrentTeamResponse
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
data class PlayerResponse(
|
||||||
|
val id: Int,
|
||||||
|
val firstName: String,
|
||||||
|
val lastName: String,
|
||||||
|
val name: String,
|
||||||
|
val dateOfBirth: String,
|
||||||
|
val nationality: String,
|
||||||
|
val position: String,
|
||||||
|
val shirtNumber: Int,
|
||||||
|
val lastUpdated: String,
|
||||||
|
val currentTeam: CurrentTeamResponse
|
||||||
|
) {
|
||||||
|
fun toModel() = Personne(
|
||||||
|
id,
|
||||||
|
firstName,
|
||||||
|
lastName,
|
||||||
|
name,
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(dateOfBirth) as Date
|
||||||
|
},
|
||||||
|
nationality,
|
||||||
|
Contract(
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM", Locale.US).parse(currentTeam.contract.start) as Date
|
||||||
|
},
|
||||||
|
Calendar.getInstance().apply {
|
||||||
|
time = SimpleDateFormat("yyyy-MM", Locale.US).parse(currentTeam.contract.until) as Date
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package uca.iut.clermont.data
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.room.Database
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.room.RoomDatabase
|
||||||
|
import uca.iut.clermont.data.dao.CompetitionDao
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
|
||||||
|
@Database(entities = arrayOf(Competition::class), version = 1)
|
||||||
|
abstract class BDD : RoomDatabase() {
|
||||||
|
|
||||||
|
abstract fun competitionDao(): CompetitionDao
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private var INSTANCE: BDD? = null
|
||||||
|
|
||||||
|
fun getInstance(context: Context) =
|
||||||
|
INSTANCE ?: synchronized(this) {
|
||||||
|
val db = Room.databaseBuilder(
|
||||||
|
context,
|
||||||
|
BDD::class.java,
|
||||||
|
"ScorItDB"
|
||||||
|
).build()
|
||||||
|
INSTANCE = db
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package uca.iut.clermont.data.dao
|
||||||
|
|
||||||
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Delete
|
||||||
|
import androidx.room.Insert
|
||||||
|
import androidx.room.Query
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
interface CompetitionDao {
|
||||||
|
|
||||||
|
@Delete
|
||||||
|
fun deleteCompetition(competition: Competition)
|
||||||
|
|
||||||
|
@Query("SELECT * FROM competition")
|
||||||
|
fun getAllCompetitions(): Flow<List<Competition>>
|
||||||
|
|
||||||
|
@Insert
|
||||||
|
fun insertCompetition(competition: Competition)
|
||||||
|
|
||||||
|
}
|
@ -1,95 +0,0 @@
|
|||||||
package uca.iut.clermont.model
|
|
||||||
|
|
||||||
import AreaManager
|
|
||||||
import CompetitionsManager
|
|
||||||
import DataManager
|
|
||||||
import MatchesManager
|
|
||||||
import PeopleManager
|
|
||||||
import TeamsManager
|
|
||||||
|
|
||||||
class ApiManager : DataManager() {
|
|
||||||
override val areaMgr: AreaManager = ApiAreaManager()
|
|
||||||
override val peopleMgr: PeopleManager = ApiPeopleManager()
|
|
||||||
override val matchesMgr: MatchesManager = ApiMatchesManager()
|
|
||||||
override val competitionsMgr: CompetitionsManager = ApiCompetitionsManager()
|
|
||||||
override val teamsMgr: TeamsManager = ApiTeamsManager()
|
|
||||||
|
|
||||||
class ApiAreaManager : AreaManager {
|
|
||||||
override fun getItemsByName(substring: String): List<Area> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItems(): List<Area> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemById(id: Int): Area? {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApiPeopleManager : PeopleManager {
|
|
||||||
override fun getItemsByName(substring: String): List<Personne> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItems(): List<Personne> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemById(id: Int): Personne? {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApiMatchesManager : MatchesManager {
|
|
||||||
override fun getNbItemsByCompetition(substring: String): Int {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemsByCompetition(substring: String): List<Match> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItems(): List<Match> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemById(id: Int): Match? {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApiCompetitionsManager : CompetitionsManager {
|
|
||||||
override fun getItemsByName(substring: String): List<Competition> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItems(): List<Competition> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemById(id: Int): Competition? {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApiTeamsManager : TeamsManager {
|
|
||||||
override fun getItemsByName(substring: String): List<Team> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItems(): List<Team> {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemById(id: Int): Team? {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +1,16 @@
|
|||||||
package uca.iut.clermont.model
|
package uca.iut.clermont.model
|
||||||
|
|
||||||
|
import androidx.room.ColumnInfo
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
@Entity(tableName = "competitions")
|
||||||
class Competition(
|
class Competition(
|
||||||
val id: Int,
|
@PrimaryKey val id: Int,
|
||||||
val name: String,
|
@ColumnInfo val name: String,
|
||||||
val code: String,
|
@ColumnInfo val code: String,
|
||||||
val type: String,
|
@ColumnInfo val type: String,
|
||||||
val emblem: String,
|
@ColumnInfo val emblem: String,
|
||||||
val currentSeason: Season,
|
@ColumnInfo val currentSeason: Season,
|
||||||
val area: Area
|
val area: Area
|
||||||
)
|
)
|
@ -1,6 +1,6 @@
|
|||||||
package uca.iut.clermont.model
|
package uca.iut.clermont.model
|
||||||
|
|
||||||
interface GenericDataManager<T> {
|
interface GenericDataManager<T> {
|
||||||
fun getItems(): List<T>
|
suspend fun getItems(): List<T>
|
||||||
fun getItemById(id: Int): T?
|
suspend fun getItemById(id: Int): T?
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package uca.iut.clermont.model
|
package uca.iut.clermont.model
|
||||||
|
|
||||||
class Score(
|
class Score(
|
||||||
val home: Int,
|
val home: Int?,
|
||||||
val away: Int,
|
val away: Int?,
|
||||||
val winner: String
|
val winner: String?
|
||||||
)
|
)
|
@ -1,13 +0,0 @@
|
|||||||
package uca.iut.clermont.view
|
|
||||||
|
|
||||||
import com.bumptech.glide.annotation.GlideModule
|
|
||||||
import com.bumptech.glide.module.AppGlideModule
|
|
||||||
|
|
||||||
@GlideModule
|
|
||||||
class SampleGlideModule : AppGlideModule() {
|
|
||||||
|
|
||||||
override fun isManifestParsingEnabled(): Boolean {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,45 @@
|
|||||||
|
package uca.iut.clermont.view.viewModel
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import uca.iut.clermont.api.ApiManager
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
import uca.iut.clermont.model.Match
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class DetailViewModel(
|
||||||
|
//val dao: CompetitionDao
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
|
val manager = ApiManager()
|
||||||
|
val competition = MutableLiveData<Competition?>()
|
||||||
|
val competitionMatches = MutableLiveData<List<Match>>()
|
||||||
|
val nbCompetitionMatches = MutableLiveData<Int>()
|
||||||
|
|
||||||
|
/*fun insertCompetition(competition: Competition) =
|
||||||
|
viewModelScope.launch {
|
||||||
|
dao.insertCompetition(competition)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
fun loadCurrentCompetition(id: Int) = viewModelScope.launch {
|
||||||
|
val result = manager.competitionsMgr.getItemById(id)
|
||||||
|
competition.value = result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun loadMatches(id: Int) = viewModelScope.launch {
|
||||||
|
|
||||||
|
val matchResults = manager.matchesMgr.getItemsByCompetition(id)
|
||||||
|
competitionMatches.value =
|
||||||
|
matchResults.filter { it.status != "TIMED" && it.status != "SCHEDULED" && it.status != "POSTPONED" }
|
||||||
|
.apply { forEach { it.date.add(Calendar.HOUR_OF_DAY, 2) } }
|
||||||
|
.sortedBy { it.competition.name }
|
||||||
|
.sortedByDescending { it.date }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun loadNumberMatches() = viewModelScope.launch {
|
||||||
|
nbCompetitionMatches.value = competitionMatches.value?.size
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package uca.iut.clermont.view.viewModel
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import uca.iut.clermont.api.ApiManager
|
||||||
|
import uca.iut.clermont.model.Competition
|
||||||
|
|
||||||
|
class FavoriteViewModel(
|
||||||
|
//val dao: CompetitionDao
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
|
val manager = ApiManager()
|
||||||
|
val competitions = MutableLiveData<List<Competition>>()
|
||||||
|
|
||||||
|
//fun getAllCompetitions() = dao.getAllCompetitions()
|
||||||
|
//.isLiveDate()
|
||||||
|
|
||||||
|
fun loadCompetitions() = viewModelScope.launch {
|
||||||
|
val result = manager.competitionsMgr.getItems()
|
||||||
|
competitions.value = result
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package uca.iut.clermont.view.viewModel
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import uca.iut.clermont.api.ApiManager
|
||||||
|
import uca.iut.clermont.model.Match
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class HomeViewModel : ViewModel() {
|
||||||
|
|
||||||
|
val manager = ApiManager()
|
||||||
|
val matches = MutableLiveData<List<Match>?>()
|
||||||
|
|
||||||
|
fun loadMatches() = viewModelScope.launch {
|
||||||
|
val matchResults = manager.matchesMgr.getItems()
|
||||||
|
matches.value = matchResults.filter { it.status != "TIMED" }
|
||||||
|
.apply { forEach { it.date.add(Calendar.HOUR_OF_DAY, 2) } }
|
||||||
|
.sortedBy { it.competition.name }
|
||||||
|
.sortedByDescending { it.date }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 8.7 KiB |
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingHorizontal="30dp"
|
||||||
|
android:paddingVertical="30dp"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/exitContainer"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/buttonHome"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:src="@drawable/arrow"
|
||||||
|
android:contentDescription="@string/imageNotFound" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/buttonTextHome"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:fontFamily="@font/mulish_bold"
|
||||||
|
android:text="Exit"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:textColor="@color/title"
|
||||||
|
android:textSize="26dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textFavorites"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:fontFamily="@font/mulish_black"
|
||||||
|
android:text="Favoris"
|
||||||
|
android:textColor="@color/title"
|
||||||
|
android:textSize="30dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/exitContainer" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/listFavorites"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textFavorites" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:paddingHorizontal="30dp">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/hello"
|
||||||
|
android:textColor="@color/title"
|
||||||
|
android:textSize="20sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/buttonFavorite"
|
||||||
|
android:layout_width="34dp"
|
||||||
|
android:layout_height="34dp"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@drawable/icon_like"
|
||||||
|
android:contentDescription="@string/imageNotFound" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/header">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewSubtitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:fontFamily="@font/mulish_black"
|
||||||
|
android:text="Welcome Back!"
|
||||||
|
android:textColor="@color/title"
|
||||||
|
android:textSize="28sp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/header" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/searchBarContainer"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="45dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingHorizontal="16dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="14dp"
|
||||||
|
android:layout_height="14dp"
|
||||||
|
android:contentDescription="search icon"
|
||||||
|
android:src="@drawable/search" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/searchBar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:drawablePadding="8dp"
|
||||||
|
android:hint="Search for a league, team, etc."
|
||||||
|
android:inputType="text"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColorHint="#B0B0B0"
|
||||||
|
android:textSize="15dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="40dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewRecentMatches"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
|
android:text="Recent Matches"
|
||||||
|
android:textColor="@color/title"
|
||||||
|
android:textSize="30dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/searchBarContainer" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/listRecentsMatches"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textViewRecentMatches"
|
||||||
|
tools:itemCount="10" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -1,3 +1,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Scor_It</string>
|
<string name="app_name">Scor_It</string>
|
||||||
|
<string name="noMatches">No games started yet!</string>
|
||||||
|
<string name="imageNotFound">Image not found</string>
|
||||||
|
<string name="hello">Hello</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|