diff --git a/corrections/corrigeQuiz/Quiz/.gitignore b/corrections/Ouafff_finP1/.gitignore
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/.gitignore
rename to corrections/Ouafff_finP1/.gitignore
diff --git a/corrections/corrigeQuiz/Quiz/app/.gitignore b/corrections/Ouafff_finP1/app/.gitignore
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/.gitignore
rename to corrections/Ouafff_finP1/app/.gitignore
diff --git a/corrections/Ouafff_finP1/app/build.gradle b/corrections/Ouafff_finP1/app/build.gradle
new file mode 100644
index 0000000..3608d3c
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/build.gradle
@@ -0,0 +1,56 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+ id 'kotlin-kapt'
+}
+
+android {
+ namespace 'fr.iut.ouafff'
+ compileSdk 33
+
+ defaultConfig {
+ applicationId "fr.iut.ouafff"
+ minSdk 16
+ targetSdk 33
+ versionCode 1
+ versionName "1.0"
+ // Permet de spécifier le fichier dans lequel stocker le schéma de la BdD
+ kapt {
+ arguments {
+ arg("room.schemaLocation", "$projectDir/schemas".toString())
+ }
+ }
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.9.0'
+ implementation 'androidx.appcompat:appcompat:1.5.1'
+ implementation 'com.google.android.material:material:1.7.0'
+ implementation "androidx.fragment:fragment-ktx:1.5.5"
+// implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+// implementation 'androidx.recyclerview:recyclerview:1.2.1'
+// implementation "androidx.cardview:cardview:1.0.0"
+
+
+ // Room ORM
+ def room_version = "2.4.3"
+ implementation "androidx.room:room-runtime:$room_version"
+ kapt "androidx.room:room-compiler:$room_version"
+}
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/app/proguard-rules.pro b/corrections/Ouafff_finP1/app/proguard-rules.pro
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/proguard-rules.pro
rename to corrections/Ouafff_finP1/app/proguard-rules.pro
diff --git a/corrections/Ouafff_finP1/app/schemas/fr.iut.ouafff.data.persistance.DogDatabase/1.json b/corrections/Ouafff_finP1/app/schemas/fr.iut.ouafff.data.persistance.DogDatabase/1.json
new file mode 100644
index 0000000..f8890ec
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/schemas/fr.iut.ouafff.data.persistance.DogDatabase/1.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 1,
+ "identityHash": "ec7718f7c93df353ddf73a877a18b155",
+ "entities": [
+ {
+ "tableName": "dogs",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `breed` TEXT NOT NULL, `gender` INTEGER NOT NULL, `weight` REAL NOT NULL, `aggressiveness` INTEGER NOT NULL, `owner` TEXT, `admissionDate` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
+ "fields": [
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "breed",
+ "columnName": "breed",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "gender",
+ "columnName": "gender",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "weight",
+ "columnName": "weight",
+ "affinity": "REAL",
+ "notNull": true
+ },
+ {
+ "fieldPath": "aggressiveness",
+ "columnName": "aggressiveness",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "owner",
+ "columnName": "owner",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "admissionDate",
+ "columnName": "admissionDate",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ec7718f7c93df353ddf73a877a18b155')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/androidTest/java/fr/iut/ouafff/ExampleInstrumentedTest.kt b/corrections/Ouafff_finP1/app/src/androidTest/java/fr/iut/ouafff/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..deeeb0a
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/androidTest/java/fr/iut/ouafff/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package fr.iut.ouafff
+
+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.iut.ouafff", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/AndroidManifest.xml b/corrections/Ouafff_finP1/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8b6f9c7
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/AndroidManifest.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/DogApplication.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/DogApplication.kt
new file mode 100644
index 0000000..ba10fe5
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/DogApplication.kt
@@ -0,0 +1,11 @@
+package fr.iut.ouafff
+
+import android.app.Application
+import fr.iut.ouafff.data.persistance.DogDatabase
+
+class DogApplication : Application() {
+ override fun onCreate() {
+ super.onCreate()
+ DogDatabase.initialize(this)
+ }
+}
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/Dog.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/Dog.kt
new file mode 100644
index 0000000..46b1ef6
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/Dog.kt
@@ -0,0 +1,24 @@
+package fr.iut.ouafff.data
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+import java.util.Date
+
+const val NEW_DOG_ID = 0L
+
+@Entity(tableName = "dogs")
+data class Dog(var name: String = "",
+ var breed: String = "",
+ var gender: Gender = Gender.UNKNOWN,
+ var weight: Float = 0f,
+ var aggressiveness: Int = 0,
+ var owner: String? = null,
+ var admissionDate: Date? = null,
+ @PrimaryKey(autoGenerate = true) val id: Long = NEW_DOG_ID) {
+
+ enum class Gender {
+ UNKNOWN,
+ MALE,
+ FEMALE
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDao.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDao.kt
new file mode 100644
index 0000000..36d9581
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDao.kt
@@ -0,0 +1,27 @@
+package fr.iut.ouafff.data.persistance
+
+import androidx.room.*
+import androidx.room.OnConflictStrategy.REPLACE
+import fr.iut.ouafff.data.Dog
+
+@Dao
+interface DogDao {
+
+ @Query("SELECT * FROM dogs")
+ fun getAll(): List
+
+ @Query("SELECT * FROM dogs WHERE id = :id")
+ fun findById(id: Long): Dog
+
+ @Insert(onConflict = REPLACE)
+ fun insert(dog: Dog)
+
+ @Insert
+ fun insertAll(vararg dogs: Dog)
+
+ @Update(onConflict = REPLACE)
+ fun update(dog: Dog)
+
+ @Delete
+ fun delete(dog: Dog)
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDatabase.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDatabase.kt
new file mode 100644
index 0000000..e069aec
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/DogDatabase.kt
@@ -0,0 +1,69 @@
+package fr.iut.ouafff.data.persistance
+
+import android.app.Application
+import androidx.room.Database
+import androidx.room.Room
+import androidx.room.RoomDatabase
+import androidx.room.TypeConverters
+import androidx.sqlite.db.SupportSQLiteDatabase
+import fr.iut.ouafff.DogApplication
+import fr.iut.ouafff.data.Dog
+import fr.iut.ouafff.data.persistance.converter.DateToLongConverter
+import fr.iut.ouafff.data.persistance.converter.GenderToIntConverter
+import java.util.Date
+
+private const val DOG_DB_FILENAME = "dogs.db"
+
+@Database(entities = [Dog::class], version = 1)
+@TypeConverters(GenderToIntConverter::class, DateToLongConverter::class)
+abstract class DogDatabase : RoomDatabase() {
+
+ abstract fun dogDAO(): DogDao
+
+ companion object {
+ private lateinit var application: Application
+
+ @Volatile
+ private var instance: DogDatabase? = null
+
+ fun getInstance(): DogDatabase {
+ if (::application.isInitialized) {
+ if (instance == null)
+ synchronized(this) {
+ if (instance == null) {
+ instance = Room.databaseBuilder(
+ application.applicationContext,
+ DogDatabase::class.java,
+ DOG_DB_FILENAME
+ )
+ .allowMainThreadQueries()
+ .build()
+
+ instance?.dogDAO()?.let {
+ if (it.getAll().isEmpty()) emptyDatabaseStub(it)
+ }
+ }
+ }
+ return instance!!
+ } else
+ throw RuntimeException("the database must be first initialized")
+ }
+
+
+ @Synchronized
+ fun initialize(app: DogApplication) {
+ if (::application.isInitialized)
+ throw RuntimeException("the database must not be initialized twice")
+
+ application = app
+ }
+
+
+ private fun emptyDatabaseStub(dogDAO: DogDao) = with(dogDAO) {
+ insert(Dog("Lassie", "Collet", Dog.Gender.FEMALE, 22.5f, 0))
+ insert(Dog("Snoopy", "Beagle", Dog.Gender.MALE, 6f, 2, "Charlie Brown"))
+ insert(Dog("Robert", "Caniche", Dog.Gender.MALE, 5f, 1))
+ insert(Dog("Titan", "Dogue", Dog.Gender.MALE, 32f, 3, "John Doe", Date(22), 4))
+ }
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/DateToLongConverter.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/DateToLongConverter.kt
new file mode 100644
index 0000000..b9f888a
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/DateToLongConverter.kt
@@ -0,0 +1,12 @@
+package fr.iut.ouafff.data.persistance.converter
+
+import androidx.room.TypeConverter
+import java.util.Date
+
+class DateToLongConverter {
+ @TypeConverter
+ fun fromTimestamp(timestamp: Long?) = timestamp?.let { Date(it) }
+
+ @TypeConverter
+ fun toTimestamp(date: Date?) = date?.time
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/GenderToIntConverter.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/GenderToIntConverter.kt
new file mode 100644
index 0000000..1599761
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/data/persistance/converter/GenderToIntConverter.kt
@@ -0,0 +1,14 @@
+package fr.iut.ouafff.data.persistance.converter
+
+import androidx.room.TypeConverter
+import fr.iut.ouafff.data.Dog.Gender
+
+fun Int.toGender() = enumValues()[this]
+
+class GenderToIntConverter {
+ @TypeConverter
+ fun fromInt(ordinal: Int) = ordinal.toGender()
+
+ @TypeConverter
+ fun toOrdinal(gender: Gender) = gender.ordinal
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogActivity.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogActivity.kt
new file mode 100644
index 0000000..721b1f2
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogActivity.kt
@@ -0,0 +1,37 @@
+package fr.iut.ouafff.ui.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import fr.iut.ouafff.R
+import fr.iut.ouafff.data.NEW_DOG_ID
+import fr.iut.ouafff.ui.fragment.DogFragment
+
+class DogActivity : SimpleFragmentActivity(), DogFragment.OnInteractionListener {
+
+ companion object {
+ private const val EXTRA_DOG_ID = "fr.iut.ouafff.extra_dog_id"
+
+ fun getIntent(context: Context, dogId: Long) =
+ Intent(context, DogActivity::class.java).apply {
+ putExtra(EXTRA_DOG_ID, dogId)
+ }
+ }
+
+ private var dogId = NEW_DOG_ID
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ dogId = intent.getLongExtra(EXTRA_DOG_ID, NEW_DOG_ID)
+ super.onCreate(savedInstanceState)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ }
+
+
+ override fun createFragment() = DogFragment.newInstance(dogId)
+ override fun getLayoutResId() = R.layout.toolbar_activity
+
+ override fun onDogSaved() = finish()
+
+ override fun onDogDeleted() = finish()
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogListActivity.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogListActivity.kt
new file mode 100644
index 0000000..388517b
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogListActivity.kt
@@ -0,0 +1,77 @@
+package fr.iut.ouafff.ui.activity
+
+import android.os.Bundle
+import android.widget.FrameLayout
+import fr.iut.ouafff.R
+import fr.iut.ouafff.data.NEW_DOG_ID
+import fr.iut.ouafff.ui.fragment.DogFragment
+import fr.iut.ouafff.ui.fragment.DogListFragment
+
+class DogListActivity : SimpleFragmentActivity(),
+ DogListFragment.OnInteractionListener, DogFragment.OnInteractionListener {
+
+ private var isTwoPane: Boolean = false
+ private lateinit var masterFragment: DogListFragment
+
+ override fun createFragment() = DogListFragment().also { masterFragment = it }
+ override fun getLayoutResId() = R.layout.toolbar_md_activity
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ supportActionBar?.setIcon(R.mipmap.ic_launcher)
+
+ isTwoPane = findViewById(R.id.container_fragment_detail) != null
+ if (savedInstanceState != null)
+ masterFragment = supportFragmentManager.findFragmentById(R.id.container_fragment) as DogListFragment
+
+ if (!isTwoPane) {
+ removeDisplayedFragment()
+ }
+ }
+
+
+ override fun onDogSelected(dogId: Long) {
+ if (isTwoPane) {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.container_fragment_detail, DogFragment.newInstance(dogId))
+ .commit()
+ } else {
+ // Pour la version sans le pager, remplacer DogPagerActivity par DogActivity
+ startActivity(DogPagerActivity.getIntent(this, dogId))
+ }
+ }
+
+
+ override fun onAddNewDog() = startActivity(DogActivity.getIntent(this, NEW_DOG_ID))
+
+
+ override fun onDogSaved() {
+ if (isTwoPane) {
+ masterFragment.updateList()
+ }
+ }
+
+
+ private fun removeDisplayedFragment() {
+ supportFragmentManager.findFragmentById(R.id.container_fragment_detail)?.let {
+ supportFragmentManager.beginTransaction().remove(it).commit()
+ }
+ }
+
+
+ override fun onDogDeleted() {
+ if (isTwoPane) {
+ removeDisplayedFragment()
+ } else
+ finish()
+ }
+
+
+ override fun onDogSwiped() {
+ if (isTwoPane) {
+ removeDisplayedFragment()
+ }
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogPagerActivity.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogPagerActivity.kt
new file mode 100644
index 0000000..49b2a31
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/DogPagerActivity.kt
@@ -0,0 +1,55 @@
+package fr.iut.ouafff.ui.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.LinearLayout
+import androidx.appcompat.app.AppCompatActivity
+import androidx.viewpager2.widget.ViewPager2
+import fr.iut.ouafff.R
+import fr.iut.ouafff.ui.fragment.DogFragment
+import fr.iut.ouafff.ui.utils.DogPagerAdapter
+
+
+class DogPagerActivity : AppCompatActivity(), DogFragment.OnInteractionListener {
+
+ companion object {
+ private const val EXTRA_DOG_ID = "fr.iut.ouafff.extra_dog_id"
+
+ fun getIntent(context: Context, dogId: Long) =
+ Intent(context, DogPagerActivity::class.java).apply {
+ putExtra(EXTRA_DOG_ID, dogId)
+ }
+ }
+
+ private lateinit var viewPager: ViewPager2
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_pager)
+
+ setSupportActionBar(findViewById(R.id.toolbar_activity))
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+ viewPager = ViewPager2(this)
+ viewPager.id = R.id.view_pager
+ findViewById(R.id.pager_layout).addView(viewPager)
+
+ val adapter = DogPagerAdapter(this)
+ viewPager.adapter = adapter
+ val initialPosition = adapter.positionFromId(intent.getLongExtra(EXTRA_DOG_ID, 1))
+ viewPager.currentItem = initialPosition
+ supportActionBar?.subtitle = getString(R.string.dogs_subtitle_format, initialPosition + 1)
+
+ viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+
+ override fun onPageSelected(position: Int) {
+ supportActionBar?.subtitle = getString(R.string.dogs_subtitle_format, position + 1)
+ }
+
+ })
+ }
+
+ override fun onDogSaved() = finish()
+ override fun onDogDeleted() = finish()
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/SimpleFragmentActivity.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/SimpleFragmentActivity.kt
new file mode 100644
index 0000000..8629590
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/activity/SimpleFragmentActivity.kt
@@ -0,0 +1,43 @@
+package fr.iut.ouafff.ui.activity
+
+import android.os.Bundle
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.Fragment
+import fr.iut.ouafff.R
+
+/**
+ * A base class to manage an activity hosting one fragment
+ * and an action bar.
+ */
+abstract class SimpleFragmentActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(getLayoutResId())
+
+ setSupportActionBar(findViewById(R.id.toolbar_activity))
+
+ if (supportFragmentManager.findFragmentById(R.id.container_fragment) == null) {
+ supportFragmentManager.beginTransaction()
+ .add(R.id.container_fragment, createFragment())
+ .commit()
+ }
+ }
+
+
+ /**
+ * Creates an instance of the hosted fragment
+ */
+ protected abstract fun createFragment(): Fragment
+
+
+ /**
+ * Returns the resource id of the layout used for this activity.
+ * It must contain a view whose id is `@+id/container_fragment`
+ * to inject the hosted fragment's view
+ */
+ @LayoutRes
+ protected abstract fun getLayoutResId(): Int
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/dialog/DatePickerFragment.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/dialog/DatePickerFragment.kt
new file mode 100644
index 0000000..2258eb3
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/dialog/DatePickerFragment.kt
@@ -0,0 +1,60 @@
+package fr.iut.ouafff.ui.dialog
+
+import android.app.Dialog
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.widget.DatePicker
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatDialogFragment
+import androidx.core.os.bundleOf
+import androidx.fragment.app.setFragmentResult
+import fr.iut.ouafff.R
+import java.util.*
+
+class DatePickerFragment : AppCompatDialogFragment() {
+ companion object {
+ const val EXTRA_YEAR = "fr.iut.ouafff.year"
+ const val EXTRA_MONTH = "fr.iut.ouafff.month"
+ const val EXTRA_DAY = "fr.iut.ouafff.day"
+
+ private const val ARG_DATE = "date"
+
+ fun newInstance(requestKey: String, date: Date? = null) = DatePickerFragment().apply {
+ this.requestKey = requestKey
+ if (date != null)
+ arguments = Bundle().apply {
+ putLong(ARG_DATE, date.time)
+ }
+ }
+ }
+
+ private lateinit var requestKey: String
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val view = LayoutInflater.from(activity).inflate(R.layout.dialog_date, null)
+
+ val calendar = Calendar.getInstance()
+ calendar.timeInMillis = arguments?.getLong(ARG_DATE) ?: Date().time
+ val year = calendar.get(Calendar.YEAR)
+ val month = calendar.get(Calendar.MONTH)
+ val day = calendar.get(Calendar.DAY_OF_MONTH)
+
+ val pickerDate = view as DatePicker
+ pickerDate.init(year, month, day, null)
+
+ return AlertDialog.Builder(view.context, R.style.NarrowDialog)
+ .setView(view)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ setFragmentResult(
+ requestKey,
+ bundleOf(
+ EXTRA_YEAR to pickerDate.year,
+ EXTRA_MONTH to pickerDate.month,
+ EXTRA_DAY to pickerDate.dayOfMonth
+ )
+ )
+ }
+ .setNegativeButton(android.R.string.cancel, null)
+ .create()
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogFragment.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogFragment.kt
new file mode 100644
index 0000000..a7ad39b
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogFragment.kt
@@ -0,0 +1,247 @@
+package fr.iut.ouafff.ui.fragment
+
+import android.content.Context
+import android.os.Bundle
+import android.provider.ContactsContract
+import android.text.format.DateFormat
+import android.view.*
+import android.widget.EditText
+import android.widget.RatingBar
+import android.widget.Spinner
+import android.widget.TextView
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.activity.result.launch
+import androidx.appcompat.app.AlertDialog
+import androidx.core.os.bundleOf
+import androidx.core.view.MenuProvider
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.setFragmentResultListener
+import androidx.lifecycle.Lifecycle
+import fr.iut.ouafff.R
+import fr.iut.ouafff.data.Dog
+import fr.iut.ouafff.data.NEW_DOG_ID
+import fr.iut.ouafff.data.persistance.DogDatabase
+import fr.iut.ouafff.data.persistance.converter.toGender
+import fr.iut.ouafff.ui.dialog.DatePickerFragment
+import java.util.Date
+import java.util.Calendar
+
+class DogFragment : Fragment() {
+
+ companion object {
+ private const val EXTRA_DOG_ID = "fr.iut.ouafff.extra_dogid"
+ private const val REQUEST_DATE = "DateRequest"
+ private const val DIALOG_DATE = "DateDialog"
+
+ fun newInstance(dogId: Long) = DogFragment().apply {
+ arguments = bundleOf(EXTRA_DOG_ID to dogId)
+ }
+ }
+
+ private lateinit var dog: Dog
+ private var dogId: Long = NEW_DOG_ID
+
+ private lateinit var editDogName: EditText
+ private lateinit var editDogBreed: EditText
+ private lateinit var spinnerGender: Spinner
+ private lateinit var editDogWeight: EditText
+ private lateinit var ratingbarAggressiveness: RatingBar
+ private lateinit var textDogOwner: TextView
+ private lateinit var textDogAdmissionDate: TextView
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setFragmentResultListener(REQUEST_DATE, this::onAdmissionDateChanged)
+
+ dogId = savedInstanceState?.getLong(EXTRA_DOG_ID) ?: arguments?.getLong(EXTRA_DOG_ID)
+ ?: NEW_DOG_ID
+
+ dog = if (dogId == NEW_DOG_ID) {
+ requireActivity().setTitle(R.string.title_add_dog)
+ Dog()
+ } else {
+ DogDatabase.getInstance().dogDAO().findById(dogId)
+ }
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ outState.putLong(EXTRA_DOG_ID, dogId)
+ }
+
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_dog, container, false)
+ editDogName = view.findViewById(R.id.edit_dog_name)
+ editDogBreed = view.findViewById(R.id.edit_dog_breed)
+ spinnerGender = view.findViewById(R.id.spinner_gender)
+ editDogWeight = view.findViewById(R.id.edit_dog_weight)
+ ratingbarAggressiveness = view.findViewById(R.id.ratingbar_aggressiveness)
+ textDogOwner = view.findViewById(R.id.text_dog_owner)
+ textDogAdmissionDate = view.findViewById(R.id.text_dog_admission_date)
+
+ updateViewFromCurrentDog()
+
+ textDogOwner.setOnClickListener {
+ pickOwner.launch()
+ }
+
+ textDogAdmissionDate.setOnClickListener {
+ val dateDialog = DatePickerFragment.newInstance(REQUEST_DATE, dog.admissionDate)
+ dateDialog.show(parentFragmentManager, DIALOG_DATE)
+ }
+
+ return view
+ }
+
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ setupMenu()
+ }
+
+
+ private fun setupMenu() {
+ requireActivity().addMenuProvider(object : MenuProvider {
+ override fun onPrepareMenu(menu: Menu) {
+ super.onPrepareMenu(menu)
+ if (dogId == NEW_DOG_ID) {
+ menu.findItem(R.id.action_delete)?.isVisible = false
+ }
+ }
+
+ override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+ menuInflater.inflate(R.menu.fragment_dog, menu)
+ }
+
+ override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+ return when (menuItem.itemId) {
+ R.id.action_save -> {
+ saveDog()
+ true
+ }
+ R.id.action_delete -> {
+ deleteDog()
+ true
+ }
+ else -> false
+ }
+ }
+
+ }, viewLifecycleOwner, Lifecycle.State.RESUMED)
+ }
+
+
+ private fun updateViewFromCurrentDog() {
+ editDogName.setText(dog.name)
+ editDogBreed.setText(dog.breed)
+ spinnerGender.setSelection(dog.gender.ordinal)
+ editDogWeight.setText(dog.weight.toString())
+ ratingbarAggressiveness.rating = dog.aggressiveness.toFloat()
+ textDogOwner.text = dog.owner
+ dog.admissionDate?.let {
+ textDogAdmissionDate.text = DateFormat.getDateFormat(activity).format(it)
+ }
+ }
+
+
+ private fun saveDog() {
+ val dogName = editDogName.text.trim()
+ val dogWeight = editDogWeight.text.trim()
+ if (dogName.isEmpty() || dogWeight.isEmpty() || dogWeight == ".") {
+ AlertDialog.Builder(requireActivity())
+ .setTitle(R.string.create_dog_error_dialog_title)
+ .setMessage(R.string.create_dog_error_message)
+ .setNeutralButton(android.R.string.ok, null)
+ .show()
+ return
+ }
+
+ dog.name = dogName.toString()
+ dog.breed = editDogBreed.text.toString()
+ dog.gender = spinnerGender.selectedItemPosition.toGender()
+ dog.weight = dogWeight.toString().toFloat()
+ dog.aggressiveness = ratingbarAggressiveness.rating.toInt()
+
+ if (dog.id == NEW_DOG_ID)
+ DogDatabase.getInstance().dogDAO().insert(dog)
+ else
+ DogDatabase.getInstance().dogDAO().update(dog)
+
+ listener?.onDogSaved()
+ }
+
+
+ private fun deleteDog() {
+ if (dogId != NEW_DOG_ID) {
+ DogDatabase.getInstance().dogDAO().delete(dog)
+ listener?.onDogDeleted()
+ }
+ }
+
+
+ private fun onAdmissionDateChanged(requestKey: String, bundle: Bundle) {
+ if (requestKey == REQUEST_DATE) {
+ val year = bundle.getInt(DatePickerFragment.EXTRA_YEAR)
+ val month = bundle.getInt(DatePickerFragment.EXTRA_MONTH)
+ val day = bundle.getInt(DatePickerFragment.EXTRA_DAY)
+
+ val cal = Calendar.getInstance()
+ cal.set(year, month, day)
+ dog.admissionDate = Date().apply { time = cal.timeInMillis }
+ textDogAdmissionDate.text = dog.admissionDate?.let {
+ DateFormat.getDateFormat(activity).format(it)
+ } ?: ""
+ }
+ }
+
+
+ private val pickOwner =
+ registerForActivityResult(ActivityResultContracts.PickContact()) { contactUri ->
+ if (contactUri != null) {
+ val queryFields = arrayOf(ContactsContract.Contacts.DISPLAY_NAME)
+ val contactCursor = activity?.contentResolver?.query(
+ contactUri, queryFields, null,
+ null, null
+ )
+
+ contactCursor?.let {
+ if (it.count != 0) {
+ it.moveToFirst()
+ dog.owner = it.getString(0)
+ }
+ it.close()
+ }
+ textDogOwner.text = dog.owner
+ }
+ }
+
+
+ interface OnInteractionListener {
+ fun onDogSaved()
+ fun onDogDeleted()
+ }
+
+ private var listener: OnInteractionListener? = null
+
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ if (context is OnInteractionListener) {
+ listener = context
+ } else {
+ throw RuntimeException("$context must implement OnInteractionListener")
+ }
+ }
+
+
+ override fun onDetach() {
+ super.onDetach()
+ listener = null
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogListFragment.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogListFragment.kt
new file mode 100644
index 0000000..deae0df
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/fragment/DogListFragment.kt
@@ -0,0 +1,147 @@
+package fr.iut.ouafff.ui.fragment
+
+import android.content.Context
+import android.os.Bundle
+import android.view.*
+import androidx.constraintlayout.widget.Group
+import androidx.core.view.MenuProvider
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Lifecycle
+import androidx.recyclerview.widget.ItemTouchHelper
+import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.floatingactionbutton.FloatingActionButton
+import fr.iut.ouafff.R
+import fr.iut.ouafff.data.Dog
+import fr.iut.ouafff.data.persistance.DogDatabase
+import fr.iut.ouafff.ui.utils.DogRecyclerViewAdapter
+
+class DogListFragment : Fragment(), DogRecyclerViewAdapter.Callbacks {
+
+ private var dogList = DogDatabase.getInstance().dogDAO().getAll()
+ private val dogListAdapter =
+ DogRecyclerViewAdapter(dogList, this)
+
+ private lateinit var groupEmptyView: Group
+
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_list_dog, container, false)
+ groupEmptyView = view.findViewById(R.id.group_empty_view)
+ groupEmptyView.visibility = if (dogList.isEmpty()) View.VISIBLE else View.GONE
+ val recyclerview = view.findViewById(R.id.recycler_view)
+ recyclerview.adapter = dogListAdapter
+ ItemTouchHelper(DogListItemTouchHelper()).attachToRecyclerView(recyclerview)
+ view.findViewById(R.id.fab_add_dog).setOnClickListener { addNewDog() }
+ return view
+ }
+
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ setupMenu()
+ }
+
+
+ private fun setupMenu() {
+ requireActivity().addMenuProvider(object : MenuProvider {
+ override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
+ menuInflater.inflate(R.menu.fragment_list_dog, menu)
+ }
+
+ override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
+ return when (menuItem.itemId) {
+ R.id.menu_item_new_dog -> {
+ addNewDog()
+ true
+ }
+ else -> false
+ }
+ }
+ }, viewLifecycleOwner, Lifecycle.State.RESUMED)
+ }
+
+
+ override fun onResume() {
+ super.onResume()
+ updateList()
+ }
+
+
+ fun updateList() {
+ dogList = DogDatabase.getInstance().dogDAO().getAll()
+ dogListAdapter.updateList(dogList)
+ groupEmptyView.visibility = if (dogList.isEmpty()) View.VISIBLE else View.GONE
+ }
+
+
+ private fun addNewDog() {
+ listener?.onAddNewDog()
+ }
+
+
+ override fun onDogSelected(dogId: Long) {
+ listener?.onDogSelected(dogId)
+ }
+
+
+ private inner class DogListItemTouchHelper : ItemTouchHelper.Callback() {
+ override fun isLongPressDragEnabled() = false
+
+ override fun getMovementFlags(
+ recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder
+ ) =
+ makeMovementFlags(
+ ItemTouchHelper.UP or ItemTouchHelper.DOWN,
+ ItemTouchHelper.START or ItemTouchHelper.END
+ )
+
+ override fun onMove(
+ recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder,
+ target: RecyclerView.ViewHolder
+ ) = false
+
+ override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
+ (viewHolder as DogRecyclerViewAdapter.DogViewHolder).dog?.also {
+ removeDog(it)
+ listener?.onDogSwiped()
+ }
+ }
+ }
+
+
+ private fun removeDog(dog: Dog) {
+ val dao = DogDatabase.getInstance().dogDAO()
+ dao.delete(dog)
+ updateList()
+ }
+
+
+ interface OnInteractionListener {
+ fun onDogSelected(dogId: Long)
+ fun onAddNewDog()
+ fun onDogSwiped()
+ }
+
+ private var listener: OnInteractionListener? = null
+
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ if (context is OnInteractionListener) {
+ listener = context
+ } else {
+ throw RuntimeException("$context must implement OnInteractionListener")
+ }
+ }
+
+
+ override fun onDetach() {
+ super.onDetach()
+ listener = null
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogPagerAdapter.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogPagerAdapter.kt
new file mode 100644
index 0000000..390078e
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogPagerAdapter.kt
@@ -0,0 +1,16 @@
+package fr.iut.ouafff.ui.utils
+
+import androidx.fragment.app.FragmentActivity
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import fr.iut.ouafff.data.persistance.DogDatabase
+import fr.iut.ouafff.ui.fragment.DogFragment
+
+class DogPagerAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
+ private var dogList = DogDatabase.getInstance().dogDAO().getAll()
+
+ override fun getItemCount() = dogList.size
+
+ override fun createFragment(position: Int) = DogFragment.newInstance(dogList[position].id)
+
+ fun positionFromId(dogId: Long) = dogList.indexOfFirst { it.id == dogId }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogRecyclerViewAdapter.kt b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogRecyclerViewAdapter.kt
new file mode 100644
index 0000000..ecd716b
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/java/fr/iut/ouafff/ui/utils/DogRecyclerViewAdapter.kt
@@ -0,0 +1,70 @@
+package fr.iut.ouafff.ui.utils
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import fr.iut.ouafff.R
+import fr.iut.ouafff.data.Dog
+
+class DogRecyclerViewAdapter(private var dogList: List, private val listener: Callbacks) :
+ RecyclerView.Adapter() {
+
+ override fun getItemCount() = dogList.size
+
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+ DogViewHolder(
+ LayoutInflater.from(parent.context).inflate(
+ R.layout.item_list_dog,
+ parent,
+ false
+ ), listener
+ )
+
+
+ override fun onBindViewHolder(holder: DogViewHolder, position: Int) =
+ holder.bind(dogList[position])
+
+
+ class DogViewHolder(itemView: View, listener: Callbacks) :
+ RecyclerView.ViewHolder(itemView) {
+
+ private val viewName = itemView.findViewById(R.id.view_name)
+ private val viewBreed = itemView.findViewById(R.id.view_breed)
+ private val cardviewDog = itemView.findViewById(R.id.cardview_dog)
+
+ var dog: Dog? = null
+ private set
+
+ init {
+ itemView.setOnClickListener { dog?.let { listener.onDogSelected(it.id) } }
+ }
+
+ fun bind(dog: Dog) {
+ this.dog = dog
+ viewName.text = dog.name
+ val context = itemView.context
+ val breed = dog.breed
+ viewBreed.text =
+ breed.ifEmpty { context.getString(R.string.unknown_breed) }
+ val color =
+ context.resources.getIntArray(R.array.aggressiveness_color)[dog.aggressiveness]
+ cardviewDog.setCardBackgroundColor(color)
+ }
+
+ }
+
+
+ fun updateList(dogList: List) {
+ this.dogList = dogList
+ notifyDataSetChanged()
+ }
+
+
+ interface Callbacks {
+ fun onDogSelected(dogId: Long)
+ }
+}
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add.xml
new file mode 100644
index 0000000..a07919d
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add_pet.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add_pet.xml
new file mode 100644
index 0000000..b6fb20c
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_add_pet.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_delete.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_delete.xml
new file mode 100644
index 0000000..f9213d2
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_delete.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_done.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_done.xml
new file mode 100644
index 0000000..99caef9
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_done.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_empty_shelter.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_empty_shelter.xml
new file mode 100644
index 0000000..32841b3
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_empty_shelter.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_launcher_foreground.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..7ead9c8
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_person.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_person.xml
new file mode 100644
index 0000000..fbe0080
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_person.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_time.xml b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_time.xml
new file mode 100644
index 0000000..da57663
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/drawable/ic_time.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout-land/toolbar_md_activity_content.xml b/corrections/Ouafff_finP1/app/src/main/res/layout-land/toolbar_md_activity_content.xml
new file mode 100644
index 0000000..db8cb86
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout-land/toolbar_md_activity_content.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/activity_pager.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/activity_pager.xml
new file mode 100644
index 0000000..c21af28
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/activity_pager.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/dialog_date.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/dialog_date.xml
new file mode 100644
index 0000000..fe35895
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/dialog_date.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_dog.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_dog.xml
new file mode 100644
index 0000000..7852d34
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_dog.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_list_dog.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_list_dog.xml
new file mode 100644
index 0000000..391af63
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/fragment_list_dog.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/item_list_dog.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/item_list_dog.xml
new file mode 100644
index 0000000..27a172d
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/item_list_dog.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_activity.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_activity.xml
new file mode 100644
index 0000000..1755a2b
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_activity.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity.xml
new file mode 100644
index 0000000..f43e40a
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity_content.xml b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity_content.xml
new file mode 100644
index 0000000..59d3295
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/layout/toolbar_md_activity_content.xml
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_dog.xml b/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_dog.xml
new file mode 100644
index 0000000..ac9a7ae
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_dog.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_list_dog.xml b/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_list_dog.xml
new file mode 100644
index 0000000..4dd4b9e
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/menu/fragment_list_dog.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..3131d55
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3131d55
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..90d6042
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..90d6042
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..9186c29
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9186c29
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2efca93
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..2efca93
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..0f04309
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..0f04309
Binary files /dev/null and b/corrections/Ouafff_finP1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values-fr/strings.xml b/corrections/Ouafff_finP1/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..99ca5bb
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,42 @@
+
+
+ Ouafff
+ Détail du chien
+ Nouveau chien
+ Chien %d
+ Date d\'admission
+ Chien supprimé
+ Impossible de supprimer le chien
+ Sauvegarder
+ Supprimer
+ "URL inconnue : "
+ "Insertion non autorisée dans : "
+ "Mise à jour non autorisée dans : "
+ "Suppression non autorisée dans : "
+ Ajouter un chien
+
+ Genre
+ Identité
+ Mesure
+ Agressivité
+ Divers
+
+ Nom
+ Race
+ Poids
+ kg
+ Propriétaire
+ Date d\'admission
+
+ Inconnu
+ Mâle
+ Femelle
+
+ Race inconnue
+
+ C\'est un peu vide par ici…
+ Commençons par ajouter un chien
+ Impossible de créer le chien
+ Le nom du chien et son poids ne peuvent pas être vides.
+ Un bouton de raccourci pour ajouter un nouveau chien
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values-night/themes.xml b/corrections/Ouafff_finP1/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4d084c9
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/arrays.xml b/corrections/Ouafff_finP1/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..def17c5
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/arrays.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ - @string/gender_unknown
+ - @string/gender_male
+ - @string/gender_female
+
+
+
+
+
+ - @color/colorNice
+ - @color/colorNormal
+ - @color/colorBad
+ - @color/colorDevil
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/colors.xml b/corrections/Ouafff_finP1/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..0e49785
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/colors.xml
@@ -0,0 +1,23 @@
+
+
+ #F0514B
+ #C0403C
+
+ #212121
+ #727272
+
+ #FFFFFF
+ #000000
+
+ @color/white
+
+
+ #2D3640
+ #394450
+
+
+ @color/red
+ #FFAC40
+ #FFEE58
+ @color/white
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/dimens.xml b/corrections/Ouafff_finP1/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..97cb59e
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/dimens.xml
@@ -0,0 +1,15 @@
+
+
+
+ 16dp
+ 16dp
+
+ 4dp
+
+
+ 48dp
+ 16dp
+ 8dp
+ 32dp
+
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/ids.xml b/corrections/Ouafff_finP1/app/src/main/res/values/ids.xml
new file mode 100644
index 0000000..3241b29
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/strings.xml b/corrections/Ouafff_finP1/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..26e7e82
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/strings.xml
@@ -0,0 +1,42 @@
+
+
+ Ouafff
+ Dog detail
+ New dog
+ Dog %d
+ Admission date of the dog:
+ Dog deleted
+ Fail to delete dog
+ Save
+ Delete
+ "Unknown URI: "
+ "Insertion not allowed in: "
+ "Update not allowed: "
+ "Delete not allowed: "
+ Add a dog
+
+ Overview
+ Gender
+ Measurement
+ Aggressiveness
+ Miscellaneous
+
+ Name
+ Breed
+ Weight
+ kg
+ Owner
+ Admission date
+
+ Unknown
+ Male
+ Female
+
+ Unknown breed
+
+ It\'s a bit lonely here…
+ Get started by adding a pet
+ Cannot create the dog
+ Dog\'s name and weight cannot be empty.
+ A shortcut button to add a new dog
+
diff --git a/corrections/Ouafff_finP1/app/src/main/res/values/themes.xml b/corrections/Ouafff_finP1/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..64a3211
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/main/res/values/themes.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/xml/backup_rules.xml b/corrections/Ouafff_finP1/app/src/main/res/xml/backup_rules.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/xml/backup_rules.xml
rename to corrections/Ouafff_finP1/app/src/main/res/xml/backup_rules.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/xml/data_extraction_rules.xml b/corrections/Ouafff_finP1/app/src/main/res/xml/data_extraction_rules.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/xml/data_extraction_rules.xml
rename to corrections/Ouafff_finP1/app/src/main/res/xml/data_extraction_rules.xml
diff --git a/corrections/Ouafff_finP1/app/src/test/java/fr/iut/ouafff/ExampleUnitTest.kt b/corrections/Ouafff_finP1/app/src/test/java/fr/iut/ouafff/ExampleUnitTest.kt
new file mode 100644
index 0000000..2bf15c5
--- /dev/null
+++ b/corrections/Ouafff_finP1/app/src/test/java/fr/iut/ouafff/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package fr.iut.ouafff
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/corrections/Ouafff_finP1/build.gradle b/corrections/Ouafff_finP1/build.gradle
new file mode 100644
index 0000000..2536974
--- /dev/null
+++ b/corrections/Ouafff_finP1/build.gradle
@@ -0,0 +1,6 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.3.1' apply false
+ id 'com.android.library' version '7.3.1' apply false
+ id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
+}
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/gradle.properties b/corrections/Ouafff_finP1/gradle.properties
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/gradle.properties
rename to corrections/Ouafff_finP1/gradle.properties
diff --git a/corrections/Ouafff_finP1/gradle/wrapper/gradle-wrapper.properties b/corrections/Ouafff_finP1/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..7e06b40
--- /dev/null
+++ b/corrections/Ouafff_finP1/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 19 12:14:28 CET 2022
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/corrections/corrigeQuiz/Quiz/gradlew b/corrections/Ouafff_finP1/gradlew
old mode 100755
new mode 100644
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/gradlew
rename to corrections/Ouafff_finP1/gradlew
diff --git a/corrections/corrigeQuiz/Quiz/gradlew.bat b/corrections/Ouafff_finP1/gradlew.bat
similarity index 96%
rename from corrections/corrigeQuiz/Quiz/gradlew.bat
rename to corrections/Ouafff_finP1/gradlew.bat
index ac1b06f..107acd3 100644
--- a/corrections/corrigeQuiz/Quiz/gradlew.bat
+++ b/corrections/Ouafff_finP1/gradlew.bat
@@ -1,89 +1,89 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/corrections/Ouafff_finP1/settings.gradle b/corrections/Ouafff_finP1/settings.gradle
new file mode 100644
index 0000000..a0cc7e6
--- /dev/null
+++ b/corrections/Ouafff_finP1/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "Ouafff"
+include ':app'
diff --git a/corrections/Quiz/.gitignore b/corrections/Quiz/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/corrections/Quiz/.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/corrections/Quiz/app/.gitignore b/corrections/Quiz/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/corrections/Quiz/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/app/build.gradle b/corrections/Quiz/app/build.gradle
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/build.gradle
rename to corrections/Quiz/app/build.gradle
diff --git a/corrections/Quiz/app/proguard-rules.pro b/corrections/Quiz/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/corrections/Quiz/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/corrections/corrigeQuiz/Quiz/app/src/androidTest/java/fr/iut/pm/quiz/ExampleInstrumentedTest.kt b/corrections/Quiz/app/src/androidTest/java/fr/iut/pm/quiz/ExampleInstrumentedTest.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/androidTest/java/fr/iut/pm/quiz/ExampleInstrumentedTest.kt
rename to corrections/Quiz/app/src/androidTest/java/fr/iut/pm/quiz/ExampleInstrumentedTest.kt
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/AndroidManifest.xml b/corrections/Quiz/app/src/main/AndroidManifest.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/AndroidManifest.xml
rename to corrections/Quiz/app/src/main/AndroidManifest.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/CheatActivity.kt b/corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/CheatActivity.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/CheatActivity.kt
rename to corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/CheatActivity.kt
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/QuizActivity.kt b/corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/QuizActivity.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/QuizActivity.kt
rename to corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/QuizActivity.kt
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/Stub.kt b/corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/Stub.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/Stub.kt
rename to corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/Stub.kt
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/question/TrueFalseQuestion.kt b/corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/question/TrueFalseQuestion.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/java/fr/iut/pm/quiz/question/TrueFalseQuestion.kt
rename to corrections/Quiz/app/src/main/java/fr/iut/pm/quiz/question/TrueFalseQuestion.kt
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/drawable-v21/ic_navigate_next.xml b/corrections/Quiz/app/src/main/res/drawable-v21/ic_navigate_next.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/drawable-v21/ic_navigate_next.xml
rename to corrections/Quiz/app/src/main/res/drawable-v21/ic_navigate_next.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/drawable/ic_launcher_foreground.xml b/corrections/Quiz/app/src/main/res/drawable/ic_launcher_foreground.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/drawable/ic_launcher_foreground.xml
rename to corrections/Quiz/app/src/main/res/drawable/ic_launcher_foreground.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/drawable/ic_navigate_next.xml b/corrections/Quiz/app/src/main/res/drawable/ic_navigate_next.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/drawable/ic_navigate_next.xml
rename to corrections/Quiz/app/src/main/res/drawable/ic_navigate_next.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/layout/activity_cheat.xml b/corrections/Quiz/app/src/main/res/layout/activity_cheat.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/layout/activity_cheat.xml
rename to corrections/Quiz/app/src/main/res/layout/activity_cheat.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/layout/activity_quiz.xml b/corrections/Quiz/app/src/main/res/layout/activity_quiz.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/layout/activity_quiz.xml
rename to corrections/Quiz/app/src/main/res/layout/activity_quiz.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/corrections/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
rename to corrections/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/corrections/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
rename to corrections/Quiz/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher.png b/corrections/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to corrections/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/corrections/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
rename to corrections/Quiz/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher.png b/corrections/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to corrections/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/corrections/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
rename to corrections/Quiz/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/corrections/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to corrections/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/corrections/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
rename to corrections/Quiz/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/corrections/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to corrections/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/corrections/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
rename to corrections/Quiz/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/corrections/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to corrections/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/corrections/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
rename to corrections/Quiz/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values-fr/strings.xml b/corrections/Quiz/app/src/main/res/values-fr/strings.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values-fr/strings.xml
rename to corrections/Quiz/app/src/main/res/values-fr/strings.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values-night/themes.xml b/corrections/Quiz/app/src/main/res/values-night/themes.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values-night/themes.xml
rename to corrections/Quiz/app/src/main/res/values-night/themes.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values/colors.xml b/corrections/Quiz/app/src/main/res/values/colors.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values/colors.xml
rename to corrections/Quiz/app/src/main/res/values/colors.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values/dimens.xml b/corrections/Quiz/app/src/main/res/values/dimens.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values/dimens.xml
rename to corrections/Quiz/app/src/main/res/values/dimens.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values/strings.xml b/corrections/Quiz/app/src/main/res/values/strings.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values/strings.xml
rename to corrections/Quiz/app/src/main/res/values/strings.xml
diff --git a/corrections/corrigeQuiz/Quiz/app/src/main/res/values/themes.xml b/corrections/Quiz/app/src/main/res/values/themes.xml
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/main/res/values/themes.xml
rename to corrections/Quiz/app/src/main/res/values/themes.xml
diff --git a/corrections/Quiz/app/src/main/res/xml/backup_rules.xml b/corrections/Quiz/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/corrections/Quiz/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/corrections/Quiz/app/src/main/res/xml/data_extraction_rules.xml b/corrections/Quiz/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/corrections/Quiz/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/app/src/test/java/fr/iut/pm/quiz/ExampleUnitTest.kt b/corrections/Quiz/app/src/test/java/fr/iut/pm/quiz/ExampleUnitTest.kt
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/app/src/test/java/fr/iut/pm/quiz/ExampleUnitTest.kt
rename to corrections/Quiz/app/src/test/java/fr/iut/pm/quiz/ExampleUnitTest.kt
diff --git a/corrections/corrigeQuiz/Quiz/build.gradle b/corrections/Quiz/build.gradle
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/build.gradle
rename to corrections/Quiz/build.gradle
diff --git a/corrections/Quiz/gradle.properties b/corrections/Quiz/gradle.properties
new file mode 100644
index 0000000..3c5031e
--- /dev/null
+++ b/corrections/Quiz/gradle.properties
@@ -0,0 +1,23 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/corrections/corrigeQuiz/Quiz/gradle/wrapper/gradle-wrapper.properties b/corrections/Quiz/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/gradle/wrapper/gradle-wrapper.properties
rename to corrections/Quiz/gradle/wrapper/gradle-wrapper.properties
diff --git a/corrections/Quiz/gradlew b/corrections/Quiz/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/corrections/Quiz/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/corrections/Quiz/gradlew.bat b/corrections/Quiz/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/corrections/Quiz/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/corrections/corrigeQuiz/Quiz/settings.gradle b/corrections/Quiz/settings.gradle
similarity index 100%
rename from corrections/corrigeQuiz/Quiz/settings.gradle
rename to corrections/Quiz/settings.gradle