Compare commits
6 Commits
2.0.1-beta
...
2.0.1
Author | SHA1 | Date | |
---|---|---|---|
eea7a7b27c | |||
dd12a6a91e | |||
c976c00ce4 | |||
ae62c2ab7e | |||
22732c42a3 | |||
5cb3478bb6 |
@ -15,8 +15,8 @@ android {
|
||||
applicationId "fr.sanchezm.attestationsCovid19"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 30
|
||||
versionCode 9
|
||||
versionName "2.0.0"
|
||||
versionCode 10
|
||||
versionName "2.0.1"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package fr.sanchezm.attestationsCovid19.data.db.entity
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
const val PATTERN = "dd/MM/yyyy 'à' HH'h'mm"
|
||||
const val PATTERN = "dd/MM/yyyy 'à' HH:mm"
|
||||
|
||||
//@Entity(tableName = "attestation")
|
||||
data class Attestation(
|
||||
|
@ -1,6 +1,9 @@
|
||||
package fr.sanchezm.attestationsCovid19.ui.add
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.DatePickerDialog
|
||||
import android.app.TimePickerDialog
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LiveData
|
||||
@ -13,6 +16,7 @@ import fr.sanchezm.attestationsCovid19.data.repository.AttestationRepository
|
||||
import fr.sanchezm.attestationsCovid19.data.repository.ConfigRepository
|
||||
import fr.sanchezm.attestationsCovid19.data.repository.ProfileRepository
|
||||
import fr.sanchezm.attestationsCovid19.utilities.Event
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatter
|
||||
@ -21,7 +25,8 @@ import java.util.*
|
||||
class AddViewModel(
|
||||
private val configRepository: ConfigRepository,
|
||||
private val profileRepository: ProfileRepository,
|
||||
private val attestationRepository: AttestationRepository
|
||||
private val attestationRepository: AttestationRepository,
|
||||
private val app: Context
|
||||
) : ViewModel() {
|
||||
|
||||
private val _errorMessage = MutableLiveData<Event<Int>>()
|
||||
@ -60,7 +65,7 @@ class AddViewModel(
|
||||
// endregion
|
||||
|
||||
private val datePattern = "dd/MM/yyyy"
|
||||
private val timePattern = "HH'h'mm"
|
||||
private val timePattern = "HH:mm"
|
||||
|
||||
@SuppressLint("LongLogTag")
|
||||
fun onGenerateAttestationClick() {
|
||||
@ -77,6 +82,68 @@ class AddViewModel(
|
||||
}
|
||||
}
|
||||
|
||||
fun onBirthdayClick() {
|
||||
val c = Calendar.getInstance().also { it.set(1970, 0, 1) }
|
||||
if (!birthday.value.isNullOrBlank()) {
|
||||
birthday.value?.let { birthday ->
|
||||
DateFormat.getDateInstance(DateFormat.SHORT, Locale.FRANCE).parse(birthday)
|
||||
?.let { c.time = it }
|
||||
}
|
||||
}
|
||||
val year = c.get(Calendar.YEAR)
|
||||
val month = c.get(Calendar.MONTH)
|
||||
val day = c.get(Calendar.DAY_OF_MONTH)
|
||||
|
||||
val dpd = DatePickerDialog(
|
||||
app,
|
||||
DatePickerDialog.OnDateSetListener { _, yearPicked, monthOfYear, dayOfMonth ->
|
||||
birthday.value =
|
||||
"${getFormattedDayOrMonth(dayOfMonth)}/${getFormattedDayOrMonth(monthOfYear + 1)}/$yearPicked"
|
||||
},
|
||||
year,
|
||||
month,
|
||||
day
|
||||
)
|
||||
dpd.show()
|
||||
}
|
||||
|
||||
fun onExitDateClick() {
|
||||
val c = Calendar.getInstance()
|
||||
val year = c.get(Calendar.YEAR)
|
||||
val month = c.get(Calendar.MONTH)
|
||||
val day = c.get(Calendar.DAY_OF_MONTH)
|
||||
|
||||
val dpd = DatePickerDialog(
|
||||
app,
|
||||
DatePickerDialog.OnDateSetListener { _, yearPicked, monthOfYear, dayOfMonth ->
|
||||
exitDate.value =
|
||||
"${getFormattedDayOrMonth(dayOfMonth)}/${getFormattedDayOrMonth(monthOfYear + 1)}/$yearPicked"
|
||||
},
|
||||
year,
|
||||
month,
|
||||
day
|
||||
)
|
||||
dpd.show()
|
||||
}
|
||||
|
||||
fun onExitHourClick() {
|
||||
val c = Calendar.getInstance()
|
||||
val hour = c.get(Calendar.HOUR_OF_DAY)
|
||||
val minute = c.get(Calendar.MINUTE)
|
||||
|
||||
val tpd = TimePickerDialog(
|
||||
app,
|
||||
TimePickerDialog.OnTimeSetListener { _, hourPicked, minutePicked ->
|
||||
exitHour.value =
|
||||
"${getFormattedDayOrMonth(hourPicked)}:${getFormattedDayOrMonth(minutePicked)}"
|
||||
},
|
||||
hour,
|
||||
minute,
|
||||
true
|
||||
)
|
||||
tpd.show()
|
||||
}
|
||||
|
||||
init {
|
||||
setProfileValue()
|
||||
setDateHourToday()
|
||||
@ -170,4 +237,13 @@ class AddViewModel(
|
||||
|| reason9.value!!
|
||||
}
|
||||
|
||||
private fun getFormattedDayOrMonth(date: Int): String {
|
||||
var formattedDate: String = date.toString()
|
||||
|
||||
if (formattedDate.length <= 1) {
|
||||
formattedDate = "0$formattedDate"
|
||||
}
|
||||
return formattedDate
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package fr.sanchezm.attestationsCovid19.ui.add
|
||||
|
||||
import android.content.Context
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import fr.sanchezm.attestationsCovid19.data.repository.AttestationRepository
|
||||
@ -9,12 +10,13 @@ import fr.sanchezm.attestationsCovid19.data.repository.ProfileRepository
|
||||
class AddViewModelFactory(
|
||||
private val configRepository: ConfigRepository,
|
||||
private val profileRepository: ProfileRepository,
|
||||
private val attestationRepository: AttestationRepository
|
||||
private val attestationRepository: AttestationRepository,
|
||||
private val app: Context
|
||||
) :
|
||||
ViewModelProvider.NewInstanceFactory() {
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
return AddViewModel(configRepository, profileRepository, attestationRepository) as T
|
||||
return AddViewModel(configRepository, profileRepository, attestationRepository, app) as T
|
||||
}
|
||||
}
|
@ -16,7 +16,8 @@ object InjectorUtils {
|
||||
AddViewModelFactory(
|
||||
getConfigRepo(context),
|
||||
getProfileRepo(context),
|
||||
getAttestationRepo(context)
|
||||
getAttestationRepo(context),
|
||||
context
|
||||
)
|
||||
|
||||
fun provideAttestationViewModel(context: Context): AttestationsViewModelFactory =
|
||||
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="@drawable/custom_rectangle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="15dp"
|
||||
android:background="@drawable/custom_rectangle"
|
||||
android:padding="15dp">
|
||||
|
||||
<TextView
|
||||
@ -13,50 +13,50 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/people_item"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_item"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/date_item"
|
||||
android:layout_marginTop="3dp"
|
||||
android:text="@string/date_item"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintTop_toBottomOf="@+id/people_item"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/people_item" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/reason_item"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/reason_item"
|
||||
android:layout_marginTop="3dp"
|
||||
android:text="@string/reason_item"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintTop_toBottomOf="@+id/date_item"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/date_item" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/people_item_data"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_item_data"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="3dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/people_item_data"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/people_item_data" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/reason_item_data"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="3dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/date_item_data"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/date_item_data" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context=".ui.add.AddFragment">
|
||||
|
||||
<data>
|
||||
@ -12,9 +12,9 @@
|
||||
</data>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/constraintContext"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/constraintContext">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
@ -34,10 +34,10 @@
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/attestation_title"
|
||||
android:textColor="?attr/colorPrimary"
|
||||
android:textSize="25sp" />
|
||||
android:textSize="25sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
@ -88,9 +88,11 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="date"
|
||||
android:focusable="false"
|
||||
android:onClick="@{() -> viewModel.onBirthdayClick()}"
|
||||
android:text="@={viewModel.birthday}"
|
||||
app:validateDate='@{"dd/MM/yyyy"}'
|
||||
app:validateDateMessage="@{@string/date_error_message}"/>
|
||||
app:validateDateMessage="@{@string/date_error_message}" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
@ -164,10 +166,12 @@
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="false"
|
||||
android:inputType="date"
|
||||
android:onClick="@{() -> viewModel.onExitDateClick()}"
|
||||
android:text="@={viewModel.exitDate}"
|
||||
app:validateDate='@{"dd/MM/yyyy"}'
|
||||
app:validateDateMessage="@{@string/date_error_message}"/>
|
||||
app:validateDateMessage="@{@string/date_error_message}" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
@ -181,7 +185,9 @@
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="false"
|
||||
android:inputType="time"
|
||||
android:onClick="@{() -> viewModel.onExitHourClick()}"
|
||||
android:text="@={viewModel.exitHour}" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
@ -273,7 +279,6 @@
|
||||
android:layout_marginTop="20dp"
|
||||
android:onClick="@{() -> viewModel.onGenerateAttestationClick()}"
|
||||
android:text="@string/generate_attestation_button" />
|
||||
<!-- android:enabled="false"-->
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -1,12 +1,12 @@
|
||||
<resources>
|
||||
<string name="app_name">Attestation de déplacement dérogatoire (couvre-feu)</string>
|
||||
<string name="app_name">Attestation de déplacement dérogatoire</string>
|
||||
<string name="title_add">Nouvelle Attestation</string>
|
||||
<string name="title_attestations">Mes Attestations</string>
|
||||
<string name="title_info">À Propos</string>
|
||||
|
||||
<!-- Attestation Fragment -->
|
||||
<string name="attestation_title">@string/app_name</string>
|
||||
<string name="attestation_subtitle">Respectons les gestes barrières et les distanciations sociales et faisons barrière à la Covid-19</string>
|
||||
<string name="attestation_subtitle">Restons chez nous pour nous protéger et protéger les autres</string>
|
||||
<string name="attestation_generated">Attestation générée</string>
|
||||
<string name="no_attestation">Aucune attestation, veuillez en générer une.</string>
|
||||
|
||||
@ -18,12 +18,12 @@
|
||||
<string name="address">Adresse</string>
|
||||
<string name="city">Ville</string>
|
||||
<string name="postal_code">Code Postal</string>
|
||||
<string name="reason">Je certifie que mon déplacement est lié au motif suivant (cocher la case) autorisé en application des mesures générales nécessaires pour faire face à l\'épidémie de Covid19 dans le cadre de l\'état d\'urgence sanitaire :</string>
|
||||
<string name="exit_date">Date de sortie</string>
|
||||
<string name="exit_hour">Heure de sortie</string>
|
||||
<string name="generate_attestation_button">Générer l\'attestation</string>
|
||||
|
||||
<!-- Reasons for leaving house -->
|
||||
<string name="reason">Je certifie que mon déplacement est lié au motif suivant (cocher la case) autorisé en application des mesures générales nécessaires pour faire face à l\'épidémie de Covid19 dans le cadre de l\'état d\'urgence sanitaire :</string>
|
||||
<string name="reason_1">Déplacements entre le domicile et le lieu d\'exercice de l\'activité professionnelle ou les déplacements professionnels ne pouvant être différés.</string>
|
||||
<string name="reason_2">Déplacements pour effectuer des achats de fournitures nécessaires à l\'activité professionnelle, des achats de première nécessité dans des établissements dont les activités demeurent autorisées (liste sur gouvernement.fr) et les livraisons à domicile.</string>
|
||||
<string name="reason_3">Consultations et soins ne pouvant être assurés à distance et ne pouvant être différés et l’achat de médicaments.</string>
|
||||
|
Reference in New Issue
Block a user