Skip to content
Snippets Groups Projects
Commit 660085c8 authored by Matthias Urhahn's avatar Matthias Urhahn
Browse files

Merge branch 'release/1.5.x' into feature/interoperability

# Conflicts:
#	Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionQRCodeScanFragment.kt
#	Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionResultPositiveOtherWarningFragment.kt
#	Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTanFragment.kt
parents 387076a2 c6cde256
No related branches found
No related tags found
No related merge requests found
Showing
with 117 additions and 130 deletions
......@@ -237,7 +237,8 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.work:work-runtime-ktx:2.3.4'
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation 'android.arch.lifecycle:extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
implementation 'androidx.annotation:annotation:1.1.0'
// DAGGER
......@@ -247,6 +248,7 @@ dependencies {
kapt 'com.google.dagger:dagger-compiler:2.28.1'
kapt 'com.google.dagger:dagger-android-processor:2.28.1'
// QR
implementation('com.journeyapps:zxing-android-embedded:4.1.0') { transitive = false }
// noinspection GradleDependency - needed for SDK 23 compatibility, in combination with com.journeyapps:zxing-android-embedded:4.1.0
......
......@@ -16,6 +16,7 @@ import de.rki.coronawarnapp.risk.TimeVariables
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.timer.TimerHelper
import de.rki.coronawarnapp.ui.doNavigate
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel
import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel
import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
......@@ -44,15 +45,14 @@ class MainFragment : Fragment() {
private val tracingViewModel: TracingViewModel by activityViewModels()
private val settingsViewModel: SettingsViewModel by activityViewModels()
private val submissionViewModel: SubmissionViewModel by activityViewModels()
private var _binding: FragmentMainBinding? = null
private val binding: FragmentMainBinding get() = _binding!!
private var binding: FragmentMainBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMainBinding.inflate(inflater)
binding = FragmentMainBinding.inflate(inflater)
binding.tracingViewModel = tracingViewModel
binding.settingsViewModel = settingsViewModel
binding.submissionViewModel = submissionViewModel
......@@ -60,11 +60,6 @@ class MainFragment : Fragment() {
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -52,6 +52,7 @@ import de.rki.coronawarnapp.storage.ExposureSummaryRepository
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
import de.rki.coronawarnapp.util.KeyFileHelper
import de.rki.coronawarnapp.util.di.AppInjector
......@@ -97,8 +98,7 @@ class TestForAPIFragment : Fragment(), InternalExposureNotificationPermissionHel
private lateinit var qrPagerAdapter: RecyclerView.Adapter<QRPagerAdapter.QRViewHolder>
// Data and View binding
private var _binding: FragmentTestForAPIBinding? = null
private val binding: FragmentTestForAPIBinding get() = _binding!!
private var binding: FragmentTestForAPIBinding by viewLifecycle()
private var lastSetCountries: List<String>? = null
......@@ -109,7 +109,7 @@ class TestForAPIFragment : Fragment(), InternalExposureNotificationPermissionHel
): View? {
// get the binding reference by inflating it with the current layout
_binding = FragmentTestForAPIBinding.inflate(inflater)
binding = FragmentTestForAPIBinding.inflate(inflater)
// set the viewmmodel variable that will be used for data binding
binding.tracingViewModel = tracingViewModel
......@@ -121,11 +121,6 @@ class TestForAPIFragment : Fragment(), InternalExposureNotificationPermissionHel
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
......
......@@ -32,6 +32,7 @@ import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.RiskLevelRepository
import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction
import de.rki.coronawarnapp.transaction.RiskLevelTransaction
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel
import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel
import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
......@@ -59,8 +60,7 @@ class TestRiskLevelCalculationFragment : Fragment() {
private val tracingViewModel: TracingViewModel by activityViewModels()
private val settingsViewModel: SettingsViewModel by activityViewModels()
private val submissionViewModel: SubmissionViewModel by activityViewModels()
private var _binding: FragmentTestRiskLevelCalculationBinding? = null
private val binding: FragmentTestRiskLevelCalculationBinding get() = _binding!!
private var binding: FragmentTestRiskLevelCalculationBinding by viewLifecycle()
// reference to the client from the Google framework with the given application context
private val exposureNotificationClient by lazy {
......@@ -72,7 +72,7 @@ class TestRiskLevelCalculationFragment : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentTestRiskLevelCalculationBinding.inflate(inflater)
binding = FragmentTestRiskLevelCalculationBinding.inflate(inflater)
binding.tracingViewModel = tracingViewModel
binding.settingsViewModel = settingsViewModel
binding.submissionViewModel = submissionViewModel
......@@ -80,11 +80,6 @@ class TestRiskLevelCalculationFragment : Fragment() {
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
......
......@@ -16,6 +16,7 @@ import de.rki.coronawarnapp.risk.TimeVariables
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.timer.TimerHelper
import de.rki.coronawarnapp.ui.doNavigate
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel
import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel
import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
......@@ -44,15 +45,14 @@ class MainFragment : Fragment() {
private val tracingViewModel: TracingViewModel by activityViewModels()
private val settingsViewModel: SettingsViewModel by activityViewModels()
private val submissionViewModel: SubmissionViewModel by activityViewModels()
private var _binding: FragmentMainBinding? = null
private val binding: FragmentMainBinding get() = _binding!!
private var binding: FragmentMainBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMainBinding.inflate(inflater)
binding = FragmentMainBinding.inflate(inflater)
binding.tracingViewModel = tracingViewModel
binding.settingsViewModel = settingsViewModel
binding.submissionViewModel = submissionViewModel
......@@ -60,11 +60,6 @@ class MainFragment : Fragment() {
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -498,7 +498,7 @@
</p>
<ul>
<li>
Benachrichtigungen zu möglicher Begegnung mit COVID-19-Infizierten
COVID-19-Benachrichtigungen
</li>
</ul>
<p>
......@@ -782,4 +782,4 @@
</p>
<p>
Stand: 12.06.2020
</p>
\ No newline at end of file
</p>
......@@ -57,8 +57,7 @@
</p>
<p>
vertreten durch den Präsidenten. Für Fragen, Beschwerden und Ansprüche im
Zusammenhang mit diesen Nutzungsbedingungen können Sie das RKI telefonisch
unter +49 30 18754-5100 und per E-Mail unter CoronaWarnApp@rki.de
Zusammenhang mit diesen Nutzungsbedingungen können Sie das RKI per E-Mail unter CoronaWarnApp@rki.de
erreichen.
</p>
<p>
......
......@@ -27,30 +27,31 @@ import de.rki.coronawarnapp.exception.http.UnsupportedMediaTypeException
import okhttp3.Interceptor
import okhttp3.Response
import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
class HttpErrorParser : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
try {
val response = chain.proceed(chain.request())
return when (val code = response.code) {
200 -> response
201 -> response
202 -> response
204 -> response
400 -> throw BadRequestException()
401 -> throw UnauthorizedException()
403 -> throw ForbiddenException()
404 -> throw NotFoundException()
409 -> throw ConflictException()
410 -> throw GoneException()
415 -> throw UnsupportedMediaTypeException()
HttpsURLConnection.HTTP_OK -> response
HttpsURLConnection.HTTP_CREATED -> response
HttpsURLConnection.HTTP_ACCEPTED -> response
HttpsURLConnection.HTTP_NO_CONTENT -> response
HttpsURLConnection.HTTP_BAD_REQUEST -> throw BadRequestException()
HttpsURLConnection.HTTP_UNAUTHORIZED -> throw UnauthorizedException()
HttpsURLConnection.HTTP_FORBIDDEN -> throw ForbiddenException()
HttpsURLConnection.HTTP_NOT_FOUND -> throw NotFoundException()
HttpsURLConnection.HTTP_CONFLICT -> throw ConflictException()
HttpsURLConnection.HTTP_GONE -> throw GoneException()
HttpsURLConnection.HTTP_UNSUPPORTED_TYPE -> throw UnsupportedMediaTypeException()
429 -> throw TooManyRequestsException()
500 -> throw InternalServerErrorException()
501 -> throw NotImplementedException()
502 -> throw BadGatewayException()
503 -> throw ServiceUnavailableException()
504 -> throw GatewayTimeoutException()
505 -> throw HTTPVersionNotSupported()
HttpsURLConnection.HTTP_INTERNAL_ERROR -> throw InternalServerErrorException()
HttpsURLConnection.HTTP_NOT_IMPLEMENTED -> throw NotImplementedException()
HttpsURLConnection.HTTP_BAD_GATEWAY -> throw BadGatewayException()
HttpsURLConnection.HTTP_UNAVAILABLE -> throw ServiceUnavailableException()
HttpsURLConnection.HTTP_GATEWAY_TIMEOUT -> throw GatewayTimeoutException()
HttpsURLConnection.HTTP_VERSION -> throw HTTPVersionNotSupported()
511 -> throw NetworkAuthenticationRequiredException()
598 -> throw NetworkReadTimeoutException()
599 -> throw NetworkConnectTimeoutException()
......
......@@ -178,7 +178,7 @@ object NotificationHelper {
*/
fun sendNotification(content: String, visibility: Int) {
if (!CoronaWarnApplication.isAppInForeground) {
sendNotification("", content, visibility)
sendNotification("", content, visibility, true)
}
}
......
......@@ -371,7 +371,7 @@ object RetrieveDiagnosisKeysTransaction : Transaction() {
exportFiles: Collection<File>,
exposureConfiguration: ExposureConfiguration?
) = executeState(API_SUBMISSION) {
if (googleAPIVersion.isAbove(GoogleAPIVersion.V16)) {
if (googleAPIVersion.isAtLeast(GoogleAPIVersion.V16)) {
InternalExposureNotificationClient.asyncProvideDiagnosisKeys(
exportFiles,
exposureConfiguration,
......
package de.rki.coronawarnapp.ui
import android.os.Handler
import android.os.Looper
import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import androidx.navigation.NavController
import androidx.navigation.NavDirections
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
/**
* Extends NavController to prevent navigation error when the user clicks on two buttons at almost
......@@ -13,3 +21,47 @@ fun NavController.doNavigate(direction: NavDirections) {
currentDestination?.getAction(direction.actionId)
?.let { navigate(direction) }
}
/**
* An extension to bind and unbind a value based on the view lifecycle of a Fragment.
* The binding will be unbound in onDestroyView.
*
* @throws IllegalStateException If the getter is invoked before the binding is set,
* or after onDestroyView an exception is thrown.
*/
fun <T> Fragment.viewLifecycle(): ReadWriteProperty<Fragment, T> {
return object : ReadWriteProperty<Fragment, T>, DefaultLifecycleObserver {
private var binding: T? = null
init {
this@viewLifecycle
.viewLifecycleOwnerLiveData
.observe(this@viewLifecycle, Observer { owner: LifecycleOwner? ->
owner?.lifecycle?.addObserver(this)
})
}
override fun onDestroy(owner: LifecycleOwner) {
val handler = Handler(Looper.getMainLooper())
handler.post {
binding = null
}
}
override fun getValue(
thisRef: Fragment,
property: KProperty<*>
): T {
return this.binding ?: error("Called before onCreateView or after onDestroyView.")
}
override fun setValue(
thisRef: Fragment,
property: KProperty<*>,
value: T
) {
this.binding = value
}
}
}
......@@ -11,6 +11,7 @@ import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentInformationAboutBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* Basic Fragment which only displays static content.
......@@ -20,23 +21,17 @@ class InformationAboutFragment : Fragment() {
private val TAG: String? = InformationAboutFragment::class.simpleName
}
private var _binding: FragmentInformationAboutBinding? = null
private val binding: FragmentInformationAboutBinding get() = _binding!!
private var binding: FragmentInformationAboutBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationAboutBinding.inflate(inflater)
binding = FragmentInformationAboutBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentInformationContactBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.util.ExternalActionHelper
/**
......@@ -19,23 +20,17 @@ class InformationContactFragment : Fragment() {
private val TAG: String? = InformationContactFragment::class.simpleName
}
private var _binding: FragmentInformationContactBinding? = null
private val binding: FragmentInformationContactBinding get() = _binding!!
private var binding: FragmentInformationContactBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationContactBinding.inflate(inflater)
binding = FragmentInformationContactBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -12,6 +12,7 @@ import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentInformationBinding
import de.rki.coronawarnapp.ui.doNavigate
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.util.ExternalActionHelper
/**
......@@ -22,23 +23,17 @@ class InformationFragment : Fragment() {
private val TAG: String? = InformationFragment::class.simpleName
}
private var _binding: FragmentInformationBinding? = null
private val binding: FragmentInformationBinding get() = _binding!!
private var binding: FragmentInformationBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationBinding.inflate(inflater)
binding = FragmentInformationBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -11,6 +11,7 @@ import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentInformationLegalBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.util.convertToHyperlink
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* Basic Fragment which only displays static content.
......@@ -20,23 +21,17 @@ class InformationLegalFragment : Fragment() {
private val TAG: String? = InformationLegalFragment::class.simpleName
}
private var _binding: FragmentInformationLegalBinding? = null
private val binding: FragmentInformationLegalBinding get() = _binding!!
private var binding: FragmentInformationLegalBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationLegalBinding.inflate(inflater)
binding = FragmentInformationLegalBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......@@ -49,8 +44,6 @@ class InformationLegalFragment : Fragment() {
private fun setUpContactFormLinks() {
binding.informationLegalContactForm.informationLegalContactForm
.convertToHyperlink(getString(R.string.information_legal_subtitle_contact_url))
binding.informationLegalContactForm.informationLegalContactForm
.movementMethod = LinkMovementMethod.getInstance()
binding.informationLegalContactForm.informationLegalContactFormNonEnDe
.movementMethod = LinkMovementMethod.getInstance()
}
......
......@@ -8,6 +8,7 @@ import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.databinding.FragmentInformationPrivacyBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* Basic Fragment which only displays static content.
......@@ -17,23 +18,17 @@ class InformationPrivacyFragment : Fragment() {
private val TAG: String? = InformationPrivacyFragment::class.simpleName
}
private var _binding: FragmentInformationPrivacyBinding? = null
private val binding: FragmentInformationPrivacyBinding get() = _binding!!
private var binding: FragmentInformationPrivacyBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationPrivacyBinding.inflate(inflater)
binding = FragmentInformationPrivacyBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -8,6 +8,7 @@ import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.databinding.FragmentInformationTechnicalBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* Basic Fragment which only displays static content.
......@@ -17,23 +18,17 @@ class InformationTechnicalFragment : Fragment() {
private val TAG: String? = InformationTechnicalFragment::class.simpleName
}
private var _binding: FragmentInformationTechnicalBinding? = null
private val binding: FragmentInformationTechnicalBinding get() = _binding!!
private var binding: FragmentInformationTechnicalBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationTechnicalBinding.inflate(inflater)
binding = FragmentInformationTechnicalBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -8,6 +8,7 @@ import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.databinding.FragmentInformationTermsBinding
import de.rki.coronawarnapp.ui.main.MainActivity
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* Basic Fragment which only displays static content.
......@@ -17,23 +18,17 @@ class InformationTermsFragment : Fragment() {
private val TAG: String? = InformationTermsFragment::class.simpleName
}
private var _binding: FragmentInformationTermsBinding? = null
private val binding: FragmentInformationTermsBinding get() = _binding!!
private var binding: FragmentInformationTermsBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentInformationTermsBinding.inflate(inflater)
binding = FragmentInformationTermsBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -7,6 +7,7 @@ import android.view.ViewGroup
import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.databinding.FragmentMainOverviewBinding
import de.rki.coronawarnapp.ui.viewLifecycle
/**
* The fragment displays static informative content to the user
......@@ -21,23 +22,17 @@ class MainOverviewFragment : Fragment() {
private val TAG: String? = MainOverviewFragment::class.simpleName
}
private var _binding: FragmentMainOverviewBinding? = null
private val binding: FragmentMainOverviewBinding get() = _binding!!
private var binding: FragmentMainOverviewBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMainOverviewBinding.inflate(inflater)
binding = FragmentMainOverviewBinding.inflate(inflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
......@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentMainShareBinding
import de.rki.coronawarnapp.ui.viewLifecycle
import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel
import de.rki.coronawarnapp.util.ExternalActionHelper
......@@ -24,25 +25,19 @@ class MainShareFragment : Fragment() {
}
private val tracingViewModel: TracingViewModel by activityViewModels()
private var _binding: FragmentMainShareBinding? = null
private val binding: FragmentMainShareBinding get() = _binding!!
private var binding: FragmentMainShareBinding by viewLifecycle()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMainShareBinding.inflate(inflater)
binding = FragmentMainShareBinding.inflate(inflater)
binding.tracingViewModel = tracingViewModel
binding.lifecycleOwner = this
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setButtonOnClickListener()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment