Realized call API 📲
continuous-integration/drone/push Build is failing Details

pull/10/head
Emre KARTAL 2 years ago
parent 6e3d94a354
commit a5ae9880ed

@ -37,10 +37,13 @@ dependencies {
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
//Glide // Glide
implementation 'com.github.bumptech.glide:glide:4.12.0' implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
implementation 'com.caverock:androidsvg:1.4'
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.appcompat:appcompat:1.6.1'

@ -1,4 +1,4 @@
package uca.iut.clermont.model package uca.iut.clermont.api
import AreaManager import AreaManager
import CompetitionsManager import CompetitionsManager
@ -6,6 +6,19 @@ import DataManager
import MatchesManager import MatchesManager
import PeopleManager import PeopleManager
import TeamsManager import TeamsManager
import kotlinx.coroutines.coroutineScope
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import uca.iut.clermont.model.*
import java.text.SimpleDateFormat
import java.util.*
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() { class ApiManager : DataManager() {
override val areaMgr: AreaManager = ApiAreaManager() override val areaMgr: AreaManager = ApiAreaManager()
@ -15,33 +28,38 @@ class ApiManager : DataManager() {
override val teamsMgr: TeamsManager = ApiTeamsManager() override val teamsMgr: TeamsManager = ApiTeamsManager()
class ApiAreaManager : AreaManager { class ApiAreaManager : AreaManager {
override fun getItemsByName(substring: String): List<Area> { override fun getItemsByName(substring: String): List<Area> {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItems(): List<Area> { override suspend fun getItems(): List<Area> {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItemById(id: Int): Area? { override suspend fun getItemById(id: Int): Area? {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
} }
class ApiPeopleManager : PeopleManager { class ApiPeopleManager : PeopleManager {
override fun getItemsByName(substring: String): List<Personne> { override fun getItemsByName(substring: String): List<Personne> {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItems(): List<Personne> { override suspend fun getItems(): List<Personne> {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItemById(id: Int): Personne? { override suspend fun getItemById(id: Int): Personne? = coroutineScope {
TODO("Not yet implemented") val personne = footballApi.getPlayer(id)
personne?.let {
return@coroutineScope personne.toModel()
}
return@coroutineScope null
} }
} }
class ApiMatchesManager : MatchesManager { class ApiMatchesManager : MatchesManager {
@ -53,11 +71,12 @@ class ApiManager : DataManager() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItems(): List<Match> { override suspend fun getItems(): List<Match> = coroutineScope {
TODO("Not yet implemented") val matches = footballApi.getMatches()
return@coroutineScope matches.matches.map { matchResult -> matchResult.toModel() }
} }
override fun getItemById(id: Int): Match? { override suspend fun getItemById(id: Int): Match? {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
@ -68,11 +87,12 @@ class ApiManager : DataManager() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItems(): List<Competition> { override suspend fun getItems(): List<Competition> = coroutineScope {
TODO("Not yet implemented") val competitons = footballApi.getCompetitions()
return@coroutineScope competitons.competitions.map { competitionResult -> competitionResult.toModel() }.sortedBy { it.name }
} }
override fun getItemById(id: Int): Competition? { override suspend fun getItemById(id: Int): Competition? {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
@ -83,11 +103,11 @@ class ApiManager : DataManager() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItems(): List<Team> { override suspend fun getItems(): List<Team> {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getItemById(id: Int): Team? { override suspend fun getItemById(id: Int): Team? {
TODO("Not yet implemented") TODO("Not yet implemented")
} }

@ -0,0 +1,31 @@
package uca.iut.clermont.api
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Path
import uca.iut.clermont.api.response.competitionResponse.CompetitionResponse
import uca.iut.clermont.api.response.matchResponse.MatchResponse
import uca.iut.clermont.model.Area
import uca.iut.clermont.model.PlayerResponse
interface FootballApi {
@GET("areas")
suspend fun getAreas(): List<Area>
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
@GET("persons/{id}")
suspend fun getPlayer(@Path("id") playerId: Int): PlayerResponse
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
@GET("persons")
suspend fun getPlayers(): List<PlayerResponse>
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
@GET("competitions")
suspend fun getCompetitions(): CompetitionResponse
@Headers("X-Auth-Token: 7814ffe5b0314b5291a287d32a178e57")
@GET("matches")
suspend fun getMatches(): MatchResponse
}

@ -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,28 @@
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()
return Season(
id,
calendar.apply {
time = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(startDate)
},
calendar.apply {
time = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(endDate)
},
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)
},
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)
},
nationality,
Contract(
Calendar.getInstance().apply {
time = SimpleDateFormat("yyyy-MM", Locale.US).parse(currentTeam.contract.start)
},
Calendar.getInstance().apply {
time = SimpleDateFormat("yyyy-MM", Locale.US).parse(currentTeam.contract.until)
}
)
)
}

@ -424,9 +424,9 @@ class StubData : DataManager() {
override fun getItemsByName(substring: String) = override fun getItemsByName(substring: String) =
parent.areaList.filter { it.name.contains(substring, ignoreCase = true) } parent.areaList.filter { it.name.contains(substring, ignoreCase = true) }
override fun getItems(): List<Area> = parent.areaList override suspend fun getItems(): List<Area> = parent.areaList
override fun getItemById(id: Int) = parent.areaList.find { it.id == id } override suspend fun getItemById(id: Int) = parent.areaList.find { it.id == id }
} }
@ -434,9 +434,9 @@ class StubData : DataManager() {
override fun getItemsByName(substring: String) = override fun getItemsByName(substring: String) =
parent.peopleList.filter { it.name.contains(substring, ignoreCase = true) } parent.peopleList.filter { it.name.contains(substring, ignoreCase = true) }
override fun getItems() = parent.peopleList override suspend fun getItems() = parent.peopleList
override fun getItemById(id: Int) = parent.peopleList.find { it.id == id } override suspend fun getItemById(id: Int) = parent.peopleList.find { it.id == id }
} }
class StubMatchesManager(private val parent: StubData) : MatchesManager { class StubMatchesManager(private val parent: StubData) : MatchesManager {
@ -446,9 +446,9 @@ class StubData : DataManager() {
override fun getItemsByCompetition(substring: String) = override fun getItemsByCompetition(substring: String) =
parent.matchList.filter { it.competition.name.contains(substring) } parent.matchList.filter { it.competition.name.contains(substring) }
override fun getItems(): List<Match> = parent.matchList override suspend fun getItems(): List<Match> = parent.matchList
override fun getItemById(id: Int) = parent.matchList.find { it.id == id } override suspend fun getItemById(id: Int) = parent.matchList.find { it.id == id }
} }
@ -456,9 +456,9 @@ class StubData : DataManager() {
override fun getItemsByName(substring: String) = override fun getItemsByName(substring: String) =
parent.competitionList.filter { it.name.contains(substring, ignoreCase = true) } parent.competitionList.filter { it.name.contains(substring, ignoreCase = true) }
override fun getItems() = parent.competitionList override suspend fun getItems() = parent.competitionList
override fun getItemById(id: Int) = parent.competitionList.find { it.id == id } override suspend fun getItemById(id: Int) = parent.competitionList.find { it.id == id }
} }
@ -466,9 +466,9 @@ class StubData : DataManager() {
override fun getItemsByName(substring: String) = override fun getItemsByName(substring: String) =
parent.teamList.filter { it.name.contains(substring, ignoreCase = true) } parent.teamList.filter { it.name.contains(substring, ignoreCase = true) }
override fun getItems() = parent.teamList override suspend fun getItems() = parent.teamList
override fun getItemById(id: Int) = parent.teamList.find { it.id == id } override suspend fun getItemById(id: Int) = parent.teamList.find { it.id == id }
} }
} }

@ -6,7 +6,6 @@ abstract class DataManager {
abstract val matchesMgr: MatchesManager abstract val matchesMgr: MatchesManager
abstract val competitionsMgr: CompetitionsManager abstract val competitionsMgr: CompetitionsManager
abstract val teamsMgr: TeamsManager abstract val teamsMgr: TeamsManager
} }
interface AreaManager : GenericDataManager<Area> { interface AreaManager : GenericDataManager<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?
} }

@ -2,7 +2,7 @@ package uca.iut.clermont.model
import java.util.Calendar import java.util.Calendar
abstract class Personne( open class Personne(
val id: Int, val id: Int,
val firstName: String, val firstName: String,
val lastName: String, val lastName: String,

@ -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?
) )

@ -16,6 +16,7 @@ import uca.iut.clermont.R
import uca.iut.clermont.model.Competition import uca.iut.clermont.model.Competition
import uca.iut.clermont.view.adapter.MatchesAdapter import uca.iut.clermont.view.adapter.MatchesAdapter
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.*
class DetailFragment : Fragment() { class DetailFragment : Fragment() {
@ -32,7 +33,7 @@ class DetailFragment : Fragment() {
val id = arguments?.getInt("idItem")!! val id = arguments?.getInt("idItem")!!
competition = (activity as MainActivity).manager.competitionsMgr.getItemById(id)!! //competition = (activity as MainActivity).manager.competitionsMgr.getItemById(id)!!
initializeView(view) initializeView(view)
initRecyclerView(view) initRecyclerView(view)
@ -66,14 +67,14 @@ class DetailFragment : Fragment() {
titleHeader.text = competition.name titleHeader.text = competition.name
var date = competition.currentSeason.endDate var date = competition.currentSeason.endDate
var formatter = SimpleDateFormat("dd-MM-yyyy") var formatter = SimpleDateFormat("dd-MM-yyyy", Locale.US)
var formattedDate = formatter.format(date.time) var formattedDate = formatter.format(date.time)
dateEnd.text = formattedDate dateEnd.text = formattedDate
date = competition.currentSeason.startDate date = competition.currentSeason.startDate
formatter = SimpleDateFormat("dd-MM-yyyy") formatter = SimpleDateFormat("dd-MM-yyyy", Locale.US)
formattedDate = formatter.format(date.time) formattedDate = formatter.format(date.time)
dateStart.text = formattedDate dateStart.text = formattedDate

@ -6,26 +6,37 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.TextView
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import uca.iut.clermont.R import uca.iut.clermont.R
import uca.iut.clermont.model.Competition import uca.iut.clermont.model.Competition
import uca.iut.clermont.view.adapter.FavoritesAdapter import uca.iut.clermont.view.adapter.FavoritesAdapter
import uca.iut.clermont.view.viewModel.FavoriteViewModel
class FavoriteFragment : Fragment(), FavoritesAdapter.OnItemClickListener { class FavoriteFragment : Fragment(), FavoritesAdapter.OnItemClickListener {
private val viewModel: FavoriteViewModel by viewModels<FavoriteViewModel>()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val view = inflater.inflate(R.layout.fragment_favorite, container, false) val view = inflater.inflate(R.layout.fragment_favorite, container, false)
var competitions = (activity as MainActivity).manager.competitionsMgr.getItems() viewModel.competitions.observe(viewLifecycleOwner, Observer { competitions ->
competitions?.let {
initRecyclerView(view, competitions, this)
}
})
viewModel.loadCompetitions()
initRecyclerView(view, competitions, this)
initializeView(view) initializeView(view)
return view return view
@ -36,8 +47,8 @@ class FavoriteFragment : Fragment(), FavoritesAdapter.OnItemClickListener {
} }
private fun initializeView(view: View) { private fun initializeView(view: View) {
var buttonHome = view.findViewById<ImageButton>(R.id.buttonHome) val buttonHome = view.findViewById<ImageButton>(R.id.buttonHome)
var buttonTextFavorite = view.findViewById<Button>(R.id.buttonTextHome) val buttonTextFavorite = view.findViewById<Button>(R.id.buttonTextHome)
buttonHome.setOnClickListener { buttonHome.setOnClickListener {
navigate() navigate()
@ -61,8 +72,8 @@ class FavoriteFragment : Fragment(), FavoritesAdapter.OnItemClickListener {
} }
override fun onItemClick(position: Int) { override fun onItemClick(position: Int) {
var competitions = (activity as MainActivity).manager.competitionsMgr.getItems() /*val competitions = viewModel.competitions
val bundle = bundleOf("idItem" to competitions[position].id) val bundle = bundleOf("idItem" to competitions[position].id)
findNavController().navigate(R.id.action_favoriteFragment_to_detailFragment, bundle) findNavController().navigate(R.id.action_favoriteFragment_to_detailFragment, bundle)*/
} }
} }

@ -5,16 +5,22 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import uca.iut.clermont.R import uca.iut.clermont.R
import uca.iut.clermont.model.Match import uca.iut.clermont.model.Match
import uca.iut.clermont.view.adapter.MatchesAdapter import uca.iut.clermont.view.adapter.MatchesAdapter
import uca.iut.clermont.view.viewModel.HomeViewModel
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
val viewModel: HomeViewModel by viewModels<HomeViewModel>()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -22,7 +28,20 @@ class HomeFragment : Fragment() {
): View? { ): View? {
val view = inflater.inflate(R.layout.fragment_home, container, false) val view = inflater.inflate(R.layout.fragment_home, container, false)
val matches = (activity as MainActivity).manager.matchesMgr.getItems()
val text = view.findViewById<TextView>(R.id.textEmpty)
viewModel.matches.observe(viewLifecycleOwner, Observer { matches ->
matches?.let {
if (it.isNotEmpty()) {
initRecyclerView(view, it)
} else {
text.setText("No games started yet!")
}
}
})
viewModel.loadMatches()
val buttonFavorite = view.findViewById<ImageButton>(R.id.buttonFavorite) val buttonFavorite = view.findViewById<ImageButton>(R.id.buttonFavorite)
@ -30,7 +49,6 @@ class HomeFragment : Fragment() {
findNavController().navigate(R.id.favoriteFragment) findNavController().navigate(R.id.favoriteFragment)
} }
initRecyclerView(view, matches)
return view return view
} }

@ -19,7 +19,6 @@ class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController private lateinit var navController: NavController
@RequiresApi(Build.VERSION_CODES.R) @RequiresApi(Build.VERSION_CODES.R)
private fun hideSystemUI() { private fun hideSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
@ -34,7 +33,6 @@ class MainActivity : AppCompatActivity() {
} }
@RequiresApi(Build.VERSION_CODES.R) @RequiresApi(Build.VERSION_CODES.R)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

@ -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
}
}

@ -11,14 +11,20 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.marginStart import androidx.core.view.marginStart
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import uca.iut.clermont.R import uca.iut.clermont.R
import uca.iut.clermont.view.viewModel.HomeViewModel
class StartFragment : Fragment(), SensorEventListener { class StartFragment : Fragment(), SensorEventListener {
private lateinit var ball: ImageView private lateinit var ball: ImageView
private lateinit var sensorManager: SensorManager private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null private var accelerometer: Sensor? = null

@ -8,6 +8,7 @@ import uca.iut.clermont.R
import uca.iut.clermont.model.Match import uca.iut.clermont.model.Match
import uca.iut.clermont.view.viewHolder.MatchHolder import uca.iut.clermont.view.viewHolder.MatchHolder
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.*
class MatchesAdapter(private val recentMatches: Array<Match>) : class MatchesAdapter(private val recentMatches: Array<Match>) :
RecyclerView.Adapter<MatchHolder>() { RecyclerView.Adapter<MatchHolder>() {
@ -19,15 +20,24 @@ class MatchesAdapter(private val recentMatches: Array<Match>) :
override fun onBindViewHolder(holder: MatchHolder, position: Int) { override fun onBindViewHolder(holder: MatchHolder, position: Int) {
holder.titleFirstTeam.text = recentMatches[position].homeTeam.name holder.titleFirstTeam.text = recentMatches[position].homeTeam.name
holder.titleSecondTeam.text = recentMatches[position].awayTeam.name holder.titleSecondTeam.text = recentMatches[position].awayTeam.name
holder.scoreHomeTeam.text = recentMatches[position].score.home.toString() if (recentMatches[position].score.home != null) {
holder.scoreAwayTeam.text = recentMatches[position].score.away.toString() holder.scoreHomeTeam.text = recentMatches[position].score.home.toString()
} else {
holder.scoreHomeTeam.text = "0"
}
var date = recentMatches[position].date if (recentMatches[position].score.away != null) {
holder.scoreAwayTeam.text = recentMatches[position].score.away.toString()
} else {
holder.scoreAwayTeam.text = "0"
}
var formatter = SimpleDateFormat("dd-MM-yyyy") val date = recentMatches[position].date
var formattedDate = formatter.format(date.time)
holder.dateCompetition.text = recentMatches[position].competition.name + " : " + formattedDate val formatter = SimpleDateFormat("dd-MM-yyyy", Locale.US)
val formattedDate = formatter.format(date.time)
holder.dateCompetition.text = recentMatches[position].competition.name.plus(" : ").plus(formattedDate)
Glide.with(holder.itemView.context) Glide.with(holder.itemView.context)
.load(recentMatches[position].homeTeam.crest) .load(recentMatches[position].homeTeam.crest)

@ -0,0 +1,4 @@
package uca.iut.clermont.view.viewModel
class DetailViewModel {
}

@ -0,0 +1,20 @@
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 : ViewModel() {
val manager = ApiManager()
val competitions = MutableLiveData<List<Competition>>()
fun loadCompetitions() = viewModelScope.launch {
val result = manager.competitionsMgr.getItems()
competitions.value = result
}
}

@ -0,0 +1,20 @@
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
class HomeViewModel : ViewModel() {
val manager = ApiManager()
val matches = MutableLiveData<List<Match>?>()
fun loadMatches() = viewModelScope.launch {
val matchResult = manager.matchesMgr.getItems()
matches.value = matchResult.filter { it.status == "FINISHED" }
}
}

@ -19,6 +19,7 @@
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="64dp" android:layout_height="64dp"
android:layout_marginHorizontal="15dp" android:layout_marginHorizontal="15dp"
android:contentDescription=""
android:layout_marginVertical="10dp" /> android:layout_marginVertical="10dp" />
<TextView <TextView
@ -29,7 +30,7 @@
android:fontFamily="@font/mulish_bold" android:fontFamily="@font/mulish_bold"
android:maxLines="3" android:maxLines="3"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="18dp" /> android:textSize="18sp" />
</LinearLayout> </LinearLayout>

@ -32,7 +32,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
android:orientation="horizontal"> android:orientation="horizontal"
android:baselineAligned="false">
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"

@ -88,13 +88,24 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:text="Recent Matches" android:text="Recent Matches Day"
android:textColor="@color/title" android:textColor="@color/title"
android:textSize="20dp" android:textSize="20dp"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/searchBarContainer" /> app:layout_constraintTop_toBottomOf="@+id/searchBarContainer" />
<TextView
android:id="@+id/textEmpty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/title"
android:textSize="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewRecentMatches" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/listRecentsMatches" android:id="@+id/listRecentsMatches"
android:layout_width="wrap_content" android:layout_width="wrap_content"

@ -27,6 +27,7 @@
<LinearLayout <LinearLayout
android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="70dp" android:layout_marginTop="70dp"

Loading…
Cancel
Save