commit 5a592f3e434a1c9455a076043405cd05479a41f5
Author: Lucàs <86352901+LucasVbr@users.noreply.github.com>
Date: Thu Jan 2 14:44:39 2025 +0100
Initial commit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b86273d
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..d603dda
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..7b3006b
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..cde3e19
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..6d0ee1c
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..74dd639
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..16660f1
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..d843f34
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..650487e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,21 @@
+# Queezer
+
+## Roadmap
+
+- [X] Page d'accueil
+- [X] Page des Paramètres
+ - [X] URL de l'API
+ - [X] Nombre de questions
+ - [X] Mode de jeu
+ - [X] Annuler les modifications
+ - [X] Sauvegarder les modifications
+- [ ] Partie Rapide
+ - [ ] Lancer une musique
+ - [ ] Prendre en compte les réponses
+ - [ ] Afficher les scores
+ - [ ] Boucle de jeu, toutes les 30 secondes change de titre
+- [ ] Partie Personnalisée
+ - [ ] Afficher une page de paramètres
+- [ ] Page des Scores
+
+- [ ] Désactiver la rotation de l'écran
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 0000000..7e97d2a
--- /dev/null
+++ b/app/build.gradle.kts
@@ -0,0 +1,61 @@
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.kotlin.compose)
+}
+
+android {
+ namespace = "fr.univpau.queezer"
+ compileSdk = 34
+
+ defaultConfig {
+ applicationId = "fr.univpau.queezer"
+ minSdk = 29
+ targetSdk = 34
+ versionCode = 1
+ versionName = "1.0"
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = "11"
+ }
+ buildFeatures {
+ compose = true
+ }
+}
+
+dependencies {
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.lifecycle.runtime.ktx)
+ implementation(libs.androidx.activity.compose)
+ implementation(platform(libs.androidx.compose.bom))
+ implementation(libs.androidx.ui)
+ implementation(libs.androidx.ui.graphics)
+ implementation(libs.androidx.ui.tooling.preview)
+ implementation(libs.androidx.material3)
+ implementation(libs.androidx.navigation.compose)
+ implementation(libs.retrofit)
+ implementation(libs.converter.gson)
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.androidx.junit)
+ androidTestImplementation(libs.androidx.espresso.core)
+ androidTestImplementation(platform(libs.androidx.compose.bom))
+ androidTestImplementation(libs.androidx.ui.test.junit4)
+ debugImplementation(libs.androidx.ui.tooling)
+ debugImplementation(libs.androidx.ui.test.manifest)
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/src/androidTest/java/fr/univpau/queezer/ExampleInstrumentedTest.kt b/app/src/androidTest/java/fr/univpau/queezer/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..6eb7681
--- /dev/null
+++ b/app/src/androidTest/java/fr/univpau/queezer/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package fr.univpau.queezer
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("fr.univpau.queezer", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..31b2726
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/fr/univpau/queezer/Fetcher.kt b/app/src/main/java/fr/univpau/queezer/Fetcher.kt
new file mode 100644
index 0000000..52635f0
--- /dev/null
+++ b/app/src/main/java/fr/univpau/queezer/Fetcher.kt
@@ -0,0 +1,61 @@
+package fr.univpau.queezer
+
+import android.util.Log
+import androidx.compose.runtime.MutableState
+import com.google.gson.Gson
+import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+import java.net.HttpURLConnection
+import java.net.URL
+
+data class Track(
+ val title: String,
+ val artist: Artist,
+ val preview: String,
+ val album: Album
+)
+
+data class Artist(
+ val name: String
+)
+
+data class Album(
+ val cover: String
+)
+
+
+suspend fun fetchTracks(apiUrl: String): MutableState> {
+ return withContext(Dispatchers.IO) {
+ try {
+ val url = URL(apiUrl)
+ val connection = url.openConnection() as HttpURLConnection
+ connection.requestMethod = "GET"
+
+ if (connection.responseCode == HttpURLConnection.HTTP_OK) {
+ val response = connection.inputStream.bufferedReader().use { it.readText() }
+ val json = Gson().fromJson(response, JsonObject::class.java)
+ val tracksJson = json["tracks"].asJsonObject["data"].toString()
+ val trackListType = object : TypeToken>() {}.type
+ Gson().fromJson>(tracksJson, trackListType)
+ } else {
+ null
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+}
+
+suspend fun displayTracks(apiUrl: String) {
+ val tracks = fetchTracks(apiUrl)
+
+ tracks?.forEach { track ->
+ Log.d("Track", track.title)
+ Log.d("Artist", track.artist.name)
+ Log.d("Preview", track.preview)
+ Log.d("Album", track.album.cover)
+ }
+}
diff --git a/app/src/main/java/fr/univpau/queezer/GameScreen.kt b/app/src/main/java/fr/univpau/queezer/GameScreen.kt
new file mode 100644
index 0000000..8225865
--- /dev/null
+++ b/app/src/main/java/fr/univpau/queezer/GameScreen.kt
@@ -0,0 +1,148 @@
+package fr.univpau.queezer
+
+import android.os.CountDownTimer
+import android.util.Log
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.painter.Painter
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.rememberNavController
+import androidx.compose.ui.res.painterResource
+import kotlinx.coroutines.runBlocking
+
+@Composable
+fun GameScreen(navController: NavHostController) {
+ val context = LocalContext.current
+ val loadedSettings = loadSettings(context)
+
+ var selectedGameMode by remember { mutableStateOf(loadedSettings.gameMode) }
+ val numberOfTitles by remember { mutableIntStateOf(loadedSettings.numberOfTitles.toInt()) }
+ val playlistUrl by remember { mutableStateOf(loadedSettings.playlistUrl) }
+ var tracks = remember { mutableStateOf(emptyList