diff --git a/app/build.gradle b/app/build.gradle index e5b454e4..98399dc3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,8 +22,8 @@ android { applicationId "es.gob.radarcovid" minSdkVersion 23 targetSdkVersion 29 - versionCode 12 - versionName "1.4.0" + versionCode 13 + versionName "1.4.1" resConfigs "en", "es", "ro", "ca", "gl", "eu", "fr" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -306,7 +306,11 @@ dependencies { implementation 'com.google.android.gms:play-services-vision:20.1.3' //CrowdNotifier - implementation 'org.crowdnotifier:crowdnotifier-sdk-android:2.1.0' + implementation ('org.crowdnotifier:crowdnotifier-sdk-android:2.1.0') { + exclude group: 'com.goterl.lazycode', module: 'lazysodium-android' + } + + implementation fileTree(include: 'lazysodium-android.aar', dir: 'lazysodium-android-4.2.0') implementation 'com.google.protobuf:protobuf-lite:3.0.1' //Biometrics diff --git a/app/src/main/java/es/gob/radarcovid/common/base/broadcast/ExposureStatusChangeBroadcastReceiver.kt b/app/src/main/java/es/gob/radarcovid/common/base/broadcast/ExposureStatusChangeBroadcastReceiver.kt index 159946cf..9664c929 100644 --- a/app/src/main/java/es/gob/radarcovid/common/base/broadcast/ExposureStatusChangeBroadcastReceiver.kt +++ b/app/src/main/java/es/gob/radarcovid/common/base/broadcast/ExposureStatusChangeBroadcastReceiver.kt @@ -25,6 +25,7 @@ import es.gob.radarcovid.R import es.gob.radarcovid.common.base.events.BUS import es.gob.radarcovid.common.base.events.EventExposureStatusChange import es.gob.radarcovid.common.extensions.default +import es.gob.radarcovid.datamanager.repository.ExposureRecordRepository import es.gob.radarcovid.datamanager.usecase.ExposureInfoUseCase import es.gob.radarcovid.datamanager.usecase.GetHealingTimeUseCase import es.gob.radarcovid.datamanager.utils.LabelManager @@ -50,6 +51,9 @@ class ExposureStatusChangeBroadcastReceiver : DaggerBroadcastReceiver() { @Inject lateinit var labelManager: LabelManager + @Inject + lateinit var exposureRecordRepository: ExposureRecordRepository + override fun onReceive(context: Context?, intent: Intent?) { super.onReceive(context, intent) when (intent?.action) { @@ -62,6 +66,7 @@ class ExposureStatusChangeBroadcastReceiver : DaggerBroadcastReceiver() { getHealingTimeUseCase.getHealingTime().exposureHighMinutes ) showHighExposureNotification(it) + exposureRecordRepository.addExposure(exposureInfoUseCase.getExposureInfo()) } }, 2000) } diff --git a/app/src/main/java/es/gob/radarcovid/common/di/module/RepositoryModule.kt b/app/src/main/java/es/gob/radarcovid/common/di/module/RepositoryModule.kt index c7493e79..2eb3e023 100644 --- a/app/src/main/java/es/gob/radarcovid/common/di/module/RepositoryModule.kt +++ b/app/src/main/java/es/gob/radarcovid/common/di/module/RepositoryModule.kt @@ -56,4 +56,8 @@ class RepositoryModule { @PerApplication fun providesEncryptedPreferencesRepository(repository: EncryptedPreferencesRepositoryImpl): EncryptedPreferencesRepository = repository + @Provides + @PerApplication + fun providesExposureRecordRepository(repository: ExposureRecordRepositoryImpl): ExposureRecordRepository = repository + } \ No newline at end of file diff --git a/app/src/main/java/es/gob/radarcovid/common/di/module/ViewsModule.kt b/app/src/main/java/es/gob/radarcovid/common/di/module/ViewsModule.kt index 68aaec1d..85aeff9a 100644 --- a/app/src/main/java/es/gob/radarcovid/common/di/module/ViewsModule.kt +++ b/app/src/main/java/es/gob/radarcovid/common/di/module/ViewsModule.kt @@ -15,6 +15,7 @@ import dagger.android.ContributesAndroidInjector import es.gob.radarcovid.common.view.* import es.gob.radarcovid.common.view.adapter.SingleChoiceAdapter import es.gob.radarcovid.features.home.view.ShareDialog +import es.gob.radarcovid.features.information.view.ExposureRecordDialog import es.gob.radarcovid.features.information.view.InformationDialog import es.gob.radarcovid.features.main.view.ExposureHealedDialog import es.gob.radarcovid.features.stats.view.StatsCountriesDialog @@ -67,6 +68,9 @@ abstract class ViewsModule { @ContributesAndroidInjector abstract fun bindsInformationDialog(): InformationDialog + @ContributesAndroidInjector + abstract fun bindsExposureRecordDialog(): ExposureRecordDialog + @ContributesAndroidInjector abstract fun bindsStatsCountriesDialog(): StatsCountriesDialog diff --git a/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepository.kt b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepository.kt new file mode 100644 index 00000000..1f7c5db6 --- /dev/null +++ b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepository.kt @@ -0,0 +1,10 @@ +package es.gob.radarcovid.datamanager.repository + +import es.gob.radarcovid.models.domain.ExposureInfo + +interface ExposureRecordRepository { + + fun getExposureRecords() : List + fun addExposure(exposureInfo: ExposureInfo) + fun removeExposures() +} \ No newline at end of file diff --git a/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepositoryImpl.kt b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepositoryImpl.kt new file mode 100644 index 00000000..68da6f9a --- /dev/null +++ b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureRecordRepositoryImpl.kt @@ -0,0 +1,54 @@ +package es.gob.radarcovid.datamanager.repository + +import es.gob.radarcovid.models.domain.ExposureInfo +import android.content.SharedPreferences +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import es.gob.radarcovid.common.extensions.toJson +import javax.inject.Inject + +class ExposureRecordRepositoryImpl @Inject constructor( + private val sharedPreferences: SharedPreferences? +): ExposureRecordRepository { + + companion object { + private const val KEY_EXPOSURE_RECORD_LIST = "key_exposure_record_list" + } + + private fun saveToPrefs(key: String, data: String) { + sharedPreferences?.edit()?.putString(key, data)?.apply() + } + + private fun getFromPreferences(key: String): String? = + sharedPreferences?.getString(key, null) + + private fun removeFromPrefs(key: String) { + sharedPreferences?.edit()?.remove(key)?.apply() + } + + + override fun getExposureRecords(): List { + val list = getFromPreferences(KEY_EXPOSURE_RECORD_LIST) + return if (list != null) { + val itemType = object : TypeToken>() {}.type + Gson().fromJson( + list, + itemType + ) + } else { + emptyList() + } + } + + override fun addExposure(exposureInfo: ExposureInfo) { + var list = getExposureRecords() + list += exposureInfo + saveToPrefs(KEY_EXPOSURE_RECORD_LIST, list.toJson()) + } + + override fun removeExposures() { + removeFromPrefs(KEY_EXPOSURE_RECORD_LIST) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureStatusRepositoryImpl.kt b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureStatusRepositoryImpl.kt index d1b62241..fa89b859 100644 --- a/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureStatusRepositoryImpl.kt +++ b/app/src/main/java/es/gob/radarcovid/datamanager/repository/ExposureStatusRepositoryImpl.kt @@ -11,8 +11,12 @@ package es.gob.radarcovid.datamanager.repository import android.content.Context +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import es.gob.radarcovid.common.extensions.toJson import es.gob.radarcovid.datamanager.mapper.ExposureInfoDataMapper import es.gob.radarcovid.models.domain.ExposureInfo +import es.gob.radarcovid.models.domain.VenueRecord import org.dpppt.android.sdk.DP3T import org.dpppt.android.sdk.internal.AppConfigManager import org.dpppt.android.sdk.internal.storage.ExposureDayStorage @@ -66,4 +70,7 @@ class ExposureStatusRepositoryImpl @Inject constructor( DP3T.resetExposureDays(context) preferencesRepository.setExposureAnalyticsCount(0) } + + + } \ No newline at end of file diff --git a/app/src/main/java/es/gob/radarcovid/features/information/presenter/InformationPresenterImpl.kt b/app/src/main/java/es/gob/radarcovid/features/information/presenter/InformationPresenterImpl.kt index 3bb8af3c..3524a821 100644 --- a/app/src/main/java/es/gob/radarcovid/features/information/presenter/InformationPresenterImpl.kt +++ b/app/src/main/java/es/gob/radarcovid/features/information/presenter/InformationPresenterImpl.kt @@ -45,6 +45,10 @@ class InformationPresenterImpl @Inject constructor( router.navigateToMail(text, subject, email) } + override fun onExposureRecodrClick() { + view.showExposureRecordDialog() + } + private fun updateViews(exposureInfo: ExposureInfo) { view.showRadarEnabled(exposureRadarUseCase.isRadarEnabled()) view.showBluetoothEnabled() diff --git a/app/src/main/java/es/gob/radarcovid/features/information/protocols/Protocols.kt b/app/src/main/java/es/gob/radarcovid/features/information/protocols/Protocols.kt index 142128df..d632ceaa 100644 --- a/app/src/main/java/es/gob/radarcovid/features/information/protocols/Protocols.kt +++ b/app/src/main/java/es/gob/radarcovid/features/information/protocols/Protocols.kt @@ -23,6 +23,7 @@ interface InformationView { fun showLastUpdateDate(date: Date, daysElapsed: Int, locale: String) fun showTerminalData(locale: String) + fun showExposureRecordDialog() } interface InformationPresenter { @@ -35,6 +36,8 @@ interface InformationPresenter { fun onSupportMailClick(text: String, subject: String, email: String) + fun onExposureRecodrClick() + } interface InformationRouter { diff --git a/app/src/main/java/es/gob/radarcovid/features/information/view/ExposureRecordDialog.kt b/app/src/main/java/es/gob/radarcovid/features/information/view/ExposureRecordDialog.kt new file mode 100644 index 00000000..17df7d8c --- /dev/null +++ b/app/src/main/java/es/gob/radarcovid/features/information/view/ExposureRecordDialog.kt @@ -0,0 +1,81 @@ +package es.gob.radarcovid.features.information.view + +import android.app.AlertDialog +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import dagger.android.HasAndroidInjector +import es.gob.radarcovid.R +import es.gob.radarcovid.common.extensions.toDateFormat +import es.gob.radarcovid.datamanager.repository.ExposureRecordRepository +import es.gob.radarcovid.datamanager.utils.LabelManager +import es.gob.radarcovid.models.domain.ExposureInfo +import kotlinx.android.extensions.LayoutContainer +import kotlinx.android.synthetic.main.dialog_exposure_record.* +import java.util.* +import javax.inject.Inject + +class ExposureRecordDialog(context: Context) : LayoutContainer { + + private val dialog: Dialog + + override val containerView: View = + LayoutInflater.from(context).inflate(R.layout.dialog_exposure_record, null) + + @Inject + lateinit var labelManager: LabelManager + + @Inject + lateinit var exposureRecordRepository: ExposureRecordRepository + + init { + + initializeInjector(context) + + dialog = AlertDialog.Builder(context) + .setView(containerView) + .create() + .apply { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + + buttonClose.setOnClickListener { dialog.dismiss() } + buttonCancel.setOnClickListener { dialog.dismiss() } + + } + + private fun loadRecords() { + val records = exposureRecordRepository.getExposureRecords() + var text = "" + if (records.isEmpty()) { + text = labelManager.getText( + "EXPOSURE_RECORDS_NO_DATA", + R.string.exposure_records_no_data + ).toString() + } else { + records.forEach { + text += "\u25CF " + it.lastExposureDate.toDateFormat() + "\n" + } + } + + recordContent.text = text + } + + private fun initializeInjector(context: Context) { + (context.applicationContext as? HasAndroidInjector)?.androidInjector()?.inject(this) + } + + fun show() { + dialog.show() + dialog.window?.setLayout( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + loadRecords() + } + +} \ No newline at end of file diff --git a/app/src/main/java/es/gob/radarcovid/features/information/view/InformationActivity.kt b/app/src/main/java/es/gob/radarcovid/features/information/view/InformationActivity.kt index 87265e8e..4941fab4 100644 --- a/app/src/main/java/es/gob/radarcovid/features/information/view/InformationActivity.kt +++ b/app/src/main/java/es/gob/radarcovid/features/information/view/InformationActivity.kt @@ -61,6 +61,10 @@ class InformationActivity : BaseBackNavigationActivity(), InformationView { InformationDialog(this).show() } + override fun showExposureRecordDialog() { + ExposureRecordDialog(this).show() + } + override fun showRadarEnabled(isRadarEnabled: Boolean) { if (isRadarEnabled) { val activeText = labelManager.getText( @@ -174,6 +178,9 @@ class InformationActivity : BaseBackNavigationActivity(), InformationView { buttonMaintenance.setSafeOnClickListener { presenter.onHelpButtonClick() } + buttonExposureRecord.setSafeOnClickListener { + presenter.onExposureRecodrClick() + } buttonSupportMail.setSafeOnClickListener { val mail = labelManager.getText( "INFO_TECHNICAL_HELP_EMAIL", diff --git a/app/src/main/res/layout/activity_information.xml b/app/src/main/res/layout/activity_information.xml index 015cec03..6d3e9cea 100644 --- a/app/src/main/res/layout/activity_information.xml +++ b/app/src/main/res/layout/activity_information.xml @@ -265,6 +265,21 @@ app:labelId="INFO_KEEP_RADAR_ACTIVE" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/textViewBluetoothStatus"/> + + + app:layout_constraintTop_toBottomOf="@id/buttonExposureRecord"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 75eaa445..c45e3484 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -547,5 +547,8 @@ mostrar Lugar visible ocultar + Fechas de alta exposición + Registro de fechas de exposición + No se ha registrado alta exposición \ No newline at end of file diff --git a/lazysodium-android-4.2.0/build.gradle b/lazysodium-android-4.2.0/build.gradle new file mode 100644 index 00000000..358878b3 --- /dev/null +++ b/lazysodium-android-4.2.0/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('lazysodium-android-4.2.0.aar')) \ No newline at end of file diff --git a/lazysodium-android-4.2.0/lazysodium-android-4.2.0.aar b/lazysodium-android-4.2.0/lazysodium-android-4.2.0.aar new file mode 100644 index 00000000..472388b8 Binary files /dev/null and b/lazysodium-android-4.2.0/lazysodium-android-4.2.0.aar differ diff --git a/settings.gradle b/settings.gradle index 991b8bd4..2c76cb72 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,4 +9,4 @@ */ rootProject.name='Radar COVID' -include ':app' +include ':app', ':lazysodium-android-4.2.0'