diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index a45a78f7566c2a5626e7356d4e5d39d8cee90818..23e83205b1d4198561b7e72f8a4d6d2197475b92 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -78,7 +78,6 @@ android { productFlavors { device { dimension "version" - buildConfigField "String", "BUILD_VARIANT", "\"device\"" resValue "string", "app_name", "Corona-Warn" ext { @@ -88,7 +87,6 @@ android { deviceForTesters { // Contains test fragments dimension "version" - buildConfigField "String", "BUILD_VARIANT", "\"deviceForTesters\"" resValue "string", "app_name", "CWA TEST" applicationIdSuffix '.dev' diff --git a/Corona-Warn-App/src/device/res/navigation/test_nav_graph.xml b/Corona-Warn-App/src/device/res/navigation/test_nav_graph.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed1d8a66ba51ded503486da1ea7c56f82c0bfae6 --- /dev/null +++ b/Corona-Warn-App/src/device/res/navigation/test_nav_graph.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<navigation xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/test_nav_graph"> + +</navigation> diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt index 7acc24c296162b1ff94af0ebd3bf0c5350d5d2d9..92e6be5c83f319428b2baca75e9ac3ad10bb5172 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt @@ -54,6 +54,7 @@ import de.rki.coronawarnapp.storage.AppDatabase import de.rki.coronawarnapp.storage.ExposureSummaryRepository import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository +import de.rki.coronawarnapp.test.menu.ui.TestMenuItem import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.KeyFileHelper import de.rki.coronawarnapp.util.di.AppInjector @@ -82,6 +83,11 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), private val vm: TestForApiFragmentViewModel by cwaViewModels { viewModelFactory } companion object { + val MENU_ITEM = TestMenuItem( + title = "Test for API", + description = "A mix of API related test options.", + targetId = R.id.test_for_api_fragment + ) const val CONFIG_SCORE = 8 fun keysToJson(keys: List<TemporaryExposureKey>): String { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuAdapter.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..246a6b59503db761c03b16f8f7bf911eb1905d65 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuAdapter.kt @@ -0,0 +1,45 @@ +package de.rki.coronawarnapp.test.menu.ui + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.FragmentTestMenuAdapterItemBinding +import de.rki.coronawarnapp.ui.lists.BaseAdapter +import javax.inject.Inject + +class TestMenuAdapter @Inject constructor() : BaseAdapter<TestMenuAdapter.VH>() { + + private val internalData = mutableListOf<TestMenuItem>() + + var data: List<TestMenuItem> + get() = internalData.toList() + set(value) { + internalData.clear() + internalData.addAll(value) + notifyDataSetChanged() + } + + var onItemClickListener: (TestMenuItem) -> Unit = {} + + override fun getItemCount(): Int = internalData.size + + override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): VH = VH(parent) + + override fun onBindBaseVH(holder: VH, position: Int) { + holder.apply { + val item = internalData[position] + bind(item) + itemView.setOnClickListener { onItemClickListener(item) } + } + } + + class VH(parent: ViewGroup) : BaseAdapter.VH(R.layout.fragment_test_menu_adapter_item, parent) { + private val viewBinding: FragmentTestMenuAdapterItemBinding = + FragmentTestMenuAdapterItemBinding.bind(itemView) + + fun bind(item: TestMenuItem) = viewBinding.apply { + imageView.setImageResource(item.iconRes) + title.text = item.title + description.text = item.description + } + } +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..8ccbcf5f5490cd8f634ad1780f7d1345b38592d6 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragment.kt @@ -0,0 +1,41 @@ +package de.rki.coronawarnapp.test.menu.ui + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.FragmentTestMenuBinding +import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.ui.observe2 +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 TestMenuFragment : Fragment(R.layout.fragment_test_menu), AutoInject { + + @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory + private val vm: TestMenuFragmentViewModel by cwaViewModels { viewModelFactory } + + private val binding: FragmentTestMenuBinding by viewBindingLazy() + + @Inject lateinit var menuAdapter: TestMenuAdapter + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.testMenuList.apply { + layoutManager = LinearLayoutManager(requireContext()) + adapter = menuAdapter + } + + vm.testMenuData.observe2(this) { menuAdapter.data = it } + menuAdapter.onItemClickListener = { vm.showTestScreen(it) } + + vm.showTestScreenEvent.observe2(this) { + findNavController().navigate(it.targetId) + } + } +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentModule.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..caf82c2556ec48477edcee01578e088b678e96c5 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentModule.kt @@ -0,0 +1,16 @@ +package de.rki.coronawarnapp.test.menu.ui + +import dagger.Binds +import dagger.Module +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 TestMenuFragmentModule { + @Binds + @IntoMap + @CWAViewModelKey(TestMenuFragmentViewModel::class) + abstract fun testRiskLevelFragment(factory: TestMenuFragmentViewModel.Factory): CWAViewModelFactory<out CWAViewModel> +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..214735fd424d2efde9d88148f3fed4cbc2d1b8e8 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt @@ -0,0 +1,27 @@ +package de.rki.coronawarnapp.test.menu.ui + +import androidx.lifecycle.MutableLiveData +import com.squareup.inject.assisted.AssistedInject +import de.rki.coronawarnapp.test.api.ui.TestForAPIFragment +import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment +import de.rki.coronawarnapp.util.ui.SingleLiveEvent +import de.rki.coronawarnapp.util.viewmodel.CWAViewModel +import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory + +class TestMenuFragmentViewModel @AssistedInject constructor() : CWAViewModel() { + + val testMenuData by lazy { + listOf( + TestForAPIFragment.MENU_ITEM, + TestRiskLevelCalculationFragment.MENU_ITEM + ).let { MutableLiveData(it) } + } + val showTestScreenEvent = SingleLiveEvent<TestMenuItem>() + + fun showTestScreen(it: TestMenuItem) { + showTestScreenEvent.postValue(it) + } + + @AssistedInject.Factory + interface Factory : SimpleCWAViewModelFactory<TestMenuFragmentViewModel> +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuItem.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuItem.kt new file mode 100644 index 0000000000000000000000000000000000000000..765012f4817f7c57dceab48e7139555172aeffb0 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuItem.kt @@ -0,0 +1,12 @@ +package de.rki.coronawarnapp.test.menu.ui + +import androidx.annotation.DrawableRes +import androidx.annotation.IdRes +import de.rki.coronawarnapp.R + +data class TestMenuItem( + @DrawableRes val iconRes: Int = R.drawable.ic_bug, + val title: String, + val description: String, + @IdRes val targetId: Int +) 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 710555ae5067a96f872f02cdb7ff3caaad3477dc..437122d7a6eb1f4b64fc3747eb2c518ab63f2bba 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 @@ -13,6 +13,7 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentTestRiskLevelCalculationBinding import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange import de.rki.coronawarnapp.sharing.ExposureSharingService +import de.rki.coronawarnapp.test.menu.ui.TestMenuItem import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel @@ -121,5 +122,10 @@ class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_le companion object { val TAG: String = TestRiskLevelCalculationFragment::class.simpleName!! + val MENU_ITEM = TestMenuItem( + title = "Risklevel Calculation", + description = "Risklevel calculation related test options.", + targetId = R.id.test_risklevel_calculation_fragment + ) } } diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt index e4371986903d63f93649895ecb25372344ad7e2c..21917dcf8a13dfd56e5854c2fa98438030748dce 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt @@ -4,12 +4,17 @@ import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.test.api.ui.TestForAPIFragment import de.rki.coronawarnapp.test.api.ui.TestForApiFragmentModule +import de.rki.coronawarnapp.test.menu.ui.TestMenuFragment +import de.rki.coronawarnapp.test.menu.ui.TestMenuFragmentModule import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragmentModule @Module abstract class MainActivityTestModule { + @ContributesAndroidInjector(modules = [TestMenuFragmentModule::class]) + abstract fun testMenuFragment(): TestMenuFragment + @ContributesAndroidInjector(modules = [TestRiskLevelCalculationFragmentModule::class]) abstract fun testRiskLevelCalculationFragment(): TestRiskLevelCalculationFragment diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt deleted file mode 100644 index e294c6778e3475ff9ebcf7887fad3904578a6074..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainFragment.kt +++ /dev/null @@ -1,243 +0,0 @@ -package de.rki.coronawarnapp.ui.main - -import android.os.Bundle -import android.view.View -import android.view.accessibility.AccessibilityEvent -import android.widget.PopupMenu -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.databinding.FragmentMainBinding -import de.rki.coronawarnapp.risk.TimeVariables -import de.rki.coronawarnapp.storage.LocalData -import de.rki.coronawarnapp.timer.TimerHelper -import de.rki.coronawarnapp.ui.doNavigate -import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel -import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel -import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel -import de.rki.coronawarnapp.util.DialogHelper -import de.rki.coronawarnapp.util.ExternalActionHelper -import de.rki.coronawarnapp.util.di.AppInjector -import de.rki.coronawarnapp.util.ui.viewBindingLazy -import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -/** - * After the user has finished the onboarding this fragment will be the heart of the application. - * Three ViewModels are needed that this fragment shows all relevant information to the user. - * Also the Menu is set here. - * - * @see tracingViewModel - * @see settingsViewModel - * @see submissionViewModel - * @see PopupMenu - */ -class MainFragment : Fragment(R.layout.fragment_main) { - - private val tracingViewModel: TracingViewModel by activityViewModels() - private val settingsViewModel: SettingsViewModel by activityViewModels() - private val submissionViewModel: SubmissionViewModel by activityViewModels() - private val binding: FragmentMainBinding by viewBindingLazy() - - private val errorResetTool by lazy { - AppInjector.component.errorResetTool - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.tracingViewModel = tracingViewModel - binding.settingsViewModel = settingsViewModel - binding.submissionViewModel = submissionViewModel - - setButtonOnClickListener() - setContentDescription() - checkShouldInteroperabilityBeOpened() - showOneTimeTracingExplanationDialog() - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - - if (errorResetTool.isResetNoticeToBeShown) { - RecoveryByResetDialogFactory(this).showDialog( - detailsLink = R.string.errors_generic_text_catastrophic_error_encryption_failure, - onDismiss = { - errorResetTool.isResetNoticeToBeShown = false - } - ) - } - } - - override fun onResume() { - super.onResume() - // refresh required data - tracingViewModel.refreshRiskLevel() - tracingViewModel.refreshExposureSummary() - tracingViewModel.refreshLastTimeDiagnosisKeysFetchedDate() - tracingViewModel.refreshIsTracingEnabled() - tracingViewModel.refreshActiveTracingDaysInRetentionPeriod() - TimerHelper.checkManualKeyRetrievalTimer() - submissionViewModel.refreshDeviceUIState() - tracingViewModel.refreshLastSuccessfullyCalculatedScore() - binding.mainScrollview.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) - } - - private fun setContentDescription() { - binding.mainHeaderShare.buttonIcon.contentDescription = getString(R.string.button_share) - binding.mainHeaderOptionsMenu.buttonIcon.contentDescription = getString(R.string.button_menu) - binding.mainAbout.mainCard.contentDescription = getString(R.string.hint_external_webpage) - } - - private fun setButtonOnClickListener() { - binding.mainTestUnregistered.submissionStatusCardUnregistered.setOnClickListener { - toSubmissionIntro() - } - binding.mainTestUnregistered.submissionStatusCardUnregisteredButton.setOnClickListener { - toSubmissionIntro() - } - binding.mainTestDone.submissionStatusCardDone.setOnClickListener { - findNavController().doNavigate( - MainFragmentDirections.actionMainFragmentToSubmissionDoneFragment() - ) - } - binding.mainTestResult.submissionStatusCardContent.setOnClickListener { - toSubmissionResult() - } - binding.mainTestResult.submissionStatusCardContentButton.setOnClickListener { - toSubmissionResult() - } - binding.mainTestPositive.submissionStatusCardPositive.setOnClickListener { - toSubmissionResult() - } - binding.mainTestPositive.submissionStatusCardPositiveButton.setOnClickListener { - toSubmissionResult() - } - binding.mainTracing.setOnClickListener { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToSettingsTracingFragment()) - } - binding.mainRisk.riskCard.setOnClickListener { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToRiskDetailsFragment()) - } - binding.mainRisk.riskCardButtonUpdate.setOnClickListener { - tracingViewModel.refreshDiagnosisKeys() - settingsViewModel.updateManualKeyRetrievalEnabled(false) - } - binding.mainRisk.riskCardButtonEnableTracing.setOnClickListener { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToSettingsTracingFragment()) - } - binding.mainAbout.mainCard.setOnClickListener { - ExternalActionHelper.openUrl(this, requireContext().getString(R.string.main_about_link)) - } - binding.mainHeaderShare.buttonIcon.setOnClickListener { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToMainSharingFragment()) - } - binding.mainHeaderOptionsMenu.buttonIcon.setOnClickListener { - showPopup(it) - } - } - - private fun toSubmissionResult() { - findNavController().doNavigate( - MainFragmentDirections.actionMainFragmentToSubmissionResultFragment() - ) - } - - private fun toSubmissionIntro() { - findNavController().doNavigate( - MainFragmentDirections.actionMainFragmentToSubmissionIntroFragment() - ) - } - - private fun showPopup(view: View) { - val popup = PopupMenu(requireContext(), view) - popup.inflate(R.menu.menu_main) - // TODO we shouldn't have to duplicate the whole fragment to add these items - // In the future we'd like a DI'ed class that changes the navigation for this MainFragment? - popup.setOnMenuItemClickListener { - return@setOnMenuItemClickListener when (it.itemId) { - R.id.menu_help -> { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToMainOverviewFragment()) - true - } - R.id.menu_information -> { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToInformationFragment()) - true - } - R.id.menu_settings -> { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToSettingsFragment()) - true - } - R.id.menu_test_api -> { - findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToTestForAPIFragment()) - true - } - R.id.menu_test_risk_level -> { - findNavController().doNavigate( - MainFragmentDirections.actionMainFragmentToTestRiskLevelCalculation( - exampleArgument = null - ) - ) - true - } - else -> super.onOptionsItemSelected(it) - } - } - popup.show() - } - - private fun checkShouldInteroperabilityBeOpened() { - if (!LocalData.isInteroperabilityShownAtLeastOnce) { - navigateToInteroperabilityFeature() - } - } - - private fun navigateToInteroperabilityFeature() { - findNavController().doNavigate( - MainFragmentDirections.actionMainFragmentToOnboardingDeltaInteroperabilityFragment() - ) - } - - private fun showOneTimeTracingExplanationDialog() { - - // check if the dialog explaining the tracing time was already shown - if (!LocalData.tracingExplanationDialogWasShown()) { - - val activity = this.requireActivity() - - lifecycleScope.launch { - - // get all text strings and the current active tracing time - val infoPeriodLogged = - getString(R.string.risk_details_information_body_period_logged) - val infoPeriodLoggedAssessment = - getString( - R.string.risk_details_information_body_period_logged_assessment, - (TimeVariables.getActiveTracingDaysInRetentionPeriod()).toString() - ) - val infoFAQ = getString(R.string.risk_details_explanation_dialog_faq_body) - - withContext(Dispatchers.Main) { - - // display the dialog - DialogHelper.showDialog( - DialogHelper.DialogInstance( - activity, - getString(R.string.risk_details_explanation_dialog_title), - "$infoPeriodLogged\n\n$infoPeriodLoggedAssessment\n\n$infoFAQ", - getString(R.string.errors_generic_button_positive), - null, - null, - { - LocalData.tracingExplanationDialogWasShown(true) - }, - {} - )) - } - } - } - } -} diff --git a/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_bug.xml b/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_bug.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed88658407baec3e8107d6281f279e9d0af2f86c --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_bug.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:width="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#000" + android:pathData="M14,12H10V10H14M14,16H10V14H14M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8Z" /> +</vector> diff --git a/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_coffee.xml b/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_coffee.xml new file mode 100644 index 0000000000000000000000000000000000000000..95c65dbf1b3c2232925dc54ff1f98bc6e1c49567 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/res/drawable/ic_coffee.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:width="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#000" + android:pathData="M2,21H20V19H2M20,8H18V5H20M20,3H4V13A4,4 0 0,0 8,17H14A4,4 0 0,0 18,13V10H20A2,2 0 0,0 22,8V5C22,3.89 21.1,3 20,3Z" /> +</vector> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml deleted file mode 100644 index b2e40f739ec11bc85cb30a65eb8dbc5cad750f59..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_main.xml +++ /dev/null @@ -1,235 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layout 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"> - - <data> - - <import type="de.rki.coronawarnapp.util.formatter.FormatterSettingsHelper" /> - - <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> - - <variable - name="submissionViewModel" - type="de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel" /> - - <variable - name="tracingViewModel" - type="de.rki.coronawarnapp.ui.viewmodel.TracingViewModel" /> - - <variable - name="settingsViewModel" - type="de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel" /> - </data> - - <ScrollView - android:id="@+id/main_scrollview" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:contentDescription="@string/main_title" - android:fillViewport="true" - tools:context="de.rki.coronawarnapp.ui.main.MainFragment"> - - <!-- todo apply merge tags through xml when applicable (eod) --> - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/main_header" - android:layout_width="@dimen/match_constraint" - android:layout_height="@dimen/header_main" - android:layout_margin="@dimen/spacing_small" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:id="@+id/main_header_logo" - android:layout_width="0dp" - android:layout_height="match_parent" - android:importantForAccessibility="no" - android:scaleType="fitStart" - android:src="@drawable/ic_main_header" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/main_header_share" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <include - android:id="@+id/main_header_share" - layout="@layout/include_button_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:icon="@{@drawable/ic_main_share}" - app:iconDescription="@{@string/main_share_title}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/main_header_options_menu" - app:layout_constraintTop_toTopOf="parent" /> - - <include - android:id="@+id/main_header_options_menu" - layout="@layout/include_button_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:icon="@{@drawable/ic_main_settings}" - app:iconDescription="@{@string/accessibility_menu}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/main_tracing" - style="@style/buttonTracing" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:focusable="true" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/main_header"> - - <TextView - android:id="@+id/main_tracing_headline" - style="@style/bodyButton" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/spacing_small" - android:focusable="false" - android:contentDescription="@{FormatterSettingsHelper.formatTracingContentDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isLocationEnabled())}" - android:text="@{FormatterSettingsHelper.formatTracingDescription(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isLocationEnabled())}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/main_tracing_icon" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <com.airbnb.lottie.LottieAnimationView - android:id="@+id/main_tracing_icon" - android:layout_width="@dimen/icon_size_main_card" - android:layout_height="@dimen/icon_size_main_card" - android:importantForAccessibility="no" - app:animation="@{FormatterSettingsHelper.formatTracingIcon(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isLocationEnabled())}" - app:animation_tint="@{FormatterSettingsHelper.formatTracingIconColor(tracingViewModel.isTracingEnabled(), settingsViewModel.isBluetoothEnabled(), settingsViewModel.isLocationEnabled())}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - <include - android:id="@+id/main_tracing_divider" - layout="@layout/include_divider" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/main_tracing" /> - - <include - android:id="@+id/main_risk" - layout="@layout/include_risk_card" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatShowRiskStatusCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_tracing_divider" - app:settingsViewModel="@{settingsViewModel}" - app:showDetails="@{false}" - app:tracingViewModel="@{tracingViewModel}" /> - - <!-- submission status cards --> - <include - android:id="@+id/main_test_unregistered" - layout="@layout/include_submission_status_card_unregistered" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardUnregisteredVisible(submissionViewModel.deviceRegistered)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@id/main_risk" /> - - <include - android:id="@+id/main_test_result" - layout="@layout/include_submission_status_card_content" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentVisible(submissionViewModel.deviceUiState)}" - app:deviceUIState="@{submissionViewModel.deviceUiState}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@id/main_test_unregistered" /> - - <include - android:id="@+id/main_test_fetching" - layout="@layout/include_submission_status_card_fetching" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardFetchingVisible(submissionViewModel.deviceRegistered, submissionViewModel.uiStateState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@id/main_test_result" /> - - <include - android:id="@+id/main_test_positive" - layout="@layout/include_submission_status_card_positive" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatShowSubmissionStatusPositiveCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_test_fetching" - app:registerDate="@{submissionViewModel.testResultReceivedDate}" /> - - <include - android:id="@+id/main_test_done" - layout="@layout/include_submission_status_card_done" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:visibility="@{FormatterSubmissionHelper.formatShowSubmissionDoneCard(submissionViewModel.deviceUiState)}" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_test_positive" /> - - <androidx.constraintlayout.widget.Barrier - android:id="@+id/main_barrier" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:barrierDirection="bottom" - app:constraint_referenced_ids="main_test_done, main_risk" /> - - <include - android:id="@+id/main_about" - layout="@layout/include_main_faq_card" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" - app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_barrier" - app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" - app:layout_constraintVertical_bias="0.0"/> - - <include layout="@layout/merge_guidelines_side" /> - - <androidx.constraintlayout.widget.Guideline - android:id="@+id/guideline_bottom" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_end="@dimen/spacing_small" /> - - <include layout="@layout/merge_guidelines_card" /> - - </androidx.constraintlayout.widget.ConstraintLayout> - - </ScrollView> -</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu.xml new file mode 100644 index 0000000000000000000000000000000000000000..32e387a62f941248a3155341818bf9ad30c82d6c --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <androidx.appcompat.widget.Toolbar + android:id="@+id/toolbar" + style="@style/Widget.AppCompat.Toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:navigationIcon="@drawable/ic_coffee" + app:layout_constraintStart_toStartOf="parent" + app:subtitle="For testers ;)" + app:layout_constraintTop_toTopOf="parent" + app:title="Test Menu" /> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/test_menu_list" + android:layout_width="match_parent" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/toolbar" /> +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu_adapter_item.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu_adapter_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..52d7e53e0e39b5f4eea259031d559ecc58373d95 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_menu_adapter_item.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:background="?selectableItemBackground" + android:layout_height="wrap_content" + xmlns:tools="http://schemas.android.com/tools"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="32dp" + android:layout_height="32dp" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + style="@style/MaterialAlertDialog.MaterialComponents.Title.Icon" + android:layout_marginBottom="8dp" + tools:src="@drawable/circle" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" /> + + <TextView + android:id="@+id/title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + style="@style/body1" + app:layout_constraintVertical_chainStyle="packed" + android:layout_marginEnd="16dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/imageView" + app:layout_constraintTop_toTopOf="parent" + tools:text="Title" /> + + <TextView + android:id="@+id/description" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + style="@style/body2" + android:layout_marginBottom="8dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/imageView" + app:layout_constraintTop_toBottomOf="@+id/title" + tools:text="Description" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml b/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml deleted file mode 100644 index 680f4bd138172b7caab32caba8e1d768f73f43a1..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/res/menu/menu_main.xml +++ /dev/null @@ -1,19 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:id="@+id/menu_help" - android:title="@string/menu_help" /> - <item - android:id="@+id/menu_information" - android:title="@string/menu_information" /> - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" /> - - <!-- These are for testing --> - <item - android:id="@+id/menu_test_api" - android:title="@string/menu_test_api" /> - <item - android:id="@+id/menu_test_risk_level" - android:title="@string/menu_test_risk_level" /> -</menu> diff --git a/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml b/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml deleted file mode 100644 index 87acfaca254f416a611c92fda2aa4fcaa3f12370..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml +++ /dev/null @@ -1,377 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<navigation 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:id="@+id/nav_graph" - app:startDestination="@id/mainFragment"> - - <!-- Main --> - <fragment - android:id="@+id/mainFragment" - android:name="de.rki.coronawarnapp.ui.main.MainFragment" - android:label="MainFragment" - tools:layout="@layout/fragment_main"> - <action - android:id="@+id/action_mainFragment_to_settingsTracingFragment" - app:destination="@id/settingsTracingFragment" /> - <action - android:id="@+id/action_mainFragment_to_riskDetailsFragment" - app:destination="@id/riskDetailsFragment" /> - <action - android:id="@+id/action_mainFragment_to_settingsFragment" - app:destination="@id/settingsFragment" /> - <action - android:id="@+id/action_mainFragment_to_testForAPIFragment" - app:destination="@id/testForAPIFragment" /> - <action - android:id="@+id/action_mainFragment_to_informationFragment" - app:destination="@id/informationFragment" /> - <action - android:id="@+id/action_mainFragment_to_mainSharingFragment" - app:destination="@id/mainSharingFragment" /> - <action - android:id="@+id/action_mainFragment_to_submissionIntroFragment" - app:destination="@id/submissionIntroFragment" /> - <action - android:id="@+id/action_mainFragment_to_submissionResultFragment" - app:destination="@id/submissionResultFragment" /> - <action - android:id="@+id/action_mainFragment_to_submissionDoneFragment" - app:destination="@id/submissionDoneFragment" /> - <action - android:id="@+id/action_mainFragment_to_mainOverviewFragment" - app:destination="@id/mainOverviewFragment" /> - <action - android:id="@+id/action_mainFragment_to_testRiskLevelCalculation" - app:destination="@id/testRiskLevelCalculation" /> - <action - android:id="@+id/action_mainFragment_to_onboardingDeltaInteroperabilityFragment" - app:destination="@id/onboardingDeltaInteroperabilityFragment" /> - </fragment> - - <fragment - android:id="@+id/mainSharingFragment" - android:name="de.rki.coronawarnapp.ui.main.MainShareFragment" - android:label="@layout/fragment_main_share" - tools:layout="@layout/fragment_main_share" /> - - <fragment - android:id="@+id/mainOverviewFragment" - android:name="de.rki.coronawarnapp.ui.main.MainOverviewFragment" - android:label="@layout/fragment_main_overview" - tools:layout="@layout/fragment_main_overview" /> - - <!-- Settings --> - <fragment - android:id="@+id/settingsFragment" - android:name="de.rki.coronawarnapp.ui.settings.SettingsFragment" - android:label="@layout/fragment_settings" - tools:layout="@layout/fragment_settings"> - <action - android:id="@+id/action_settingsFragment_to_settingsResetFragment" - app:destination="@id/settingsResetFragment" /> - <action - android:id="@+id/action_settingsFragment_to_settingsTracingFragment" - app:destination="@id/settingsTracingFragment" /> - <action - android:id="@+id/action_settingsFragment_self" - app:destination="@id/settingsFragment" /> - <action - android:id="@+id/action_settingsFragment_to_settingsNotificationFragment" - app:destination="@id/settingsNotificationFragment" /> - <action - android:id="@+id/action_settingsFragment_to_settingsBackgroundPriorityFragment" - app:destination="@id/settingsBackgroundPriorityFragment" /> - </fragment> - - <fragment - android:id="@+id/settingsTracingFragment" - android:name="de.rki.coronawarnapp.ui.settings.SettingsTracingFragment" - android:label="@layout/fragment_settings_tracing" - tools:layout="@layout/fragment_settings_tracing"> - <action - android:id="@+id/action_settingsTracingFragment_to_interopCountryConfigurationFragment" - app:destination="@id/interopCountryConfigurationFragment" /> - </fragment> - - <fragment - android:id="@+id/onboardingDeltaInteroperabilityFragment" - android:name="de.rki.coronawarnapp.ui.onboarding.OnboardingDeltaInteroperabilityFragment" - android:label="OnboardingDeltaInteroperabilityFragment" > - <action - android:id="@+id/action_onboardingDeltaInteroperabilityFragment_to_informationTermsFragment" - app:destination="@id/informationTermsFragment" /> - </fragment> - - <fragment - android:id="@+id/interopCountryConfigurationFragment" - android:name="de.rki.coronawarnapp.ui.interoperability.InteroperabilityConfigurationFragment" - android:label="InteropCountryConfigurationFragment" - tools:layout="@layout/fragment_interoperability_configuration"> - <action - android:id="@+id/action_interopCountryConfigurationFragment_to_settingTracingFragment" - app:destination="@id/settingsTracingFragment" /> - </fragment> - - <fragment - android:id="@+id/settingsNotificationFragment" - android:name="de.rki.coronawarnapp.ui.settings.SettingsNotificationFragment" - android:label="SettingsNotificationFragment" - tools:layout="@layout/fragment_settings_notifications" /> - - <fragment - android:id="@+id/settingsBackgroundPriorityFragment" - android:name="de.rki.coronawarnapp.ui.settings.SettingsBackgroundPriorityFragment" - android:label="SettingsBackgroundPriorityFragment" - tools:layout="@layout/fragment_settings_background_priority" /> - - <fragment - android:id="@+id/settingsResetFragment" - android:name="de.rki.coronawarnapp.ui.settings.SettingsResetFragment" - android:label="@layout/fragment_settings_reset" - tools:layout="@layout/fragment_settings_reset"> - <action - android:id="@+id/action_settingsResetFragment_to_mainFragment" - app:destination="@id/mainFragment" /> - </fragment> - - <!-- Information --> - <fragment - android:id="@+id/informationFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationFragment" - android:label="@layout/fragment_information" - tools:layout="@layout/fragment_information"> - <action - android:id="@+id/action_informationFragment_to_informationLegalFragment" - app:destination="@id/informationLegalFragment" /> - <action - android:id="@+id/action_informationFragment_to_informationTermsFragment" - app:destination="@id/informationTermsFragment" /> - <action - android:id="@+id/action_informationFragment_to_informationPrivacyFragment" - app:destination="@id/informationPrivacyFragment" /> - <action - android:id="@+id/action_informationFragment_to_informationAboutFragment" - app:destination="@id/informationAboutFragment" /> - <action - android:id="@+id/action_informationFragment_to_informationContactFragment" - app:destination="@id/informationContactFragment" /> - <action - android:id="@+id/action_informationFragment_to_informationTechnicalFragment" - app:destination="@id/informationTechnicalFragment" /> - </fragment> - - <fragment - android:id="@+id/informationAboutFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationAboutFragment" - android:label="@layout/fragment_information_about" - tools:layout="@layout/fragment_information_about" /> - - <fragment - android:id="@+id/informationPrivacyFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationPrivacyFragment" - android:label="@layout/fragment_information_privacy" - tools:layout="@layout/fragment_information_privacy" /> - - <fragment - android:id="@+id/informationTermsFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationTermsFragment" - android:label="@layout/fragment_information_terms" - tools:layout="@layout/fragment_information_terms" /> - - <fragment - android:id="@+id/informationContactFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationContactFragment" - android:label="@layout/fragment_information_contact" - tools:layout="@layout/fragment_information_contact" /> - - <fragment - android:id="@+id/informationLegalFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationLegalFragment" - android:label="@layout/fragment_information_legal" - tools:layout="@layout/fragment_information_legal" /> - - <fragment - android:id="@+id/informationTechnicalFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationTechnicalFragment" - android:label="InformationTechnicalFragment" - tools:layout="@layout/fragment_information_technical" /> - - <!-- Submission --> - <fragment - android:id="@+id/testForAPIFragment" - android:name="de.rki.coronawarnapp.test.api.ui.TestForAPIFragment" - android:label="@layout/fragment_test_for_a_p_i" - tools:layout="@layout/fragment_test_for_a_p_i" /> - - <fragment - android:id="@+id/riskDetailsFragment" - android:name="de.rki.coronawarnapp.ui.riskdetails.RiskDetailsFragment" - android:label="@layout/fragment_risk_details" - tools:layout="@layout/fragment_risk_details"> - <action - android:id="@+id/action_riskDetailsFragment_to_settingsTracingFragment" - app:destination="@id/settingsTracingFragment" /> - </fragment> - - <fragment - android:id="@+id/submissionDispatcherFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDispatcherFragment" - android:label="fragment_submission_dispatcher" - tools:layout="@layout/fragment_submission_dispatcher"> - <action - android:id="@+id/action_submissionDispatcherFragment_to_submissionTanFragment" - app:destination="@id/submissionTanFragment" /> - <action - android:id="@+id/action_submissionDispatcherFragment_to_submissionQRCodeScanFragment" - app:destination="@id/submissionQRCodeScanFragment" /> - <action - android:id="@+id/action_submissionDispatcherFragment_to_submissionContactFragment" - app:destination="@id/submissionContactFragment" /> - </fragment> - <fragment - android:id="@+id/submissionResultPositiveOtherWarningFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionResultPositiveOtherWarningFragment" - android:label="fragment_submission_result_positive_other_warning" - tools:layout="@layout/fragment_submission_positive_other_warning"> - <action - android:id="@+id/action_submissionResultPositiveOtherWarningFragment_to_submissionResultFragment" - app:destination="@id/submissionResultFragment" - app:popUpTo="@id/submissionResultFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_submissionResultPositiveOtherWarningFragment_to_submissionDoneFragment" - app:destination="@id/submissionDoneFragment" - app:popUpTo="@id/submissionDoneFragment" - app:popUpToInclusive="true" /> - </fragment> - <fragment - android:id="@+id/submissionResultFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTestResultFragment" - android:label="fragment_submission_result" - tools:layout="@layout/fragment_submission_test_result"> - <argument - android:name="skipInitialTestResultRefresh" - android:defaultValue="false" - app:argType="boolean" /> - <action - android:id="@+id/action_submissionResultFragment_to_mainFragment" - app:destination="@id/mainFragment" - app:popUpTo="@id/mainFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_submissionResultFragment_to_submissionSymptomIntroductionFragment" - app:destination="@id/submissionSymptomIntroductionFragment" /> - </fragment> - - <fragment - android:id="@+id/submissionTanFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTanFragment" - android:label="fragment_submission_tan" - tools:layout="@layout/fragment_submission_tan"> - <action - android:id="@+id/action_submissionTanFragment_to_submissionResultFragment" - app:destination="@id/submissionResultFragment" - app:popUpTo="@id/submissionResultFragment" - app:popUpToInclusive="true"> - <argument - android:name="skipInitialTestResultRefresh" - android:defaultValue="true" - app:argType="boolean" /> - </action> - </fragment> - - <fragment - android:id="@+id/submissionIntroFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionIntroFragment" - android:label="SubmissionIntroFragment"> - <action - android:id="@+id/action_submissionIntroFragment_to_mainFragment" - app:destination="@id/mainFragment" - app:popUpTo="@+id/mainFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_submissionIntroFragment_to_submissionDispatcherFragment" - app:destination="@id/submissionDispatcherFragment" /> - </fragment> - <activity - android:id="@+id/launcherActivity" - android:name="de.rki.coronawarnapp.ui.LauncherActivity" - android:label="LauncherActivity"> - <deepLink - android:id="@+id/deepLink" - app:uri="coronawarnapp://launch" /> - </activity> - <fragment - android:id="@+id/submissionQRCodeScanFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionQRCodeScanFragment" - android:label="SubmissionQRCodeScanFragment"> - <action - android:id="@+id/action_submissionQRCodeScanFragment_to_submissionDispatcherFragment" - app:destination="@id/submissionDispatcherFragment" - app:popUpTo="@id/submissionDispatcherFragment" - app:popUpToInclusive="true" /> - <action - android:id="@+id/action_submissionQRCodeScanFragment_to_submissionResultFragment" - app:destination="@id/submissionResultFragment" - app:popUpTo="@id/submissionResultFragment"> - <argument - android:name="skipInitialTestResultRefresh" - android:defaultValue="true" - app:argType="boolean" /> - </action> - </fragment> - <fragment - android:id="@+id/submissionDoneFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDoneFragment" - android:label="SubmissionDoneFragment"> - <action - android:id="@+id/action_submissionDoneFragment_to_mainFragment" - app:destination="@id/mainFragment" - app:popUpTo="@id/mainFragment" - app:popUpToInclusive="true" /> - </fragment> - <fragment - android:id="@+id/submissionContactFragment" - android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionContactFragment" - android:label="SubmissionContactFragment"> - <action - android:id="@+id/action_submissionContactFragment_to_submissionTanFragment" - app:destination="@id/submissionTanFragment" /> - </fragment> - <fragment - android:id="@+id/testRiskLevelCalculation" - android:name="de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment" - android:label="fragment_test_risk_level_calculation" - tools:layout="@layout/fragment_test_risk_level_calculation"> - <argument - android:name="exampleArgument" - app:argType="string" - app:nullable="true" /> - </fragment> - <fragment - android:id="@+id/submissionSymptomIntroductionFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionSymptomIntroductionFragment" - android:label="SubmissionSymptomIntroductionFragment" > - <action - android:id="@+id/action_submissionSymptomIntroductionFragment_to_submissionSymptomCalendarFragment" - app:destination="@id/submissionSymptomCalendarFragment" /> - <action - android:id="@+id/action_submissionSymptomIntroductionFragment_to_submissionResultFragment" - app:destination="@id/submissionResultFragment" /> - <action - android:id="@+id/action_submissionSymptomIntroductionFragment_to_submissionResultPositiveOtherWarningFragment" - app:destination="@id/submissionResultPositiveOtherWarningFragment" /> - </fragment> - <fragment - android:id="@+id/submissionSymptomCalendarFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionSymptomCalendarFragment" - android:label="SubmissionSymptomCalendarFragment" > - <action - android:id="@+id/action_submissionCalendarFragment_to_submissionSymptomIntroductionFragment" - app:destination="@id/submissionSymptomIntroductionFragment" /> - <action - android:id="@+id/action_submissionSymptomCalendarFragment_to_submissionResultPositiveOtherWarningFragment" - app:destination="@id/submissionResultPositiveOtherWarningFragment" /> - </fragment> -</navigation> diff --git a/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml b/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml new file mode 100644 index 0000000000000000000000000000000000000000..f4e587edd02f7688d7ef6b78a1793a60cabfcc33 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<navigation 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:id="@+id/test_nav_graph" + app:startDestination="@id/test_menu_fragment"> + + <fragment + android:id="@+id/test_menu_fragment" + android:name="de.rki.coronawarnapp.test.menu.ui.TestMenuFragment" + android:label="TestMenuFragment"> + <action + android:id="@+id/action_testMenuFragment_to_testForAPIFragment" + app:destination="@id/test_for_api_fragment" /> + <action + android:id="@+id/action_testMenuFragment_to_testRiskLevelCalculation" + app:destination="@id/test_risklevel_calculation_fragment" /> + </fragment> + + <fragment + android:id="@+id/test_for_api_fragment" + android:name="de.rki.coronawarnapp.test.api.ui.TestForAPIFragment" + android:label="@layout/fragment_test_for_a_p_i" + tools:layout="@layout/fragment_test_for_a_p_i" /> + + <fragment + android:id="@+id/test_risklevel_calculation_fragment" + android:name="de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment" + android:label="fragment_test_risk_level_calculation" + tools:layout="@layout/fragment_test_risk_level_calculation"> + <argument + android:name="exampleArgument" + app:argType="string" + android:defaultValue="null" + app:nullable="true" /> + </fragment> + +</navigation> diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/lists/BaseAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/lists/BaseAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..8cad45f7db98cddcafe6cd29c6955ab3f54e1d96 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/lists/BaseAdapter.kt @@ -0,0 +1,32 @@ +package de.rki.coronawarnapp.ui.lists + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.CallSuper +import androidx.annotation.LayoutRes +import androidx.recyclerview.widget.RecyclerView + +abstract class BaseAdapter<T : BaseAdapter.VH> : RecyclerView.Adapter<T>() { + + @CallSuper + final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T { + return onCreateBaseVH(parent, viewType) + } + + abstract fun onCreateBaseVH(parent: ViewGroup, viewType: Int): T + + @CallSuper + final override fun onBindViewHolder(holder: T, position: Int) { + onBindBaseVH(holder, position) + } + + abstract fun onBindBaseVH(holder: T, position: Int) + + abstract class VH(@LayoutRes layoutRes: Int, parent: ViewGroup) : RecyclerView.ViewHolder( + LayoutInflater.from(parent.context).inflate(layoutRes, parent, false) + ) { + + val context: Context = parent.context + } +} diff --git a/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt similarity index 93% rename from Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt index eace8dd5a4b3c93757e7f7dd1986ad0600143a63..db82cafc9c5b7084710bd046145f62b75eb560dd 100644 --- a/Corona-Warn-App/src/device/java/de/rki/coronawarnapp/ui/main/MainFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainFragment.kt @@ -17,11 +17,12 @@ import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel +import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.ExternalActionHelper -import de.rki.coronawarnapp.util.ui.viewBindingLazy import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.errors.RecoveryByResetDialogFactory +import de.rki.coronawarnapp.util.ui.viewBindingLazy import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -87,12 +88,10 @@ class MainFragment : Fragment(R.layout.fragment_main) { } private fun setContentDescription() { - val shareButtonString: String = getString(R.string.button_share) - val menuButtonString: String = getString(R.string.button_menu) - val mainCardString: String = getString(R.string.hint_external_webpage) - binding.mainHeaderShare.buttonIcon.contentDescription = shareButtonString - binding.mainHeaderOptionsMenu.buttonIcon.contentDescription = menuButtonString - binding.mainAbout.mainCard.contentDescription = mainCardString + binding.mainHeaderShare.buttonIcon.contentDescription = getString(R.string.button_share) + binding.mainHeaderOptionsMenu.buttonIcon.contentDescription = + getString(R.string.button_menu) + binding.mainAbout.mainCard.contentDescription = getString(R.string.hint_external_webpage) } private fun setButtonOnClickListener() { @@ -155,10 +154,10 @@ class MainFragment : Fragment(R.layout.fragment_main) { ) } - private fun showPopup(view: View) { - val popup = PopupMenu(requireContext(), view) - popup.inflate(R.menu.menu_main) - popup.setOnMenuItemClickListener { + private fun showPopup(view: View) = PopupMenu(requireContext(), view).apply { + inflate(R.menu.menu_main) + menu.findItem(R.id.menu_test).isVisible = CWADebug.isDeviceForTestersBuild + setOnMenuItemClickListener { return@setOnMenuItemClickListener when (it.itemId) { R.id.menu_help -> { findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToMainOverviewFragment()) @@ -172,11 +171,14 @@ class MainFragment : Fragment(R.layout.fragment_main) { findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToSettingsFragment()) true } + R.id.menu_test -> { + findNavController().doNavigate(MainFragmentDirections.actionMainFragmentToTestNavGraph()) + true + } else -> super.onOptionsItemSelected(it) } } - popup.show() - } + }.show() private fun checkShouldInteroperabilityBeOpened() { if (!LocalData.isInteroperabilityShownAtLeastOnce) { 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 66d4d98b7646c6adee562607df4ef475e6feda3a..8efb6c14888cb3fb0193da546f7ea5f9cf7566d4 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 @@ -23,7 +23,9 @@ object CWADebug { get() = BuildConfig.DEBUG || buildFlavor == BuildFlavor.DEVICE_FOR_TESTERS val buildFlavor: BuildFlavor - get() = BuildFlavor.values().single { it.rawValue == BuildConfig.BUILD_VARIANT } + get() = BuildFlavor.values().single { it.rawValue == BuildConfig.FLAVOR } + + val isDeviceForTestersBuild: Boolean = buildFlavor == BuildFlavor.DEVICE_FOR_TESTERS enum class BuildFlavor(val rawValue: String) { DEVICE("device"), diff --git a/Corona-Warn-App/src/main/res/menu/menu_main.xml b/Corona-Warn-App/src/main/res/menu/menu_main.xml index 73c8756d988fe004d10977a42833f5c804d99f0b..811d32f472235221f4f0022d1c690fe4883b126b 100644 --- a/Corona-Warn-App/src/main/res/menu/menu_main.xml +++ b/Corona-Warn-App/src/main/res/menu/menu_main.xml @@ -1,4 +1,5 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android"> +<menu xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_help" android:title="@string/menu_help" /> @@ -8,4 +9,9 @@ <item android:id="@+id/menu_settings" android:title="@string/menu_settings" /> + <item + android:id="@+id/menu_test" + android:visible="false" + android:title="Test Menu" + tools:ignore="HardcodedText" /> </menu> 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 f3b8b1a429b87429d14b4081f1970abfc44d95c3..ac0bff96c293d40617e2417b5314444020403fc9 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -5,6 +5,8 @@ android:id="@+id/nav_graph" app:startDestination="@id/mainFragment"> + <include app:graph="@navigation/test_nav_graph" /> + <!-- Main --> <fragment android:id="@+id/mainFragment" @@ -41,6 +43,9 @@ <action android:id="@+id/action_mainFragment_to_onboardingDeltaInteroperabilityFragment" app:destination="@id/onboardingDeltaInteroperabilityFragment" /> + <action + android:id="@+id/action_mainFragment_to_test_nav_graph" + app:destination="@id/test_nav_graph" /> </fragment> <fragment 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 841858a14775e4b1c09a3913440d3dc3fc9835be..424f8bf9eeabc4c9c9f12683d1812d23bb0d82e8 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -1188,10 +1188,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> 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 84632073164e6618fb2e20ce609cc95ebc93e04e..11c8210444042f6a074bdc4fe0595c6152d0e4b9 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -1188,10 +1188,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> 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 2810d7243367918a1624e6873a41f510b4a18fdf..67d99bbf967a13b9a4d572af1c724a237fd3e714 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -1188,10 +1188,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> 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 eb3ce0de59b1c33216e9e13a45226fb7021a7bef..681113024f7f608c3defc6bdda967babfebf0cd8 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -1188,10 +1188,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> 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 5d077c7223767dbbc620596050b47a64d2b886ea..8d437d7bd55b61c5ca0e170db1ab08355b23a23f 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -1188,10 +1188,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> 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 bb836d6bb461e19b8c03d93d5ae80409f6173fc3..d073615dc2ef932f4807d44f32dac5faa7d55571 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -1180,10 +1180,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index b5ac77afed96aedb566897c308c25438930f50cd..aa0181ac17062aaf217af880346759c173286d82 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -1194,10 +1194,6 @@ <!-- NOTR --> <string name="lorem_ipsum">"Lorem Ipsum"</string> <!-- NOTR --> - <string name="menu_test_api">"Test API"</string> - <!-- NOTR --> - <string name="menu_test_risk_level">"Test Risk Level"</string> - <!-- NOTR --> <string name="menu_test_notification">"Test Notification"</string> <!-- NOTR --> <string name="test_api_button_api_launch">"Android API Test(Manual Test)"</string>