Skip to content

Commit

Permalink
Merge pull request #419 from SwissCovid/feature/summer-sleep-fixes
Browse files Browse the repository at this point in the history
Feature/summer sleep fixes
  • Loading branch information
simonroesch authored Mar 17, 2022
2 parents a476b99 + e4d0f39 commit 32c0523
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 15 deletions.
18 changes: 18 additions & 0 deletions app/src/main/java/ch/admin/bag/dp3t/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@ package ch.admin.bag.dp3t
import android.content.*
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.activity.result.ActivityResult
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import ch.admin.bag.dp3t.checkin.CheckinOverviewFragment
import ch.admin.bag.dp3t.checkin.CrowdNotifierViewModel
Expand All @@ -31,6 +33,7 @@ import ch.admin.bag.dp3t.checkin.utils.ErrorDialog
import ch.admin.bag.dp3t.checkin.utils.NotificationHelper
import ch.admin.bag.dp3t.hibernate.HibernatingInfoFragment
import ch.admin.bag.dp3t.inform.InformActivity
import ch.admin.bag.dp3t.networking.ConfigWorker
import ch.admin.bag.dp3t.networking.ConfigWorker.Companion.scheduleConfigWorkerIfOutdated
import ch.admin.bag.dp3t.onboarding.OnboardingActivityArgs
import ch.admin.bag.dp3t.onboarding.OnboardingActivityResultContract
Expand All @@ -44,6 +47,7 @@ import ch.admin.bag.dp3t.util.UrlUtil
import ch.admin.bag.dp3t.viewmodel.TracingViewModel
import ch.admin.bag.dp3t.whattodo.WtdPositiveTestFragment
import com.google.android.gms.instantapps.InstantApps
import kotlinx.coroutines.launch
import org.crowdnotifier.android.sdk.CrowdNotifier
import org.crowdnotifier.android.sdk.utils.QrUtils.*
import org.dpppt.android.sdk.DP3T
Expand Down Expand Up @@ -88,6 +92,20 @@ class MainActivity : FragmentActivity() {
}
return
}

// After the App Update, load the config immediately to check whether hibernation mode is turned on
if (secureStorage.lastConfigLoadSuccessAppVersion != BuildConfig.VERSION_CODE) {
lifecycleScope.launch {
try {
ConfigWorker.loadConfig(this@MainActivity)
if (secureStorage.isHibernating) showHibernateFragment()
} catch (e: Exception) {
Log.d("MainActivity", "Failed to load Config after App Update")
}

}
}

