diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index a7429a68792850ee457cd7de0e2208d578015458..adaafd4b5e9a017e4b03e10911518b51c8784ccf 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -325,7 +325,6 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-process:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0' - implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' implementation 'androidx.annotation:annotation:1.1.0' @@ -350,7 +349,7 @@ dependencies { implementation 'com.google.zxing:core:3.3.0' //ENA - implementation files('libs\\play-services-nearby-exposurenotification-1.7.2-eap.aar') + implementation files('libs/play-services-nearby-exposurenotification-1.7.2-eap.aar') // Testing testImplementation "androidx.arch.core:core-testing:2.1.0" diff --git a/Corona-Warn-App/config/detekt.yml b/Corona-Warn-App/config/detekt.yml index d63c3db9e9a17da3cef328daff128d236a51d5f4..7c3834307a4630d7af33e04d949f47a6436c1449 100644 --- a/Corona-Warn-App/config/detekt.yml +++ b/Corona-Warn-App/config/detekt.yml @@ -77,7 +77,7 @@ complexity: threshold: 600 LongMethod: active: true - threshold: 60 + threshold: 120 LongParameterList: active: true functionThreshold: 6 diff --git a/Corona-Warn-App/src/deviceForTesters/AndroidManifest.xml b/Corona-Warn-App/src/deviceForTesters/AndroidManifest.xml deleted file mode 100644 index ca1b20da31c951adc75614ac532bda6681a4d23e..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - tools:ignore="LockedOrientationActivity" - package="de.rki.coronawarnapp"> - - <application> - - <provider - android:name="androidx.core.content.FileProvider" - android:authorities="${applicationId}.fileProvider" - android:exported="false" - android:grantUriPermissions="true"> - <meta-data - android:name="android.support.FILE_PROVIDER_PATHS" - android:resource="@xml/provider_paths"/> - </provider> - - </application> - -</manifest> \ No newline at end of file diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt index be1e35256019f7d1f03f72ebc5618e637af03028..91d9cbe9653ce277f5adaee0642fc5fe6e8159be 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt @@ -25,7 +25,6 @@ import timber.log.Timber import java.io.File import javax.inject.Inject -@Suppress("LongMethod") class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_level_calculation), AutoInject { private val navArgs by navArgs<TestRiskLevelCalculationFragmentArgs>() diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/tasks/ui/TestTaskControllerFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/tasks/ui/TestTaskControllerFragment.kt index c990c6980263ead1aa8bbdcfcb466edea665be66..13ccbc2e9a73f15b4bd2b52bcbe143d9d879022b 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/tasks/ui/TestTaskControllerFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/tasks/ui/TestTaskControllerFragment.kt @@ -16,7 +16,6 @@ import de.rki.coronawarnapp.util.viewmodel.cwaViewModels import javax.inject.Inject @SuppressLint("SetTextI18n") -@Suppress("LongMethod") class TestTaskControllerFragment : Fragment(R.layout.fragment_test_task_controller), AutoInject { @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_appconfig.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_appconfig.xml index 3ee3624e066e0db6bbea840ab21aa0498b8bf968..6727ba4838a99fcfa548f7958fb6a17381a11007 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_appconfig.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_appconfig.xml @@ -14,7 +14,7 @@ android:paddingBottom="32dp"> <LinearLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -74,7 +74,7 @@ </LinearLayout> <LinearLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -93,7 +93,7 @@ </LinearLayout> <LinearLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -109,4 +109,4 @@ </LinearLayout> </LinearLayout> -</androidx.core.widget.NestedScrollView> \ No newline at end of file +</androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_contact_diary.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_contact_diary.xml index c288be592188370f1485e593f8f7cd5f5bbffff1..248f44fa2b398f89f1a4a9b01e3de69116927664 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_contact_diary.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_contact_diary.xml @@ -15,7 +15,7 @@ android:paddingBottom="32dp"> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -76,7 +76,7 @@ <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> @@ -124,7 +124,7 @@ <View android:id="@+id/divider_top" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_small" android:background="@color/colorHairline" @@ -166,7 +166,7 @@ <View android:id="@+id/divider_bottom" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_small" android:background="@color/colorHairline" @@ -196,7 +196,7 @@ </androidx.constraintlayout.widget.ConstraintLayout> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> @@ -223,4 +223,4 @@ </androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout> -</androidx.core.widget.NestedScrollView> \ No newline at end of file +</androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_debugoptions.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_debugoptions.xml index bd1eeb247b6ff2ef4c04476c71df6cdda8331671..92afdbf89c73d87c4cff4ea27b794c145db9a5c9 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_debugoptions.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_debugoptions.xml @@ -17,7 +17,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/debug_container" - style="@style/card" + style="@style/Card" android:layout_margin="@dimen/spacing_tiny" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -57,7 +57,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/environment_container" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_deviceinfo.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_deviceinfo.xml index f7d6edb921beddf7576b23566c92329b50ee9472..4bdea42d327f82034846f46e5535f53d7f1b7af4 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_deviceinfo.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_deviceinfo.xml @@ -16,7 +16,7 @@ android:orientation="vertical"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/gms_container" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> @@ -57,7 +57,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/tracing_container" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_keydownload.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_keydownload.xml index 7c160bde79a9c55807e3402cc0fae18afca6accd..8140fa2cbc54b5dadbd4998342ed00092755ae04 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_keydownload.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_keydownload.xml @@ -15,7 +15,7 @@ android:paddingBottom="32dp"> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -85,4 +85,4 @@ android:layout_height="match_parent" /> </LinearLayout> -</androidx.core.widget.NestedScrollView> \ No newline at end of file +</androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml index 53f6d063c81c02e75a511b14d16a688096eddbac..d91080a772c9a4a9c1b7b8324ab773d993999a74 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml @@ -16,7 +16,7 @@ <LinearLayout android:id="@+id/environment_container" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_submission.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_submission.xml index e7ee015dbe4e09484590e7910a9e8df7cc2bdff2..2bcf0b827e69d49351dce960a513fc6e08de3661 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_submission.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_submission.xml @@ -15,7 +15,7 @@ android:paddingBottom="32dp"> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -67,7 +67,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/tek_history" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny"> @@ -140,4 +140,4 @@ </androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout> -</androidx.core.widget.NestedScrollView> \ No newline at end of file +</androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_task_controller.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_task_controller.xml index 78caeca3b37a62175a5ee21233ffd72ce5d39e26..190f14bca25945809f47729f536dd068e7650cc1 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_task_controller.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_task_controller.xml @@ -15,7 +15,7 @@ android:orientation="vertical"> <LinearLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -40,7 +40,7 @@ </LinearLayout> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -92,7 +92,7 @@ android:layout_height="wrap_content" /> <LinearLayout - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -115,4 +115,4 @@ </LinearLayout> </LinearLayout> -</androidx.core.widget.NestedScrollView> \ No newline at end of file +</androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/view_crashreport_list_item.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/view_crashreport_list_item.xml index d820d54e752ee1ab99c20c29f5fcf07054638567..a301fc4ec15a1ed76dc32162324ebe40725e5777 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/view_crashreport_list_item.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/view_crashreport_list_item.xml @@ -25,7 +25,7 @@ android:paddingBottom="2dp"> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/card" + style="@style/Card" android:layout_width="390dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_tiny" @@ -45,7 +45,7 @@ <TextView android:id="@+id/textViewCrashReportDate" style="@style/body1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:text="@{crashReportDateFormatted}" @@ -71,4 +71,4 @@ </androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/deviceForTesters/res/xml/provider_paths.xml b/Corona-Warn-App/src/deviceForTesters/res/xml/provider_paths.xml deleted file mode 100644 index b6522dfad14436380412cde73b661d34d7a1eef7..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/res/xml/provider_paths.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<paths xmlns:android="http://schemas.android.com/apk/res/android"> - <cache-path name="share" path="share/" /> -</paths> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/AndroidManifest.xml b/Corona-Warn-App/src/main/AndroidManifest.xml index 3c07d693f697985e7f84e98b531026292c0e7a3f..e058ffe9572563a9836bc3a95bbd28d58ef59c67 100644 --- a/Corona-Warn-App/src/main/AndroidManifest.xml +++ b/Corona-Warn-App/src/main/AndroidManifest.xml @@ -80,9 +80,19 @@ android:name=".contactdiary.ui.ContactDiaryActivity" android:exported="false" android:screenOrientation="portrait" - android:launchMode= "singleTop" + android:launchMode="singleTop" android:theme="@style/AppTheme.ContactDiary" - android:windowSoftInputMode="adjustResize"/> + android:windowSoftInputMode="adjustResize" /> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.fileProvider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/provider_paths" /> + </provider> </application> diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt index 4fbdaee7f79dd4a70673342ce99917152ada406b..4f4b34c525793543e636095751b7bb953b9bcb2a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt @@ -66,6 +66,8 @@ class CoronaWarnApplication : Application(), HasAndroidInjector { Timber.v("onCreate(): Initializing Dagger") AppInjector.init(this) + CWADebug.initAfterInjection(component) + Timber.plant(rollingLogHistory) Timber.v("onCreate(): WorkManager setup done: $workManager") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReportingSharedModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReportingSharedModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..99c18ab32dd265ee969d06385ec1af369b7caa22 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReportingSharedModule.kt @@ -0,0 +1,22 @@ +package de.rki.coronawarnapp.bugreporting + +import dagger.Module +import dagger.Provides +import de.rki.coronawarnapp.bugreporting.censors.BugCensor +import de.rki.coronawarnapp.bugreporting.censors.RegistrationTokenCensor +import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger +import javax.inject.Singleton + +@Module +class BugReportingSharedModule { + + @Singleton + @Provides + fun debugLogger() = DebugLogger + + @Singleton + @Provides + fun censors( + registrationTokenCensor: RegistrationTokenCensor + ): List<BugCensor> = listOf(registrationTokenCensor) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/BugCensor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/BugCensor.kt new file mode 100644 index 0000000000000000000000000000000000000000..e9c2c69eaecdf5f9b85ad5e321db0af8cc6bcb33 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/BugCensor.kt @@ -0,0 +1,11 @@ +package de.rki.coronawarnapp.bugreporting.censors + +import de.rki.coronawarnapp.bugreporting.debuglog.LogLine + +interface BugCensor { + + /** + * If there is something to censor a new log line is returned, otherwise returns null + */ + fun checkLog(entry: LogLine): LogLine? +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensor.kt new file mode 100644 index 0000000000000000000000000000000000000000..5832e2f6f7965c1c7cc7f0427e23210201d904b6 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensor.kt @@ -0,0 +1,23 @@ +package de.rki.coronawarnapp.bugreporting.censors + +import dagger.Reusable +import de.rki.coronawarnapp.bugreporting.debuglog.LogLine +import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.util.CWADebug +import javax.inject.Inject +import kotlin.math.min + +@Reusable +class RegistrationTokenCensor @Inject constructor() : BugCensor { + override fun checkLog(entry: LogLine): LogLine? { + val token = LocalData.registrationToken() ?: return null + if (!entry.message.contains(token)) return null + + val replacement = if (CWADebug.isDeviceForTestersBuild) { + token + } else { + token.substring(0, min(4, token.length)) + "###-####-####-####-############" + } + return entry.copy(message = entry.message.replace(token, replacement)) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogTree.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogTree.kt new file mode 100644 index 0000000000000000000000000000000000000000..68dc7f45181883d2907138e228231a228866675b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogTree.kt @@ -0,0 +1,34 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import timber.log.Timber + +class DebugLogTree : Timber.DebugTree() { + + private val logLinesPub = MutableSharedFlow<LogLine>( + replay = 128, + extraBufferCapacity = 1024, + onBufferOverflow = BufferOverflow.DROP_OLDEST + ) + val logLines: Flow<LogLine> = logLinesPub + + init { + Timber.tag(TAG).d("init()") + } + + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + LogLine( + timestamp = System.currentTimeMillis(), + priority = priority, + tag = tag, + message = message, + throwable = t + ).also { logLinesPub.tryEmit(it) } + } + + companion object { + private const val TAG = "DebugLogTree" + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogger.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogger.kt new file mode 100644 index 0000000000000000000000000000000000000000..2cdd042ea0c4f9e160ff32fb0896dd0ecc8e0653 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLogger.kt @@ -0,0 +1,166 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.util.Log +import de.rki.coronawarnapp.util.di.ApplicationComponent +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.yield +import timber.log.Timber +import java.io.File + +@SuppressLint("LogNotTimber") +@Suppress("BlockingMethodInNonBlockingContext") +object DebugLogger : DebugLoggerBase() { + + private val scope = DebugLoggerScope + private lateinit var context: Context + + private val debugDir by lazy { + File(context.cacheDir, "debuglog").also { + if (!it.exists()) it.mkdir() + } + } + + private val triggerFile by lazy { File(debugDir, "debug.trigger") } + + internal val runningLog by lazy { File(debugDir, "debug.log") } + val sharedDirectory by lazy { File(debugDir, "shared") } + + private val mutex = Mutex() + + private var logJob: Job? = null + private var logTree: DebugLogTree? = null + private var isDaggerReady = false + + fun init(application: Application) { + context = application + + try { + if (triggerFile.exists()) { + Timber.tag(TAG).i("Trigger file exists, starting debug log.") + runBlocking { start() } + } + } catch (e: Exception) { + // This is called from Application.onCreate() never crash here. + Timber.tag(TAG).e(e, "DebugLogger init(%s) failed.", application) + } + } + + /** + * To censor unique data, we need to actually know what to censor. + * So we buffer log statements until Dagger is ready + */ + fun setInjectionIsReady(component: ApplicationComponent) { + Timber.tag(TAG).i("setInjectionIsReady()") + component.inject(this) + isDaggerReady = true + } + + val isLogging: Boolean + get() = logJob?.isActive == true + + suspend fun start(): Unit = mutex.withLock { + Timber.tag(TAG).d("start()") + + if (isLogging) { + Timber.tag(TAG).w("Ignoring start(), already running.") + return@withLock + } + + logJob?.cancel() + logTree?.let { Timber.uproot(it) } + + DebugLogTree().apply { + Timber.plant(this) + logTree = this + + if (!runningLog.exists()) { + runningLog.parentFile?.mkdirs() + if (runningLog.createNewFile()) { + Timber.tag(TAG).i("Log file didn't exist and was created.") + } + } + + logJob = scope.launch { + try { + logLines.collect { rawLine -> + while (!isDaggerReady) { + yield() + } + val censoredLine = bugCensors.get().mapNotNull { it.checkLog(rawLine) }.firstOrNull() + appendLogLine(censoredLine ?: rawLine) + } + } catch (e: CancellationException) { + Timber.tag(TAG).i("Logging was canceled.") + } catch (e: Exception) { + Log.e(TAG, "Failed to call appendLogLine(...)", e) + } + } + } + + if (!triggerFile.exists()) { + Timber.tag(TAG).i("Trigger file created.") + triggerFile.createNewFile() + } + } + + suspend fun stop() = mutex.withLock { + Timber.tag(TAG).i("stop()") + + if (triggerFile.exists() && triggerFile.delete()) { + Timber.tag(TAG).d("Trigger file deleted.") + } + + logTree?.let { + Timber.tag(TAG).d("LogTree uprooted.") + Timber.uproot(it) + } + logTree = null + + logJob?.let { + Timber.tag(TAG).d("LogJob canceled.") + it.cancel() + it.join() + } + logJob = null + + if (runningLog.exists() && runningLog.delete()) { + Timber.tag(TAG).d("Log file was deleted.") + } + + clearSharedFiles() + } + + private fun appendLogLine(line: LogLine) { + val formattedLine = line.format(context) + runningLog.appendText(formattedLine, Charsets.UTF_8) + } + + fun getLogSize(): Long = runningLog.length() + + fun getShareSize(): Long = sharedDirectory.listFiles() + ?.fold(0L) { prev, file -> prev + file.length() } + ?: 0L + + fun clearSharedFiles() { + if (!sharedDirectory.exists()) return + + sharedDirectory.listFiles()?.forEach { + if (it.delete()) { + Timber.tag(TAG).d("Deleted shared file: %s", it) + } else { + Timber.tag(TAG).w("Failed to delete shared file: %s", it) + } + } + } + + private const val TAG = "DebugLogger" +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerBase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerBase.kt new file mode 100644 index 0000000000000000000000000000000000000000..ee056fbd562c4e613e63aac0f8fd60173f38249b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerBase.kt @@ -0,0 +1,12 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import de.rki.coronawarnapp.bugreporting.censors.BugCensor +import javax.inject.Inject + +/** + * Workaround for dagger injection into kotlin objects + */ +@Suppress("UnnecessaryAbstractClass") +abstract class DebugLoggerBase { + @Inject internal lateinit var bugCensors: dagger.Lazy<List<BugCensor>> +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerScope.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerScope.kt new file mode 100644 index 0000000000000000000000000000000000000000..4943b1f113c5861b9a3b46247acc138b24acf92e --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerScope.kt @@ -0,0 +1,23 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import de.rki.coronawarnapp.util.threads.NamedThreadFactory +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors +import javax.inject.Qualifier +import javax.inject.Singleton +import kotlin.coroutines.CoroutineContext + +@Singleton +object DebugLoggerScope : CoroutineScope { + val dispatcher = Executors.newSingleThreadExecutor( + NamedThreadFactory("DebugLogger") + ).asCoroutineDispatcher() + override val coroutineContext: CoroutineContext = SupervisorJob() + dispatcher +} + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class AppScope diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/LogLine.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/LogLine.kt new file mode 100644 index 0000000000000000000000000000000000000000..bbc527eee8dc99d4235407073c5e787cd2145c5d --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/LogLine.kt @@ -0,0 +1,28 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import android.content.Context +import android.util.Log +import org.joda.time.Instant + +data class LogLine( + val timestamp: Long, + val priority: Int, + val tag: String?, + val message: String, + val throwable: Throwable? +) { + + fun format(context: Context): String { + val time = Instant.ofEpochMilli(timestamp) + return "$time ${priorityLabel(priority)}/$tag: $message\n" + } + + private fun priorityLabel(priority: Int): String = when (priority) { + Log.ERROR -> "E" + Log.WARN -> "W" + Log.INFO -> "I" + Log.DEBUG -> "D" + Log.VERBOSE -> "V" + else -> priority.toString() + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..def69cfa0727f9ec0c22fbdfad50849ca48e38ac --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt @@ -0,0 +1,62 @@ +package de.rki.coronawarnapp.bugreporting.debuglog.ui + +import android.os.Bundle +import android.text.format.Formatter +import android.view.View +import android.widget.Toast +import androidx.core.view.isGone +import androidx.fragment.app.Fragment +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.BugreportingDebuglogFragmentBinding +import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.ui.observe2 +import de.rki.coronawarnapp.util.ui.popBackStack +import de.rki.coronawarnapp.util.ui.viewBindingLazy +import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider +import de.rki.coronawarnapp.util.viewmodel.cwaViewModels +import javax.inject.Inject + +class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), AutoInject { + + @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory + private val vm: DebugLogViewModel by cwaViewModels { viewModelFactory } + private val binding: BugreportingDebuglogFragmentBinding by viewBindingLazy() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + vm.state.observe2(this) { + binding.apply { + debuglogActivityIndicator.isGone = !it.isRecording + debuglogStatusPrimary.text = getString( + if (it.isRecording) R.string.debugging_debuglog_status_recording + else R.string.debugging_debuglog_status_not_recording + ) + debuglogStatusSecondary.text = getString( + R.string.debugging_debuglog_status_additional_infos, + Formatter.formatFileSize(context, it.currentSize) + ) + toggleRecording.text = getString( + if (it.isRecording) R.string.debugging_debuglog_action_stop_recording + else R.string.debugging_debuglog_action_start_recording + ) + shareRecording.isEnabled = it.currentSize > 0L && !it.sharingInProgress + toggleRecording.isEnabled = !it.sharingInProgress + } + } + + vm.errorEvent.observe2(this) { + Toast.makeText(requireContext(), it.toString(), Toast.LENGTH_LONG).show() + } + + vm.shareEvent.observe2(this) { + startActivity(it.get(requireActivity())) + } + + binding.apply { + toggleRecording.setOnClickListener { vm.toggleRecording() } + shareRecording.setOnClickListener { vm.shareRecording() } + toolbar.setNavigationOnClickListener { popBackStack() } + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragmentModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragmentModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..11725335abd04709340bc9f82ebedba55b01d473 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragmentModule.kt @@ -0,0 +1,20 @@ +package de.rki.coronawarnapp.bugreporting.debuglog.ui + +import dagger.Binds +import dagger.Module +import dagger.android.ContributesAndroidInjector +import dagger.multibindings.IntoMap +import de.rki.coronawarnapp.util.viewmodel.CWAViewModel +import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory +import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey + +@Module +abstract class DebugLogFragmentModule { + @Binds + @IntoMap + @CWAViewModelKey(DebugLogViewModel::class) + abstract fun onboardingNotificationsVM(factory: DebugLogViewModel.Factory): CWAViewModelFactory<out CWAViewModel> + + @ContributesAndroidInjector + abstract fun debuglogFragment(): DebugLogFragment +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..027a0793c78a9ddf22a4b8fce44172235f6daa65 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt @@ -0,0 +1,115 @@ +package de.rki.coronawarnapp.bugreporting.debuglog.ui + +import androidx.lifecycle.LiveData +import androidx.lifecycle.asLiveData +import com.squareup.inject.assisted.AssistedInject +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger +import de.rki.coronawarnapp.nearby.ENFClient +import de.rki.coronawarnapp.util.CWADebug +import de.rki.coronawarnapp.util.TimeStamper +import de.rki.coronawarnapp.util.compression.Zipper +import de.rki.coronawarnapp.util.coroutine.DispatcherProvider +import de.rki.coronawarnapp.util.sharing.FileSharing +import de.rki.coronawarnapp.util.ui.SingleLiveEvent +import de.rki.coronawarnapp.util.viewmodel.CWAViewModel +import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flow +import org.joda.time.format.DateTimeFormat +import timber.log.Timber +import java.io.File + +class DebugLogViewModel @AssistedInject constructor( + private val debugLogger: DebugLogger, + dispatcherProvider: DispatcherProvider, + private val timeStamper: TimeStamper, + private val fileSharing: FileSharing, + private val enfClient: ENFClient +) : CWAViewModel(dispatcherProvider = dispatcherProvider) { + private val ticker = flow { + while (true) { + emit(Unit) + delay(500) + } + } + private val manualTick = MutableStateFlow(Unit) + private val sharingInProgress = MutableStateFlow(false) + val state: LiveData<State> = combine(ticker, manualTick, sharingInProgress) { _, _, sharingInProgress -> + State( + isRecording = debugLogger.isLogging, + currentSize = debugLogger.getLogSize() + debugLogger.getShareSize(), + sharingInProgress = sharingInProgress + ) + }.asLiveData(context = dispatcherProvider.Default) + + val errorEvent = SingleLiveEvent<Throwable>() + val shareEvent = SingleLiveEvent<FileSharing.ShareIntentProvider>() + + fun toggleRecording() = launch { + try { + if (debugLogger.isLogging) { + debugLogger.stop() + } else { + debugLogger.start() + printExtendedLogInfos() + } + } catch (e: Exception) { + errorEvent.postValue(e) + } finally { + manualTick.value = Unit + } + } + + private suspend fun printExtendedLogInfos() { + CWADebug.logDeviceInfos() + try { + val enfVersion = enfClient.getENFClientVersion() + Timber.tag("ENFClient").i("ENF Version: %d", enfVersion) + } catch (e: Exception) { + Timber.tag("ENFClient").e(e, "Failed to get ENF version for debug log.") + } + } + + fun shareRecording() { + sharingInProgress.value = true + launch { + try { + debugLogger.clearSharedFiles() + + val now = timeStamper.nowUTC + val formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS") + val formattedFileName = "CWA Log ${now.toString(formatter)}" + val zipFile = File(debugLogger.sharedDirectory, "$formattedFileName.zip") + + Zipper(zipFile).zip( + listOf(Zipper.Entry(name = "$formattedFileName.txt", path = debugLogger.runningLog)) + ) + + val intentProvider = fileSharing.getIntentProvider( + path = zipFile, + title = zipFile.name, + chooserTitle = R.string.debugging_debuglog_sharing_dialog_title + ) + + shareEvent.postValue(intentProvider) + } catch (e: Exception) { + Timber.e(e, "Sharing debug log failed.") + errorEvent.postValue(e) + } finally { + sharingInProgress.value = false + } + } + } + + data class State( + val isRecording: Boolean, + val sharingInProgress: Boolean = false, + val currentSize: Long = 0 + ) + + @AssistedInject.Factory + interface Factory : SimpleCWAViewModelFactory<DebugLogViewModel> +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt index 3e0ec3ea911f726355e3afef50eb4aa90f16bbe5..78ff94aa01a3af64f4036d54b4e8daeb14cc1321 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryLocation.kt @@ -2,6 +2,8 @@ package de.rki.coronawarnapp.contactdiary.model data class DefaultContactDiaryLocation( override val locationId: Long = 0L, - override var locationName: String, - override val stableId: Long = locationId -) : ContactDiaryLocation + override var locationName: String +) : ContactDiaryLocation { + override val stableId: Long + get() = locationId +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt index 1d0188925b5baef305ba5aeccc702971cfa4ac01..911bd939bfc14b4fbdebc634d6ccdaf11bf68d7e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/model/DefaultContactDiaryPerson.kt @@ -2,6 +2,8 @@ package de.rki.coronawarnapp.contactdiary.model data class DefaultContactDiaryPerson( override val personId: Long = 0L, - override var fullName: String, - override val stableId: Long = personId -) : ContactDiaryPerson + override var fullName: String +) : ContactDiaryPerson { + override val stableId: Long + get() = personId +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt index 42349daa6e6170199ce52d9032151af796c309b4..2301d5682a6ac8ad115851d100dad35ab47c1f2e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayFragment.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.contactdiary.ui.day import android.os.Bundle import android.view.View +import android.view.accessibility.AccessibilityEvent import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import com.google.android.material.tabs.TabLayoutMediator @@ -61,9 +62,11 @@ class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), A } } - viewModel.uiState.observe2(this) { - binding.contactDiaryDayHeader.title = it.dayText(requireContext()) - binding.contentContainer.contentDescription = it.dayText(requireContext()) + viewModel.uiState.observe2(this) { uiState -> + binding.contactDiaryDayHeader.apply { + title = uiState.dayText(context) + contentDescription = uiState.dayTextContentDescription(context) + } } viewModel.routeToScreen.observe2(this) { @@ -84,4 +87,9 @@ class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), A } } } + + override fun onResume() { + super.onResume() + binding.contentContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt index d7312158100c45b10934a2b669b0d6c473bd1811..82b5775e5401e38f438399d8944f5e08b2417021 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt @@ -7,6 +7,7 @@ import com.squareup.inject.assisted.AssistedInject import de.rki.coronawarnapp.contactdiary.ui.day.tabs.ContactDiaryDayTab import de.rki.coronawarnapp.contactdiary.util.getLocale import de.rki.coronawarnapp.contactdiary.util.toFormattedDay +import de.rki.coronawarnapp.contactdiary.util.toFormattedDayForAccessibility import de.rki.coronawarnapp.ui.SingleLiveEvent import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.viewmodel.CWAViewModel @@ -24,7 +25,9 @@ class ContactDiaryDayViewModel @AssistedInject constructor( val routeToScreen: SingleLiveEvent<ContactDiaryDayNavigationEvents> = SingleLiveEvent() val uiState = displayedDay.map { day -> - UIState(dayText = { day.toFormattedDay(it.getLocale()) }) + UIState( + dayText = { day.toFormattedDay(it.getLocale()) }, + dayTextContentDescription = { day.toFormattedDayForAccessibility(it.getLocale()) }) }.asLiveData() fun onCreateButtonClicked(activeTab: ContactDiaryDayTab) { @@ -41,7 +44,8 @@ class ContactDiaryDayViewModel @AssistedInject constructor( } data class UIState( - val dayText: (Context) -> String + val dayText: (Context) -> String, + val dayTextContentDescription: (Context) -> String ) @AssistedInject.Factory diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/location/ContactDiaryLocationListAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/location/ContactDiaryLocationListAdapter.kt index 53ad1fa2d41f1b8a20164d6fa8531dc1727f420b..0e1dbfd1a8eeff1a8d3e3966d9351238d906485b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/location/ContactDiaryLocationListAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/location/ContactDiaryLocationListAdapter.kt @@ -4,25 +4,19 @@ import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent import de.rki.coronawarnapp.R import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation +import de.rki.coronawarnapp.contactdiary.util.AbstractAdapter import de.rki.coronawarnapp.contactdiary.util.SelectableItem import de.rki.coronawarnapp.contactdiary.util.setClickLabel import de.rki.coronawarnapp.databinding.ContactDiaryLocationListItemBinding import de.rki.coronawarnapp.ui.lists.BaseAdapter import de.rki.coronawarnapp.util.lists.BindableVH import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer -class ContactDiaryLocationListAdapter( +internal class ContactDiaryLocationListAdapter( private val onTappedCallback: (item: SelectableItem<ContactDiaryLocation>) -> Unit -) : BaseAdapter<ContactDiaryLocationListAdapter.CachedLocationViewHolder>(), +) : AbstractAdapter<SelectableItem<ContactDiaryLocation>, ContactDiaryLocationListAdapter.CachedLocationViewHolder>(), AsyncDiffUtilAdapter<SelectableItem<ContactDiaryLocation>> { - override val asyncDiffer: AsyncDiffer<SelectableItem<ContactDiaryLocation>> = AsyncDiffer(this) - - override fun getItemCount(): Int = data.size - - override fun getItemId(position: Int): Long = data[position].stableId - override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): CachedLocationViewHolder = CachedLocationViewHolder(parent) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/person/ContactDiaryPersonListAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/person/ContactDiaryPersonListAdapter.kt index f8142cb31790c510697b750316d50e77c200de9c..d45e619471ab3b4f4513ac93c16b6ea7120be981 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/person/ContactDiaryPersonListAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/tabs/person/ContactDiaryPersonListAdapter.kt @@ -4,25 +4,19 @@ import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent import de.rki.coronawarnapp.R import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson +import de.rki.coronawarnapp.contactdiary.util.AbstractAdapter import de.rki.coronawarnapp.contactdiary.util.SelectableItem import de.rki.coronawarnapp.contactdiary.util.setClickLabel import de.rki.coronawarnapp.databinding.ContactDiaryPersonListItemBinding import de.rki.coronawarnapp.ui.lists.BaseAdapter import de.rki.coronawarnapp.util.lists.BindableVH import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer -class ContactDiaryPersonListAdapter( +internal class ContactDiaryPersonListAdapter( private val onTappedCallback: (item: SelectableItem<ContactDiaryPerson>) -> Unit -) : BaseAdapter<ContactDiaryPersonListAdapter.CachedPersonViewHolder>(), +) : AbstractAdapter<SelectableItem<ContactDiaryPerson>, ContactDiaryPersonListAdapter.CachedPersonViewHolder>(), AsyncDiffUtilAdapter<SelectableItem<ContactDiaryPerson>> { - override val asyncDiffer: AsyncDiffer<SelectableItem<ContactDiaryPerson>> = AsyncDiffer(this) - - override fun getItemCount(): Int = data.size - - override fun getItemId(position: Int): Long = data[position].stableId - override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): CachedPersonViewHolder = CachedPersonViewHolder(parent) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsFragment.kt index e9c77914fabb5e74f02964cc10a5a1fe2762614f..5a226c1139680e183acad1ee8307828b1a8fc347 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsFragment.kt @@ -1,24 +1,17 @@ package de.rki.coronawarnapp.contactdiary.ui.edit import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import android.widget.TextView import androidx.core.view.isGone import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.RecyclerView import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation import de.rki.coronawarnapp.contactdiary.ui.edit.ContactDiaryEditLocationsViewModel.NavigationEvent.ShowDeletionConfirmationDialog import de.rki.coronawarnapp.contactdiary.ui.edit.ContactDiaryEditLocationsViewModel.NavigationEvent.ShowLocationDetailSheet -import de.rki.coronawarnapp.contactdiary.util.setClickLabel +import de.rki.coronawarnapp.contactdiary.ui.edit.adapter.LocationEditAdapter import de.rki.coronawarnapp.databinding.ContactDiaryEditLocationsFragmentBinding import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.di.AutoInject -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer import de.rki.coronawarnapp.util.lists.diffutil.update import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 @@ -34,7 +27,7 @@ class ContactDiaryEditLocationsFragment : Fragment(R.layout.contact_diary_edit_l private val viewModel: ContactDiaryEditLocationsViewModel by cwaViewModels { viewModelFactory } private val binding: ContactDiaryEditLocationsFragmentBinding by viewBindingLazy() - private lateinit var listAdapter: ListAdapter + private lateinit var listAdapter: LocationEditAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -81,9 +74,11 @@ class ContactDiaryEditLocationsFragment : Fragment(R.layout.contact_diary_edit_l } private fun setupRecyclerView() { - listAdapter = ListAdapter(getString(R.string.accessibility_edit)) { - getString(R.string.accessibility_location, it.locationName) - } + listAdapter = LocationEditAdapter( + clickLabelString = getString(R.string.accessibility_edit), + getContentDescriptionString = { getString(R.string.accessibility_location, it.locationName) }, + onItemClicked = { viewModel.onEditLocationClick(it) } + ) binding.locationsRecyclerView.adapter = listAdapter } @@ -99,43 +94,4 @@ class ContactDiaryEditLocationsFragment : Fragment(R.layout.contact_diary_edit_l } ) } - - inner class ListAdapter( - private val clickLabelString: String, - private val getContentDescriptionString: (ContactDiaryLocation) -> String - ) : RecyclerView.Adapter<ListAdapter.ViewHolder>(), - AsyncDiffUtilAdapter<ContactDiaryLocation> { - - override val asyncDiffer: AsyncDiffer<ContactDiaryLocation> = AsyncDiffer(this) - - inner class ViewHolder(listItemView: View) : RecyclerView.ViewHolder(listItemView) { - val nameTextView = itemView.findViewById<TextView>(R.id.name) - val itemContainerView = itemView.findViewById<View>(R.id.item_container) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListAdapter.ViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.contact_diary_edit_list_item, parent, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ListAdapter.ViewHolder, position: Int) { - val location = data[position] - with(viewHolder) { - nameTextView.text = location.locationName - itemContainerView.setOnClickListener { - viewModel.onEditLocationClick(location) - } - itemContainerView.contentDescription = getContentDescriptionString(location) - itemContainerView.setClickLabel(clickLabelString) - } - } - - override fun getItemCount(): Int { - return data.size - } - - override fun getItemId(position: Int): Long { - return data[position].locationId - } - } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModel.kt index 3ef030e2cb7a656271e2e7f3efe88d19da273f20..c4a5dd4e1555d3af1399ca77f501bfe8d41d32a5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditLocationsViewModel.kt @@ -28,10 +28,10 @@ class ContactDiaryEditLocationsViewModel @AssistedInject constructor( val navigationEvent = SingleLiveEvent<NavigationEvent>() - val isButtonEnabled = contactDiaryRepository.locations.map { !it.isNullOrEmpty() } + val isButtonEnabled = contactDiaryRepository.locations.map { it.isNotEmpty() } .asLiveData(dispatcherProvider.IO) - val isListVisible = contactDiaryRepository.locations.map { !it.isNullOrEmpty() } + val isListVisible = contactDiaryRepository.locations.map { it.isNotEmpty() } .asLiveData(dispatcherProvider.IO) fun onDeleteAllLocationsClick() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsFragment.kt index eaeace7dd4329e2179d3803652d29d0b86f55332..bd46ac7977fcb952ecb6a172ed22f49935327ff5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsFragment.kt @@ -1,24 +1,17 @@ package de.rki.coronawarnapp.contactdiary.ui.edit import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent -import android.widget.TextView import androidx.core.view.isGone import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.RecyclerView import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson import de.rki.coronawarnapp.contactdiary.ui.edit.ContactDiaryEditPersonsViewModel.NavigationEvent.ShowDeletionConfirmationDialog import de.rki.coronawarnapp.contactdiary.ui.edit.ContactDiaryEditPersonsViewModel.NavigationEvent.ShowPersonDetailSheet -import de.rki.coronawarnapp.contactdiary.util.setClickLabel +import de.rki.coronawarnapp.contactdiary.ui.edit.adapter.PersonEditAdapter import de.rki.coronawarnapp.databinding.ContactDiaryEditPersonsFragmentBinding import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.di.AutoInject -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter -import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer import de.rki.coronawarnapp.util.lists.diffutil.update import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 @@ -34,7 +27,7 @@ class ContactDiaryEditPersonsFragment : Fragment(R.layout.contact_diary_edit_per private val viewModel: ContactDiaryEditPersonsViewModel by cwaViewModels { viewModelFactory } private val binding: ContactDiaryEditPersonsFragmentBinding by viewBindingLazy() - private lateinit var listAdapter: ListAdapter + private lateinit var listAdapter: PersonEditAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -83,9 +76,11 @@ class ContactDiaryEditPersonsFragment : Fragment(R.layout.contact_diary_edit_per } private fun setupRecyclerView() { - listAdapter = ListAdapter(getString(R.string.accessibility_edit)) { - getString(R.string.accessibility_person, it.fullName) - } + listAdapter = PersonEditAdapter( + clickLabelString = getString(R.string.accessibility_edit), + getContentDescriptionString = { getString(R.string.accessibility_person, it.fullName) }, + onItemClicked = { viewModel.onEditPersonClick(it) } + ) binding.personsRecyclerView.adapter = listAdapter } @@ -101,43 +96,4 @@ class ContactDiaryEditPersonsFragment : Fragment(R.layout.contact_diary_edit_per } ) } - - inner class ListAdapter( - private val clickLabelString: String, - private val getContentDescriptionString: (ContactDiaryPerson) -> String - ) : RecyclerView.Adapter<ListAdapter.ViewHolder>(), - AsyncDiffUtilAdapter<ContactDiaryPerson> { - - override val asyncDiffer: AsyncDiffer<ContactDiaryPerson> = AsyncDiffer(this) - - inner class ViewHolder(listItemView: View) : RecyclerView.ViewHolder(listItemView) { - val nameTextView = itemView.findViewById<TextView>(R.id.name) - val itemContainerView = itemView.findViewById<View>(R.id.item_container) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListAdapter.ViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.contact_diary_edit_list_item, parent, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ListAdapter.ViewHolder, position: Int) { - val person = data[position] - with(viewHolder) { - nameTextView.text = person.fullName - itemContainerView.setOnClickListener { - viewModel.onEditPersonClick(person) - } - itemContainerView.contentDescription = getContentDescriptionString(person) - itemContainerView.setClickLabel(clickLabelString) - } - } - - override fun getItemCount(): Int { - return data.size - } - - override fun getItemId(position: Int): Long { - return data[position].personId - } - } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModel.kt index 2fa6a23e7591d2984509a6aed59f34e182368906..d418c003a4c83a64fbd4a0644bbe1c96b842df69 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/ContactDiaryEditPersonsViewModel.kt @@ -25,10 +25,10 @@ class ContactDiaryEditPersonsViewModel @AssistedInject constructor( val personsLiveData = contactDiaryRepository.people .asLiveData() - val isButtonEnabled = contactDiaryRepository.people.map { !it.isNullOrEmpty() } + val isButtonEnabled = contactDiaryRepository.people.map { it.isNotEmpty() } .asLiveData(dispatcherProvider.IO) - val isListVisible = contactDiaryRepository.people.map { !it.isNullOrEmpty() } + val isListVisible = contactDiaryRepository.people.map { it.isNotEmpty() } .asLiveData(dispatcherProvider.IO) private val coroutineExceptionHandler = CoroutineExceptionHandler { coroutineContext, ex -> diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/LocationEditAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/LocationEditAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..54b560ab31cd084c2d3fe6208f30a1651de540c1 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/LocationEditAdapter.kt @@ -0,0 +1,40 @@ +package de.rki.coronawarnapp.contactdiary.ui.edit.adapter + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation +import de.rki.coronawarnapp.contactdiary.util.AbstractAdapter +import de.rki.coronawarnapp.contactdiary.util.setClickLabel +import de.rki.coronawarnapp.databinding.ContactDiaryEditListItemBinding +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.util.lists.BindableVH + +internal class LocationEditAdapter( + private val clickLabelString: String, + private val getContentDescriptionString: (ContactDiaryLocation) -> String, + private val onItemClicked: (item: ContactDiaryLocation) -> Unit +) : AbstractAdapter<ContactDiaryLocation, LocationEditAdapter.ViewHolder>() { + + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(parent) + + override fun onBindBaseVH(holder: ViewHolder, position: Int, payloads: MutableList<Any>) = + holder.bind(data[position], payloads) + + inner class ViewHolder(parent: ViewGroup) : BaseAdapter.VH(R.layout.contact_diary_edit_list_item, parent), + BindableVH<ContactDiaryLocation, ContactDiaryEditListItemBinding> { + override val viewBinding: + Lazy<ContactDiaryEditListItemBinding> = + lazy { ContactDiaryEditListItemBinding.bind(itemView) } + + override val onBindData: + ContactDiaryEditListItemBinding.(item: ContactDiaryLocation, payloads: List<Any>) -> Unit = + { location, _ -> + name.text = location.locationName + itemContainer.apply { + setOnClickListener { onItemClicked(location) } + contentDescription = getContentDescriptionString(location) + setClickLabel(clickLabelString) + } + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/PersonEditAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/PersonEditAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..c241ecef2fb03586ec4d16a135d9e58f30aa3c18 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/edit/adapter/PersonEditAdapter.kt @@ -0,0 +1,40 @@ +package de.rki.coronawarnapp.contactdiary.ui.edit.adapter + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson +import de.rki.coronawarnapp.contactdiary.util.AbstractAdapter +import de.rki.coronawarnapp.contactdiary.util.setClickLabel +import de.rki.coronawarnapp.databinding.ContactDiaryEditListItemBinding +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.util.lists.BindableVH + +internal class PersonEditAdapter( + private val clickLabelString: String, + private val getContentDescriptionString: (ContactDiaryPerson) -> String, + private val onItemClicked: (item: ContactDiaryPerson) -> Unit +) : AbstractAdapter<ContactDiaryPerson, PersonEditAdapter.ViewHolder>() { + + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(parent) + + override fun onBindBaseVH(holder: ViewHolder, position: Int, payloads: MutableList<Any>) = + holder.bind(data[position], payloads) + + inner class ViewHolder(parent: ViewGroup) : BaseAdapter.VH(R.layout.contact_diary_edit_list_item, parent), + BindableVH<ContactDiaryPerson, ContactDiaryEditListItemBinding> { + override val viewBinding: + Lazy<ContactDiaryEditListItemBinding> = + lazy { ContactDiaryEditListItemBinding.bind(itemView) } + + override val onBindData: + ContactDiaryEditListItemBinding.(item: ContactDiaryPerson, payloads: List<Any>) -> Unit = + { person, _ -> + name.text = person.fullName + itemContainer.apply { + setOnClickListener { onItemClicked(person) } + contentDescription = getContentDescriptionString(person) + setClickLabel(clickLabelString) + } + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt index 8df5988087bd2fd580a25c7b4acf04d723fd01bf..4cef4c67c8851503d535c67b39320b5cd6523a82 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewFragment.kt @@ -3,12 +3,14 @@ package de.rki.coronawarnapp.contactdiary.ui.overview import android.os.Bundle import android.view.View import android.view.accessibility.AccessibilityEvent +import androidx.appcompat.widget.Toolbar import androidx.core.app.ShareCompat import androidx.fragment.app.Fragment import de.rki.coronawarnapp.R import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ContactDiaryOverviewAdapter import de.rki.coronawarnapp.contactdiary.util.getLocale import de.rki.coronawarnapp.contactdiary.util.toFormattedDay +import de.rki.coronawarnapp.contactdiary.util.toFormattedDayForAccessibility import de.rki.coronawarnapp.databinding.ContactDiaryOverviewFragmentBinding import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.ui.doNavigate @@ -22,7 +24,6 @@ import javax.inject.Inject class ContactDiaryOverviewFragment : Fragment(R.layout.contact_diary_overview_fragment), AutoInject { @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory - @Inject lateinit var contactDiaryOverviewMenu: ContactDiaryOverviewMenu private val vm: ContactDiaryOverviewViewModel by cwaViewModels { viewModelFactory } private val binding: ContactDiaryOverviewFragmentBinding by viewBindingLazy() @@ -30,10 +31,11 @@ class ContactDiaryOverviewFragment : Fragment(R.layout.contact_diary_overview_fr super.onViewCreated(view, savedInstanceState) val adapter = ContactDiaryOverviewAdapter( { it.toFormattedDay(requireContext().getLocale()) }, + { it.toFormattedDayForAccessibility(requireContext().getLocale()) }, { vm.onItemPress(it) } ) - setupToolbar() + setupMenu(binding.toolbar) binding.apply { contactDiaryOverviewRecyclerview.adapter = adapter @@ -87,7 +89,37 @@ class ContactDiaryOverviewFragment : Fragment(R.layout.contact_diary_overview_fr } } - private fun setupToolbar() { - contactDiaryOverviewMenu.setupMenu(binding.toolbar) + private fun setupMenu(toolbar: Toolbar) = toolbar.apply { + inflateMenu(R.menu.menu_contact_diary_overview) + setOnMenuItemClickListener { + when (it.itemId) { + R.id.menu_contact_diary_information -> { + doNavigate( + ContactDiaryOverviewFragmentDirections + .actionContactDiaryOverviewFragmentToContactDiaryOnboardingFragment() + ) + true + } + R.id.menu_contact_diary_export_entries -> { + vm.onExportPress(context) + true + } + R.id.menu_contact_diary_edit_persons -> { + doNavigate( + ContactDiaryOverviewFragmentDirections + .actionContactDiaryOverviewFragmentToContactDiaryEditPersonsFragment() + ) + true + } + R.id.menu_contact_diary_edit_locations -> { + doNavigate( + ContactDiaryOverviewFragmentDirections + .actionContactDiaryOverviewFragmentToContactDiaryEditLocationsFragment() + ) + true + } + else -> onOptionsItemSelected(it) + } + } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewMenu.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewMenu.kt deleted file mode 100644 index 048c25a9f2de0dc6f7b82ccee8b40415c5677a13..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewMenu.kt +++ /dev/null @@ -1,52 +0,0 @@ -package de.rki.coronawarnapp.contactdiary.ui.overview - -import androidx.appcompat.widget.Toolbar -import androidx.navigation.NavController -import androidx.navigation.fragment.findNavController -import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.ui.doNavigate -import de.rki.coronawarnapp.util.viewmodel.cwaViewModels -import javax.inject.Inject - -// TODO(Remove this useless class) -class ContactDiaryOverviewMenu @Inject constructor( - private val contactDiaryOverviewFragment: ContactDiaryOverviewFragment -) { - - private val navController: NavController - get() = contactDiaryOverviewFragment.findNavController() - private val vm: ContactDiaryOverviewViewModel by contactDiaryOverviewFragment.cwaViewModels { - contactDiaryOverviewFragment.viewModelFactory - } - - fun setupMenu(toolbar: Toolbar) = toolbar.apply { - inflateMenu(R.menu.menu_contact_diary_overview) - setOnMenuItemClickListener { - when (it.itemId) { - R.id.menu_contact_diary_information -> { - navController.doNavigate( - ContactDiaryOverviewFragmentDirections - .actionContactDiaryOverviewFragmentToContactDiaryOnboardingFragment() - ) - true - } - R.id.menu_contact_diary_export_entries -> { - vm.onExportPress(context) - true } - R.id.menu_contact_diary_edit_persons -> { - navController.doNavigate( - ContactDiaryOverviewFragmentDirections - .actionContactDiaryOverviewFragmentToContactDiaryEditPersonsFragment()) - true - } - R.id.menu_contact_diary_edit_locations -> { - navController.doNavigate( - ContactDiaryOverviewFragmentDirections - .actionContactDiaryOverviewFragmentToContactDiaryEditLocationsFragment()) - true - } - else -> contactDiaryOverviewFragment.onOptionsItemSelected(it) - } - } - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt index 554bf6d88ccd8dac7ac5c3f110df500b931e0402..a0dbcbfaeff4060b8994d3903e953ddc1667cd86 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt @@ -139,7 +139,9 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( } } - private fun List<String>.addToStringBuilder(sb: StringBuilder, dateString: String) = sorted() + private fun List<String>.addToStringBuilder(sb: StringBuilder, dateString: String) = sortedBy { + it.toLowerCase(Locale.ROOT) + } .forEach { sb.appendLine("$dateString $it") } // According to tech spec german locale only diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt index 4875c0734c43571d1d915cd1f1ddb74123cb145b..3e3c3a730f25006b120c4930900c60bf1bd83b9e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt @@ -1,62 +1,54 @@ package de.rki.coronawarnapp.contactdiary.ui.overview.adapter -import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isGone -import androidx.recyclerview.widget.RecyclerView +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.contactdiary.util.clearAndAddAll import de.rki.coronawarnapp.databinding.ContactDiaryOverviewListItemBinding +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.util.lists.BindableVH import org.joda.time.LocalDate class ContactDiaryOverviewAdapter( private val dateFormatter: (LocalDate) -> String, + private val dateFormatterForAccessibility: (LocalDate) -> String, private val onItemSelectionListener: (ListItem) -> Unit -) : - RecyclerView.Adapter<ContactDiaryOverviewAdapter.OverviewElementHolder>() { +) : BaseAdapter<ContactDiaryOverviewAdapter.OverviewElementHolder>() { + private val elements: MutableList<ListItem> = mutableListOf() fun setItems(elements: List<ListItem>) { - this.elements.clear() - this.elements += elements + this.elements.clearAndAddAll(elements) notifyDataSetChanged() } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OverviewElementHolder { - val inflater = LayoutInflater.from(parent.context) - return OverviewElementHolder( - ContactDiaryOverviewListItemBinding.inflate( - inflater, - parent, - false - ) - ) - } - override fun getItemCount() = elements.size - override fun onBindViewHolder(holder: OverviewElementHolder, position: Int) { - holder.bind(elements[position], dateFormatter, onItemSelectionListener) - } + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): OverviewElementHolder = OverviewElementHolder(parent) - class OverviewElementHolder(private val viewDataBinding: ContactDiaryOverviewListItemBinding) : - RecyclerView.ViewHolder(viewDataBinding.root) { - private val nestedItemAdapter = ContactDiaryOverviewNestedAdapter() + override fun onBindBaseVH(holder: OverviewElementHolder, position: Int, payloads: MutableList<Any>) = + holder.bind(elements[position], payloads) - init { - viewDataBinding.contactDiaryOverviewNestedRecyclerView.adapter = nestedItemAdapter - } - - fun bind( - item: ListItem, - dateFormatter: (LocalDate) -> String, - onElementSelectionListener: (ListItem) -> Unit - ) { - viewDataBinding.contactDiaryOverviewElementName.text = dateFormatter(item.date) + inner class OverviewElementHolder(parent: ViewGroup) : + BaseAdapter.VH(R.layout.contact_diary_overview_list_item, parent), + BindableVH<ListItem, ContactDiaryOverviewListItemBinding> { - viewDataBinding.contactDiaryOverviewElementBody.setOnClickListener { onElementSelectionListener(item) } + override val viewBinding: Lazy<ContactDiaryOverviewListItemBinding> = + lazy { ContactDiaryOverviewListItemBinding.bind(itemView) } - viewDataBinding.contactDiaryOverviewNestedElementGroup.isGone = item.data.isEmpty() + private val nestedItemAdapter = ContactDiaryOverviewNestedAdapter() - nestedItemAdapter.setItems(item.data) + init { + viewBinding.value.contactDiaryOverviewNestedRecyclerView.adapter = nestedItemAdapter } + + override val onBindData: ContactDiaryOverviewListItemBinding.(item: ListItem, payloads: List<Any>) -> Unit = + { item, _ -> + contactDiaryOverviewElementName.text = dateFormatter(item.date) + contactDiaryOverviewElementName.contentDescription = dateFormatterForAccessibility(item.date) + contactDiaryOverviewElementBody.setOnClickListener { onItemSelectionListener(item) } + contactDiaryOverviewNestedElementGroup.isGone = item.data.isEmpty() + nestedItemAdapter.setItems(item.data) + } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewNestedAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewNestedAdapter.kt index b8cd8b56d3baac8b681e20664790d1467af5a78d..e7835cb12fd5efa22917f93f221e2fca51bbf74b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewNestedAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewNestedAdapter.kt @@ -1,37 +1,41 @@ package de.rki.coronawarnapp.contactdiary.ui.overview.adapter -import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.contactdiary.util.clearAndAddAll import de.rki.coronawarnapp.databinding.ContactDiaryOverviewNestedListItemBinding +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.util.lists.BindableVH class ContactDiaryOverviewNestedAdapter : - RecyclerView.Adapter<ContactDiaryOverviewNestedAdapter.NestedItemViewHolder>() { + BaseAdapter<ContactDiaryOverviewNestedAdapter.NestedItemViewHolder>() { private val dataList: MutableList<ListItem.Data> = mutableListOf() fun setItems(dataList: List<ListItem.Data>) { - this.dataList.clear() - this.dataList += dataList + this.dataList.clearAndAddAll(dataList) notifyDataSetChanged() } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NestedItemViewHolder { - val inflater = LayoutInflater.from(parent.context) - return NestedItemViewHolder(ContactDiaryOverviewNestedListItemBinding.inflate(inflater, parent, false)) - } + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): NestedItemViewHolder = NestedItemViewHolder(parent) - override fun onBindViewHolder(holder: NestedItemViewHolder, position: Int) { - holder.bind(dataList[position]) - } + override fun onBindBaseVH(holder: NestedItemViewHolder, position: Int, payloads: MutableList<Any>) = + holder.bind(dataList[position], payloads) override fun getItemCount(): Int = dataList.size - class NestedItemViewHolder(private val viewBinding: ContactDiaryOverviewNestedListItemBinding) : - RecyclerView.ViewHolder(viewBinding.root) { - fun bind(data: ListItem.Data) { - viewBinding.contactDiaryOverviewElementImage.setImageResource(data.drawableId) - viewBinding.contactDiaryOverviewElementName.text = data.text - } + class NestedItemViewHolder(parent: ViewGroup) : + BaseAdapter.VH(R.layout.contact_diary_overview_nested_list_item, parent), + BindableVH<ListItem.Data, ContactDiaryOverviewNestedListItemBinding> { + override val viewBinding: + Lazy<ContactDiaryOverviewNestedListItemBinding> = + lazy { ContactDiaryOverviewNestedListItemBinding.bind(itemView) } + + override val onBindData: + ContactDiaryOverviewNestedListItemBinding.(item: ListItem.Data, payloads: List<Any>) -> Unit = + { key, _ -> + contactDiaryOverviewElementImage.setImageResource(key.drawableId) + contactDiaryOverviewElementName.text = key.text + } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/location/ContactDiaryLocationBottomSheetDialogViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/location/ContactDiaryLocationBottomSheetDialogViewModel.kt index c59fb7368daf83c9949e2f72dd404d168fcc2a7b..7e639168a24a0b7d32d3c84daa383cbb88c43a09 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/location/ContactDiaryLocationBottomSheetDialogViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/location/ContactDiaryLocationBottomSheetDialogViewModel.kt @@ -97,5 +97,3 @@ class ContactDiaryLocationBottomSheetDialogViewModel @AssistedInject constructor fun create(addedAt: String?): ContactDiaryLocationBottomSheetDialogViewModel } } - -private const val MAX_LOCATION_NAME_LENGTH = 250 diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/person/ContactDiaryPersonBottomSheetDialogViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/person/ContactDiaryPersonBottomSheetDialogViewModel.kt index 82c42dd13f76a0399a4033560741744324f7a22c..eff32df76a4896a7429461d55ca31470b4b00a53 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/person/ContactDiaryPersonBottomSheetDialogViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/sheets/person/ContactDiaryPersonBottomSheetDialogViewModel.kt @@ -97,5 +97,3 @@ class ContactDiaryPersonBottomSheetDialogViewModel @AssistedInject constructor( fun create(addedAt: String?): ContactDiaryPersonBottomSheetDialogViewModel } } - -private const val MAX_PERSON_NAME_LENGTH = 250 diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/AbstractAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/AbstractAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..567c2c549d76bb7205144608b3e769e42ece7060 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/AbstractAdapter.kt @@ -0,0 +1,15 @@ +package de.rki.coronawarnapp.contactdiary.util + +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import de.rki.coronawarnapp.util.lists.HasStableId +import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter +import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer + +internal abstract class AbstractAdapter<T : HasStableId, U : BaseAdapter.VH> : BaseAdapter<U>(), + AsyncDiffUtilAdapter<T> { + override val asyncDiffer: AsyncDiffer<T> = AsyncDiffer(this) + + override fun getItemCount(): Int = data.size + + override fun getItemId(position: Int): Long = data[position].stableId +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt index 92614ba40b25549db3818376859f031ea424e423..6348145c6833c9a85aa064e517e8a154fb2e2f77 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt @@ -38,6 +38,14 @@ fun LocalDate.toFormattedDay(locale: Locale): String { DateTimeFormat.shortDate().withLocale(locale).print(this) } +fun LocalDate.toFormattedDayForAccessibility(locale: Locale): String { + // Use two different methods to get the final date format (Weekday, Longdate) + // because the custom pattern of toString() does not localize characters like "/" or "." + // For accessibility DateTimeFormat.longDate() is required since shortDate() may read the date in the wrong format + return "${toString("EEEE", locale)}, " + + DateTimeFormat.longDate().withLocale(locale).print(this) +} + fun String.formatContactDiaryNameField(maxLength: Int): String { val newName = if (isNotBlank()) { trim() @@ -89,3 +97,8 @@ fun View.setClickLabel(label: String) { } }) } + +fun <T> MutableList<T>.clearAndAddAll(newItems: List<T>) { + clear() + addAll(newItems) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt index 6a741421493b0958044f56fd38a3d6775b35eaf6..db52d23dcd0803b00a9500e8e4efec8c017b756a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt @@ -39,7 +39,6 @@ class DownloadDiagnosisKeysTask @Inject constructor( private var isCanceled = false - @Suppress("LongMethod") override suspend fun run(arguments: Task.Arguments): Task.Result { val rollbackItems = mutableListOf<RollbackItem>() try { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt index 2a3db46981b4bde9072fd312ff7ca5bb46298df4..ae10898ca7053737daefa9f76076a0befcf509cd 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ErrorReportReceiver.kt @@ -13,7 +13,6 @@ import java.util.Locale class ErrorReportReceiver(private val activity: Activity) : BroadcastReceiver() { - @Suppress("LongMethod") override fun onReceive(context: Context, intent: Intent) { val category = ExceptionCategory .valueOf(intent.getStringExtra(ReportingConstants.ERROR_REPORT_CATEGORY_EXTRA) ?: "") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/TestResultAvailableNotification.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/TestResultAvailableNotification.kt index 07214c4d788a1295717b89940b7379dacb934abc..80cdfa7569c5c609e065ab47685e582a5607a4a3 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/TestResultAvailableNotification.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/TestResultAvailableNotification.kt @@ -35,6 +35,10 @@ class TestResultAvailableNotification @Inject constructor( ) } + fun cancelTestResultNotification() { + notificationHelper.cancelCurrentNotification(NotificationConstants.TEST_RESULT_AVAILABLE_NOTIFICATION_ID) + } + /** * The pending result fragment will forward to the correct screen * Because we can't save the test result at the moment (legal), diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelTask.kt index 2a752a0207cbe98f667eb9c77f3f8da9a9df729f..30d3cbf9c2546578bbded15fd2a60f5fdb91f72b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelTask.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/RiskLevelTask.kt @@ -48,7 +48,6 @@ class RiskLevelTask @Inject constructor( private var isCanceled = false - @Suppress("LongMethod") override suspend fun run(arguments: Task.Arguments): RiskLevelTaskResult = try { Timber.d("Running with arguments=%s", arguments) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt index 7b0deee24ba9b006478b63ad034bcd1c6627dcaf..645d931705e03c7a31ce17aa3a6e35a5b80371aa 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.submission.task import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException +import de.rki.coronawarnapp.notification.TestResultAvailableNotification import de.rki.coronawarnapp.notification.TestResultNotificationService import de.rki.coronawarnapp.playbook.Playbook import de.rki.coronawarnapp.storage.LocalData @@ -33,7 +34,8 @@ class SubmissionTask @Inject constructor( private val submissionSettings: SubmissionSettings, private val autoSubmission: AutoSubmission, private val timeStamper: TimeStamper, - private val testResultNotificationService: TestResultNotificationService + private val testResultNotificationService: TestResultNotificationService, + private val testResultAvailableNotification: TestResultAvailableNotification ) : Task<DefaultProgress, SubmissionTask.Result> { private val internalProgress = ConflatedBroadcastChannel<DefaultProgress>() @@ -154,6 +156,7 @@ class SubmissionTask @Inject constructor( LocalData.numberOfSuccessfulSubmissions(1) testResultNotificationService.cancelPositiveTestResultNotification() + testResultAvailableNotification.cancelTestResultNotification() } data class Arguments( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/states/TracingState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/states/TracingState.kt index 6dd893521e346fc312766a8f48d479a638aa7269..8b201929b5f2e2f3f8031991573e2fed2550d852 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/states/TracingState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/states/TracingState.kt @@ -131,18 +131,13 @@ data class TracingFailed( val showRestartButton: Boolean = !isInDetailsMode - fun getTimeFetched(c: Context): String = when (riskState) { - RiskState.LOW_RISK, RiskState.INCREASED_RISK -> { - if (lastExposureDetectionTime != null) { - c.getString( - R.string.risk_card_body_time_fetched, - formatRelativeDateTimeString(c, lastExposureDetectionTime) - ) - } else { - c.getString(R.string.risk_card_body_not_yet_fetched) - } - } - else -> "" + fun getTimeFetched(context: Context): String = if (lastExposureDetectionTime != null) { + context.getString( + R.string.risk_card_body_time_fetched, + formatRelativeDateTimeString(context, lastExposureDetectionTime) + ) + } else { + context.getString(R.string.risk_card_body_not_yet_fetched) } fun getLastRiskState(c: Context): String { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt index 25c5d3f8ff24dc7536fa7efb0ff6208e59b50f1d..4c07b081e2ebfa4f2c584404c3642cbdc141e5e5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/Country.kt @@ -1,9 +1,9 @@ package de.rki.coronawarnapp.ui +import android.content.Context import androidx.annotation.DrawableRes import androidx.annotation.StringRes import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.util.ui.CachedString enum class Country( val code: String, @@ -43,5 +43,7 @@ enum class Country( SI("si", R.string.country_name_si, R.drawable.ic_country_si), SK("sk", R.string.country_name_sk, R.drawable.ic_country_sk); - val label = CachedString { it.getString(labelRes) } + fun getLabel(context: Context): String { + return context.getString(labelRes) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt index caac006b32562d2d7ccffa0881ad81d6eb3eec9a..198e37eaeb01c901af3b5ec9372c52a57ec48dad 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragment.kt @@ -5,15 +5,16 @@ import android.os.Bundle import android.view.View import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo +import androidx.core.view.isGone import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient 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.util.CWADebug import de.rki.coronawarnapp.util.ExternalActionHelper import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 import de.rki.coronawarnapp.util.ui.setGone import de.rki.coronawarnapp.util.ui.viewBindingLazy @@ -55,6 +56,9 @@ class InformationFragment : Fragment(R.layout.fragment_information), AutoInject setButtonOnClickListener() setAccessibilityDelegate() + + // TODO Hidden until further clarification regarding release schedule is available + binding.informationDebuglog.mainRow.isGone = !CWADebug.isDeviceForTestersBuild } override fun onResume() { @@ -76,22 +80,22 @@ class InformationFragment : Fragment(R.layout.fragment_information), AutoInject private fun setButtonOnClickListener() { binding.informationAbout.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationAboutFragment() ) } binding.informationPrivacy.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationPrivacyFragment() ) } binding.informationTerms.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationTermsFragment() ) } binding.informationContact.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationContactFragment() ) } @@ -99,15 +103,20 @@ class InformationFragment : Fragment(R.layout.fragment_information), AutoInject ExternalActionHelper.openUrl(this, requireContext().getString(R.string.main_about_link)) } binding.informationLegal.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationLegalFragment() ) } binding.informationTechnical.mainRow.setOnClickListener { - findNavController().doNavigate( + doNavigate( InformationFragmentDirections.actionInformationFragmentToInformationTechnicalFragment() ) } + binding.informationDebuglog.mainRow.setOnClickListener { + doNavigate( + InformationFragmentDirections.actionInformationFragmentToDebuglogFragment() + ) + } binding.informationHeader.headerButtonBack.buttonIcon.setOnClickListener { (activity as MainActivity).goBack() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt index 7b7473491c6c067a89555f75535491ffbdd81b27..e52ddb99205c428db477710548307ba7caf0b4f2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt @@ -4,11 +4,12 @@ import dagger.Binds import dagger.Module import dagger.android.ContributesAndroidInjector import dagger.multibindings.IntoMap +import de.rki.coronawarnapp.bugreporting.debuglog.ui.DebugLogFragmentModule import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey -@Module +@Module(includes = [DebugLogFragmentModule::class]) abstract class InformationFragmentModule { @Binds @IntoMap diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt index cf51ffb8764efdf007285b5019bbc3d9bbf52a46..64ffa90ef5bec6b466d352a14469414f95d22fbb 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt @@ -47,7 +47,6 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject { private val homeAdapter = HomeAdapter() - @Suppress("LongMethod") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/BackgroundPriorityState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/BackgroundPriorityState.kt index 585df2b15540de30071328eabbd1769881c5e90f..3c810016a8a826ef0697be950d1602d0b41f71c7 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/BackgroundPriorityState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/backgroundpriority/BackgroundPriorityState.kt @@ -21,4 +21,13 @@ data class BackgroundPriorityState( } return ContextCompat.getDrawable(context, illustrationId) } + + fun getHeaderIllustrationDescription(context: Context): String { + val illustrationDescription = if (isBackgroundPriorityEnabled) { + R.string.settings_background_priority_on_illustration_description + } else { + R.string.settings_background_priority_off_illustration_description + } + return context.getString(illustrationDescription) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningNoConsentFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningNoConsentFragment.kt index eab307688d9b15cdaa88171bfa99134ef09bf80a..5aef9891bc0113c36ed32cd435026028d1a7db30 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningNoConsentFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/warnothers/SubmissionResultPositiveOtherWarningNoConsentFragment.kt @@ -41,7 +41,7 @@ class SubmissionResultPositiveOtherWarningNoConsentFragment : binding.submissionPositiveOtherWarningNoConsentButtonNext.setOnClickListener { viewModel.onConsentButtonClicked() } - binding.submissionPositiveOtherWarningHeader.headerButtonBack.buttonIcon.setOnClickListener { + binding.toolbar.setNavigationOnClickListener { viewModel.onBackPressed() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt index ed93584ddf85f339b74c0cf3afdff10c77225200..8a5a0c171e4ccf0e32a7ec85370a9c54a440712d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/CountryListView.kt @@ -25,10 +25,10 @@ class CountryListView(context: Context, attrs: AttributeSet) : LinearLayout(cont set(value) { field = value.sortedWith { a, b -> // Sort country list alphabetically - Collator.getInstance().compare(a.label.get(context), b.label.get(context)) + Collator.getInstance().compare(a.getLabel(context), b.getLabel(context)) }.also { countries -> adapterCountryFlags.countryList = countries - countryNames.text = countries.joinToString(", ") { it.label.get(context) } + countryNames.text = countries.joinToString(", ") { it.getLabel(context) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt index 9b474acf26fb9d4a1d35d9a470f804febf33e92f..15f4ffa545e810b2f56e68134bf624d9e9a60c47 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt @@ -2,8 +2,12 @@ package de.rki.coronawarnapp.util import android.app.Application import android.os.Build +import androidx.annotation.VisibleForTesting import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger import de.rki.coronawarnapp.util.debug.FileLogger +import de.rki.coronawarnapp.util.debug.UncaughtExceptionLogger +import de.rki.coronawarnapp.util.di.ApplicationComponent import timber.log.Timber object CWADebug { @@ -19,9 +23,15 @@ object CWADebug { fileLogger = FileLogger(application) } - Timber.i("CWA version: %s (%s)", BuildConfig.VERSION_CODE, BuildConfig.GIT_COMMIT_SHORT_HASH) - Timber.i("CWA flavor: %s (%s)", BuildConfig.FLAVOR, BuildConfig.BUILD_TYPE) - Timber.i("Build.FINGERPRINT: %s", Build.FINGERPRINT) + setupExceptionHandler() + + DebugLogger.init(application) + + logDeviceInfos() + } + + fun initAfterInjection(component: ApplicationComponent) { + DebugLogger.setInjectionIsReady(component) } val isDebugBuildOrMode: Boolean @@ -45,4 +55,18 @@ object CWADebug { false } } + + fun logDeviceInfos() { + Timber.i("CWA version: %s (%s)", BuildConfig.VERSION_CODE, BuildConfig.GIT_COMMIT_SHORT_HASH) + Timber.i("CWA flavor: %s (%s)", BuildConfig.FLAVOR, BuildConfig.BUILD_TYPE) + Timber.i("Build.FINGERPRINT: %s", Build.FINGERPRINT) + } + + /** + * Allow internal logging via `DebugLogger` to log stacktraces for uncaught exceptions. + */ + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun setupExceptionHandler() { + UncaughtExceptionLogger.wrapCurrentHandler() + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/compression/Zipper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/compression/Zipper.kt new file mode 100644 index 0000000000000000000000000000000000000000..2c7924c2b5e2a462303ef3f74b32452e090e466a --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/compression/Zipper.kt @@ -0,0 +1,44 @@ +package de.rki.coronawarnapp.util.compression + +import timber.log.Timber +import java.io.File +import java.io.IOException +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream + +class Zipper(private val zipPath: File) { + + fun zip(toZip: List<Entry>) { + if (zipPath.exists()) throw IOException("$zipPath already exists") + + Timber.tag(TAG).d("Creating ZIP file: %s", zipPath) + zipPath.parentFile?.mkdirs() + zipPath.createNewFile() + + if (!zipPath.exists()) throw IOException("Could not create $zipPath") + + ZipOutputStream(zipPath.outputStream().buffered()).use { output -> + for (i in toZip.indices) { + Timber.tag(TAG).v("Compressing ${toZip[i]} into $zipPath") + + val item = toZip[i] + Timber.tag(TAG).v("Reading %s (size=%d)", item.path, item.path.length()) + item.path.inputStream().buffered().use { input -> + output.putNextEntry(ZipEntry(item.name)) + input.copyTo(output) + } + } + } + + Timber.tag(TAG).i("ZipFile finished: %s", zipPath) + } + + data class Entry( + val path: File, + val name: String = path.name + ) + + companion object { + private const val TAG = "ZipFile" + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLogger.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLogger.kt new file mode 100644 index 0000000000000000000000000000000000000000..a9887e63f59b9bb5d4a46bc13a98d66633147442 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLogger.kt @@ -0,0 +1,23 @@ +package de.rki.coronawarnapp.util.debug + +import timber.log.Timber + +class UncaughtExceptionLogger( + private val wrappedHandler: Thread.UncaughtExceptionHandler? +) : Thread.UncaughtExceptionHandler { + + init { + Timber.v("Wrapping exception handler: %s", wrappedHandler) + } + + override fun uncaughtException(thread: Thread, error: Throwable) { + Timber.tag(thread.name).e(error, "Uncaught exception!") + wrappedHandler?.uncaughtException(thread, error) + } + + companion object { + fun wrapCurrentHandler() = UncaughtExceptionLogger(Thread.getDefaultUncaughtExceptionHandler()).also { + Thread.setDefaultUncaughtExceptionHandler(it) + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt index ba3270685ab4ef1d76c153c40f842d7b547cc0ed..793ba8478adc68b9bce2772e24dab5a12225f86e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt @@ -9,6 +9,8 @@ import de.rki.coronawarnapp.appconfig.AppConfigModule import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.bugreporting.BugReporter import de.rki.coronawarnapp.bugreporting.BugReportingModule +import de.rki.coronawarnapp.bugreporting.BugReportingSharedModule +import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger import de.rki.coronawarnapp.contactdiary.ContactDiaryRootModule import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule import de.rki.coronawarnapp.diagnosiskeys.DownloadDiagnosisKeysTaskModule @@ -64,6 +66,7 @@ import javax.inject.Singleton TaskModule::class, DeviceForTestersModule::class, BugReportingModule::class, + BugReportingSharedModule::class, SerializationModule::class, WorkerBinder::class, ContactDiaryRootModule::class @@ -88,6 +91,8 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { val bugReporter: BugReporter + fun inject(logger: DebugLogger) + @Component.Factory interface Factory { fun create(@BindsInstance app: CoronaWarnApplication): ApplicationComponent diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/sharing/FileSharing.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/sharing/FileSharing.kt new file mode 100644 index 0000000000000000000000000000000000000000..59dff05d68a47b0d753c7edfafbc7c5f01a9e156 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/sharing/FileSharing.kt @@ -0,0 +1,66 @@ +package de.rki.coronawarnapp.util.sharing + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.annotation.StringRes +import androidx.core.app.ShareCompat +import androidx.core.content.FileProvider +import dagger.Reusable +import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.util.di.AppContext +import timber.log.Timber +import java.io.File +import javax.inject.Inject + +@Reusable +class FileSharing @Inject constructor( + @AppContext private val context: Context +) { + + private fun getFileUri(path: File): Uri = FileProvider.getUriForFile( + context, + AUTHORITY, + path + ) + + fun getIntentProvider( + path: File, + title: String, + @StringRes chooserTitle: Int? = null + ): ShareIntentProvider = object : ShareIntentProvider { + override fun get(activity: Activity): Intent { + val builder = ShareCompat.IntentBuilder.from(activity).apply { + setType(determineMimeType(path)) + setStream(getFileUri(path)) + setSubject(title) + chooserTitle?.let { setChooserTitle(it) } + } + + val intent = if (chooserTitle != null) { + builder.createChooserIntent() + } else { + builder.intent + } + return intent.apply { + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + Timber.tag(TAG).d("Intent created %s", this) + } + } + } + + interface ShareIntentProvider { + fun get(activity: Activity): Intent + } + + private fun determineMimeType(path: File): String = when { + path.name.endsWith(".zip") -> "application/zip" + else -> throw UnsupportedOperationException("Unsupported MIME type: $path") + } + + companion object { + private const val AUTHORITY = "${BuildConfig.APPLICATION_ID}.fileProvider" + private const val TAG = "FileSharing" + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/threads/NamedThreadFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/threads/NamedThreadFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..c25d83b9528f348fcf4b97d55464b6fbb1e1551b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/threads/NamedThreadFactory.kt @@ -0,0 +1,17 @@ +package de.rki.coronawarnapp.util.threads + +import java.util.Locale +import java.util.concurrent.ThreadFactory +import java.util.concurrent.atomic.AtomicLong + +class NamedThreadFactory(private val threadPrefix: String) : ThreadFactory { + private val threadIndex = AtomicLong(1) + + override fun newThread(runnable: Runnable): Thread = Thread(runnable).apply { + name = if (threadPrefix.contains("%d")) { + String.format(Locale.ROOT, threadPrefix, threadIndex.getAndIncrement()) + } else { + "$threadPrefix-${threadIndex.getAndIncrement()}" + } + } +} diff --git a/Corona-Warn-App/src/main/res/drawable/grey_card_ripple.xml b/Corona-Warn-App/src/main/res/drawable/grey_card_ripple.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf1bad719e5d29aede7c5d50f930012ddf6ea83c --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/grey_card_ripple.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:attr/colorControlHighlight"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <solid android:color="@color/colorSurface2Pressed" /> + <corners android:radius="@dimen/radius_card" /> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <corners android:radius="@dimen/radius_card" /> + <solid android:color="@color/colorSurface2" /> + </shape> + </item> +</ripple> diff --git a/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml new file mode 100644 index 0000000000000000000000000000000000000000..c33bf0eb51c4e7592e3811508f95817d162f132f --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <Toolbar + android:id="@+id/toolbar" + style="@style/CWAToolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:navigationIcon="@drawable/ic_back" + android:title="@string/debugging_debuglog_title" /> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + <TextView + android:id="@+id/explanation" + style="@style/body1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="@dimen/spacing_normal" + android:text="@string/debugging_debuglog_intro_explanation" /> + + <TextView + android:id="@+id/sensitive_information" + style="@style/body1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/cwaGrayHighlight" + android:padding="@dimen/spacing_normal" + android:text="@string/debugging_debuglog_intro_warning" + android:textColor="@color/colorStableLight" /> + + <androidx.constraintlayout.widget.ConstraintLayout + style="@style/cardTracing" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/spacing_small" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_small" + android:layout_marginBottom="@dimen/spacing_tiny"> + + <ProgressBar + android:id="@+id/debuglog_activity_indicator" + android:layout_width="36dp" + android:layout_height="36dp" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@+id/debuglog_status_secondary" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/debuglog_status_primary" + tools:visibility="visible" /> + + <TextView + android:id="@+id/debuglog_status_primary" + style="@style/body1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/debuglog_activity_indicator" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginStart="0dp" + tools:text="@string/debugging_debuglog_status_not_recording" /> + + <TextView + android:id="@+id/debuglog_status_secondary" + style="@style/TextAppearance.AppCompat.Caption" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/debuglog_activity_indicator" + app:layout_constraintTop_toBottomOf="@id/debuglog_status_primary" + app:layout_goneMarginStart="0dp" + tools:text="@string/debugging_debuglog_status_additional_infos" /> + + <Button + android:id="@+id/share_recording" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginEnd="8dp" + android:enabled="false" + android:text="@string/debugging_debuglog_action_share_log" + app:layout_constraintEnd_toStartOf="@+id/toggle_recording" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/debuglog_status_secondary" /> + <Button + android:id="@+id/toggle_recording" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="16dp" + android:text="@string/debugging_debuglog_action_start_recording" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/share_recording" + app:layout_constraintTop_toBottomOf="@id/debuglog_status_secondary" /> + + + </androidx.constraintlayout.widget.ConstraintLayout> + </LinearLayout> + + </ScrollView> +</LinearLayout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml index ef861b939119c20f3506db228ecd86cf1a7fc3d6..215a15ab12efdac8ebf93df66bf8cf01de2c6f60 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_day_fragment.xml @@ -6,12 +6,12 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/content_container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:focusable="true"> + android:focusable="true" + android:layout_height="match_parent"> <androidx.appcompat.widget.Toolbar android:id="@+id/contact_diary_day_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:background="@drawable/contact_diary_background" android:elevation="@dimen/elevation_weak" @@ -23,7 +23,7 @@ <com.google.android.material.tabs.TabLayout android:id="@+id/contact_diary_day_tab_layout" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:background="@drawable/contact_diary_background" android:elevation="@dimen/elevation_weak" @@ -35,8 +35,8 @@ <androidx.viewpager2.widget.ViewPager2 android:id="@+id/contact_diary_day_view_pager" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_list_item.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_list_item.xml index 4e23d5f95c4e0fe24f93dd2c234efd1f14560419..e09401533bd6e6b6cccfecb8fc1c1a831a3143b0 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_list_item.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_list_item.xml @@ -12,7 +12,7 @@ <TextView android:id="@+id/name" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_locations_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_locations_fragment.xml index bf7ffdc7db5c8aa237b2b24a9533f286b7b6f837..bed59ef6f3d6d45baa64e32ecd228223bf9c17d2 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_locations_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_locations_fragment.xml @@ -9,7 +9,7 @@ <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -40,7 +40,7 @@ <TextView android:id="@+id/contact_diary_location_list_no_items_title" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_normal" @@ -53,8 +53,8 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/locations_recycler_view" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_margin="@dimen/spacing_normal" android:importantForAccessibility="no" android:scrollbars="vertical" @@ -67,7 +67,7 @@ <android.widget.Button android:id="@+id/delete_button" style="@style/buttonReset" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_normal" android:text="@string/contact_diary_remove_all_button" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_persons_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_persons_fragment.xml index afbd27e68f0d259627979d7d1d50763af8850c4f..f30bf67dbf408028f65ae4929504e6f25c5b9da5 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_edit_persons_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_edit_persons_fragment.xml @@ -9,7 +9,7 @@ <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" style="@style/CWAToolbar.Close" app:layout_constraintEnd_toEndOf="parent" @@ -40,7 +40,7 @@ <TextView android:id="@+id/contact_diary_person_list_no_items_title" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_normal" @@ -53,8 +53,8 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/persons_recycler_view" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_margin="@dimen/spacing_normal" android:importantForAccessibility="no" android:scrollbars="vertical" @@ -67,7 +67,7 @@ <android.widget.Button android:id="@+id/delete_button" style="@style/buttonReset" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_normal" android:text="@string/contact_diary_remove_all_button" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_homescreen_card_include.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_homescreen_card_include.xml index e09ed74a09cdc05bad6292ac670ea01884b360f6..724db701a43c20e48936245b01802ca905be3efe 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_homescreen_card_include.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_homescreen_card_include.xml @@ -10,7 +10,7 @@ <TextView android:id="@+id/contact_diary_card_homescreen_title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -23,7 +23,7 @@ <TextView android:id="@+id/contact_diary_card_homescreen_body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" @@ -55,7 +55,7 @@ <Button android:id="@+id/contact_diary_card_homescreen_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_location_bottom_sheet_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_location_bottom_sheet_fragment.xml index 313959efe59d63ef09ed3deec661184afe933a7d..6c84d3fc47baf97af47357c5b1bc12f8fe44e579 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_location_bottom_sheet_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_location_bottom_sheet_fragment.xml @@ -44,7 +44,7 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/contact_diary_location_bottom_sheet_text_input_layout" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_small" @@ -67,7 +67,7 @@ <android.widget.Button android:id="@+id/contact_diary_location_bottom_sheet_save_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_fragment.xml index cd24fef52e7b1d6dfe30e701e5d01cec71353db9..f1030bc19bdf1cf00aeebfe29608478bfdc190f1 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_fragment.xml @@ -8,8 +8,8 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/contact_diary_location_list_recycler_view" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginHorizontal="@dimen/spacing_small" android:layout_marginVertical="@dimen/spacing_normal" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" @@ -40,7 +40,7 @@ <TextView android:id="@+id/contact_diary_location_list_no_items_title" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_normal" @@ -54,7 +54,7 @@ <TextView android:id="@+id/contact_diary_location_list_no_items_subtitle" style="@style/body2Medium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_tiny" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_item.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_item.xml index 7d4c67491adc0dffce5949f570376d0691192137..7ba3076e4a29661eb1a38a2b0a7a0dec74a8062b 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_item.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_location_list_item.xml @@ -23,7 +23,7 @@ <TextView android:id="@+id/contact_diary_location_list_item_name" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_small" android:layout_marginVertical="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_fragment.xml index d06d551e6daec476cb364715d444af84e5805cd0..4920c3a3aa81639c60aa0b668dab0b8931d71ffb 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_fragment.xml @@ -13,7 +13,7 @@ <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" style="@style/CWAToolbar.Close" app:layout_constraintEnd_toEndOf="parent" @@ -22,8 +22,8 @@ app:title="@string/contact_diary_title" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginBottom="@dimen/spacing_small" app:layout_constraintBottom_toTopOf="@id/contact_diary_onboarding_next_button" app:layout_constraintEnd_toEndOf="parent" @@ -36,7 +36,7 @@ <ImageView android:id="@+id/contact_diary_onboarding_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:contentDescription="@string/contact_diary_onboarding_image_content_description" android:focusable="true" @@ -49,7 +49,7 @@ <TextView android:id="@+id/onboarding_headline" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -63,7 +63,7 @@ <TextView android:id="@+id/contact_diary_onboarding_body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -76,7 +76,7 @@ <include android:id="@+id/contact_diary_onboarding_first_section" layout="@layout/contact_diary_onboarding_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -89,7 +89,7 @@ <include android:id="@+id/contact_diary_onboarding_second_section" layout="@layout/contact_diary_onboarding_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -102,7 +102,7 @@ <include android:id="@+id/contact_diary_onboarding_third_section" layout="@layout/contact_diary_onboarding_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -115,7 +115,7 @@ <include android:id="@+id/contact_diary_onboarding_fourth_section" layout="@layout/contact_diary_onboarding_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -128,7 +128,7 @@ <include android:id="@+id/contact_diary_onboarding_fifth_section" layout="@layout/contact_diary_onboarding_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -141,7 +141,7 @@ <include android:id="@+id/contact_diary_onboarding_privacy_card" layout="@layout/contact_diary_privacy_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/guideline_card" android:layout_marginTop="@dimen/spacing_normal" @@ -152,7 +152,7 @@ <View android:id="@+id/contact_diary_onboarding_first_divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_small" android:background="?android:attr/listDivider" @@ -163,7 +163,7 @@ <TextView android:id="@+id/contact_diary_onboarding_privacy_information" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:background="?selectableItemBackground" android:clickable="true" @@ -177,7 +177,7 @@ <View android:id="@+id/contact_diary_onboarding_second_divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:background="?android:attr/listDivider" app:layout_constraintBottom_toBottomOf="parent" @@ -206,7 +206,7 @@ <android.widget.Button android:id="@+id/contact_diary_onboarding_next_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_row.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_row.xml index 8b6cedcd46f1cd59b6ea278c4f245ba9486aa672..7590e16c371522be8d42c13efe74cb92214fae52 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_row.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_onboarding_row.xml @@ -33,7 +33,7 @@ <TextView android:id="@+id/contact_diary_row_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" android:text="@{body}" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_fragment.xml index f84d209ab2070ecfa0ff417e97dab6f675901e39..d3182899cbebc34850e13b284c0c0ef9b8acb49d 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_fragment.xml @@ -11,7 +11,7 @@ <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" style="@style/CWAToolbar.BackArrow" android:background="@color/colorBackground" @@ -24,7 +24,7 @@ <TextView android:id="@+id/onboarding_headline" style="@style/headline5Bold" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:focusable="true" @@ -37,7 +37,7 @@ <TextView android:id="@+id/contact_diary_overview_subtitle" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" @@ -49,8 +49,8 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/contact_diary_overview_recyclerview" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginTop="@dimen/spacing_small" android:layout_marginBottom="@dimen/spacing_mega_tiny" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_list_item.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_list_item.xml index d14dd047210dd1413d276bab525d8407861bf2fa..ee92e9c05860e7877f5bf1a9ccdfc6ffeff0dba3 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_list_item.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_list_item.xml @@ -23,7 +23,7 @@ <TextView android:id="@+id/contact_diary_overview_element_name" style="@style/contactDiaryListItem" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" android:focusable="true" @@ -35,7 +35,7 @@ <ImageView android:id="@+id/contact_diary_overview_element_right_arrow" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_tiny" android:layout_marginEnd="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_nested_list_item.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_nested_list_item.xml index dcd3745ccda10f237685e3b82e453f26c1f33154..e05f8779d5a8df94f0d1c4ff8dd521df19083fe7 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_overview_nested_list_item.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_overview_nested_list_item.xml @@ -25,7 +25,7 @@ <ImageView android:id="@+id/contact_diary_overview_element_image" android:layout_width="wrap_content" - android:layout_height="@dimen/match_constraint" + android:layout_height="0dp" android:layout_marginStart="@dimen/spacing_small" android:importantForAccessibility="no" android:scaleType="centerInside" @@ -37,7 +37,7 @@ <TextView android:id="@+id/contact_diary_overview_element_name" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_person_bottom_sheet_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_person_bottom_sheet_fragment.xml index a1958cdbdfd013a7c61d7a7255eea3d0af869a22..c4ed71519a0afbfa26f186252bfd042fb1e14cae 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_person_bottom_sheet_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_person_bottom_sheet_fragment.xml @@ -43,7 +43,7 @@ <com.google.android.material.textfield.TextInputLayout android:id="@+id/contact_diary_person_bottom_sheet_text_input_layout" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_small" @@ -66,7 +66,7 @@ <android.widget.Button android:id="@+id/contact_diary_person_bottom_sheet_save_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_fragment.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_fragment.xml index b5dfda25ca209e3a3a2b6f3992364f68812bc99b..761caef6d9622af80b25c6ab571832e84c83beea 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_fragment.xml @@ -8,8 +8,8 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/contact_diary_person_list_recycler_view" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginHorizontal="@dimen/spacing_small" android:layout_marginVertical="@dimen/spacing_normal" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" @@ -40,7 +40,7 @@ <TextView android:id="@+id/contact_diary_person_list_no_items_title" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_normal" @@ -54,7 +54,7 @@ <TextView android:id="@+id/contact_diary_person_list_no_items_subtitle" style="@style/body2Medium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_huge" android:layout_marginTop="@dimen/spacing_tiny" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_item.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_item.xml index 856626b5998f21c605e2b14068ce642de42825c1..d81299dac4415f12f7f8c7f43b9de8ca41e02e16 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_item.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_person_list_item.xml @@ -23,7 +23,7 @@ <TextView android:id="@+id/contact_diary_person_list_item_name" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_small" android:layout_marginVertical="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_privacy_card.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_privacy_card.xml index fa066d4d3bb3fdc476edb300e1b7c7a798ef3431..3d9a24832fae9c75df5bab8289d225ef167001c7 100644 --- a/Corona-Warn-App/src/main/res/layout/contact_diary_privacy_card.xml +++ b/Corona-Warn-App/src/main/res/layout/contact_diary_privacy_card.xml @@ -4,7 +4,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/contact_diary_privacy_card" - style="@style/cardGrey" + style="@style/GreyCard" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/spacing_normal" @@ -14,7 +14,7 @@ android:id="@+id/contact_diary_privacy_card_title" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/contact_diary_onboarding_privacy_information_title" android:focusable="true" @@ -26,7 +26,7 @@ android:id="@+id/contact_diary_privacy_card_first_section_title" style="@style/subtitle" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/contact_diary_onboarding_privacy_information_first_section_title" @@ -38,7 +38,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/contact_diary_privacy_card_first_section_body_container_one" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" @@ -56,7 +56,7 @@ <TextView android:id="@+id/contact_diary_privacy_card_first_section_body_one" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:focusable="true" @@ -70,7 +70,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/contact_diary_privacy_card_first_section_body_container_two" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" @@ -87,7 +87,7 @@ <TextView android:id="@+id/contact_diary_privacy_card_first_section_body_two" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:focusable="true" @@ -102,7 +102,7 @@ <TextView android:id="@+id/contact_diary_privacy_card_second_section_title" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -114,7 +114,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/contact_diary_privacy_card_second_section_body_container_one" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" @@ -131,7 +131,7 @@ <TextView android:id="@+id/contact_diary_privacy_card_second_section_body_one" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:focusable="true" @@ -145,7 +145,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/contact_diary_privacy_card_second_section_body_container_two" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" @@ -162,7 +162,7 @@ <TextView android:id="@+id/contact_diary_privacy_card_second_section_body_two" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:focusable="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information.xml b/Corona-Warn-App/src/main/res/layout/fragment_information.xml index 09abab386fbd8ad10175f5c88d9e08f1cc730ec8..783c68a5e79461e9a035f3c7ed9ebcd53272e6ca 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information.xml @@ -106,29 +106,39 @@ app:layout_constraintTop_toBottomOf="@+id/information_contact" app:subtitle="@{@string/information_legal_title}" /> + <include + android:id="@+id/information_debuglog" + layout="@layout/include_row" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/information_contact" + app:subtitle="@{@string/debugging_debuglog_title}" /> + <TextView android:id="@+id/information_version" style="@style/body2Medium" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="@dimen/guideline_body_title_padding" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" - tools:text="v1.8.0-RC1" - android:layout_marginStart="@dimen/guideline_body_title_padding" /> + tools:text="v1.8.0-RC1" /> <TextView android:id="@+id/information_enf_version" style="@style/body2Medium" - android:visibility="gone" - tools:visibility="visible" android:layout_width="match_parent" - android:paddingTop="@dimen/spacing_tiny" - android:paddingBottom="@dimen/spacing_tiny" android:layout_height="wrap_content" - android:focusable="true" + android:layout_marginStart="@dimen/guideline_body_title_padding" android:background="?selectableItemBackground" + android:focusable="true" + android:paddingTop="@dimen/spacing_tiny" + android:paddingBottom="@dimen/spacing_tiny" + android:visibility="gone" tools:text="16000000" - android:layout_marginStart="@dimen/guideline_body_title_padding" /> + tools:visibility="visible" /> </LinearLayout> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml index 504b275a695ffcf346a66c1745e450bd0c8ec993..1c11a67bb189f6b23507bd310539e8721c898aa1 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_information_legal.xml @@ -20,7 +20,7 @@ <include android:id="@+id/information_legal_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -29,8 +29,8 @@ app:title="@{@string/information_legal_title}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:fillViewport="true" android:focusable="true" app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" @@ -70,7 +70,7 @@ <include android:id="@+id/information_legal_divider_contact" layout="@layout/include_divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:focusable="true" @@ -108,7 +108,7 @@ <include android:id="@+id/information_legal_contact_form" layout="@layout/include_contact_form" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toStartOf="@+id/guideline_end" app:layout_constraintStart_toEndOf="@+id/guideline_start" @@ -117,7 +117,7 @@ <include android:id="@+id/information_legal_divider_taxid" layout="@layout/include_divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" app:layout_constraintEnd_toEndOf="@+id/guideline_end" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_interoperability_configuration.xml b/Corona-Warn-App/src/main/res/layout/fragment_interoperability_configuration.xml index 5061f03075ee26981a75e575ffb8bfa1b7d6d7ff..0fec8d14b854f83f60a54453e3b5cae672911f17 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_interoperability_configuration.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_interoperability_configuration.xml @@ -15,7 +15,7 @@ <include android:id="@+id/interoperability_configuration_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:title="@{@string/interoperability_title}" app:icon="@{@drawable/ic_back}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml index f766a4b60557a75edfbd07c6da4db1b00bbbb35b..5e4b126e35c3a9c1fef3fe4af0f762e9db26e626 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_onboarding_privacy.xml @@ -45,8 +45,8 @@ <include layout="@layout/include_onboarding" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginBottom="@dimen/spacing_small" app:body="@{FormatterHelper.parseHtmlFromAssets(context, @string/information_privacy_html_path)}" app:headline="@{@string/onboarding_privacy_headline}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml index b10e12af96c1dfda406f6f2223ceb11d6e4db6ff..ef1a77ba6efac198d149805bdba3e126b46ae6fa 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings.xml @@ -84,7 +84,7 @@ <include android:id="@+id/settings_background_priority" layout="@layout/include_setting_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:body="@{@string/settings_background_priority_body_description}" app:color="@{backgroundState.getBackgroundPriorityIconColor(context)}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_background_priority.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_background_priority.xml index fb78326f1ad18383b5e424a0edd0f82ec81adc22..d3b162defdbd627c69d4d58f82c440a16d621255 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_background_priority.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_background_priority.xml @@ -18,7 +18,7 @@ <include android:id="@+id/settings_background_priority_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -27,8 +27,8 @@ app:title="@{@string/settings_background_priority_title}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:fillViewport="true" app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" app:layout_constraintEnd_toEndOf="parent" @@ -42,12 +42,12 @@ <include android:id="@+id/settings_background_priority_header_details" layout="@layout/include_information_details" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:body="@{@string/settings_background_priority_body}" app:headline="@{@string/settings_background_priority_headline}" app:illustration="@{state.getHeaderIllustration(context)}" - app:illustrationDescription="@{@string/settings_background_priority_illustration_description}" + app:illustrationDescription="@{state.getHeaderIllustrationDescription(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -101,7 +101,7 @@ <include android:id="@+id/settings_tracing_status_connection" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:body="@{@string/settings_background_priority_card_body}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml index 7f45da2f1c66e0bdb5b51a45e80b5f3bdd400448..f2a5f0f15f992c625cf64c554ba0a700fe76cc24 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_notifications.xml @@ -88,7 +88,7 @@ <include android:id="@+id/settings_notifications_card" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" gone="@{state == null || state.isNotificationsEnabled}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml index 66961944eaa54cebc2808d1fba7ca77f04022c6e..5daedd342d05ab2efca12dd091df346b41bb1c92 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_reset.xml @@ -50,7 +50,7 @@ <include android:id="@+id/settings_reset_keys" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" app:body="@{@string/settings_reset_body_keys}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml index b4808c5b5880efaf863d21078f6cf4ec38d6dd7d..b7e28dd240178406b6f69c316c2236fa6402a210 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_settings_tracing.xml @@ -61,7 +61,7 @@ <include android:id="@+id/settings_tracing_switch_row" layout="@layout/include_settings_switch_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:enabled="@{settingsTracingState.isTracingSwitchEnabled()}" @@ -75,7 +75,7 @@ <include android:id="@+id/settings_interoperability_row" layout="@layout/include_settings_plain_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -86,7 +86,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/settings_tracing_status" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:layout_constraintEnd_toEndOf="parent" @@ -96,7 +96,7 @@ <include android:id="@+id/settings_tracing_status_location" layout="@layout/include_tracing_status_card_location" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" gone="@{!settingsTracingState.isLocationCardVisible()}" app:buttonText="@{@string/settings_tracing_status_location_button}" @@ -109,7 +109,7 @@ <include android:id="@+id/settings_tracing_status_bluetooth" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" gone="@{!settingsTracingState.isBluetoothCardVisible()}" app:body="@{@string/settings_tracing_status_bluetooth_body}" @@ -151,7 +151,7 @@ <TextView android:id="@+id/settings_tracing_body" style="@style/body1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:text="@string/settings_tracing_body_text" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_consent.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_consent.xml index bec9593bf6425b65a94a848ed3a50b2d5d54dcdd..43d97e3dd4471011be8aa6b142568e6397087aeb 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_consent.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_consent.xml @@ -21,7 +21,7 @@ <include android:id="@+id/submission_consent_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -30,21 +30,21 @@ app:title="@{@string/submission_consent_main_headline}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/submission_consent_header" app:layout_constraintBottom_toTopOf="@+id/guideline_action"> <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" + android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="@dimen/spacing_normal"> <ImageView android:id="@+id/submission_consent_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:src="@drawable/ic_submission_consent" app:layout_constraintTop_toTopOf="parent" @@ -54,7 +54,7 @@ <include layout="@layout/include_submission_consent_intro" android:id="@+id/include_submission_consent_intro" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintStart_toStartOf="parent" @@ -63,7 +63,7 @@ <de.rki.coronawarnapp.ui.view.CountryListView android:id="@+id/countryList" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginHorizontal="@dimen/spacing_normal" @@ -74,7 +74,7 @@ <include layout="@layout/include_submission_consent_body" android:id="@+id/include_submission_consent_body" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginHorizontal="@dimen/guideline_card" @@ -84,7 +84,7 @@ <FrameLayout android:id="@+id/divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_tiny" android:background="@color/colorHairline" @@ -94,7 +94,7 @@ <TextView android:id="@+id/submission_consent_main_bottom_body" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:paddingVertical="@dimen/spacing_tiny" android:text="@string/submission_consent_main_bottom_body" @@ -108,7 +108,7 @@ style="@style/subtitle"/> <FrameLayout - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:background="@color/colorHairline" app:layout_constraintTop_toBottomOf="@id/submission_consent_main_bottom_body" @@ -124,7 +124,7 @@ <Button android:id="@+id/submission_consent_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_accept_button" android:textAllCaps="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml index e19759e955cc26f042c86b9fbc2f15228dda2f08..a8b7ca3fd3c2c12eca992a6f6bef5377bb092e55 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml @@ -14,7 +14,7 @@ <include android:id="@+id/submission_contact_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -25,8 +25,8 @@ <include android:id="@+id/include_submission_contact" layout="@layout/include_submission_contact" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@id/guideline_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -35,7 +35,7 @@ <Button android:id="@+id/submission_contact_button_call" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_contact_button_call" android:textAllCaps="true" @@ -47,7 +47,7 @@ <Button android:id="@+id/submission_contact_button_enter" style="@style/buttonLight" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_contact_button_enter" android:textAllCaps="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml index 68b9de13bc49356e73fbe683763a77ee124bee8b..e9c5d4d4b3ca2d2117216e6acdb74b45b45017b3 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml @@ -26,7 +26,7 @@ <include android:id="@+id/submission_country_selection_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -37,7 +37,7 @@ <TextView android:id="@+id/submission_country_selection_headline" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -49,7 +49,7 @@ <include android:id="@+id/submission_country_selection_selector" layout="@layout/include_submission_country_selector" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_tiny" android:layout_marginTop="@dimen/spacing_medium" @@ -62,7 +62,7 @@ <include android:id="@+id/submission_country_selection_no_selection" layout="@layout/include_submission_country_no_selection" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_tiny" android:layout_marginTop="@dimen/spacing_small" @@ -74,7 +74,7 @@ <TextView android:id="@+id/submission_country_selection_data_faq" style="@style/body1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -86,7 +86,7 @@ <Button android:id="@+id/submission_country_selection_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:enabled="@{submissionCountrySelectViewModel.nextActive}" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml index 044654a037b130803558ba8564b545e48fbc0f4c..218e142611efdb45c2ea6b7d148b98c8e324f838 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml @@ -14,7 +14,7 @@ <include android:id="@+id/submission_dispatcher_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -39,7 +39,7 @@ <ImageView android:id="@+id/submission_dispatcher_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:src="@drawable/ic_illustration_test" app:layout_constraintEnd_toEndOf="parent" @@ -49,7 +49,7 @@ <TextView android:id="@+id/submission_dispatcher_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_dispatcher_subheadline" @@ -61,7 +61,7 @@ <TextView android:id="@+id/submission_dispatcher_needs_testing_text" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_dispatcher_needs_testing_subheadline" @@ -73,7 +73,7 @@ <include android:id="@+id/submission_dispatcher_qr" layout="@layout/include_dispatcher_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:clickable="true" @@ -85,11 +85,10 @@ app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/submission_dispatcher_needs_testing_text" /> - <TextView android:id="@+id/submission_dispatcher_already_positive_text" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_dispatcher_already_positive_subheadline" @@ -101,7 +100,7 @@ <include android:id="@+id/submission_dispatcher_tan_code" layout="@layout/include_dispatcher_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:clickable="true" @@ -116,7 +115,7 @@ <include android:id="@+id/submission_dispatcher_tan_tele" layout="@layout/include_dispatcher_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginBottom="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml index 06a69236b36b6b09bf881402fbb6f8726d5e2365..5265e288aeb2b577b1f2910f5733633e77e5079a 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml @@ -14,7 +14,7 @@ <include android:id="@+id/submission_done_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -24,8 +24,8 @@ <include android:id="@+id/submission_done_content" layout="@layout/include_submission_done" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="@id/guideline_action" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -34,7 +34,7 @@ <Button android:id="@+id/submission_done_button_done" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:text="@string/submission_done_button_done" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_no_consent_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_no_consent_positive_other_warning.xml index 13c7783754ab29a14726e7b0cb30291c60749444..e011e4b3ed20d4560b530fe257b61a1142707ea0 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_no_consent_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_no_consent_positive_other_warning.xml @@ -18,27 +18,24 @@ android:fillViewport="true" tools:context=".ui.submission.warnothers.SubmissionResultPositiveOtherWarningNoConsentFragment"> - <include - android:id="@+id/submission_positive_other_warning_header" - layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + <androidx.appcompat.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="0dp" android:layout_height="wrap_content" - app:icon="@{@drawable/ic_back}" + style="@style/CWAToolbar.Close" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:title="@{@string/submission_positive_other_warning_title}" /> + app:title="@string/submission_positive_other_warning_title" /> <ScrollView android:id="@+id/content_scrollcontainer" android:layout_width="0dp" android:layout_height="0dp" - app:layout_constraintBottom_toTopOf="@+id/guideline_action" + app:layout_constraintBottom_toTopOf="@id/guideline_action" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_header" - app:layout_constraintVertical_bias="0.0"> + app:layout_constraintTop_toBottomOf="@id/toolbar"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" @@ -47,10 +44,10 @@ <ImageView android:id="@+id/submission_positive_other_warning_hero_illustration" - bind:cwaContentDescription="@{@string/submission_positive_other_illustration_description}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:src="@drawable/ic_submission_illustration_other_warning" + android:contentDescription="@string/submission_positive_other_illustration_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -59,64 +56,63 @@ <TextView android:id="@+id/submission_positive_other_warning_headline" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - android:accessibilityHeading="true" android:focusable="true" android:text="@string/submission_positive_other_warning_headline" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_hero_illustration" /> + app:layout_constraintTop_toBottomOf="@id/submission_positive_other_warning_hero_illustration" /> <TextView android:id="@+id/submission_positive_other_warning_text_first_part" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" android:text="@string/submission_positive_other_warning_no_consent_body_first_part" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_headline" /> + app:layout_constraintTop_toBottomOf="@id/submission_positive_other_warning_headline" /> <TextView android:id="@+id/submission_positive_other_warning_text_second_part" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" android:text="@string/submission_positive_other_warning_no_consent_body_second_part" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_text_first_part" /> + app:layout_constraintTop_toBottomOf="@id/submission_positive_other_warning_text_first_part" /> <de.rki.coronawarnapp.ui.view.CountryListView android:id="@+id/countryList" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="@+id/guideline_end" - app:layout_constraintStart_toStartOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/submission_positive_other_warning_text_second_part" /> + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@id/submission_positive_other_warning_text_second_part" /> <include android:id="@+id/submission_positive_other_privacy" layout="@layout/include_privacy_card_no_consent" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/countryList" /> + app:layout_constraintEnd_toStartOf="@id/guideline_card_end" + app:layout_constraintStart_toStartOf="@id/guideline_card_start" + app:layout_constraintTop_toBottomOf="@id/countryList" /> <include android:id="@+id/submission_no_consent_main_first_point" layout="@layout/view_bullet_point_text" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:itemText="@{@string/submission_consent_main_first_point}" @@ -127,7 +123,7 @@ <include android:id="@+id/submission_no_consent_main_second_point" layout="@layout/view_bullet_point_text" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" app:itemText="@{@string/submission_consent_main_third_point}" @@ -138,7 +134,7 @@ <include android:id="@+id/submission_no_consent_main_third_point" layout="@layout/view_bullet_point_text" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" app:itemText="@{@string/submission_consent_main_fourth_point}" @@ -148,7 +144,7 @@ <FrameLayout android:id="@+id/divider" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_small" android:background="@color/colorHairline" @@ -159,7 +155,7 @@ <TextView android:id="@+id/submission_consent_main_bottom_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:background="?selectableItemBackground" android:clickable="true" @@ -171,7 +167,7 @@ app:layout_constraintTop_toBottomOf="@id/divider" /> <FrameLayout - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:background="@color/colorHairline" app:layout_constraintEnd_toEndOf="@id/guideline_end" @@ -188,7 +184,7 @@ <Button android:id="@+id/submission_positive_other_warning_no_consent_button_next" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_accept_button" android:textAllCaps="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml index b09583be3dc7083c1eb2d8a5959addee8765f7f2..9eaf8188bcfbbf2227025cdd7636c65150637435 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml @@ -21,7 +21,7 @@ <include android:id="@+id/submission_positive_other_warning_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -31,8 +31,8 @@ <include layout="@layout/include_submission_positive_other_warning" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:countryData="@{uiState.countryList}" app:layout_constraintBottom_toTopOf="@+id/guideline_action" app:layout_constraintEnd_toEndOf="parent" @@ -44,7 +44,7 @@ <Button android:id="@+id/submission_positive_other_warning_button_next" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:enabled="@{uiState != null && uiState.isSubmitButtonEnabled()}" android:text="@string/submission_accept_button" @@ -57,7 +57,7 @@ <ProgressBar android:id="@+id/submission_positive_other_warning_spinner" style="?android:attr/progressBarStyleHorizontal" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_large" android:indeterminate="true" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml index dfa553e432a5bc1801974e287fb86f042aa8eb14..cba9a2bb359901002565ef59c64e35f55afc499b 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_scan.xml @@ -12,8 +12,8 @@ <com.journeyapps.barcodescanner.BarcodeView android:id="@+id/submission_qr_code_scan_preview" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -25,8 +25,8 @@ <com.journeyapps.barcodescanner.ViewfinderView android:id="@+id/submission_qr_code_scan_viewfinder_view" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_result_ready.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_result_ready.xml index c22d46bd8e62975f57f15c99b5b5938395d6fcfe..7ef34d33e1ad6d7a77fe5d928d417c12675d3828 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_result_ready.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_result_ready.xml @@ -15,7 +15,7 @@ <include android:id="@+id/submission_done_no_consent_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -25,8 +25,8 @@ <ScrollView android:id="@+id/content_scrollcontainer" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:fillViewport="true" app:layout_constraintBottom_toTopOf="@+id/submission_done_button_continue_with_symptom_recording" app:layout_constraintEnd_toEndOf="parent" @@ -42,7 +42,7 @@ <ImageView android:id="@+id/submission_done_hero_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:src="@drawable/ic_illustration_together" @@ -54,7 +54,7 @@ <TextView android:id="@+id/submission_done_text" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_normal" @@ -67,7 +67,7 @@ <TextView android:id="@+id/submission_done_subtitle" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -80,7 +80,7 @@ <TextView android:id="@+id/submission_done_no_consent_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -109,7 +109,7 @@ <Button android:id="@+id/submission_done_contact_button_finish_flow" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/spacing_small" android:text="@string/submission_done_no_consent_break_flow" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml index 916e7f216bae974cc8c14df0ac2bc4d0f2b5163d..6587c5eedad451ea86501427680f4a3f391077d6 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml @@ -21,7 +21,7 @@ <include android:id="@+id/submission_tan_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="false" app:icon="@{@drawable/ic_close}" @@ -33,8 +33,8 @@ <include android:id="@+id/submission_tan_content" layout="@layout/include_submission_tan" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@id/guideline_action" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -54,7 +54,7 @@ <Button android:id="@+id/submission_tan_button_enter" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:enabled="@{uiState.tanValid}" android:text="@string/submission_tan_button_text" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_available.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_available.xml index ce68d1236ec7c23becc6ffca39d595d40ab33e5d..494201687e24ae17343f7fbfe52b09a59c38dedd 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_available.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_available.xml @@ -15,7 +15,7 @@ <include android:id="@+id/submission_test_result_available_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:title="@{@string/submission_test_result_available_title}" @@ -24,8 +24,8 @@ app:layout_constraintTop_toTopOf="parent" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="@id/guideline_action" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" @@ -40,7 +40,7 @@ <ImageView android:id="@+id/submission_test_result_illustration_result_available" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:src="@drawable/ic_test_result_illustration_result_available" @@ -52,7 +52,7 @@ <de.rki.coronawarnapp.ui.submission.consentstatus.ConsentStatusView android:id="@+id/submission_test_result_available_consent_status" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:focusable="true" @@ -63,7 +63,7 @@ <TextView android:id="@+id/submission_test_result_available_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_normal" @@ -83,7 +83,7 @@ <Button android:id="@+id/submission_test_result_available_proceed_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:text="@string/submission_intro_button_next" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml index 1ef59dcf819b7e3fe1a26d4f6287281cea6ddf40..d000dfd81b3f6a4e4c2f52382680e89d979fcf8d 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml @@ -21,7 +21,7 @@ <include android:id="@+id/submission_test_result_consent_given_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -30,8 +30,8 @@ app:title="@{@string/submission_test_result_consent_given_heading}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" android:fillViewport="true" @@ -46,7 +46,7 @@ <de.rki.coronawarnapp.ui.view.TestResultSectionView android:id="@+id/submission_test_result_section" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" @@ -58,7 +58,7 @@ <TextView android:id="@+id/submission_test_result_consent_given_subtitle" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:accessibilityHeading="true" @@ -70,7 +70,7 @@ <TextView android:id="@+id/submission_test_result_consent_given_body" style="@style/body1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:accessibilityHeading="true" @@ -92,7 +92,7 @@ <Button android:id="@+id/submission_test_result_button_consent_given_continue" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_test_result_positive_continue_button_with_symptoms" app:layout_constraintBottom_toTopOf="@+id/submission_test_result_button__consent_given_continue_without_symptoms" @@ -103,7 +103,7 @@ <Button android:id="@+id/submission_test_result_button_consent_given_continue_without_symptoms" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_test_result_consent_given_breakup_button" app:layout_constraintBottom_toBottomOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_invalid.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_invalid.xml index 8f3ee30a3865449b49e88c26f7198bdbe3752b2d..42606386e207a488c3573382f457db4d58ab4361 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_invalid.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_invalid.xml @@ -12,7 +12,7 @@ <include android:id="@+id/submission_test_result_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -96,7 +96,7 @@ <Button android:id="@+id/submission_test_result_button_invalid_remove_test" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_normal" android:text="@string/submission_test_result_invalid_remove_test_button" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_negative.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_negative.xml index 726e8ec8544eb36fe341880a07a94395709fc0ff..f87e108477b6c97139a44c18bc1a19fde7cfd683 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_negative.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_negative.xml @@ -12,7 +12,7 @@ <include android:id="@+id/submission_test_result_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -122,7 +122,7 @@ <Button android:id="@+id/submission_test_result_button_negative_remove_test" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_normal" android:text="@string/submission_test_result_negative_remove_test_button" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_positive_no_consent.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_positive_no_consent.xml index c2e176272b8da319ca764390f9cd1a703d770a11..55e6be3cdde6d85fbe12e3b331ca30562d136809 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_positive_no_consent.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_positive_no_consent.xml @@ -15,7 +15,7 @@ <include android:id="@+id/submission_test_result_consent_given_header" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_close}" app:layout_constraintEnd_toEndOf="parent" @@ -24,8 +24,8 @@ app:title="@{@string/submission_test_result_consent_given_heading}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" android:layout_marginBottom="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -42,7 +42,7 @@ <de.rki.coronawarnapp.ui.view.TestResultSectionView android:id="@+id/submission_test_result_section" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" @@ -55,7 +55,7 @@ android:id="@+id/submission_test_result_positive_no_consent_subtitle" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:text="@string/submission_test_result_positive_no_consent_subtitle" @@ -80,7 +80,7 @@ <TextView android:id="@+id/submission_test_result_positive_no_consent_text_1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_small" @@ -106,7 +106,7 @@ <TextView android:id="@+id/submission_test_result_positive_no_consent_text_2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_small" @@ -131,7 +131,7 @@ <TextView android:id="@+id/submission_test_result_positive_no_consent_text_3" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_small" @@ -148,7 +148,7 @@ <Button android:id="@+id/submission_test_result_positive_no_consent_button_warn_others" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:text="@string/submission_test_result_positive_no_consent_button_warn_others" @@ -159,7 +159,7 @@ <Button android:id="@+id/submission_test_result_positive_no_consent_button_abort" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:text="@string/submission_test_result_positive_no_consent_button_abort" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_your_consent.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_your_consent.xml index d0bfb607b07904a05019b1f3adc8e61cad586b90..6afea3003ca30db6bce0e8f2d62bbe96c696d352 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_your_consent.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_your_consent.xml @@ -14,7 +14,7 @@ <include android:id="@+id/submission_your_consent_title" layout="@layout/include_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:icon="@{@drawable/ic_back}" app:layout_constraintEnd_toEndOf="parent" @@ -23,8 +23,8 @@ app:title="@{@string/submission_your_consent_title}" /> <ScrollView - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="@id/guideline_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" @@ -40,7 +40,7 @@ <include android:id="@+id/submission_your_consent_switch" layout="@layout/include_settings_switch_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:enabled="@{true}" @@ -53,7 +53,7 @@ <TextView android:id="@+id/submission_your_consent_about_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/submission_your_consent_about_agreement" @@ -64,7 +64,7 @@ <LinearLayout android:id="@+id/submission_your_consent_agreement_card" style="@style/cardTracing" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:focusable="true" @@ -109,7 +109,7 @@ <View android:id="@+id/submission_your_consent_agreement_details_divider_top" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:layout_marginTop="@dimen/spacing_medium" android:background="@color/colorHairline" @@ -120,7 +120,7 @@ <TextView android:id="@+id/submission_your_consent_agreement_details_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:background="?selectableItemBackground" android:paddingTop="@dimen/spacing_small" @@ -132,7 +132,7 @@ <View android:id="@+id/submission_your_consent_agreement_details_divider_bottom" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/card_divider" android:background="@color/colorHairline" app:layout_constraintEnd_toEndOf="@+id/guideline_end" diff --git a/Corona-Warn-App/src/main/res/layout/home_faq_card_layout.xml b/Corona-Warn-App/src/main/res/layout/home_faq_card_layout.xml index be507b5d65629f49b7b72d81b58a944f427c8d04..55e41cb3cfde7f09bd5169f55931a5be4028b1d2 100644 --- a/Corona-Warn-App/src/main/res/layout/home_faq_card_layout.xml +++ b/Corona-Warn-App/src/main/res/layout/home_faq_card_layout.xml @@ -25,7 +25,7 @@ <TextView android:id="@+id/main_card_header_headline" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="@dimen/spacing_small" android:layout_marginEnd="@dimen/spacing_small" @@ -50,7 +50,7 @@ <TextView android:id="@+id/main_card_content_body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/main_about_body" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_done.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_done.xml index 9d41a0938a295bc2c080ceff6a086ef6f577a6a5..7d43888b64c917b0c02fa946b95a41ec52ba7034 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_done.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_done.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/submission_done_card_title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_normal" @@ -24,7 +24,7 @@ <ImageView android:id="@+id/submission_done_card_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:contentDescription="@string/submission_done_illustration_description" @@ -38,7 +38,7 @@ <include android:id="@+id/submission_done_card_content" layout="@layout/include_submission_done_content" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:illustrationDescription="@{@string/submission_done_illustration_description}" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_error.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_error.xml index ab591b8506277fcec69373130b9753279fe11e49..354525d2570ffa9e54441071966b071a12ec51d7 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_error.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_error.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -26,7 +26,7 @@ <TextView android:id="@+id/subtitle" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" @@ -41,7 +41,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_tiny" @@ -71,7 +71,7 @@ <Button android:id="@+id/show_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_fetching.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_fetching.xml index dd6a74f62e62798830dbddccc6d8267165d0c73c..bc6badd3cc05e4d9b4cec32cd376d78254756055 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_fetching.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_fetching.xml @@ -12,7 +12,7 @@ <TextView android:id="@+id/submission_status_card_fetching_title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:accessibilityHeading="true" android:text="@string/submission_status_card_title_fetching" @@ -32,7 +32,7 @@ <TextView android:id="@+id/submission_status_card_fetching_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:text="@string/submission_status_card_body_fetching" @@ -44,7 +44,7 @@ <Button android:id="@+id/show_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:enabled="false" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_invalid.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_invalid.xml index ed2cecc98e023e7c93de5798a6a2360d8b73a4e9..725283a5de36bd9bf5a9ca9b622dda7ecc182722 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_invalid.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_invalid.xml @@ -26,7 +26,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" @@ -56,7 +56,7 @@ <Button android:id="@+id/delete_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_negative.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_negative.xml index 81c79af49c915bd1b35208ec1c7685fac6289909..4b8c0df4532909f0345b052769a7b52687af60d1 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_negative.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_negative.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -26,7 +26,7 @@ <TextView android:id="@+id/subtitle" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" @@ -41,7 +41,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_tiny" @@ -71,7 +71,7 @@ <Button android:id="@+id/show_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_pending.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_pending.xml index c14df92656151c9d84c5b581be341d8d0bf63125..4270b6c2f2dd7398c58607ab90a206f7f3eb2cfc 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_pending.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_pending.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -26,7 +26,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_tiny" @@ -56,7 +56,7 @@ <Button android:id="@+id/show_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_positive.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_positive.xml index 082a01db150111afa2ba38be25b6fc2016cd6407..dc381249a1cffde20e1a393f25ed9049ad63a06b 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_positive.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_positive.xml @@ -12,7 +12,7 @@ <TextView android:id="@+id/submission_status_card_positive_title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:accessibilityHeading="true" @@ -55,7 +55,7 @@ <TextView android:id="@+id/submission_status_card_positive_result_subtitle" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" @@ -67,7 +67,7 @@ <include android:id="@+id/submission_status_card_positive_result_contact" layout="@layout/include_submission_behaviour_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/submission_status_card_positive_result_contact}" @@ -79,7 +79,7 @@ <include android:id="@+id/submission_status_card_positive_result_contagious" layout="@layout/include_submission_behaviour_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/submission_status_card_positive_result_contagious}" @@ -91,7 +91,7 @@ <include android:id="@+id/submission_status_card_positive_result_share" layout="@layout/include_submission_behaviour_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/submission_status_card_positive_result_share}" @@ -103,7 +103,7 @@ <Button android:id="@+id/submission_status_card_positive_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_test_result_positive_no_consent_button_warn_others" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_ready.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_ready.xml index c88736ec8d3981481097d0374f04feeb8e36c6c8..1d5c31973af4411fd83dc7982227c35438e913b6 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_ready.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_ready.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -26,7 +26,7 @@ <TextView android:id="@+id/subtitle" style="@style/headline6Sixteen" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" @@ -39,7 +39,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" @@ -69,7 +69,7 @@ <Button android:id="@+id/show_test_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_unregistered.xml b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_unregistered.xml index e2033b0a80590b1abc587972e5fca20b08902b06..4827ffe20bc346586f167b4e4a7fa2c8dcabc260 100644 --- a/Corona-Warn-App/src/main/res/layout/home_submission_status_card_unregistered.xml +++ b/Corona-Warn-App/src/main/res/layout/home_submission_status_card_unregistered.xml @@ -11,7 +11,7 @@ <TextView android:id="@+id/title" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/card_padding" @@ -26,7 +26,7 @@ <TextView android:id="@+id/body" style="@style/subtitleMedium" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_normal" @@ -56,7 +56,7 @@ <Button android:id="@+id/next_steps_action" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/card_padding" android:layout_marginTop="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/include_16_years.xml b/Corona-Warn-App/src/main/res/layout/include_16_years.xml index 2c2d72d0c3f6f94a7aaf25f28afa7cf947ddd54f..1019f8d929de461f53a8e6b2c0620798c8695411 100644 --- a/Corona-Warn-App/src/main/res/layout/include_16_years.xml +++ b/Corona-Warn-App/src/main/res/layout/include_16_years.xml @@ -4,7 +4,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/sixteen_years" - style="@style/card" + style="@style/Card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_small" @@ -29,7 +29,7 @@ <TextView android:id="@+id/sixteen_years_body" style="@style/subtitleSixteen" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/sixteen_description_text" @@ -40,4 +40,4 @@ app:layout_constraintTop_toBottomOf="@+id/sixteen_years_headline" /> </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml b/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml index bc7769de5330a76f8949548f2bbea354b7b12f0c..c5da5315daa951ae9073dc4b5a3cc783e98efd00 100644 --- a/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_dispatcher_card.xml @@ -22,8 +22,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/dispatcher_card" - style="@style/cardGrey" - android:foreground="?selectableItemBackground" + style="@style/GreyCard.Ripple" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" @@ -33,7 +32,7 @@ android:id="@+id/dispatcher_card_title" style="@style/headline6" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_normal" @@ -59,7 +58,7 @@ <TextView android:id="@+id/submission_dispatcher_card_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/include_onboarding.xml b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml index 2236318df353218c3203ccaa60970758e4474d39..4f0c7981a3198bb01c3f5cc98a51458fd9e8d132 100644 --- a/Corona-Warn-App/src/main/res/layout/include_onboarding.xml +++ b/Corona-Warn-App/src/main/res/layout/include_onboarding.xml @@ -183,7 +183,7 @@ <include android:id="@+id/onboarding_location_card" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_large" android:focusable="true" @@ -198,7 +198,7 @@ <include android:id="@+id/onboarding_location_card_16_years" layout="@layout/include_16_years" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" @@ -211,7 +211,7 @@ <include android:id="@+id/onboarding_card" layout="@layout/include_tracing_status_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" diff --git a/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml b/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml index 6da5f3ec6e4458480425f966ed77f814ee1e7a03..b9679f833f9347aa22194713154f9af69daf63c9 100644 --- a/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_privacy_card.xml @@ -4,7 +4,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/privacy_card" - style="@style/cardGrey" + style="@style/GreyCard" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/spacing_normal" @@ -14,7 +14,7 @@ android:id="@+id/privacy_card_title" style="@style/headline6" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_positive_other_warning_privacy_title" android:focusable="true" @@ -25,7 +25,7 @@ <TextView android:id="@+id/privacy_card_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_positive_other_warning_privacy_body" @@ -35,4 +35,4 @@ app:layout_constraintTop_toBottomOf="@+id/privacy_card_title" /> </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/layout/include_privacy_card_no_consent.xml b/Corona-Warn-App/src/main/res/layout/include_privacy_card_no_consent.xml index 052034897ad6d62829abc69891ca496aa398779c..7fc07916734d6ca6c76ced7e8e78bd562b21bded 100644 --- a/Corona-Warn-App/src/main/res/layout/include_privacy_card_no_consent.xml +++ b/Corona-Warn-App/src/main/res/layout/include_privacy_card_no_consent.xml @@ -4,7 +4,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/privacy_card" - style="@style/cardGrey" + style="@style/GreyCard" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/spacing_normal" @@ -14,7 +14,7 @@ android:id="@+id/privacy_card_title" style="@style/headline6" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_consent_your_consent_subsection_headline" android:focusable="true" @@ -25,7 +25,7 @@ <TextView android:id="@+id/privacy_card_text_part_first" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_no_consent_your_consent_subsection_body_first_part" @@ -37,7 +37,7 @@ <TextView android:id="@+id/privacy_card_text_part_second" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_no_consent_your_consent_subsection_body_second_part" @@ -49,7 +49,7 @@ <TextView android:id="@+id/privacy_card_text_part_third" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_no_consent_your_consent_subsection_body_third_part" @@ -61,4 +61,4 @@ </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml index b10fe9614a877033f9eee5d0481aba274d845421..00675f1c5231c23dadfa2aed73107b97ba1c2b52 100644 --- a/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml +++ b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml @@ -9,7 +9,7 @@ android:id="@+id/simple_step_entry_title" style="@style/headline6" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -19,7 +19,7 @@ <TextView android:id="@+id/simple_step_entry_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml b/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml index bc35f67584109eace55f5ab83998170ef5121465..1575d3be951000b21f4c356737e595b72a1d397e 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml @@ -10,17 +10,17 @@ android:layout_height="wrap_content"> <FrameLayout - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/match_constraint" + android:layout_width="0dp" + android:layout_height="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/submission_consent_your_consent_subsection_headline" app:layout_constraintBottom_toBottomOf="@id/submission_consent_your_consent_subsection_third_point" - style="@style/cardGrey" /> + style="@style/GreyCard" /> <TextView android:id="@+id/submission_consent_your_consent_subsection_headline" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_consent_your_consent_subsection_headline" android:paddingTop="@dimen/spacing_normal" @@ -31,7 +31,7 @@ <TextView android:id="@+id/submission_consent_your_consent_subsection_tapping_agree" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@+id/submission_consent_your_consent_subsection_headline" @@ -42,7 +42,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/submission_consent_your_consent_subsection_first_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:paddingVertical="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@id/submission_consent_your_consent_subsection_tapping_agree" @@ -57,7 +57,7 @@ <TextView android:id="@+id/submission_consent_your_consent_subsection_first_point_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_spacing_after" app:layout_constraintEnd_toEndOf="parent" @@ -69,7 +69,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/submission_consent_your_consent_subsection_second_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:paddingBottom="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@id/submission_consent_your_consent_subsection_first_point" @@ -84,7 +84,7 @@ <TextView android:id="@+id/submission_consent_your_consent_subsection_second_point_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_spacing_after" app:layout_constraintEnd_toEndOf="parent" @@ -97,7 +97,7 @@ <TextView android:id="@+id/submission_consent_your_consent_subsection_third_point" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_size" android:paddingStart="@dimen/spacing_normal" @@ -110,7 +110,7 @@ <include layout="@layout/view_bullet_point_text" android:id="@+id/submission_consent_main_first_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="@id/guideline_end" @@ -120,7 +120,7 @@ <include layout="@layout/view_bullet_point_text" android:id="@+id/submission_consent_main_second_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" @@ -129,7 +129,7 @@ <include layout="@layout/view_bullet_point_text" android:id="@+id/submission_consent_main_third_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/submission_consent_main_second_point" app:layout_constraintEnd_toEndOf="@id/guideline_end" @@ -139,7 +139,7 @@ <include layout="@layout/view_bullet_point_text" android:id="@+id/submission_consent_main_fourth_point" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/submission_consent_main_third_point" app:layout_constraintEnd_toEndOf="@id/guideline_end" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_consent_intro.xml b/Corona-Warn-App/src/main/res/layout/include_submission_consent_intro.xml index dc5097c2cc698720f3e3787e5b9727adc02a9f95..7cc9ed4db2571809028519984bca2bf9768c4a05 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_consent_intro.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_consent_intro.xml @@ -8,7 +8,7 @@ <TextView android:id="@+id/submission_consent_main_headline_body" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/submission_consent_illustration" app:layout_constraintStart_toStartOf="@id/guideline_start" @@ -18,7 +18,7 @@ <TextView android:id="@+id/submission_consent_call_test_result" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@+id/submission_consent_main_headline_body" @@ -29,7 +29,7 @@ <TextView android:id="@+id/submission_consent_call_test_result_body" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@+id/submission_consent_call_test_result" @@ -53,7 +53,7 @@ <TextView android:id="@+id/submission_consent_call_test_result_scan_your_test_only" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_tiny" @@ -78,7 +78,7 @@ <TextView android:id="@+id/submission_consent_call_test_result_scan_test_only_once" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginStart="@dimen/spacing_tiny" @@ -90,7 +90,7 @@ <TextView android:id="@+id/submission_consent_help_by_warning_others_headline" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@+id/submission_consent_call_test_result_scan_test_only_once" @@ -101,7 +101,7 @@ <TextView android:id="@+id/submission_consent_help_by_warning_others_body" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintTop_toBottomOf="@+id/submission_consent_help_by_warning_others_headline" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml index 9fd1854090bef44186c208751149a80f8be2b19e..803f64096c2751a5f945e042d9214780fd30ace5 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml @@ -14,7 +14,7 @@ <ImageView android:id="@+id/submission_contact_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:src="@drawable/ic_submission_illustration_hotline" android:focusable="true" @@ -27,7 +27,7 @@ <TextView android:id="@+id/submission_contact_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/submission_contact_body" @@ -40,7 +40,7 @@ android:id="@+id/submission_contact_headline" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_medium" android:text="@string/submission_contact_headline" @@ -51,7 +51,7 @@ <de.rki.coronawarnapp.ui.view.StepEntry android:id="@+id/submission_contact_step_1" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -69,7 +69,7 @@ <TextView android:id="@+id/submission_contact_step_1_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/button_icon_margin" android:text="@string/submission_contact_step_1_body" @@ -81,7 +81,7 @@ android:id="@+id/submission_contact_step_1_number" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/submission_contact_number_display" @@ -94,7 +94,7 @@ <TextView android:id="@+id/submission_contact_operating_hours_body" style="@style/body2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/submission_contact_operating_hours_body" @@ -105,7 +105,7 @@ <TextView android:id="@+id/submission_contact_body_other" style="@style/body2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/submission_contact_body_other" @@ -119,7 +119,7 @@ <de.rki.coronawarnapp.ui.view.StepEntry android:id="@+id/submission_contact_step_2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:contentDescription="@string/submission_contact_step_2_content" @@ -135,7 +135,7 @@ <TextView style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/button_icon_margin" android:text="@string/submission_contact_step_2_body" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml b/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml index 239b2ef6f95f59219a6062bcb20f1cb679e58a6a..f1738b390fb565cf7ed7d23029862877c22bb6b8 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml @@ -13,7 +13,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/submission_country_no_selection_container" - style="@style/cardGrey" + style="@style/GreyCard" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="@{FormatterSubmissionHelper.formatCountrySelectCardColor(active)}" @@ -22,7 +22,7 @@ <TextView android:id="@+id/submission_country_no_selection_header" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginVertical="@dimen/spacing_normal" android:focusable="true" @@ -36,4 +36,4 @@ <include layout="@layout/merge_guidelines_side" /> </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml b/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml index 78c77635574e9cd51fa806f587adc47a4f65cbae..b083159cb27e52665c8df74144c4c52e73cf5393 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml @@ -21,7 +21,7 @@ </data> <androidx.constraintlayout.widget.ConstraintLayout - style="@style/cardGrey" + style="@style/GreyCard" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="@{FormatterSubmissionHelper.formatCountrySelectCardColor(active)}" @@ -30,7 +30,7 @@ <TextView android:id="@+id/submission_country_selector_header" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -43,7 +43,7 @@ <androidx.recyclerview.widget.RecyclerView android:id="@+id/submission_country_selector_recyclerview" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing_mega_tiny" android:layout_marginTop="@dimen/spacing_normal" @@ -58,4 +58,4 @@ <include layout="@layout/merge_guidelines_side" /> </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done.xml index 32aa40468b6f1bcf28c287be60737de29f4bca14..b199de4cec6a04d42d224a849c4b02a8664c3850 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done.xml @@ -15,7 +15,7 @@ <ImageView android:id="@+id/submission_done_hero_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:src="@drawable/ic_illustration_together" @@ -29,7 +29,7 @@ android:id="@+id/submission_done_headline" style="@style/headline4" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_done_title" @@ -41,7 +41,7 @@ <include android:id="@+id/submission_done_content" layout="@layout/include_submission_done_content" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:illustrationDescription="@{@string/submission_done_illustration_description}" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml index dbe51a20c99baba7cf484a2041fe4681cf5d2c35..ad22d089972df0c3feda32e192cf91cdbcffe43c 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done_content.xml @@ -16,7 +16,7 @@ <TextView android:id="@+id/submission_done_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/submission_done_body" android:focusable="true" @@ -28,7 +28,7 @@ android:id="@+id/submission_done_subtitle" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_done_subtitle" @@ -40,7 +40,7 @@ <include android:id="@+id/submission_done_contagious" layout="@layout/include_submission_behaviour_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/submission_done_contagious}" @@ -52,7 +52,7 @@ <include android:id="@+id/submission_done_isolate" layout="@layout/include_submission_behaviour_row" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:body="@{@string/submission_done_isolate}" @@ -63,7 +63,7 @@ <include layout="@layout/include_submission_done_further_info" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml b/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml index 9b7f903402407811d8be2224dff743d7d303b961..361fd7ed184ef26ed02911a9cc14f76bc77d2abe 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_done_further_info.xml @@ -14,7 +14,7 @@ android:id="@+id/further_info_title" style="@style/headline5" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:text="@string/submission_done_further_info_title" @@ -24,7 +24,7 @@ <de.rki.coronawarnapp.ui.view.BulletPointList android:id="@+id/further_info_text" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:focusable="true" android:layout_marginTop="@dimen/spacing_normal" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml index b5a79867553ab763abb0170601c8dba691fb58c8..688adae687beb54590ddaf5bf1186b08d013c7d2 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_positive_other_warning.xml @@ -22,7 +22,7 @@ <ImageView android:id="@+id/submission_positive_other_warning_hero_illustration" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" bind:cwaContentDescription="@{@string/submission_positive_other_illustration_description}" android:src="@drawable/ic_submission_illustration_other_warning" @@ -35,7 +35,7 @@ android:id="@+id/submission_positive_other_warning_headline" android:accessibilityHeading="true" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/submission_positive_other_warning_headline" @@ -47,7 +47,7 @@ <TextView android:id="@+id/submission_positive_other_warning_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:focusable="true" @@ -59,7 +59,7 @@ <TextView android:id="@+id/submission_country_header_description" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@{@string/submission_interoperability_list_title}" @@ -69,7 +69,7 @@ <de.rki.coronawarnapp.ui.view.CountryListView android:id="@+id/countryList" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" app:layout_constraintEnd_toEndOf="@+id/submission_country_header_description" @@ -80,7 +80,7 @@ <include android:id="@+id/submission_positive_location_card_16_years" layout="@layout/include_16_years" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" @@ -91,7 +91,7 @@ <include android:id="@+id/submission_positive_other_privacy" layout="@layout/include_privacy_card" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml index e04c7814a6a681b9fba05ce09a1c4dde55b2f736..d9be53f3883cbbe4c6a4e3cd8a6a4a6a052dfd8d 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml @@ -14,7 +14,7 @@ <TextView android:id="@+id/submission_tan_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="false" @@ -25,7 +25,7 @@ <de.rki.coronawarnapp.ui.submission.tan.TanInput android:id="@+id/submission_tan_input" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_large" android:importantForAccessibility="no" @@ -36,7 +36,7 @@ <TextView android:id="@+id/submission_tan_character_error" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:accessibilityLiveRegion="polite" @@ -51,7 +51,7 @@ <TextView android:id="@+id/submission_tan_error" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:accessibilityLiveRegion="polite" diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml index a55bff2725d226ff13def243c9238e5718276169..002e980085a85e252dbe1eef75ea392c8c09295c 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml @@ -26,7 +26,7 @@ android:id="@+id/test_result_card_headline" style="@style/body2" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:text="@string/test_result_card_headline" @@ -37,7 +37,7 @@ <TextView android:id="@+id/test_result_card_content" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:layout_marginBottom="@dimen/spacing_normal" @@ -61,7 +61,7 @@ <TextView android:id="@+id/test_result_card_registered_at_text" style="@style/body2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml index 0b91e0f511903d98a7a3f33cdac7b738d5fd1c7c..d61dcfb128ee7d27218c436c51860c981e7a991d 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card_positive.xml @@ -12,7 +12,7 @@ android:id="@+id/test_result_card_positive_title" style="@style/headline6" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:text="@string/submission_test_result_card_positive_title" @@ -33,7 +33,7 @@ <TextView android:id="@+id/test_result_card_positive_body" style="@style/body2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml index 37d6f7d94a3595c5faa55cece511f993e2b0e6ca..50be8f7c744a15a62df03905ccd3c709b2326cc0 100644 --- a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card.xml @@ -36,7 +36,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/tracing_status_card_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -72,7 +72,7 @@ <TextView android:id="@+id/tracing_status_card_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@{body}" @@ -83,7 +83,7 @@ <Button android:id="@+id/tracing_status_card_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@{buttonText}" diff --git a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card_location.xml b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card_location.xml index ba656d1e621eba0f3cc19fafdbfc93acb10855f9..3b6ab123acf077cfca08bd3cc7f285d8af59af97 100644 --- a/Corona-Warn-App/src/main/res/layout/include_tracing_status_card_location.xml +++ b/Corona-Warn-App/src/main/res/layout/include_tracing_status_card_location.xml @@ -32,7 +32,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/tracing_status_card_header" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -68,7 +68,7 @@ <de.rki.coronawarnapp.ui.view.LocationTracingStatusCardBodyTextView android:id="@+id/tracing_status_card_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" app:layout_constraintEnd_toEndOf="parent" @@ -78,7 +78,7 @@ <Button android:id="@+id/tracing_status_card_button" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@{buttonText}" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_content_disabled_view.xml b/Corona-Warn-App/src/main/res/layout/tracing_content_disabled_view.xml index 4c9a1b726547800f03f7e955025fbe99a7b5e96e..631d5d4495e2d6e4e19c71b60c24ef7d84e19b27 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_content_disabled_view.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_content_disabled_view.xml @@ -42,7 +42,7 @@ <TextView android:id="@+id/body_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/risk_card_body_tracing_off" @@ -52,7 +52,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/risk_card_row_saved_risk" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:icon="@drawable/ic_risk_card_saved_risk" @@ -66,7 +66,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_time_fetched" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_time_fetched" android:text="@{state.getTimeFetched(context)}" @@ -81,7 +81,7 @@ android:id="@+id/enable_tracing_action" style="@style/buttonPrimary" gone="@{!state.showEnableTracingButton}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/risk_details_button_enable_tracing" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_content_failed_view.xml b/Corona-Warn-App/src/main/res/layout/tracing_content_failed_view.xml index 17ef7e04c1783573ac137f8b2c86761878cc60ab..162b1b20b361e236027044e501092736a21deb69 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_content_failed_view.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_content_failed_view.xml @@ -41,7 +41,7 @@ <TextView android:id="@+id/risk_card_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@string/risk_card_check_failed_no_internet_body" @@ -51,7 +51,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/risk_card_row_saved_risk" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:icon="@drawable/ic_risk_card_saved_risk" @@ -65,7 +65,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/risk_card_row_time_fetched" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_time_fetched" android:text="@{state.getTimeFetched(context)}" @@ -80,7 +80,7 @@ android:id="@+id/risk_card_button_update" style="@style/buttonPrimary" gone="@{!state.showRestartButton}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/risk_card_check_failed_no_internet_restart_button" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_content_increased_view.xml b/Corona-Warn-App/src/main/res/layout/tracing_content_increased_view.xml index 331d117d1336acbe9ff3dcc4e6e95925191b79f5..e6407d6f255d3ff074d0db26a12a92e1fd0d4503 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_content_increased_view.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_content_increased_view.xml @@ -42,7 +42,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_contact" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:icon="@drawable/ic_risk_card_contact_increased" @@ -57,7 +57,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_contact_last" gone="@{state.getRiskContactLast(context) == null}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_calendar" android:text="@{state.getRiskContactLast(context)}" @@ -71,7 +71,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_tracing_days" gone="@{!state.inDetailsMode}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_calendar" android:text="@{state.getRiskActiveTracingDaysInRetentionPeriod(context)}" @@ -84,7 +84,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_time_fetched" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_time_fetched" android:text="@{state.getTimeFetched(context)}" @@ -99,7 +99,7 @@ android:id="@+id/update_action" style="@style/buttonLight" gone="@{!state.showUpdateButton}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/risk_card_button_update" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_content_low_view.xml b/Corona-Warn-App/src/main/res/layout/tracing_content_low_view.xml index 2ede6f41def34ccfba6f2c6e0da353fab27e44da..9f5ad6708776b2eb60851a5cee672f3c78ae0d31 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_content_low_view.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_content_low_view.xml @@ -45,7 +45,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_contact" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:icon="@drawable/ic_risk_card_contact" @@ -59,7 +59,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/row_saved_days" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -82,7 +82,7 @@ <TextView android:id="@+id/risk_card_row_saved_days_body" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:layout_marginBottom="@dimen/spacing_tiny" @@ -99,7 +99,7 @@ <de.rki.coronawarnapp.ui.view.TracingCardInfoRow android:id="@+id/row_time_fetched" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:icon="@drawable/ic_risk_card_time_fetched" android:text="@{state.getTimeFetched(context)}" @@ -114,7 +114,7 @@ android:id="@+id/update_action" style="@style/buttonLight" gone="@{!state.showUpdateButton}" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:text="@string/risk_card_button_update" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_content_progress_view.xml b/Corona-Warn-App/src/main/res/layout/tracing_content_progress_view.xml index 0d46ba20fa451923563825949498e2de2e39521f..f6c398a6bd0e82413f2c022b1ec23ccc452db04c 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_content_progress_view.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_content_progress_view.xml @@ -54,7 +54,7 @@ <TextView android:id="@+id/body_text" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" android:layout_marginTop="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/layout/tracing_details_fragment_layout.xml b/Corona-Warn-App/src/main/res/layout/tracing_details_fragment_layout.xml index a5f3773b3eb8097b9f7529ac333dbc71bc02dd13..454abe494ee28c82b0e87d90a40d175900a506c9 100644 --- a/Corona-Warn-App/src/main/res/layout/tracing_details_fragment_layout.xml +++ b/Corona-Warn-App/src/main/res/layout/tracing_details_fragment_layout.xml @@ -109,7 +109,7 @@ <Button android:id="@+id/risk_details_button_enable_tracing" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/risk_card_button_enable_tracing" gone="@{!tracingDetailsState.isRiskDetailsEnableTracingButtonVisible()}" @@ -121,7 +121,7 @@ <Button android:id="@+id/risk_details_button_update" style="@style/buttonPrimary" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:enabled="@{tracingDetailsState.isUpdateButtonEnabled()}" android:text="@{tracingDetailsState.getUpdateButtonText(context)}" diff --git a/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml b/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml index 122002ebd47f2967d93de22ad81f942a7b2acb3f..dd70a00c8d45f6a7ab3a04aa457f28a7949e7afc 100644 --- a/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml +++ b/Corona-Warn-App/src/main/res/layout/view_bullet_point_entry.xml @@ -20,7 +20,7 @@ <TextView android:id="@+id/bullet_point_content" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_spacing_after" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/view_bullet_point_text.xml b/Corona-Warn-App/src/main/res/layout/view_bullet_point_text.xml index 0c676402ab170956a97c336f3ba66eb2df7ded29..776045ec7dc7532c1e64e97f1a32fff1581a66b0 100644 --- a/Corona-Warn-App/src/main/res/layout/view_bullet_point_text.xml +++ b/Corona-Warn-App/src/main/res/layout/view_bullet_point_text.xml @@ -27,7 +27,7 @@ <TextView android:id="@+id/bullet_point_content" style="@style/subtitle" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_spacing_after" app:layout_constraintEnd_toEndOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/view_consent_status.xml b/Corona-Warn-App/src/main/res/layout/view_consent_status.xml index c40f41e737b54ef716c061c5a11197e19ee16aeb..8f533776c8ebf58cdd2888e1df32d25814fa8671 100644 --- a/Corona-Warn-App/src/main/res/layout/view_consent_status.xml +++ b/Corona-Warn-App/src/main/res/layout/view_consent_status.xml @@ -35,7 +35,7 @@ <TextView android:id="@+id/consent_status_message" style="@style/headline6" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="56dp" android:layout_marginTop="16dp" diff --git a/Corona-Warn-App/src/main/res/layout/view_step_entry.xml b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml index d44360dd792ff6121dc36a5332878277ad6ffaa0..9a11632038ebf275cffa0680443c2b4be49eca3a 100644 --- a/Corona-Warn-App/src/main/res/layout/view_step_entry.xml +++ b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml @@ -18,7 +18,7 @@ <FrameLayout android:id="@+id/step_entry_wrapper_children" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" app:layout_constraintEnd_toEndOf="parent" @@ -29,7 +29,7 @@ <View android:id="@+id/step_entry_placeholder" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="@dimen/spacing_large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/step_entry_icon" @@ -38,7 +38,7 @@ <View android:id="@+id/step_entry_line" android:layout_width="@dimen/test_result_step_progress_line_width" - android:layout_height="@dimen/match_constraint" + android:layout_height="0dp" android:background="@color/colorSurface2" app:layout_constraintBottom_toBottomOf="@+id/step_entry_placeholder" app:layout_constraintEnd_toEndOf="@id/step_entry_icon" diff --git a/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml b/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml index 946edfe5923246f02a31e235f5c7831296bd108c..b8662fe55f085e975550c95c2336ac8a8ea94e72 100644 --- a/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml +++ b/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml @@ -15,7 +15,7 @@ android:id="@+id/test_result_section_headline" style="@style/body2" android:accessibilityHeading="true" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" app:layout_constraintEnd_toStartOf="@id/test_result_section_status_icon" @@ -26,7 +26,7 @@ <TextView android:id="@+id/test_result_section_content" style="@style/headline5" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_small" android:layout_marginBottom="@dimen/spacing_normal" @@ -48,7 +48,7 @@ <TextView android:id="@+id/test_result_section_registered_at_text" style="@style/body2" - android:layout_width="@dimen/match_constraint" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index 92042f0b6bc774d873839f2ca6d2ad81a1621add..63f88702b91bef501c8116e74f14b0d7b16de639 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -168,6 +168,9 @@ <action android:id="@+id/action_informationFragment_to_informationTechnicalFragment" app:destination="@id/informationTechnicalFragment" /> + <action + android:id="@+id/action_informationFragment_to_debuglogFragment" + app:destination="@id/debuglogFragment" /> </fragment> <fragment @@ -479,4 +482,8 @@ android:name="de.rki.coronawarnapp.ui.submission.testresult.invalid.SubmissionTestResultInvalidFragment" android:label="SubmissionTestResultInvalidFragment" tools:layout="@layout/fragment_submission_test_result_invalid" /> + <fragment + android:id="@+id/debuglogFragment" + android:name="de.rki.coronawarnapp.bugreporting.debuglog.ui.DebugLogFragment" + android:label="DebuglogFragment" /> </navigation> diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index fad771ab739b424e5d556e868d7b27c0e9ca11aa..f2b0dc6e4a7356e1410480e9aaf92649f4e94a29 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -632,8 +632,6 @@ <string name="settings_background_priority_headline">"Ðвтоматична Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° риÑк"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"Ðко Ñте активирали приоритетната работа във фонов режим, приложението може да определи Ð’Ð°ÑˆÐ¸Ñ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° риÑк по вÑÑко време. Това ще изключи оптимизациÑта на потребление на Ð±Ð°Ñ‚ÐµÑ€Ð¸Ñ Ñамо за приложението Corona-Warn-App."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description"/> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"Можете да активирате и дезактивирате приоритетната работа във фонов режим от наÑтройките на уÑтройÑтвото."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 8d4bccf40d294e233d1fb8777682df98444e21ab..4c2d1a76217febdc9a0b5ff23e793d85133b6767 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -639,8 +639,10 @@ <string name="settings_background_priority_headline">"Risikostatus immer automatisch aktualisieren"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"Wenn Sie die Priorisierte Hintergrundaktivität einschalten, kann die App Ihren Risikostatus immer automatisch prüfen. Damit wird die Optimierung des Akku-Verbrauchs ausschließlich für die Corona-Warn-App deaktiviert."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description" /> + <!-- XACT: settings(background priority) - on - illustration description --> + <string name="settings_background_priority_on_illustration_description">"Eine Hand hält ein Smartphone, auf dem ein Symbol für „Aktualisierung ist aktiv" zu sehen ist." </string> + <!-- XACT: settings(background priority) - off - illustration description --> + <string name="settings_background_priority_off_illustration_description">"Eine Hand hält ein Smartphone, auf dem ein Symbol für „Aktualisierung ist nicht aktiv" zu sehen ist."</string> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"Sie können die priorisierte Hintergrundaktivität in den Einstellungen Ihres Smartphones ein- beziehungsweise ausschalten."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> @@ -733,6 +735,27 @@ <!-- XACT: describes illustration --> <string name="information_legal_illustration_description">"Eine Hand hält ein Smartphone mit viel Text, daneben ist ein Paragraphenzeichen als Symbol für das Impressum."</string> + <!-- XHED: Headline for debug log screen --> + <string name="debugging_debuglog_title">"Fehlerbericht"</string> + <!-- YTXT: Description for the debug option to record log files --> + <string name="debugging_debuglog_intro_explanation">"Durch diese Option wird das App-Verhalten in einer Textdatei protokolliert. Ist die Option aktiviert bevor ein Fehler auftritt, können Sie diesen Bericht zur Verfügung stellen, um die Entwickler bei der Problemlösung zu unterstützen.\nEine dauerhafte Aktivierung dieser Option führt zu hohem Speicherbedarf. Der Fehlerbericht wird durch Deaktivieren der Option gelöscht."</string> + <!-- YTXT: Warning regarding downsides of recording a log file --> + <string name="debugging_debuglog_intro_warning">"Bitte beachten Sie, dass in Fehlerberichten sensible Daten (z.B. Testergebnis oder Kontakt-Tagebuch-Einträge) enthalten sein können. Aus diesem Grund sollten Sie Fehlerberichte nicht öffentlich teilen."</string> + <!-- XBUT: Button text to start the log recording --> + <string name="debugging_debuglog_action_start_recording">"Starten"</string> + <!-- XBUT: Button text to stop the log recording --> + <string name="debugging_debuglog_action_stop_recording">"Löschen"</string> + <!-- XBUT: Button text to share the log recording --> + <string name="debugging_debuglog_action_share_log">"Teilen"</string> + <!-- YTXT: Status text if a debug log is being recorded --> + <string name="debugging_debuglog_status_recording">"Aufzeichnung läuft"</string> + <!-- YTXT: Status text if a debug log is not being recorded --> + <string name="debugging_debuglog_status_not_recording">"Inaktiv"</string> + <!-- YTXT: Describtion for current logging status text if a debug log is not being recorded --> + <string name="debugging_debuglog_status_additional_infos">"Derzeitige Größe: %1$s (unkomprimiert)"</string> + <!-- XHED: Title for native sharing dialog --> + <string name="debugging_debuglog_sharing_dialog_title">"CWA Fehlerbericht teilen"</string> + <!-- #################################### Interoperability ###################################### --> diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index d158dedae0fb8fc1b7575d30b9366878321ab80b..c011f0fb6af53731a6e1da22e3efa45bd5a1fe04 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -632,8 +632,6 @@ <string name="settings_background_priority_headline">"Update Risk Status Automatically"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"If you activate prioritized background activity, the app can determine your risk status at any time. This disables battery life optimization for the Corona-Warn-App only."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description"/> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"You can activate and deactivate prioritized background activity in your device settings."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 091bd57ab0f7c6409811870b561e036be753fef5..d7c2f4d9659afff068ed7ff93ee85a9dfc77fe3d 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -632,8 +632,6 @@ <string name="settings_background_priority_headline">"Zaktualizuj automatycznie status ryzyka"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"JeÅ›li aktywujesz priorytetowe dziaÅ‚anie w tle, aplikacja bÄ™dzie mogÅ‚a ustalić Twój status ryzyka w dowolnym momencie. Powoduje to wyÅ‚Ä…czenie optymalizacji żywotnoÅ›ci baterii tylko dla aplikacji Corona-Warn-App."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description"/> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"Możesz aktywować i dezaktywować priorytetowe dziaÅ‚anie w tle w ustawieniach urzÄ…dzenia."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index 140849aaa1244e52364d4fff09bfad3871c08257..be9a8c4307673ae5ff309b846ad59d672cdef0b4 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -632,8 +632,6 @@ <string name="settings_background_priority_headline">"Actualizare automată a stării de risc"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"Dacă activaÈ›i activitatea în fundal cu prioritate, aplicaÈ›ia poate determina în orice moment starea riscului dvs. Această opÈ›iune dezactivează optimizarea vieÈ›ii bateriei doar pentru aplicaÈ›ia Corona-Warn."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description"/> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"PuteÈ›i activa È™i dezactiva activitatea în fundal cu prioritate din setările dispozitivului."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> @@ -1468,4 +1466,4 @@ <!-- XBUT: Abort button for test result positive no consent screen --> <string name="submission_test_result_positive_no_consent_button_abort">"Anulare"</string> -</resources> \ No newline at end of file +</resources> diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index a85825ce718cbbc6987defb13312021fa9ef8c4c..40eb09fef88062020c934dc4d3e62b67347fc424 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -632,8 +632,6 @@ <string name="settings_background_priority_headline">"Risk Durumunu Otomatik Olarak Güncelle"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"ÖnceliklendirilmiÅŸ arka plan aktivitesini etkinleÅŸtirirseniz uygulama risk durumunuzu sürekli olarak belirleyebilir. Bu iÅŸlem, yalnızca Corona-Warn-App için pil ömrü optimizasyonunu devre dışı bırakır."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description"/> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"ÖnceliklendirilmiÅŸ arka plan aktivitesini cihaz ayarları bölümünden etkinleÅŸtirebilir ve devre dışı bırakabilirsiniz."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml index 303580119824c96fc331621a8ef0285689e858fe..46b3eb9ebca42d7218f4d5c6487ef9d96dc6e035 100644 --- a/Corona-Warn-App/src/main/res/values/dimens.xml +++ b/Corona-Warn-App/src/main/res/values/dimens.xml @@ -126,7 +126,6 @@ <dimen name="bullet_point_spacing_before">@dimen/spacing_tiny</dimen> <dimen name="bullet_point_spacing_after">@dimen/spacing_normal</dimen> - <dimen name="match_constraint">0dp</dimen> <dimen name="no_padding">0dp</dimen> <!-- Calendar --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 4a26af31fa2b8776cbb3cbd09a10d52c196f40f0..3d784b150a37c083ea78e94b6f90f44d3cfeeb90 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -643,8 +643,10 @@ <string name="settings_background_priority_headline">"Update Risk Status Automatically"</string> <!-- YTXT: settings(background priority) - description text --> <string name="settings_background_priority_body">"If you activate prioritized background activity, the app can determine your risk status at any time. This disables battery life optimization for the Corona-Warn-App only."</string> - <!-- XACT: settings(background priority) - illustraction description --> - <string name="settings_background_priority_illustration_description" /> + <!-- XACT: settings(background priority) - on - illustration description --> + <string name="settings_background_priority_on_illustration_description" /> + <!-- XACT: settings(background priority) - off - illustration description --> + <string name="settings_background_priority_off_illustration_description" /> <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"You can activate and deactivate prioritized background activity in your device settings."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> @@ -739,6 +741,28 @@ <!-- XACT: describes illustration --> <string name="information_legal_illustration_description">"A hand holds a smartphone displaying a large body of text on the screen. Next to the text is a section symbol representing the imprint."</string> + + <!-- XHED: Headline for debug log screen --> + <string name="debugging_debuglog_title" /> + <!-- YTXT: Description for the debug option to record log files --> + <string name="debugging_debuglog_intro_explanation"></string> + <!-- YTXT: Warning regarding downsides of recording a log file --> + <string name="debugging_debuglog_intro_warning" /> + <!-- XBUT: Button text to start the log recording --> + <string name="debugging_debuglog_action_start_recording" /> + <!-- XBUT: Button text to stop the log recording --> + <string name="debugging_debuglog_action_stop_recording" /> + <!-- XBUT: Button text to share the log recording --> + <string name="debugging_debuglog_action_share_log" /> + <!-- YTXT: Status text if a debug log is being recorded --> + <string name="debugging_debuglog_status_recording" /> + <!-- YTXT: Status text if a debug log is not being recorded --> + <string name="debugging_debuglog_status_not_recording" /> + <!-- YTXT: Describtion for current logging status text if a debug log is not being recorded --> + <string name="debugging_debuglog_status_additional_infos">"%1$s"</string> + <!-- XHED: Title for native sharing dialog --> + <string name="debugging_debuglog_sharing_dialog_title" /> + <!-- #################################### Interoperability ###################################### --> diff --git a/Corona-Warn-App/src/main/res/values/styles.xml b/Corona-Warn-App/src/main/res/values/styles.xml index 07955e84cc3dea96049bd7a9a1ffee7b16a9a8e9..e1dfb49017256d8bdfeaf777a9b0d3037b4498aa 100644 --- a/Corona-Warn-App/src/main/res/values/styles.xml +++ b/Corona-Warn-App/src/main/res/values/styles.xml @@ -163,11 +163,11 @@ </style> <style name="rowSettings" parent="@style/row"> - <item name="android:paddingStart">@dimen/match_constraint</item> + <item name="android:paddingStart">0dp</item> </style> <style name="rowOverview" parent="@style/row"> - <item name="android:paddingStart">@dimen/match_constraint</item> + <item name="android:paddingStart">0dp</item> <item name="android:paddingTop">@dimen/spacing_tiny</item> <item name="android:paddingBottom">@dimen/spacing_tiny</item> </style> @@ -175,16 +175,26 @@ <!-- #################################### Card ###################################### --> - <style name="card"> + <style name="Card"> <item name="android:padding">@dimen/card_padding</item> <item name="android:background">@drawable/card</item> <item name="android:elevation">@dimen/elevation_strong</item> </style> - <style name="cardNoPadding" parent="card"> + <style name="Card.NoPadding"> <item name="android:padding">@dimen/no_padding</item> </style> + <style name="GreyCard" parent="Card.NoPadding"> + <item name="android:tint">@color/card_dark</item> + <item name="android:elevation">0dp</item> + <item name="android:backgroundTint">@color/colorSurface2</item> + </style> + + <style name="GreyCard.Ripple"> + <item name="android:background">@drawable/grey_card_ripple</item> + </style> + <style name="cardTracing"> <item name="android:padding">@dimen/card_padding</item> <item name="android:background">@drawable/card</item> @@ -208,12 +218,6 @@ <item name="android:background">@drawable/card</item> </style> - <style name="cardGrey" parent="cardNoPadding"> - <item name="android:tint">@color/card_dark</item> - <item name="android:elevation">0dp</item> - <item name="android:backgroundTint">@color/colorSurface2</item> - </style> - <!-- #################################### Grey Body Background ###################################### --> diff --git a/Corona-Warn-App/src/main/res/xml/provider_paths.xml b/Corona-Warn-App/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc1e648e7f702573ec5da2f64b42a4ed4a409fb0 --- /dev/null +++ b/Corona-Warn-App/src/main/res/xml/provider_paths.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths> + <cache-path + name="share" + path="share/" /> + <cache-path + name="shared_logs" + path="debuglog/shared/" /> +</paths> \ No newline at end of file diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensorTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..8c13580efb27805aea69afab697fdb953436cff1 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/censors/RegistrationTokenCensorTest.kt @@ -0,0 +1,86 @@ +package de.rki.coronawarnapp.bugreporting.censors + +import de.rki.coronawarnapp.bugreporting.debuglog.LogLine +import de.rki.coronawarnapp.storage.LocalData +import de.rki.coronawarnapp.util.CWADebug +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.mockkObject +import io.mockk.verify +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class RegistrationTokenCensorTest : BaseTest() { + + private val testToken = "63b4d3ff-e0de-4bd4-90c1-17c2bb683a2f" + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + + mockkObject(CWADebug) + every { CWADebug.isDeviceForTestersBuild } returns false + + mockkObject(LocalData) + every { LocalData.registrationToken() } returns testToken + } + + @AfterEach + fun teardown() { + clearAllMocks() + } + + private fun createInstance() = RegistrationTokenCensor() + + @Test + fun `censoring replaces the logline message`() { + val instance = createInstance() + val filterMe = LogLine( + timestamp = 1, + priority = 3, + message = "I'm a shy registration token: $testToken", + tag = "I'm a tag", + throwable = null + ) + instance.checkLog(filterMe) shouldBe filterMe.copy( + message = "I'm a shy registration token: 63b4###-####-####-####-############" + ) + + verify { LocalData.registrationToken() } + } + + @Test + fun `censoring returns null if thereis no match`() { + val instance = createInstance() + val filterMeNot = LogLine( + timestamp = 1, + priority = 3, + message = "I'm not a registration token ;)", + tag = "I'm a tag", + throwable = null + ) + instance.checkLog(filterMeNot) shouldBe null + } + + @Test + fun `token is not censored on tester builds`() { + every { CWADebug.isDeviceForTestersBuild } returns true + val instance = createInstance() + val filterMe = LogLine( + timestamp = 1, + priority = 3, + message = "I'm a shy registration token: $testToken", + tag = "I'm a tag", + throwable = null + ) + instance.checkLog(filterMe) shouldBe filterMe.copy( + message = "I'm a shy registration token: 63b4d3ff-e0de-4bd4-90c1-17c2bb683a2f" + ) + + verify { LocalData.registrationToken() } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..99678b82732651514deb19468f0a5eb673214a3f --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/DebugLoggerTest.kt @@ -0,0 +1,170 @@ +package de.rki.coronawarnapp.bugreporting.debuglog + +import android.app.Application +import dagger.Lazy +import de.rki.coronawarnapp.bugreporting.censors.RegistrationTokenCensor +import de.rki.coronawarnapp.util.di.ApplicationComponent +import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import testhelpers.logging.JUnitTree +import timber.log.Timber +import java.io.File +import kotlin.random.Random + +class DebugLoggerTest : BaseIOTest() { + + @MockK lateinit var application: Application + @MockK lateinit var component: ApplicationComponent + @MockK lateinit var registrationTokenCensor: RegistrationTokenCensor + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + private val cacheDir = File(testDir, "cache") + private val debugLogDir = File(cacheDir, "debuglog") + private val sharedDir = File(debugLogDir, "shared") + private val runningLog = File(debugLogDir, "debug.log") + private val triggerFile = File(debugLogDir, "debug.trigger") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + + every { application.cacheDir } returns cacheDir + every { component.inject(any<DebugLogger>()) } answers { + val logger = arg<DebugLogger>(0) + logger.bugCensors = Lazy { listOf(registrationTokenCensor) } + } + } + + @AfterEach + fun teardown() { + runBlocking { DebugLogger.stop() } + testDir.deleteRecursively() + clearAllMocks() + Timber.uprootAll() + } + + private fun createInstance() = DebugLogger + + @Test + fun `init does nothing if there is no trigger file`() { + createInstance().apply { + init(application) + isLogging shouldBe false + } + runningLog.exists() shouldBe false + Timber.forest().apply { + size shouldBe 1 + (first() is JUnitTree) shouldBe true + } + } + + @Test + fun `init calls start if there is a trigger file`() { + triggerFile.parentFile?.mkdirs() + triggerFile.createNewFile() + createInstance().apply { + init(application) + isLogging shouldBe true + } + runningLog.exists() shouldBe true + } + + @Test + fun `start plants a tree and starts a logging coroutine`() { + val instance = createInstance().apply { + init(application) + isLogging shouldBe false + } + + Timber.forest().none { it is DebugLogTree } shouldBe true + + runBlocking { + instance.start() + Timber.forest().single { it is DebugLogTree } shouldNotBe null + } + } + + @Test + fun `multiple start have no effect`() { + val instance = createInstance().apply { + init(application) + isLogging shouldBe false + } + + Timber.forest().none { it is DebugLogTree } shouldBe true + + File(sharedDir, "1").apply { + parentFile?.mkdirs() + appendBytes(Random.nextBytes(10)) + } + + runBlocking { + instance.start() + instance.start() + instance.start() + + Timber.forest().single { it is DebugLogTree } shouldNotBe null + sharedDir.listFiles()!!.size shouldBe 1 + + instance.stop() + instance.stop() + + Timber.forest().none { it is DebugLogTree } shouldBe true + DebugLogger.isLogging shouldBe false + sharedDir.listFiles()!!.size shouldBe 0 + } + } + + @Test + fun `stop cancels the coroutine and uproots the tree and deletes any logs`() { + val instance = createInstance().apply { + init(application) + isLogging shouldBe false + } + + Timber.forest().none { it is DebugLogTree } shouldBe true + + runBlocking { + instance.start() + Timber.forest().single { it is DebugLogTree } shouldNotBe null + + instance.stop() + Timber.forest().none { it is DebugLogTree } shouldBe true + DebugLogger.isLogging shouldBe false + + runningLog.exists() shouldBe false + } + } + + @Test + fun `log size returns current logfile size`() { + runningLog.parentFile?.mkdirs() + runningLog.appendBytes(Random.nextBytes(22)) + createInstance().apply { + init(application) + getLogSize() shouldBe 22 + } + } + + @Test + fun `shared size aggregates shared folder size`() { + sharedDir.mkdirs() + File(sharedDir, "1").apply { appendBytes(Random.nextBytes(10)) } + File(sharedDir, "2").apply { appendBytes(Random.nextBytes(15)) } + createInstance().apply { + init(application) + getShareSize() shouldBe 25 + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt index 4e9905c86f3738ee388fdec1a118dbb7fbafe4da..596fb9a2450527fc7af19e2fab7b3bb2d1c093c7 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt @@ -4,6 +4,7 @@ import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.appconfig.ConfigData import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException +import de.rki.coronawarnapp.notification.TestResultAvailableNotification import de.rki.coronawarnapp.notification.TestResultNotificationService import de.rki.coronawarnapp.playbook.Playbook import de.rki.coronawarnapp.server.protocols.external.exposurenotification.TemporaryExposureKeyExportOuterClass @@ -48,6 +49,7 @@ class SubmissionTaskTest : BaseTest() { @MockK lateinit var tekHistoryStorage: TEKHistoryStorage @MockK lateinit var submissionSettings: SubmissionSettings @MockK lateinit var testResultNotificationService: TestResultNotificationService + @MockK lateinit var testResultAvailableNotification: TestResultAvailableNotification @MockK lateinit var autoSubmission: AutoSubmission @MockK lateinit var tekBatch: TEKHistoryStorage.TEKBatch @@ -99,6 +101,7 @@ class SubmissionTaskTest : BaseTest() { coEvery { playbook.submit(any()) } just Runs every { testResultNotificationService.cancelPositiveTestResultNotification() } just Runs + every { testResultAvailableNotification.cancelTestResultNotification() } just Runs every { autoSubmission.updateMode(any()) } just Runs @@ -113,7 +116,8 @@ class SubmissionTaskTest : BaseTest() { submissionSettings = submissionSettings, testResultNotificationService = testResultNotificationService, timeStamper = timeStamper, - autoSubmission = autoSubmission + autoSubmission = autoSubmission, + testResultAvailableNotification = testResultAvailableNotification ) @Test @@ -152,6 +156,7 @@ class SubmissionTaskTest : BaseTest() { LocalData.numberOfSuccessfulSubmissions(1) testResultNotificationService.cancelPositiveTestResultNotification() + testResultAvailableNotification.cancelTestResultNotification() } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLoggerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLoggerTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..bc8edc659f6d6178b5b84b73397ed4404bff0ce0 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/debug/UncaughtExceptionLoggerTest.kt @@ -0,0 +1,63 @@ +package de.rki.coronawarnapp.util.debug + +import io.kotest.matchers.shouldBe +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.verify +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class UncaughtExceptionLoggerTest : BaseTest() { + + var originalHandler: Thread.UncaughtExceptionHandler? = null + + @BeforeEach + fun setup() { + originalHandler = Thread.getDefaultUncaughtExceptionHandler() + } + + @AfterEach + fun teardown() { + Thread.setDefaultUncaughtExceptionHandler(originalHandler) + } + + @Test + fun `we wrap and call through to the original handler`() { + val wrappedHandler = mockk<Thread.UncaughtExceptionHandler>() + every { wrappedHandler.uncaughtException(any(), any()) } just Runs + + val instance = UncaughtExceptionLogger(wrappedHandler) + val testException = NotImplementedError() + instance.uncaughtException(Thread.currentThread(), testException) + + verify { wrappedHandler.uncaughtException(Thread.currentThread(), testException) } + } + + @Test + fun `auto setup replaces the current handler`() { + val wrappedHandler = mockk<Thread.UncaughtExceptionHandler>() + every { wrappedHandler.uncaughtException(any(), any()) } just Runs + + Thread.setDefaultUncaughtExceptionHandler(wrappedHandler) + Thread.getDefaultUncaughtExceptionHandler() shouldBe wrappedHandler + + val ourHandler = UncaughtExceptionLogger.wrapCurrentHandler() + Thread.getDefaultUncaughtExceptionHandler() shouldBe ourHandler + } + + @Test + fun `null handlers would be okay`() { + Thread.setDefaultUncaughtExceptionHandler(null) + Thread.getDefaultUncaughtExceptionHandler() shouldBe null + + val ourHandler = UncaughtExceptionLogger.wrapCurrentHandler() + Thread.getDefaultUncaughtExceptionHandler() shouldBe ourHandler + + val instance = UncaughtExceptionLogger(null) + instance.uncaughtException(Thread.currentThread(), NotImplementedError()) + } +} diff --git a/build.gradle b/build.gradle index e38102f90694e06ffca67af034e88c94c0bf0e4c..74e5b5cc43eacb2f7d63db9d8b49c2df3d22cc77 100644 --- a/build.gradle +++ b/build.gradle @@ -11,12 +11,9 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } - maven { - url 'https://storage.googleapis.com/r8-releases/raw' - } } dependencies { - classpath 'com.android.tools:r8:2.0.74' + classpath 'com.android.tools:r8:2.0.88' classpath 'com.android.tools.build:gradle:4.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufVersion"