Compare commits
	
		
			3 Commits
		
	
	
		
			master
			...
			ms/issue-5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a914e5e0fd | |||
| 54a57b65ab | |||
| 5f373a19d7 | 
| @@ -15,6 +15,7 @@ | ||||
|         android:label="@string/app_name" | ||||
|         android:roundIcon="@mipmap/ic_launcher_round" | ||||
|         android:supportsRtl="true" | ||||
|         tools:replace="android:allowBackup" | ||||
|         android:theme="@style/AppTheme.Light"> | ||||
|         <activity android:name=".QrCodeActivity" /> | ||||
|         <activity android:name=".PdfViewerActivity" /> | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import android.content.Context | ||||
| import fr.sanchezm.attestationsCovid19.data.db.dao.AttestationDao | ||||
| import fr.sanchezm.attestationsCovid19.data.db.dao.ConfigDao | ||||
| import fr.sanchezm.attestationsCovid19.data.db.dao.ProfileDao | ||||
| import fr.sanchezm.attestationsCovid19.data.repository.ConfigRepository | ||||
|  | ||||
| class MyDatabase private constructor(private val savePath: String, private val filesPath: String) { | ||||
|  | ||||
| @@ -11,10 +12,15 @@ class MyDatabase private constructor(private val savePath: String, private val f | ||||
|     private var _attestationDao: AttestationDao? = null | ||||
|     private var _configDao: ConfigDao? = null | ||||
|  | ||||
|     fun profileDao(): ProfileDao = _profileDao ?: ProfileDao(savePath).also { _profileDao = it } | ||||
|     fun profileDao(configRepository: ConfigRepository): ProfileDao = | ||||
|         _profileDao ?: ProfileDao(savePath, configRepository).also { _profileDao = it } | ||||
|  | ||||
|     fun attestationDao(): AttestationDao = | ||||
|         _attestationDao ?: AttestationDao(savePath, filesPath).also { _attestationDao = it } | ||||
|     fun attestationDao(configRepository: ConfigRepository): AttestationDao = | ||||
|         _attestationDao ?: AttestationDao( | ||||
|             savePath, | ||||
|             filesPath, | ||||
|             configRepository | ||||
|         ).also { _attestationDao = it } | ||||
|  | ||||
|     fun configDao(): ConfigDao = _configDao ?: ConfigDao(savePath).also { _configDao = it } | ||||
|  | ||||
| @@ -28,40 +34,3 @@ class MyDatabase private constructor(private val savePath: String, private val f | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
| import android.content.Context | ||||
| import androidx.room.Database | ||||
| import androidx.room.Room | ||||
| import androidx.room.RoomDatabase | ||||
| import fr.sanchezm.attestationsCovid19.data.db.dao.AttestationDao | ||||
| import fr.sanchezm.attestationsCovid19.data.db.dao.ProfileDao | ||||
| import fr.sanchezm.attestationsCovid19.data.db.entity.Profile | ||||
|  | ||||
| @Database( | ||||
|     entities = [Profile::class], | ||||
|     version = 1 | ||||
| ) | ||||
| abstract class MyDatabase private constructor() : RoomDatabase() { | ||||
|  | ||||
|     abstract fun profileDao(): ProfileDao | ||||
|     abstract fun attestationDao(): AttestationDao | ||||
|  | ||||
|     companion object { | ||||
|         @Volatile | ||||
|         private var instance: MyDatabase? = null | ||||
|         private val LOCK = Any() | ||||
|  | ||||
|         operator fun invoke(context: Context) = instance ?: synchronized(LOCK) { | ||||
|             instance ?: buildDatabase(context).also { instance = it } | ||||
|         } | ||||
|  | ||||
|         private fun buildDatabase(context: Context) = | ||||
|             Room.databaseBuilder( | ||||
|                 context.applicationContext, | ||||
|                 MyDatabase::class.java, "data.db" | ||||
|             ) | ||||
|                 .build() | ||||
|     } | ||||
| } | ||||
| */ | ||||
|   | ||||
| @@ -6,10 +6,15 @@ import androidx.lifecycle.MutableLiveData | ||||
| import com.google.gson.Gson | ||||
| import com.google.gson.reflect.TypeToken | ||||
| import fr.sanchezm.attestationsCovid19.data.db.entity.Attestation | ||||
| import fr.sanchezm.attestationsCovid19.data.repository.ConfigRepository | ||||
| import fr.sanchezm.attestationsCovid19.utilities.PdfUtils | ||||
| import java.io.File | ||||
|  | ||||
| class AttestationDao(private val savePath: String, private val filesPath: String) { | ||||
| class AttestationDao( | ||||
|     private val savePath: String, | ||||
|     private val filesPath: String, | ||||
|     private val configRepository: ConfigRepository | ||||
| ) { | ||||
|  | ||||
|     private val _attestations = MutableLiveData<ArrayList<Attestation>>() | ||||
|     private val fileName = "attestation.db" | ||||
| @@ -23,9 +28,8 @@ class AttestationDao(private val savePath: String, private val filesPath: String | ||||
|         _attestations.value?.elementAt(id) | ||||
|  | ||||
|     fun addAttestation(attestation: Attestation) { | ||||
|         _attestations.value = _attestations.value ?: ArrayList() | ||||
|  | ||||
|         _attestations.value?.add(attestation) | ||||
|         _attestations.value = _attestations.value | ||||
|         Log.d(TAG, "Add Attestation : $attestation") | ||||
|         save() | ||||
|     } | ||||
| @@ -66,6 +70,8 @@ class AttestationDao(private val savePath: String, private val filesPath: String | ||||
|  | ||||
|         if (file.exists()) { | ||||
|             _attestations.value = Gson().fromJson(file.readText(Charsets.UTF_8), type) | ||||
|         } else { | ||||
|             _attestations.value = ArrayList() | ||||
|         } | ||||
|         _attestations.value?.forEach { | ||||
|             val filePath = PdfUtils.getPath(filesPath, it.createAt) | ||||
|   | ||||
| @@ -33,7 +33,12 @@ class ConfigDao(private val savePath: String) { | ||||
|             _config.value?.versionName = BuildConfig.VERSION_NAME | ||||
|         } else { | ||||
|             _config.value = | ||||
|                 Config(BuildConfig.DB_VERSION, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) | ||||
|                 Config( | ||||
|                     BuildConfig.DB_VERSION, | ||||
|                     BuildConfig.VERSION_NAME, | ||||
|                     BuildConfig.VERSION_CODE, | ||||
|                     -1 | ||||
|                 ) | ||||
|             save() | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,48 +1,77 @@ | ||||
| package fr.sanchezm.attestationsCovid19.data.db.dao | ||||
|  | ||||
| import android.util.Log | ||||
| import androidx.lifecycle.LiveData | ||||
| import androidx.lifecycle.MutableLiveData | ||||
| import com.google.gson.Gson | ||||
| import com.google.gson.reflect.TypeToken | ||||
| import fr.sanchezm.attestationsCovid19.BuildConfig | ||||
| import fr.sanchezm.attestationsCovid19.data.db.entity.Profile | ||||
| import fr.sanchezm.attestationsCovid19.data.repository.ConfigRepository | ||||
| import fr.sanchezm.attestationsCovid19.utilities.DbMigration | ||||
| import java.io.File | ||||
|  | ||||
| class ProfileDao(private val path: String) { | ||||
| class ProfileDao(private val path: String, private val configRepository: ConfigRepository) { | ||||
|  | ||||
|     private val _profile = MutableLiveData<Profile>() | ||||
|     private val _profile = MutableLiveData<ArrayList<Profile>>() | ||||
|     private val fileName = "profile.db" | ||||
|     private val type = object : TypeToken<ArrayList<Profile>>() {}.type | ||||
|  | ||||
|     fun getProfile(): LiveData<Profile> = | ||||
|         _profile | ||||
|     @Suppress("UNCHECKED_CAST") | ||||
|     fun getProfiles(): LiveData<List<Profile>> = | ||||
|         _profile as LiveData<List<Profile>> | ||||
|  | ||||
|     fun updateProfile(profile: Profile) { | ||||
|         _profile.value = profile | ||||
|     fun getProfile(id: Int): Profile? = | ||||
|         _profile.value?.get(id) | ||||
|  | ||||
|     fun getProfileId(profile: Profile): Int? = | ||||
|         _profile.value?.indexOf(profile) | ||||
|  | ||||
|     fun addProfile(profile: Profile): Int { | ||||
|         _profile.value?.add(profile) | ||||
|         _profile.value = _profile.value | ||||
|         save() | ||||
|  | ||||
|         return _profile.value?.indexOf(profile)!! | ||||
|     } | ||||
|  | ||||
|     init { | ||||
|         load() | ||||
|         val currentDbVersion = configRepository.getConfig().value!!.dbVersion | ||||
|         val appDbVersion = BuildConfig.DB_VERSION | ||||
|  | ||||
|         if (currentDbVersion != appDbVersion) { | ||||
|             if (currentDbVersion == 1 && appDbVersion == 2) { | ||||
|                 _profile.value = DbMigration.migrateProfileFrom1To2("$path/$fileName") | ||||
|                 save() | ||||
|                 configRepository.getConfig().value!!.let { | ||||
|                     it.dbVersion = appDbVersion | ||||
|                     configRepository.updateConfig(it) | ||||
|                 } | ||||
|                 Log.d(TAG, "Db version update from $currentDbVersion to $appDbVersion") | ||||
|             } else { | ||||
|                 File("$path/$fileName").delete() | ||||
|                 load() | ||||
|             } | ||||
|         } else { | ||||
|             load() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun load() { | ||||
|         val file = File("$path/$fileName") | ||||
|  | ||||
|         if (file.exists()) { | ||||
|             _profile.value = Gson().fromJson(file.readText(Charsets.UTF_8), Profile::class.java) | ||||
|             _profile.value = Gson().fromJson(file.readText(Charsets.UTF_8), type) | ||||
|         } else { | ||||
|             _profile.value = Profile("", "", "", "", "", "", "") | ||||
|             _profile.value = ArrayList() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun save() { | ||||
|         File("$path/$fileName").writeText(Gson().toJson(_profile.value)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| //@Dao | ||||
| //interface ProfileDao { | ||||
| //    @Insert(onConflict = OnConflictStrategy.REPLACE) | ||||
| //    fun insert(profile: Profile) | ||||
| // | ||||
| //    @Query(value = "SELECT * FROM profile WHERE id = $CURRENT_PROFILE_ID") | ||||
| //    fun getProfile(): LiveData<Profile> | ||||
| //} | ||||
|     companion object { | ||||
|         private val TAG = ProfileDao::class.simpleName | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import java.util.* | ||||
|  | ||||
| const val PATTERN = "dd/MM/yyyy 'a' HH'h'mm" | ||||
|  | ||||
| //@Entity(tableName = "attestation") | ||||
| data class Attestation( | ||||
|     val profile: Profile, | ||||
|     val exitDate: String, | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| package fr.sanchezm.attestationsCovid19.data.db.entity | ||||
|  | ||||
| data class Config( | ||||
|     val dbVersion: Int, | ||||
|     var dbVersion: Int, | ||||
|     var versionName: String, | ||||
|     var versionCode: Int | ||||
|     var versionCode: Int, | ||||
|     var selectProfileId: Int | ||||
| ) | ||||
| @@ -1,6 +1,5 @@ | ||||
| package fr.sanchezm.attestationsCovid19.data.db.entity | ||||
|  | ||||
| //@Entity(tableName = "profile") | ||||
| data class Profile( | ||||
|     val firstName: String, | ||||
|     val lastName: String, | ||||
| @@ -10,8 +9,6 @@ data class Profile( | ||||
|     val city: String, | ||||
|     val postalCode: String | ||||
| ) { | ||||
| //    @PrimaryKey | ||||
| //    var id: Int = CURRENT_PROFILE_ID | ||||
|  | ||||
|     override fun toString(): String { | ||||
|         return "Nom: $lastName; Prenom: $firstName; Naissance: $birthday a $birthPlace; Adresse: $address $postalCode $city" | ||||
|   | ||||
| @@ -6,11 +6,14 @@ import fr.sanchezm.attestationsCovid19.data.db.entity.Profile | ||||
|  | ||||
| class ProfileRepository private constructor(private val profileDao: ProfileDao) { | ||||
|  | ||||
|     fun getProfile(): LiveData<Profile> = | ||||
|         profileDao.getProfile() | ||||
|     fun getProfiles(): LiveData<List<Profile>> = | ||||
|         profileDao.getProfiles() | ||||
|  | ||||
|     fun insertProfile(profile: Profile) = | ||||
|         profileDao.updateProfile(profile) | ||||
|     fun getProfile(id: Int): Profile? = | ||||
|         profileDao.getProfile(id) | ||||
|  | ||||
|     fun insertProfile(profile: Profile): Int = | ||||
|         profileDao.addProfile(profile) | ||||
|  | ||||
|     companion object { | ||||
|         @Volatile | ||||
|   | ||||
| @@ -81,15 +81,15 @@ class AddViewModel( | ||||
|     } | ||||
|  | ||||
|     private fun setProfileValue() { | ||||
|         val profile = profileRepository.getProfile() | ||||
|         val profile = profileRepository.getProfiles().value?.first() | ||||
|  | ||||
|         firstName.value = profile.value?.firstName | ||||
|         lastName.value = profile.value?.lastName | ||||
|         birthday.value = profile.value?.birthday | ||||
|         birthPlace.value = profile.value?.birthPlace | ||||
|         address.value = profile.value?.address | ||||
|         city.value = profile.value?.city | ||||
|         postalCode.value = profile.value?.postalCode | ||||
|         firstName.value = profile?.firstName | ||||
|         lastName.value = profile?.lastName | ||||
|         birthday.value = profile?.birthday | ||||
|         birthPlace.value = profile?.birthPlace | ||||
|         address.value = profile?.address | ||||
|         city.value = profile?.city | ||||
|         postalCode.value = profile?.postalCode | ||||
|     } | ||||
|  | ||||
|     private fun setDateHourToday() { | ||||
|   | ||||
| @@ -0,0 +1,22 @@ | ||||
| package fr.sanchezm.attestationsCovid19.utilities | ||||
|  | ||||
| import com.google.gson.Gson | ||||
| import fr.sanchezm.attestationsCovid19.data.db.entity.Profile | ||||
| import java.io.File | ||||
|  | ||||
| object DbMigration { | ||||
|  | ||||
|     fun migrateProfileFrom1To2(filename: String): ArrayList<Profile> { | ||||
|         val file = File(filename) | ||||
|         val list = ArrayList<Profile>() | ||||
|  | ||||
|         val profile: Profile = if (file.exists()) { | ||||
|             Gson().fromJson(file.readText(Charsets.UTF_8), Profile::class.java) | ||||
|         } else { | ||||
|             Profile("", "", "", "", "", "", "") | ||||
|         } | ||||
|         list.add(profile) | ||||
|  | ||||
|         return list | ||||
|     } | ||||
| } | ||||
| @@ -39,11 +39,12 @@ object InjectorUtils { | ||||
|  | ||||
|     private fun getAttestationRepo(context: Context): AttestationRepository = | ||||
|         AttestationRepository.getInstance( | ||||
|             MyDatabase.invoke(context, getMyFilesDir(context)).attestationDao() | ||||
|             MyDatabase.invoke(context, getMyFilesDir(context)) | ||||
|                 .attestationDao(getConfigRepo(context)) | ||||
|         ) | ||||
|  | ||||
|     private fun getProfileRepo(context: Context): ProfileRepository = ProfileRepository.getInstance( | ||||
|         MyDatabase.invoke(context, getMyFilesDir(context)).profileDao() | ||||
|         MyDatabase.invoke(context, getMyFilesDir(context)).profileDao(getConfigRepo(context)) | ||||
|     ) | ||||
|  | ||||
|     private fun getConfigRepo(context: Context): ConfigRepository = ConfigRepository.getInstance( | ||||
|   | ||||
| @@ -119,7 +119,7 @@ | ||||
|                     <com.google.android.material.textfield.TextInputEditText | ||||
|                         android:layout_width="match_parent" | ||||
|                         android:layout_height="wrap_content" | ||||
|                         android:inputType="textPostalAddress|textCapWords" | ||||
|                         android:inputType="number|textCapWords" | ||||
|                         android:text="@={viewModel.address}" /> | ||||
|  | ||||
|                 </com.google.android.material.textfield.TextInputLayout> | ||||
|   | ||||
| @@ -3,8 +3,7 @@ | ||||
| buildscript { | ||||
|     ext { | ||||
|         kotlin_version = '1.3.72' | ||||
|         db_version = '1' | ||||
|  | ||||
|         db_version = '2' | ||||
|     } | ||||
|  | ||||
|     repositories { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user