secureStorage.forceUpdateLiveData.observe(this) {

val forceUpdate = it && secureStorage.doForceUpdate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import ch.admin.bag.dp3t.R
import ch.admin.bag.dp3t.TabbarHostFragment
import ch.admin.bag.dp3t.databinding.FragmentHibernatingInfoBinding
import ch.admin.bag.dp3t.html.HtmlFragment
import ch.admin.bag.dp3t.storage.SecureStorage
import ch.admin.bag.dp3t.util.AssetUtil
import ch.admin.bag.dp3t.util.UrlUtil

Expand All @@ -24,8 +23,6 @@ class HibernatingInfoFragment : Fragment() {

private val viewModel: HibernatingViewModel by viewModels()

private val secureStorage by lazy { SecureStorage.getInstance(requireContext()) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return FragmentHibernatingInfoBinding.inflate(inflater).apply {

Expand All @@ -34,20 +31,19 @@ class HibernatingInfoFragment : Fragment() {
true
}

val infoBoxModel = secureStorage.hibernatingInfoboxCollection?.getInfoBox(resources.getString(R.string.language_key))

viewModel.isHibernatingModeEnabled.observe(viewLifecycleOwner) { isHibernatingModeEnabled ->
if (!isHibernatingModeEnabled) {
showHomeFragment()
}
}

infoBoxModel?.let {
viewModel.hibernatingInfoBox.observe(viewLifecycleOwner) {
title.text = it.title
text.text = it.msg
linkGroup.isVisible = it.urlTitle != null
linkText.text = it.urlTitle
linkGroup.setOnClickListener { v -> UrlUtil.openUrl(requireContext(), it.url) }

}

}.root
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import ch.admin.bag.dp3t.MainApplication
import ch.admin.bag.dp3t.R
import ch.admin.bag.dp3t.checkin.networking.CrowdNotifierKeyLoadWorker
import ch.admin.bag.dp3t.networking.ConfigWorker
import ch.admin.bag.dp3t.networking.FakeWorker
import ch.admin.bag.dp3t.networking.models.InfoBoxModel
import ch.admin.bag.dp3t.networking.models.InfoBoxModelCollection
import ch.admin.bag.dp3t.storage.SecureStorage
import ch.admin.bag.dp3t.util.NotificationRepeatWorker
import kotlinx.coroutines.launch
Expand All @@ -25,6 +28,14 @@ class HibernatingViewModel(application: Application) : AndroidViewModel(applicat
private val isHibernatingModeEnabledMutable = MutableLiveData<Boolean>()
val isHibernatingModeEnabled: LiveData<Boolean> = isHibernatingModeEnabledMutable

private val secureStorage: SecureStorage by lazy { SecureStorage.getInstance(application) }
private val languageKey = application.getString(R.string.language_key)

private val hibernatingInfoboxMutable =
MutableLiveData<InfoBoxModel>(secureStorage.hibernatingInfoboxCollection?.getInfoBox(languageKey))
val hibernatingInfoBox: LiveData<InfoBoxModel> = hibernatingInfoboxMutable


init {
loadConfig()
}
Expand All @@ -34,8 +45,9 @@ class HibernatingViewModel(application: Application) : AndroidViewModel(applicat
viewModelScope.launch {
try {
ConfigWorker.loadConfig(getApplication())
if (SecureStorage.getInstance(getApplication()).isHibernating) {
if (secureStorage.isHibernating) {
isHibernatingModeEnabledMutable.value = true
hibernatingInfoboxMutable.value = secureStorage.hibernatingInfoboxCollection?.getInfoBox(languageKey)
} else {
MainApplication.initDP3T(getApplication())
FakeWorker.safeStartFakeWorker(getApplication())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import org.dpppt.android.sdk.util.SignatureUtil
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.io.IOException
import java.lang.Exception

class ConfigRepository(context: Context) {

Expand Down Expand Up @@ -64,7 +65,13 @@ class ConfigRepository(context: Context) {
val appVersion = APP_VERSION_PREFIX_ANDROID + BuildConfig.VERSION_NAME
val osVersion = OS_VERSION_PREFIX_ANDROID + Build.VERSION.SDK_INT
val buildNumber = BuildConfig.BUILD_TIME.toString()
val enModuleVersion = DP3T.getENModuleVersion(context).toString()

//In Hibernating Mode, the DP3T Module is not initialized and therefore the ENModuleVersion cannot be accessed
val enModuleVersion = try {
DP3T.getENModuleVersion(context).toString()
} catch (e: Exception) {
""
}
val configResponse = configService.getConfig(appVersion, osVersion, buildNumber, enModuleVersion)
if (configResponse.isSuccessful) {
secureStorage.lastConfigLoadSuccess = System.currentTimeMillis()
Expand Down
19 changes: 12 additions & 7 deletions app/src/main/java/ch/admin/bag/dp3t/networking/ConfigWorker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.work.*
import ch.admin.bag.dp3t.BuildConfig
Expand Down Expand Up @@ -74,12 +75,16 @@ class ConfigWorker(context: Context, workerParams: WorkerParameters) : Coroutine
val configRepository = ConfigRepository(context)
val config = configRepository.getConfig(context)

DP3T.setMatchingParameters(
context,
config.sdkConfig.lowerThreshold, config.sdkConfig.higherThreshold,
config.sdkConfig.factorLow, config.sdkConfig.factorHigh,
config.sdkConfig.triggerThreshold
)
try {
DP3T.setMatchingParameters(
context,
config.sdkConfig.lowerThreshold, config.sdkConfig.higherThreshold,
config.sdkConfig.factorLow, config.sdkConfig.factorHigh,
config.sdkConfig.triggerThreshold
)
} catch (e: Exception) {
Log.d(TAG, "Matching paramters not set because DP3T is not initialized due to hibernating mode")
}

val secureStorage = SecureStorage.getInstance(context)
secureStorage.doForceUpdate = config.doForceUpdate
Expand Down Expand Up @@ -127,7 +132,7 @@ class ConfigWorker(context: Context, workerParams: WorkerParameters) : Coroutine
}

private fun activateHibernationState(context: Context) {
DP3T.stop(context)
if (DP3T.isInitialized()) DP3T.stop(context)
FakeWorker.stop(context)
CrowdNotifierKeyLoadWorker.stop(context)
NotificationRepeatWorker.stop(context)
Expand Down

0 comments on commit 32c0523

Please sign in to comment.