Skip to content

Commit

Permalink
Merge pull request #168 from ProteGO-Safe/release/4.10.0
Browse files Browse the repository at this point in the history
Release/4.10.0
  • Loading branch information
qLb authored Mar 30, 2021
2 parents 215a27b + 6080553 commit 4cac950
Show file tree
Hide file tree
Showing 65 changed files with 810 additions and 805 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@ Dev: ./app/src/dev/google-services.json

## ChangeLog

**4.10.0**

- Added new file storage method
- Split current JSON data to multiple smaller data files to prevent over downloading unwanted data
- Enhanced view of the app home screen, which now includes more detailed statistics on vaccination and infections
- New screen with detailed statistics and graphs on vaccination (number of people vaccinated, doses, adverse reactions) and infections (number of people infected, recovered, deaths, causes of death and tests)
- Added information on vaccination and registration rules with redirection to registration, vaccination request and helpline
- Fixed bug that occurred on Xiaomi phones with dark mode enabled
- Bump EN version to 1.8.3

**4.9.1**

- Added information on vaccination statistics in Poland
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ android {
applicationId "pl.gov.mc.protegosafe"
minSdkVersion 21
targetSdkVersion 29
versionCode 85
versionName "4.9.1"
versionCode 87
versionName "4.10.0"

setProperty("archivesBaseName", "protegosafe-${defaultConfig.versionName}-${defaultConfig.versionCode}")

Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/pl/gov/mc/protegosafe/AppRepositoryImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import pl.gov.mc.protegosafe.data.db.WorkersIntervalDataStore
import pl.gov.mc.protegosafe.data.db.realm.RealmDatabaseBuilder
import pl.gov.mc.protegosafe.data.extension.toCompletable
import pl.gov.mc.protegosafe.domain.repository.AppRepository
import pl.gov.mc.protegosafe.domain.repository.FileRepository
import timber.log.Timber
import java.util.Locale

Expand All @@ -22,6 +23,7 @@ class AppRepositoryImpl(
private val realmDatabaseBuilder: RealmDatabaseBuilder,
private val covidStatsDataStore: CovidStatsDataStore,
private val workersIntervalDataStore: WorkersIntervalDataStore,
private val fileRepository: FileRepository,
private val context: Context
) : AppRepository {
override fun getVersionName(): Single<String> {
Expand Down Expand Up @@ -54,9 +56,8 @@ class AppRepositoryImpl(

override fun clearAppData(): Completable {
return clearDatabase()
.andThen(
clearSharedPreferences()
)
.andThen(clearSharedPreferences())
.andThen(fileRepository.clearAllInternalFiles())
}

private fun clearDatabase(): Completable {
Expand Down
44 changes: 27 additions & 17 deletions app/src/main/java/pl/gov/mc/protegosafe/di/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,60 +10,65 @@ import pl.gov.mc.protegosafe.AppRepositoryImpl
import pl.gov.mc.protegosafe.domain.Notifier
import pl.gov.mc.protegosafe.domain.executor.PostExecutionThread
import pl.gov.mc.protegosafe.domain.repository.AppRepository
import pl.gov.mc.protegosafe.domain.repository.FileRepository
import pl.gov.mc.protegosafe.domain.usecase.AppReviewUseCase
import pl.gov.mc.protegosafe.domain.usecase.CancelExposureRiskUseCase
import pl.gov.mc.protegosafe.domain.usecase.ChangeServiceStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.PrepareMigrationIfRequiredUseCase
import pl.gov.mc.protegosafe.domain.usecase.CheckDeviceRootedUseCase
import pl.gov.mc.protegosafe.domain.usecase.ClearDataUseCase
import pl.gov.mc.protegosafe.domain.usecase.CloseAppUseCase
import pl.gov.mc.protegosafe.domain.usecase.ComposeAppLifecycleStateBrideDataUseCase
import pl.gov.mc.protegosafe.domain.usecase.DeleteActivitiesUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetActivitiesResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveKeysCountToAnalyzeUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetAnalyzeResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetAppVersionNameUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetCovidStatsNotificationStatusResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetCovidStatsResultAndUpdateUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetENStatsResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.UpdateDistrictsRestrictionsUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetExposureInformationUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetFontScaleUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetLocaleUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetMigrationUrlUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetRouteDataAndClearUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetServicesStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.GetTestSubscriptionStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.GetSystemLanguageUseCase
import pl.gov.mc.protegosafe.domain.usecase.HandleNewUriUseCase
import pl.gov.mc.protegosafe.domain.usecase.OnGetBridgeDataUseCase
import pl.gov.mc.protegosafe.domain.usecase.ShowPushNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.OnSetBridgeDataUseCase
import pl.gov.mc.protegosafe.domain.usecase.PrepareMigrationIfRequiredUseCase
import pl.gov.mc.protegosafe.domain.usecase.ProcessPendingActivityResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.ProvideDiagnosisKeysUseCase
import pl.gov.mc.protegosafe.domain.usecase.RescheduleProvideDiagnosisKeysTaskUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveExposureCheckActivityUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveExposureUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveRouteUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveKeysCountToAnalyzeUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveRiskCheckActivityUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveRouteUseCase
import pl.gov.mc.protegosafe.domain.usecase.SaveTriageCompletedUseCase
import pl.gov.mc.protegosafe.domain.usecase.SetAppLanguageUseCase
import pl.gov.mc.protegosafe.domain.usecase.ShowPushNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.StartExposureNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.StopExposureNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.StorePendingActivityResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.SubscribeCovidStatusTopicUseCase
import pl.gov.mc.protegosafe.domain.usecase.UpdateCovidStatsAndGetResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.UpdateCovidStatsNotificationsStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.UpdateCovidStatsUseCase
import pl.gov.mc.protegosafe.domain.usecase.UploadTemporaryExposureKeysUseCase
import pl.gov.mc.protegosafe.domain.usecase.UploadTemporaryExposureKeysWithCachedPayloadUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.GetTestSubscriptionPinUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.GetTestSubscriptionStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.UpdateTestSubscriptionStatusUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.UploadTestSubscriptionPinUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.GetDistrictsRestrictionsResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.info.UpdateDashboardIfRequiredAndGetResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.info.UpdateDashboardUseCase
import pl.gov.mc.protegosafe.domain.usecase.info.UpdateDetailsIfRequiredAndGetResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.info.UpdateTimestampsIfRequiredAndGetUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.GetSubscribedDistrictsResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.GetVoivodeshipsResultOrFetchIfRequiredUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.GetVoivodeshipsResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.HandleDistrictActionUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.NotifyDistrictsUpdatedUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.UpdateVoivodeshipsAndSyncDistrictsUseCase
import pl.gov.mc.protegosafe.domain.usecase.restrictions.UpdateVoivodeshipsIfRequiredUseCase
import pl.gov.mc.protegosafe.repository.FileRepositoryImpl
import pl.gov.mc.protegosafe.ui.MainViewModel
import pl.gov.mc.protegosafe.ui.common.NotifierImpl
import pl.gov.mc.protegosafe.ui.home.HomeViewModel
Expand All @@ -75,7 +80,8 @@ val appModule = module {
factory<PostExecutionThread> { pl.gov.mc.protegosafe.executor.PostExecutionThread() }
factory { Realm.getDefaultInstance() }
single<AppUpdateManager> { AppUpdateManagerFactory.create(androidContext()) }
single<AppRepository> { AppRepositoryImpl(get(), get(), get(), get(), get(), androidContext()) }
single<AppRepository> { AppRepositoryImpl(get(), get(), get(), get(), get(), get(), androidContext()) }
factory<FileRepository> { FileRepositoryImpl(androidContext()) }
}

val useCaseModule = module {
Expand All @@ -99,6 +105,8 @@ val useCaseModule = module {
get(),
get(),
get(),
get(),
get(),
get()
)
}
Expand Down Expand Up @@ -154,8 +162,6 @@ val useCaseModule = module {
factory { GetLocaleUseCase(get()) }
factory { GetFontScaleUseCase(get(), get(), get()) }
factory { CloseAppUseCase(get(), get()) }
factory { UpdateDistrictsRestrictionsUseCase(get(), get(), get()) }
factory { GetDistrictsRestrictionsResultUseCase(get(), get(), get()) }
factory { HandleDistrictActionUseCase(get(), get(), get()) }
factory { GetSubscribedDistrictsResultUseCase(get(), get(), get()) }
factory { NotifyDistrictsUpdatedUseCase(get(), get(), get(), get()) }
Expand All @@ -171,14 +177,19 @@ val useCaseModule = module {
factory { GetActivitiesResultUseCase(get(), get(), get()) }
factory { DeleteActivitiesUseCase(get(), get(), get()) }
factory { HandleNewUriUseCase(get(), get()) }
factory { UpdateCovidStatsUseCase(get(), get()) }
factory { GetCovidStatsResultAndUpdateUseCase(get(), get(), get()) }
factory { UpdateCovidStatsAndGetResultUseCase(get(), get(), get(), get()) }
factory { GetCovidStatsNotificationStatusResultUseCase(get(), get(), get()) }
factory { UpdateCovidStatsNotificationsStatusUseCase(get(), get(), get(), get()) }
factory { SubscribeCovidStatusTopicUseCase(get(), get()) }
factory { GetENStatsResultUseCase(get(), get(), get()) }
factory { RescheduleProvideDiagnosisKeysTaskUseCase(get(), get()) }
factory { UpdateTimestampsIfRequiredAndGetUseCase(get(), get()) }
factory { UpdateDashboardUseCase(get(), get()) }
factory { UpdateDashboardIfRequiredAndGetResultUseCase(get(), get(), get(), get()) }
factory { UpdateDetailsIfRequiredAndGetResultUseCase(get(), get(), get()) }
factory { GetVoivodeshipsResultUseCase(get(), get(), get()) }
factory { GetVoivodeshipsResultOrFetchIfRequiredUseCase(get(), get(), get(), get()) }
factory { UpdateVoivodeshipsAndSyncDistrictsUseCase(get(), get(), get()) }
factory { UpdateVoivodeshipsIfRequiredUseCase(get(), get(), get(), get()) }
}

val viewModelModule = module {
Expand All @@ -196,7 +207,6 @@ val viewModelModule = module {
get(),
get(),
get(),
get(),
get()
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package pl.gov.mc.protegosafe.repository

import android.content.Context
import io.reactivex.Completable
import io.reactivex.Single
import pl.gov.mc.protegosafe.domain.repository.FileRepository
import java.io.File

class FileRepositoryImpl(private val context: Context) : FileRepository {

/**
* Writes text to file in internal storage
*
* @param fileName File name
* @param text Text to write
*/
override fun writeInternalFile(fileName: String, text: String): Completable {
return Completable.fromAction {
val file = File(context.filesDir.path + "/$fileName")
if (file.exists().not()) {
file.createNewFile()
}
file.writeText(text)
}
}

/**
* Reads text from file in internal storage
*
* @param fileName File name
* @return File content
*/
override fun readInternalFile(fileName: String): Single<String> {
return Single.fromCallable {
val file = File(context.filesDir.path + "/$fileName")
file.readText()
}
}

/**
* Reads text from file in internal storage or returns empty string on error (eg. missing file)
*
* @param fileName File name
* @return File content or empty string
*/
override fun readInternalFileOrEmpty(fileName: String): Single<String> {
return readInternalFile(fileName).onErrorReturn { "" }
}

/**
* Removes all internal files recursively
*/
override fun clearAllInternalFiles(): Completable {
return Completable.fromAction {
context.filesDir.listFiles()?.forEach { file ->
file.deleteRecursively()
}
}
}
}
20 changes: 14 additions & 6 deletions app/src/main/java/pl/gov/mc/protegosafe/ui/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import android.view.ViewGroup
import android.webkit.ConsoleMessage
import android.webkit.SslErrorHandler
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Toast
Expand Down Expand Up @@ -127,12 +128,10 @@ class HomeFragment : BaseFragment() {
).addTo(disposables)
}

@SuppressLint("SetJavaScriptEnabled")
private fun startPwaMigration(url: String) {
binding.migrationLayout.isVisible = true
binding.webView.apply {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
applySettings()
webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
binding.webView.evaluateJavascript(DUMP_UI_COMMAND) { dump ->
Expand All @@ -145,11 +144,9 @@ class HomeFragment : BaseFragment() {
}
}

@SuppressLint("SetJavaScriptEnabled")
private fun setUpWebView() {
binding.webView.apply {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
applySettings()
webViewClient = ProteGoWebViewClient()
addJavascriptInterface(
NativeBridgeInterface(
Expand Down Expand Up @@ -183,6 +180,17 @@ class HomeFragment : BaseFragment() {
vm.javascriptCode.observe(viewLifecycleOwner, ::runJavascript)
}

@SuppressLint("SetJavaScriptEnabled")
private fun WebView.applySettings() {
settings.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
forceDark = WebSettings.FORCE_DARK_OFF
}
javaScriptEnabled = true
domStorageEnabled = true
}
}

private inner class ProteGoWebViewClient : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
return if (url.startsWith("tel:") ||
Expand Down
18 changes: 0 additions & 18 deletions app/src/main/java/pl/gov/mc/protegosafe/ui/home/HomeViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import pl.gov.mc.protegosafe.domain.usecase.OnSetBridgeDataUseCase
import pl.gov.mc.protegosafe.domain.usecase.ProcessPendingActivityResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.StartExposureNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.StorePendingActivityResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.UpdateCovidStatsAndGetResultUseCase
import pl.gov.mc.protegosafe.domain.usecase.UploadTemporaryExposureKeysWithCachedPayloadUseCase
import pl.gov.mc.protegosafe.domain.usecase.covidtest.UpdateTestSubscriptionStatusUseCase
import pl.gov.mc.protegosafe.logging.WebViewTimber
Expand All @@ -51,7 +50,6 @@ class HomeViewModel(
private val updateTestSubscriptionStatusUseCase: UpdateTestSubscriptionStatusUseCase,
private val outgoingBridgeDataResultComposer: OutgoingBridgeDataResultComposer,
private val getRouteAndClearUseCase: GetRouteDataAndClearUseCase,
private val updateCovidStatsAndGetResultUseCase: UpdateCovidStatsAndGetResultUseCase,
private val uiRequestCacheRepository: UiRequestCacheRepository
) : BaseViewModel() {

Expand Down Expand Up @@ -275,9 +273,6 @@ class HomeViewModel(
is ActionRequiredItem.AppReview -> {
_requestAppReview.postValue(Unit)
}
is ActionRequiredItem.UpdateCovidStats -> {
updateCovidStats()
}
}
}

Expand Down Expand Up @@ -345,19 +340,6 @@ class HomeViewModel(
).addTo(disposables)
}

private fun updateCovidStats() {
Timber.d("updateCovidStats")
updateCovidStatsAndGetResultUseCase.execute()
.subscribe(
{
onBridgeData(OutgoingBridgeDataType.GET_COVID_STATS.code, it)
},
{
Timber.d("updateCovidStats failed")
}
).addTo(disposables)
}

private fun retryCachedSetBridgeDataRequest(
setBridgeDataUIRequestItem: SetBridgeDataUIRequestItem
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import pl.gov.mc.protegosafe.domain.model.FcmNotificationMapper
import pl.gov.mc.protegosafe.domain.model.PushNotificationItem
import pl.gov.mc.protegosafe.domain.repository.ActivitiesRepository
import pl.gov.mc.protegosafe.domain.usecase.ShowPushNotificationUseCase
import pl.gov.mc.protegosafe.domain.usecase.UpdateCovidStatsUseCase
import pl.gov.mc.protegosafe.domain.usecase.info.UpdateDashboardUseCase

class HandleFcmNotificationWorker(
appContext: Context,
Expand All @@ -21,7 +21,7 @@ class HandleFcmNotificationWorker(
private val showPushNotificationUseCase: ShowPushNotificationUseCase by inject()
private val fcmNotificationMapper: FcmNotificationMapper by inject()
private val activitiesRepository: ActivitiesRepository by inject()
private val updateCovidStatsUseCase: UpdateCovidStatsUseCase by inject()
private val updateDashboardUseCase: UpdateDashboardUseCase by inject()

private val notificationData by lazy {
mutableMapOf<String, String>().apply {
Expand All @@ -42,7 +42,7 @@ class HandleFcmNotificationWorker(
}
}.andThen(
Completable.defer {
updateCovidStatsIfAvailable(notificationData)
updateDashboardIfAvailable(notificationData)
}
)
.toSingleDefault(Result.success())
Expand All @@ -67,10 +67,9 @@ class HandleFcmNotificationWorker(
}
}

private fun updateCovidStatsIfAvailable(notificationData: Map<String, String>): Completable {
return fcmNotificationMapper.getCovidStatsItem(notificationData)
.flatMapCompletable {
updateCovidStatsUseCase.execute(it)
}
private fun updateDashboardIfAvailable(notificationData: Map<String, String>): Completable {
return fcmNotificationMapper
.getDashboard(notificationData)
.flatMapCompletable(updateDashboardUseCase::execute)
}
}
Loading

0 comments on commit 4cac950

Please sign in to comment.