├── app ├── buildNumber ├── versionName ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── ic_down_arrow.xml │ │ │ │ ├── ic_tick.png │ │ │ │ ├── settings_option_background.xml │ │ │ │ ├── divider_binary_radio_group.xml │ │ │ │ ├── ic_onboarding_circle.xml │ │ │ │ ├── error_background.xml │ │ │ │ ├── ic_circle_red.xml │ │ │ │ ├── new_label_background.xml │ │ │ │ ├── status_option_background.xml │ │ │ │ ├── question_not_selected_background.xml │ │ │ │ ├── view_cornered_background.xml │ │ │ │ ├── black_border_background.xml │ │ │ │ ├── ic_stroked_circle_red.xml │ │ │ │ ├── status_option_icon_background.xml │ │ │ │ ├── area_risk_red_background.xml │ │ │ │ ├── ic_bullet_point.xml │ │ │ │ ├── ic_circle_green.xml │ │ │ │ ├── question_selected_background.xml │ │ │ │ ├── area_risk_amber_background.xml │ │ │ │ ├── area_risk_green_background.xml │ │ │ │ ├── area_risk_neutral_background.xml │ │ │ │ ├── area_risk_yellow_background.xml │ │ │ │ ├── splash_screen.xml │ │ │ │ ├── area_risk_black_background.xml │ │ │ │ ├── area_risk_maroon_background.xml │ │ │ │ ├── ic_bullet_point_primary_grey.xml │ │ │ │ ├── ic_red_circle.xml │ │ │ │ ├── ic_blue_circle.xml │ │ │ │ ├── ic_circle_green_with_border.xml │ │ │ │ ├── ic_tick_light.xml │ │ │ │ ├── ic_arrow_back_primary.xml │ │ │ │ ├── ic_positive_symptom.xml │ │ │ │ ├── ic_more_vert.xml │ │ │ │ ├── ic_arrow_back_white.xml │ │ │ │ ├── ic_tick_green.xml │ │ │ │ ├── ic_numbered_bullet_point.xml │ │ │ │ ├── user_data_item_background.xml │ │ │ │ ├── ic_close_white.xml │ │ │ │ ├── ic_close_primary.xml │ │ │ │ ├── view_area_risk_indicator.xml │ │ │ │ ├── ic_manufacturer.xml │ │ │ │ ├── ic_accordion_collapse.xml │ │ │ │ ├── ic_alert.xml │ │ │ │ ├── ic_delete_venue_visit.xml │ │ │ │ ├── ic_exclamation.xml │ │ │ │ ├── initial_card_background.xml │ │ │ │ ├── ic_isolation_hub.xml │ │ │ │ ├── radio_selected_background.xml │ │ │ │ ├── radio_not_selected_background.xml │ │ │ │ ├── ic_negative_symptom.xml │ │ │ │ └── ic_policy_international_travel.xml │ │ │ ├── raw │ │ │ │ └── success.mp3 │ │ │ ├── drawable-night │ │ │ │ └── ic_tick.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-ldpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_notification.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ ├── drawable-nodpi │ │ │ │ ├── tick_final_2004.png │ │ │ │ ├── tick_final_2005.png │ │ │ │ ├── tick_final_2006.png │ │ │ │ ├── tick_final_2007.png │ │ │ │ ├── tick_final_2008.png │ │ │ │ ├── tick_final_2009.png │ │ │ │ ├── tick_final_2010.png │ │ │ │ ├── tick_final_2011.png │ │ │ │ ├── tick_final_2012.png │ │ │ │ ├── tick_final_2013.png │ │ │ │ ├── tick_final_2014.png │ │ │ │ ├── tick_final_2015.png │ │ │ │ ├── tick_final_2016.png │ │ │ │ ├── tick_final_2017.png │ │ │ │ ├── tick_final_2018.png │ │ │ │ ├── tick_final_2019.png │ │ │ │ ├── tick_final_2020.png │ │ │ │ ├── tick_final_2021.png │ │ │ │ ├── tick_final_2022.png │ │ │ │ ├── tick_final_2023.png │ │ │ │ ├── tick_final_2024.png │ │ │ │ ├── tick_final_2025.png │ │ │ │ ├── tick_final_2026.png │ │ │ │ ├── tick_final_2027.png │ │ │ │ ├── tick_final_2028.png │ │ │ │ ├── tick_final_2029.png │ │ │ │ ├── tick_final_2030.png │ │ │ │ ├── tick_final_2031.png │ │ │ │ ├── tick_final_2032.png │ │ │ │ ├── tick_final_2033.png │ │ │ │ ├── tick_final_2034.png │ │ │ │ ├── tick_final_2035.png │ │ │ │ ├── tick_final_2036.png │ │ │ │ ├── tick_final_2037.png │ │ │ │ ├── tick_final_2038.png │ │ │ │ ├── tick_final_2039.png │ │ │ │ ├── tick_final_2040.png │ │ │ │ ├── tick_final_2041.png │ │ │ │ ├── tick_final_2042.png │ │ │ │ ├── tick_final_2043.png │ │ │ │ ├── tick_final_2044.png │ │ │ │ ├── tick_final_2045.png │ │ │ │ ├── tick_final_2046.png │ │ │ │ ├── tick_final_2047.png │ │ │ │ ├── tick_final_2048.png │ │ │ │ ├── tick_final_2049.png │ │ │ │ ├── tick_final_2050.png │ │ │ │ ├── tick_final_2051.png │ │ │ │ ├── tick_final_2052.png │ │ │ │ ├── tick_final_2053.png │ │ │ │ ├── tick_final_2054.png │ │ │ │ ├── tick_final_2055.png │ │ │ │ ├── tick_final_2056.png │ │ │ │ ├── tick_final_2057.png │ │ │ │ ├── tick_final_2058.png │ │ │ │ ├── tick_final_2059.png │ │ │ │ ├── tick_final_2060.png │ │ │ │ ├── tick_final_2061.png │ │ │ │ ├── tick_final_2062.png │ │ │ │ ├── tick_final_2063.png │ │ │ │ ├── tick_final_2064.png │ │ │ │ ├── tick_final_2065.png │ │ │ │ ├── tick_final_2066.png │ │ │ │ ├── tick_final_2067.png │ │ │ │ ├── tick_final_2068.png │ │ │ │ ├── tick_final_2069.png │ │ │ │ ├── tick_final_2070.png │ │ │ │ ├── tick_final_2071.png │ │ │ │ ├── tick_final_2072.png │ │ │ │ ├── tick_final_2073.png │ │ │ │ ├── tick_final_2074.png │ │ │ │ ├── tick_final_2075.png │ │ │ │ ├── tick_final_2076.png │ │ │ │ ├── tick_final_2077.png │ │ │ │ ├── tick_final_2078.png │ │ │ │ ├── tick_final_2079.png │ │ │ │ ├── tick_final_2080.png │ │ │ │ ├── tick_final_2081.png │ │ │ │ ├── tick_final_2082.png │ │ │ │ ├── tick_final_2083.png │ │ │ │ ├── qr_code_help_poster.png │ │ │ │ ├── qr_code_help_poster_welsh.png │ │ │ │ ├── qr_code_help_poster_hospitality.png │ │ │ │ └── qr_code_help_poster_hospitality_welsh.png │ │ │ ├── drawable-night-nodpi │ │ │ │ ├── tick_final_2004.png │ │ │ │ ├── tick_final_2005.png │ │ │ │ ├── tick_final_2006.png │ │ │ │ ├── tick_final_2007.png │ │ │ │ ├── tick_final_2008.png │ │ │ │ ├── tick_final_2009.png │ │ │ │ ├── tick_final_2010.png │ │ │ │ ├── tick_final_2011.png │ │ │ │ ├── tick_final_2012.png │ │ │ │ ├── tick_final_2013.png │ │ │ │ ├── tick_final_2014.png │ │ │ │ ├── tick_final_2015.png │ │ │ │ ├── tick_final_2016.png │ │ │ │ ├── tick_final_2017.png │ │ │ │ ├── tick_final_2018.png │ │ │ │ ├── tick_final_2019.png │ │ │ │ ├── tick_final_2020.png │ │ │ │ ├── tick_final_2021.png │ │ │ │ ├── tick_final_2022.png │ │ │ │ ├── tick_final_2023.png │ │ │ │ ├── tick_final_2024.png │ │ │ │ ├── tick_final_2025.png │ │ │ │ ├── tick_final_2026.png │ │ │ │ ├── tick_final_2027.png │ │ │ │ ├── tick_final_2028.png │ │ │ │ ├── tick_final_2029.png │ │ │ │ ├── tick_final_2030.png │ │ │ │ ├── tick_final_2031.png │ │ │ │ ├── tick_final_2032.png │ │ │ │ ├── tick_final_2033.png │ │ │ │ ├── tick_final_2034.png │ │ │ │ ├── tick_final_2035.png │ │ │ │ ├── tick_final_2036.png │ │ │ │ ├── tick_final_2037.png │ │ │ │ ├── tick_final_2038.png │ │ │ │ ├── tick_final_2039.png │ │ │ │ ├── tick_final_2040.png │ │ │ │ ├── tick_final_2041.png │ │ │ │ ├── tick_final_2042.png │ │ │ │ ├── tick_final_2043.png │ │ │ │ ├── tick_final_2044.png │ │ │ │ ├── tick_final_2045.png │ │ │ │ ├── tick_final_2046.png │ │ │ │ ├── tick_final_2047.png │ │ │ │ ├── tick_final_2048.png │ │ │ │ ├── tick_final_2049.png │ │ │ │ ├── tick_final_2050.png │ │ │ │ ├── tick_final_2051.png │ │ │ │ ├── tick_final_2052.png │ │ │ │ ├── tick_final_2053.png │ │ │ │ ├── tick_final_2054.png │ │ │ │ ├── tick_final_2055.png │ │ │ │ ├── tick_final_2056.png │ │ │ │ ├── tick_final_2057.png │ │ │ │ ├── tick_final_2058.png │ │ │ │ ├── tick_final_2059.png │ │ │ │ ├── tick_final_2060.png │ │ │ │ ├── tick_final_2061.png │ │ │ │ ├── tick_final_2062.png │ │ │ │ ├── tick_final_2063.png │ │ │ │ ├── tick_final_2064.png │ │ │ │ ├── tick_final_2065.png │ │ │ │ ├── tick_final_2066.png │ │ │ │ ├── tick_final_2067.png │ │ │ │ ├── tick_final_2068.png │ │ │ │ ├── tick_final_2069.png │ │ │ │ ├── tick_final_2070.png │ │ │ │ ├── tick_final_2071.png │ │ │ │ ├── tick_final_2072.png │ │ │ │ ├── tick_final_2073.png │ │ │ │ ├── tick_final_2074.png │ │ │ │ ├── tick_final_2075.png │ │ │ │ ├── tick_final_2076.png │ │ │ │ ├── tick_final_2077.png │ │ │ │ ├── tick_final_2078.png │ │ │ │ ├── tick_final_2079.png │ │ │ │ ├── tick_final_2080.png │ │ │ │ ├── tick_final_2081.png │ │ │ │ ├── tick_final_2082.png │ │ │ │ └── tick_final_2083.png │ │ │ ├── values-sw600dp │ │ │ │ └── styles.xml │ │ │ ├── layout │ │ │ │ ├── view_divider.xml │ │ │ │ ├── fragment_submit_selected_symptoms.xml │ │ │ │ ├── view_toolbar_primary.xml │ │ │ │ ├── view_toolbar_background.xml │ │ │ │ ├── view_logo.xml │ │ │ │ ├── accordion_how_we_calculate_close_contact.xml │ │ │ │ ├── accordion_how_we_calculate_close_contact_wales.xml │ │ │ │ ├── accordion_how_we_calculate_close_contact_england.xml │ │ │ │ ├── include_onboarding_toolbar.xml │ │ │ │ ├── view_paragraph.xml │ │ │ │ ├── item_venue_visit_header.xml │ │ │ │ └── dialog_multiline_title.xml │ │ │ ├── drawable-ldrtl │ │ │ │ └── status_option_icon_background.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── xml │ │ │ │ └── network_config.xml │ │ │ ├── menu │ │ │ │ └── menu_edit.xml │ │ │ └── values-land │ │ │ │ └── dimens.xml │ │ ├── resources │ │ │ └── jacoco-agent.properties │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ ├── receiver │ │ │ ├── AvailabilityState.kt │ │ │ └── AvailabilityStateProvider.kt │ │ │ ├── analytics │ │ │ ├── TestOrderType.kt │ │ │ ├── AnalyticsAggregatorReceiver.kt │ │ │ ├── UpdateStatusStorage.kt │ │ │ ├── SubmittedOnboardingAnalyticsProvider.kt │ │ │ └── NetworkStatsInterceptor.kt │ │ │ ├── util │ │ │ ├── Base64Encoder.kt │ │ │ ├── UUIDGenerator.kt │ │ │ ├── ListUtils.kt │ │ │ ├── BooleanUtils.kt │ │ │ ├── AndroidUUIDGenerator.kt │ │ │ ├── Base64Decoder.kt │ │ │ ├── ViewModelUtils.kt │ │ │ ├── AndroidBase64Encoder.kt │ │ │ ├── viewutils │ │ │ │ ├── AreSystemLevelAnimationsEnabled.kt │ │ │ │ ├── ViewGroupUtils.kt │ │ │ │ └── ThemeUtils.kt │ │ │ ├── adapters │ │ │ │ ├── BigDecimalAdapter.kt │ │ │ │ ├── PolicyIconAdapter.kt │ │ │ │ ├── TranslatableStringAdapter.kt │ │ │ │ ├── ColorSchemeAdapter.kt │ │ │ │ ├── LocalDateAdapter.kt │ │ │ │ ├── ContentBlockTypeAdapter.kt │ │ │ │ └── LocalMessageTypeAdapter.kt │ │ │ ├── FileUtils.kt │ │ │ ├── crashreporting │ │ │ │ ├── SetDefaultUncaughtExceptionHandler.kt │ │ │ │ └── RemoteServiceExceptionReportRateLimiter.kt │ │ │ ├── BroadcastProvider.kt │ │ │ └── WorkerUtils.kt │ │ │ ├── battery │ │ │ ├── BatteryOptimizationChecker.kt │ │ │ ├── AndroidBatteryOptimizationChecker.kt │ │ │ └── BatteryOptimizationAcknowledgementProvider.kt │ │ │ ├── remote │ │ │ ├── data │ │ │ │ ├── VirologyTestKitType.kt │ │ │ │ ├── HashResponse.kt │ │ │ │ ├── ListOfFilesResponse.kt │ │ │ │ ├── SupportedCountry.kt │ │ │ │ ├── IsolationPaymentCreateTokenRequest.kt │ │ │ │ ├── VirologyCtaExchangeRequest.kt │ │ │ │ ├── VirologyTestResultRequestBody.kt │ │ │ │ ├── IsolationPaymentUrlRequest.kt │ │ │ │ ├── RiskyPostCodeDistributionResponse.kt │ │ │ │ ├── VirologyTestOrderResponse.kt │ │ │ │ ├── IsolationPaymentResponse.kt │ │ │ │ ├── RiskyVenueConfigurationResponse.kt │ │ │ │ ├── RiskyVenuesCircuitBreakerDto.kt │ │ │ │ ├── VirologyCtaExchangeResponse.kt │ │ │ │ ├── VirologyTestResultResponse.kt │ │ │ │ └── QuestionnaireResponse.kt │ │ │ ├── EmptyApi.kt │ │ │ ├── RiskyVenuesApi.kt │ │ │ ├── LocalStatsApi.kt │ │ │ ├── LocalMessagesApi.kt │ │ │ ├── QuestionnaireApi.kt │ │ │ ├── AppAvailabilityApi.kt │ │ │ ├── ExposureConfigurationApi.kt │ │ │ ├── IsolationConfigurationApi.kt │ │ │ ├── RiskyPostDistrictsApi.kt │ │ │ ├── RiskyVenueConfigurationApi.kt │ │ │ ├── KeysSubmissionApi.kt │ │ │ ├── RemoteServiceExceptionCrashReportSubmissionApi.kt │ │ │ ├── AnalyticsApi.kt │ │ │ ├── EpidemiologyDataApi.kt │ │ │ └── KeysDistributionApi.kt │ │ │ ├── exposure │ │ │ ├── encounter │ │ │ │ ├── RandomNonRiskyExposureWindowsLimiter.kt │ │ │ │ ├── calculation │ │ │ │ │ ├── DayRisk.kt │ │ │ │ │ └── RiskScoreCalculatorProvider.kt │ │ │ │ ├── GetRiskyContactEncounterDate.kt │ │ │ │ ├── AndroidRandomNonRiskyExposureWindowsLimiter.kt │ │ │ │ └── HasSuccessfullyProcessedNewExposureProvider.kt │ │ │ ├── questionnaire │ │ │ │ ├── review │ │ │ │ │ ├── ReviewData.kt │ │ │ │ │ └── QuestionnaireOutcome.kt │ │ │ │ └── GetLastDoseDateLimit.kt │ │ │ ├── ExposureNotificationActivationResult.kt │ │ │ └── sharekeys │ │ │ │ ├── SubmitObfuscationData.kt │ │ │ │ └── ShareKeysNavigation.kt │ │ │ ├── common │ │ │ ├── BuildVersionProvider.kt │ │ │ ├── CircuitBreakerResult.kt │ │ │ ├── RandomObfuscationRateLimiter.kt │ │ │ ├── AppInfo.kt │ │ │ ├── bluetooth │ │ │ │ └── EnableBluetoothViewModel.kt │ │ │ ├── postcode │ │ │ │ ├── GetLocalAuthorityName.kt │ │ │ │ ├── PostCodeValidator.kt │ │ │ │ ├── PostCodeProvider.kt │ │ │ │ └── LocalAuthorityProvider.kt │ │ │ └── Lce.kt │ │ │ ├── DecommissioningClosureScreenActivity.kt │ │ │ ├── edgecases │ │ │ └── DeviceNotSupportedActivity.kt │ │ │ ├── qrcode │ │ │ ├── BarcodeDetectorBuilder.kt │ │ │ ├── AndroidBarcodeDetectorBuilder.kt │ │ │ ├── riskyvenues │ │ │ │ └── FilterOutdatedVisits.kt │ │ │ └── QrCodeScanResult.kt │ │ │ ├── payment │ │ │ └── IsolationPaymentTokenState.kt │ │ │ ├── packagemanager │ │ │ ├── PackageManager.kt │ │ │ └── AndroidPackageManager.kt │ │ │ ├── permissions │ │ │ ├── PermissionsManager.kt │ │ │ └── AndroidPermissionsManager.kt │ │ │ ├── onboarding │ │ │ ├── DataAndPrivacyViewModel.kt │ │ │ ├── PolicyUpdateViewModel.kt │ │ │ └── OnboardingCompletedProvider.kt │ │ │ ├── localstats │ │ │ └── FetchLocalStats.kt │ │ │ ├── testordering │ │ │ ├── unknownresult │ │ │ │ ├── UnknownTestResultViewModel.kt │ │ │ │ └── ReceivedUnknownTestResultProvider.kt │ │ │ ├── SubmitFakeExposureWindows.kt │ │ │ └── GetEmptyExposureWindowSubmissionCount.kt │ │ │ ├── state │ │ │ ├── CalculateContactExpiryDate.kt │ │ │ ├── CalculateExpirationNotificationTime.kt │ │ │ └── IsolationExpirationAlarmProvider.kt │ │ │ ├── widgets │ │ │ ├── HeadingTextView.kt │ │ │ └── UnderlinedButton.kt │ │ │ ├── status │ │ │ └── LastAppRatingStartedDateProvider.kt │ │ │ ├── availability │ │ │ └── AppStoreUtils.kt │ │ │ ├── DecommissioningNotificationSentProvider.kt │ │ │ └── questionnaire │ │ │ └── review │ │ │ └── RiskCalculator.kt │ ├── scenarios │ │ ├── res │ │ │ ├── xml │ │ │ │ └── filepaths.xml │ │ │ ├── layout │ │ │ │ ├── include_test_plain_text.xml │ │ │ │ ├── main_activity.xml │ │ │ │ ├── include_test_no_bullet_paragraph.xml │ │ │ │ ├── include_test_bullet_paragraph.xml │ │ │ │ ├── item_language.xml │ │ │ │ └── activity_test_settings.xml │ │ │ ├── drawable │ │ │ │ └── rounded_corner.xml │ │ │ └── menu │ │ │ │ └── menu_debug.xml │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ ├── util │ │ │ ├── Constants.kt │ │ │ └── MockUUIDGenerator.kt │ │ │ ├── remote │ │ │ ├── MockEmptyApi.kt │ │ │ ├── Interceptors.kt │ │ │ ├── MockKeysSubmissionApi.kt │ │ │ ├── MockRemoteServiceExceptionCrashReportSubmissionApi.kt │ │ │ ├── MockEpidemiologyDataApi.kt │ │ │ └── MockAnalyticsApi.kt │ │ │ ├── status │ │ │ └── ScenariosDateChangeBroadcastReceiver.kt │ │ │ ├── exposure │ │ │ └── encounter │ │ │ │ └── MockRandomNonRiskyExposureWindowsLimiter.kt │ │ │ ├── packagemanager │ │ │ └── MockPackageManager.kt │ │ │ └── di │ │ │ └── MockApplicationComponent.kt │ ├── production │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ ├── status │ │ │ └── DebugFragment.kt │ │ │ ├── AnalyticsReportActivity.kt │ │ │ ├── scenariodialog │ │ │ └── VirologyTestResultMockFragment.kt │ │ │ └── di │ │ │ └── module │ │ │ └── QrScannerViewModelModule.kt │ ├── productionRelease │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ └── remote │ │ │ └── Interceptors.kt │ ├── androidTestScenarios │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ ├── testhelpers │ │ │ ├── retry │ │ │ │ └── RetryFlakyTest.kt │ │ │ ├── base │ │ │ │ └── HasTestAppContext.kt │ │ │ ├── robots │ │ │ │ ├── QrCodeHelpRobot.kt │ │ │ │ ├── QrScannerRobot.kt │ │ │ │ ├── edgecases │ │ │ │ │ ├── AgeRestrictionRobot.kt │ │ │ │ │ └── EnableLocationRobot.kt │ │ │ │ ├── HowAppWorksRobot.kt │ │ │ │ └── interfaces │ │ │ │ │ └── HasActivity.kt │ │ │ ├── TestUpdateManager.kt │ │ │ └── setup │ │ │ │ └── LocalAuthoritySetupHelper.kt │ │ │ ├── report │ │ │ ├── Reported.kt │ │ │ └── output │ │ │ │ ├── Screenshot.kt │ │ │ │ ├── Step.kt │ │ │ │ └── Report.kt │ │ │ ├── util │ │ │ ├── ReflectUtils.kt │ │ │ └── DoReToAwareAndroidJUnitRunner.kt │ │ │ ├── AnalyticsReportActivityTest.kt │ │ │ ├── payment │ │ │ └── IsolationPaymentActivityTest.kt │ │ │ ├── edgecases │ │ │ ├── DeviceNotSupportedActivityTest.kt │ │ │ └── AgeRestrictionActivityTest.kt │ │ │ ├── qrcode │ │ │ └── QrScannerActivityTest.kt │ │ │ ├── onboarding │ │ │ ├── PolicyUpdateActivityTest.kt │ │ │ ├── postcode │ │ │ │ └── PostCodeActivityTest.kt │ │ │ └── DataAndPrivacyActivityTest.kt │ │ │ ├── exposure │ │ │ ├── AllowShareKeysActivityTest.kt │ │ │ └── EnableExposureNotificationActivityTest.kt │ │ │ ├── localstats │ │ │ └── FetchLocalDataProgressActivityTest.kt │ │ │ └── questionnaire │ │ │ └── review │ │ │ ├── NoSymptomsActivityTest.kt │ │ │ └── ReviewSymptomsActivityTest.kt │ ├── productionDebug │ │ └── java │ │ │ └── uk │ │ │ └── nhs │ │ │ └── nhsx │ │ │ └── covid19 │ │ │ └── android │ │ │ └── app │ │ │ └── remote │ │ │ └── Interceptors.kt │ ├── scenariosDebug │ │ └── AndroidManifest.xml │ └── test │ │ └── java │ │ └── uk │ │ └── nhs │ │ └── nhsx │ │ └── covid19 │ │ └── android │ │ └── app │ │ ├── utils │ │ └── CoroutineTest.kt │ │ └── testordering │ │ └── unknownresult │ │ └── UnknownTestResultViewModelTest.kt ├── .gitignore ├── dummy-keystore └── libs │ ├── riskscore-5.0.0.jar │ └── play-services-nearby-exposurenotification-1.7.2-eap.aar ├── custom-a11y-rules ├── consumer-rules.pro ├── .gitignore └── src │ └── main │ └── java │ └── uk │ └── nhs │ └── nhsx │ └── covid19 │ └── android │ └── a11y │ └── NhsIssueRegistry.kt ├── custom-ktlint-rules ├── consumer-rules.pro ├── .gitignore └── src │ └── main │ ├── resources │ └── META-INF │ │ └── services │ │ └── com.pinterest.ktlint.core.RuleSetProvider │ └── java │ └── uk │ └── nhs │ └── nhsx │ └── covid19 │ └── android │ └── ktlint │ └── CustomRuleSetProvider.kt ├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ └── feature_request.md ├── scripts ├── uiTestCoverage.bat ├── unitTestCoverage.bat ├── .gitignore ├── uiTestCoverage ├── unitTestCoverage └── publish.rb ├── screenshots.bat ├── docs ├── AppArchitecture.jpeg ├── DependencyInjectionGraph.jpeg └── AppArchitectureTestingApproach.jpeg ├── settings.gradle ├── .editorconfig ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── screenshots └── .gitignore /app/buildNumber: -------------------------------------------------------------------------------- 1 | 358 -------------------------------------------------------------------------------- /app/versionName: -------------------------------------------------------------------------------- 1 | 6.0 -------------------------------------------------------------------------------- /custom-a11y-rules/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /custom-ktlint-rules/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_down_arrow.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/resources/jacoco-agent.properties: -------------------------------------------------------------------------------- 1 | output=none -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /src/scenarios/res/values-non/strings.xml 3 | -------------------------------------------------------------------------------- /scripts/uiTestCoverage.bat: -------------------------------------------------------------------------------- 1 | gradlew -PjacocoEnabled=true uiTestCoverage -------------------------------------------------------------------------------- /scripts/unitTestCoverage.bat: -------------------------------------------------------------------------------- 1 | gradlew -PjacocoEnabled=true unitTestCoverage -------------------------------------------------------------------------------- /scripts/.gitignore: -------------------------------------------------------------------------------- 1 | .locale 2 | NHS_COVID-19-strings.zip 3 | StringSorter.jar -------------------------------------------------------------------------------- /custom-a11y-rules/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | local.properties 4 | .idea 5 | build -------------------------------------------------------------------------------- /custom-ktlint-rules/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | local.properties 4 | .idea 5 | build 6 | -------------------------------------------------------------------------------- /scripts/uiTestCoverage: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ./gradlew -PjacocoEnabled=true uiTestCoverage -------------------------------------------------------------------------------- /scripts/unitTestCoverage: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ./gradlew -PjacocoEnabled=true unitTestCoverage -------------------------------------------------------------------------------- /app/dummy-keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/dummy-keystore -------------------------------------------------------------------------------- /screenshots.bat: -------------------------------------------------------------------------------- 1 | gradlew -Pandroid.testInstrumentationRunnerArguments.takeScreenshots=true connectedScenariosDebugAndroidTest 2 | -------------------------------------------------------------------------------- /docs/AppArchitecture.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/docs/AppArchitecture.jpeg -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':custom-a11y-rules' 2 | include ':custom-ktlint-rules' 3 | include ':app' 4 | rootProject.name = "NHS COVID-19" -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | # possible values: number (e.g. 2), "unset" (makes ktlint ignore indentation completely) 3 | indent_size=unset -------------------------------------------------------------------------------- /app/libs/riskscore-5.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/libs/riskscore-5.0.0.jar -------------------------------------------------------------------------------- /app/src/main/res/raw/success.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/raw/success.mp3 -------------------------------------------------------------------------------- /app/src/scenarios/res/xml/filepaths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /custom-ktlint-rules/src/main/resources/META-INF/services/com.pinterest.ktlint.core.RuleSetProvider: -------------------------------------------------------------------------------- 1 | uk.nhs.nhsx.covid19.android.ktlint.CustomRuleSetProvider -------------------------------------------------------------------------------- /docs/DependencyInjectionGraph.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/docs/DependencyInjectionGraph.jpeg -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable/ic_tick.png -------------------------------------------------------------------------------- /docs/AppArchitectureTestingApproach.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/docs/AppArchitectureTestingApproach.jpeg -------------------------------------------------------------------------------- /screenshots: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ./gradlew --continue -Pandroid.testInstrumentationRunnerArguments.takeScreenshots=true connectedScenariosDebugAndroidTest 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-night/ic_tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night/ic_tick.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-hdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-mdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/util/Constants.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | const val FAKE_LOCALE_NAME_FOR_STRING_IDS = "non" 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2005.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2006.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2007.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2008.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2009.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2010.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2011.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2015.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2016.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2017.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2018.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2019.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2020.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2021.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2022.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2023.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2024.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2025.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2026.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2027.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2028.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2029.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2030.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2031.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2032.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2033.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2034.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2035.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2036.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2037.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2038.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2039.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2040.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2041.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2042.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2043.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2044.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2045.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2046.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2047.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2048.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2049.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2050.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2051.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2052.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2053.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2054.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2055.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2056.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2057.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2058.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2059.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2060.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2061.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2061.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2062.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2063.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2064.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2065.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2065.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2066.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2066.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2067.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2068.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2068.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2069.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2069.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2070.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2070.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2071.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2071.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2072.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2072.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2073.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2073.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2074.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2074.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2075.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2075.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2076.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2076.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2077.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2077.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2078.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2078.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2079.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2079.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2080.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2080.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2081.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2082.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2082.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/tick_final_2083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/tick_final_2083.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/qr_code_help_poster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/qr_code_help_poster.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2005.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2006.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2007.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2008.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2009.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2010.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2011.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2012.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2013.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2014.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2015.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2016.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2017.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2018.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2019.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2020.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2021.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2022.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2023.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2024.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2025.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2026.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2027.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2028.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2029.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2030.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2031.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2032.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2033.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2034.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2035.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2036.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2037.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2038.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2039.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2040.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2041.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2042.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2043.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2044.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2045.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2046.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2047.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2048.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2049.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2050.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2051.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2052.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2053.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2054.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2055.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2056.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2057.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2058.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2059.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2060.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2061.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2061.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2062.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2063.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2064.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2065.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2065.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2066.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2066.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2067.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2068.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2068.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2069.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2069.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2070.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2070.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2071.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2071.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2072.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2072.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2073.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2073.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2074.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2074.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2075.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2075.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2076.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2076.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2077.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2077.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2078.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2078.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2079.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2079.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2080.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2080.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2081.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2082.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2082.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-night-nodpi/tick_final_2083.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-night-nodpi/tick_final_2083.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/receiver/AvailabilityState.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.receiver 2 | 3 | enum class AvailabilityState { 4 | ENABLED, DISABLED 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/qr_code_help_poster_welsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/qr_code_help_poster_welsh.png -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/analytics/TestOrderType.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.analytics 2 | 3 | enum class TestOrderType { 4 | INSIDE_APP, 5 | OUTSIDE_APP 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/Base64Encoder.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | interface Base64Encoder { 4 | fun encodeUrl(byteArray: ByteArray): String 5 | } 6 | -------------------------------------------------------------------------------- /app/libs/play-services-nearby-exposurenotification-1.7.2-eap.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/libs/play-services-nearby-exposurenotification-1.7.2-eap.aar -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/MockEmptyApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | class MockEmptyApi : EmptyApi { 4 | override suspend fun submit() {} 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/qr_code_help_poster_hospitality.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/qr_code_help_poster_hospitality.png -------------------------------------------------------------------------------- /app/src/production/java/uk/nhs/nhsx/covid19/android/app/status/DebugFragment.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.status 2 | 3 | import androidx.fragment.app.Fragment 4 | 5 | class DebugFragment : Fragment() 6 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/UUIDGenerator.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import java.util.UUID 4 | 5 | interface UUIDGenerator { 6 | 7 | fun randomUUID(): UUID 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/ListUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | fun List.shallowCopy(): List = mutableListOf().apply { 4 | addAll(this@shallowCopy) 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/qr_code_help_poster_hospitality_welsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ukhsa-collaboration/covid-19-app-android-ag-public/HEAD/app/src/main/res/drawable-nodpi/qr_code_help_poster_hospitality_welsh.png -------------------------------------------------------------------------------- /app/src/productionRelease/java/uk/nhs/nhsx/covid19/android/app/remote/Interceptors.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import okhttp3.Interceptor 4 | 5 | val additionalInterceptors = listOf() 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/settings_option_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/retry/RetryFlakyTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.retry 2 | 3 | @Retention(AnnotationRetention.RUNTIME) 4 | annotation class RetryFlakyTest 5 | -------------------------------------------------------------------------------- /app/src/production/java/uk/nhs/nhsx/covid19/android/app/AnalyticsReportActivity.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | 5 | class AnalyticsReportActivity : AppCompatActivity() 6 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/battery/BatteryOptimizationChecker.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.battery 2 | 3 | interface BatteryOptimizationChecker { 4 | 5 | fun isIgnoringBatteryOptimizations(): Boolean 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyTestKitType.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | enum class VirologyTestKitType { 4 | LAB_RESULT, 5 | RAPID_RESULT, 6 | RAPID_SELF_REPORTED 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider_binary_radio_group.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_onboarding_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/EmptyApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | 5 | interface EmptyApi { 6 | @GET("submission/empty-submission-v2") 7 | suspend fun submit() 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/HashResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class HashResponse(val hash: String) 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/RandomNonRiskyExposureWindowsLimiter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter 2 | 3 | interface RandomNonRiskyExposureWindowsLimiter { 4 | 5 | fun isAllowed(): Boolean 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/error_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/new_label_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/status_option_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/question_not_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/production/java/uk/nhs/nhsx/covid19/android/app/scenariodialog/VirologyTestResultMockFragment.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.scenariodialog 2 | 3 | import androidx.fragment.app.DialogFragment 4 | 5 | class VirologyTestResultMockFragment : DialogFragment() 6 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/ListOfFilesResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class ListOfFilesResponse(val files: List) 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jun 10 15:35:28 CEST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/BooleanUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | fun Boolean?.defaultFalse() = 4 | this ?: false 5 | 6 | fun Boolean?.defaultTrue() = 7 | this ?: true 8 | 9 | fun Boolean.toInt() = if (this) 1 else 0 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/view_cornered_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/AndroidUUIDGenerator.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import java.util.UUID 4 | 5 | class AndroidUUIDGenerator : UUIDGenerator { 6 | 7 | override fun randomUUID(): UUID = 8 | UUID.randomUUID() 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | local.properties 4 | !.idea/ 5 | .idea/* 6 | !.idea/codeStyles/ 7 | .DS_Store 8 | build 9 | captures 10 | .externalNativeBuild 11 | .cxx 12 | jacoco.exec 13 | .envrc 14 | .tool-versions 15 | 16 | ## Pacts folder 17 | app/pacts 18 | 19 | /.pairs 20 | /.git-authors 21 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/BuildVersionProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common 2 | 3 | import android.os.Build.VERSION 4 | import javax.inject.Inject 5 | 6 | class BuildVersionProvider @Inject constructor() { 7 | fun version() = VERSION.SDK_INT 8 | } 9 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/status/ScenariosDateChangeBroadcastReceiver.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.status 2 | 3 | class ScenariosDateChangeBroadcastReceiver : DateChangeBroadcastReceiver() { 4 | fun trigger() { 5 | callback?.invoke() 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/DecommissioningClosureScreenActivity.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app 2 | 3 | import uk.nhs.nhsx.covid19.android.app.common.BaseActivity 4 | 5 | class DecommissioningClosureScreenActivity : BaseActivity(R.layout.activity_decommissioning_closure_screen) 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/black_border_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_stroked_circle_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/status_option_icon_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldrtl/status_option_icon_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/report/Reported.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.report 2 | 3 | import kotlin.annotation.AnnotationRetention.RUNTIME 4 | import kotlin.annotation.AnnotationTarget.FUNCTION 5 | 6 | @Target(FUNCTION) 7 | @Retention(RUNTIME) 8 | annotation class Reported 9 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/SupportedCountry.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.Json 4 | 5 | enum class SupportedCountry { 6 | @Json(name = "England") 7 | ENGLAND, 8 | 9 | @Json(name = "Wales") 10 | WALES 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/MockRandomNonRiskyExposureWindowsLimiter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter 2 | 3 | class MockRandomNonRiskyExposureWindowsLimiter : RandomNonRiskyExposureWindowsLimiter { 4 | 5 | override fun isAllowed(): Boolean = true 6 | } 7 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/base/HasTestAppContext.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.base 2 | 3 | import uk.nhs.nhsx.covid19.android.app.testhelpers.TestApplicationContext 4 | 5 | interface HasTestAppContext { 6 | val testAppContext: TestApplicationContext 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/IsolationPaymentCreateTokenRequest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class IsolationPaymentCreateTokenRequest( 7 | val country: SupportedCountry 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/report/output/Screenshot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.report.output 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class Screenshot( 7 | val fileName: String, 8 | val tags: List 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/calculation/DayRisk.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter.calculation 2 | 3 | data class DayRisk( 4 | val startOfDayMillis: Long, 5 | val calculatedRisk: Double, 6 | val riskCalculationVersion: Int, 7 | val matchedKeyCount: Int 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/res/xml/network_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | localhost 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/edgecases/DeviceNotSupportedActivity.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.edgecases 2 | 3 | import uk.nhs.nhsx.covid19.android.app.R 4 | import uk.nhs.nhsx.covid19.android.app.common.BaseActivity 5 | 6 | class DeviceNotSupportedActivity : BaseActivity(R.layout.activity_device_not_supported) 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/qrcode/BarcodeDetectorBuilder.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.qrcode 2 | 3 | import com.google.android.gms.vision.Detector 4 | import com.google.android.gms.vision.barcode.Barcode 5 | 6 | interface BarcodeDetectorBuilder { 7 | 8 | fun build(): Detector? 9 | } 10 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/Interceptors.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import okhttp3.logging.HttpLoggingInterceptor 4 | 5 | val additionalInterceptors = listOf( 6 | HttpLoggingInterceptor().apply { 7 | level = HttpLoggingInterceptor.Level.BODY 8 | } 9 | ) 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Project Suggestions 4 | --- 5 | 6 | Thank you for your interest in this project 7 | 8 | We welcome feedback about the Test and Trace App, and this can be sent to us via the 9 | https://faq.covid19.nhs.uk/create-case/ page on the website. 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/productionDebug/java/uk/nhs/nhsx/covid19/android/app/remote/Interceptors.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import okhttp3.logging.HttpLoggingInterceptor 4 | 5 | val additionalInterceptors = listOf( 6 | HttpLoggingInterceptor().apply { 7 | level = HttpLoggingInterceptor.Level.BODY 8 | } 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/CircuitBreakerResult.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common 2 | 3 | import com.squareup.moshi.Json 4 | 5 | enum class CircuitBreakerResult { 6 | @Json(name = "yes") 7 | YES, 8 | @Json(name = "no") 9 | NO, 10 | @Json(name = "pending") 11 | PENDING 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyCtaExchangeRequest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class VirologyCtaExchangeRequest( 7 | val ctaToken: String, 8 | val country: SupportedCountry 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/Base64Decoder.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | interface Base64Decoder { 4 | fun decode(string: String): String 5 | fun decodeToBytes(string: String): ByteArray 6 | fun decodeUrl(string: String): String 7 | fun decodeUrlToBytes(string: String): ByteArray 8 | } 9 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/include_test_plain_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_submit_selected_symptoms.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_red_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bullet_point.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/question_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/report/output/Step.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.report.output 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class Step( 7 | val name: String, 8 | val description: String, 9 | val screenshots: MutableList 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/payment/IsolationPaymentTokenState.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.payment 2 | 3 | sealed class IsolationPaymentTokenState { 4 | object Unresolved : IsolationPaymentTokenState() 5 | object Disabled : IsolationPaymentTokenState() 6 | data class Token(val token: String) : IsolationPaymentTokenState() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyTestResultRequestBody.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class VirologyTestResultRequestBody( 7 | val testResultPollingToken: String, 8 | val country: SupportedCountry 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_amber_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_green_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_neutral_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_yellow_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/util/MockUUIDGenerator.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import java.util.UUID 4 | 5 | class MockUUIDGenerator : UUIDGenerator { 6 | 7 | var nextUUID = UUID.fromString("bf66c57e-5ae0-448e-94ec-52ae6947ac79") 8 | 9 | override fun randomUUID(): UUID = 10 | nextUUID 11 | } 12 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/main_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/ViewModelUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import kotlinx.coroutines.CoroutineScope 6 | 7 | fun ViewModel.getViewModelScopeOrDefault(coroutineScope: CoroutineScope?) = 8 | coroutineScope ?: this.viewModelScope 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_black_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/RiskyVenuesApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.RiskyVenuesResponse 5 | 6 | interface RiskyVenuesApi { 7 | @GET("distribution/risky-venues") 8 | suspend fun getListOfRiskyVenues(): RiskyVenuesResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/AndroidBase64Encoder.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import android.util.Base64 4 | 5 | class AndroidBase64Encoder : Base64Encoder { 6 | override fun encodeUrl(byteArray: ByteArray): String { 7 | return Base64.encodeToString(byteArray, Base64.URL_SAFE or Base64.NO_WRAP) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/area_risk_maroon_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bullet_point_primary_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/LocalStatsApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.LocalStatsResponse 5 | 6 | interface LocalStatsApi { 7 | @GET("distribution/v1/local-covid-stats-daily") 8 | suspend fun fetchLocalStats(): LocalStatsResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/viewutils/AreSystemLevelAnimationsEnabled.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.viewutils 2 | 3 | import android.content.Context 4 | import javax.inject.Inject 5 | 6 | class AreSystemLevelAnimationsEnabled @Inject constructor(private val context: Context) { 7 | operator fun invoke() = !animationsDisabled(context) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/packagemanager/PackageManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.packagemanager 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.content.pm.ResolveInfo 6 | 7 | interface PackageManager { 8 | 9 | fun resolveActivity(context: Context, intent: Intent, flags: Int): ResolveInfo? 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/LocalMessagesApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.LocalMessagesResponse 5 | 6 | interface LocalMessagesApi { 7 | @GET("distribution/local-messages") 8 | suspend fun fetchLocalMessages(): LocalMessagesResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/RandomObfuscationRateLimiter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common 2 | 3 | import java.security.SecureRandom 4 | import javax.inject.Inject 5 | 6 | class RandomObfuscationRateLimiter @Inject constructor(private val random: SecureRandom) { 7 | 8 | val allow: Boolean 9 | get() = random.nextInt(10) == 0 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/QuestionnaireApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.QuestionnaireResponse 5 | 6 | interface QuestionnaireApi { 7 | @GET("distribution/symptomatic-questionnaire") 8 | suspend fun fetchQuestionnaire(): QuestionnaireResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_red_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_toolbar_primary.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/AppAvailabilityApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.AppAvailabilityResponse 5 | 6 | interface AppAvailabilityApi { 7 | 8 | @GET("distribution/availability-android") 9 | suspend fun getAvailability(): AppAvailabilityResponse 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_toolbar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/report/output/Report.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.report.output 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class Report( 7 | val description: String, 8 | val kind: String, 9 | val name: String, 10 | val scenario: String, 11 | val steps: List 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/AppInfo.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common 2 | 3 | import android.os.Build 4 | import uk.nhs.nhsx.covid19.android.app.BuildConfig 5 | 6 | data class AppInfo( 7 | val osVersion: Int = Build.VERSION.SDK_INT, 8 | val buildNumber: Int = BuildConfig.VERSION_CODE, 9 | val shortVersionName: String = BuildConfig.VERSION_NAME_SHORT 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_blue_circle.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/IsolationPaymentUrlRequest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | import java.time.Instant 5 | 6 | @JsonClass(generateAdapter = true) 7 | data class IsolationPaymentUrlRequest( 8 | val ipcToken: String, 9 | val riskyEncounterDate: Instant, 10 | val isolationPeriodEndDate: Instant 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/ExposureConfigurationApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.ExposureConfigurationResponse 5 | 6 | interface ExposureConfigurationApi { 7 | @GET("distribution/exposure-configuration") 8 | suspend fun getExposureConfiguration(): ExposureConfigurationResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/include_test_no_bullet_paragraph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/QrCodeHelpRobot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots 2 | 3 | import uk.nhs.nhsx.covid19.android.app.R 4 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 5 | 6 | class QrCodeHelpRobot : HasActivity { 7 | 8 | override val containerId: Int 9 | get() = R.id.qrCodeHelpTitle 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/permissions/PermissionsManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.permissions 2 | 3 | import android.app.Activity 4 | import android.content.Context 5 | 6 | interface PermissionsManager { 7 | 8 | fun requestPermissions(activity: Activity, permissions: Array, requestCode: Int) 9 | 10 | fun checkSelfPermission(context: Context, permission: String): Int 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/IsolationConfigurationApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.IsolationConfigurationResponse 5 | 6 | interface IsolationConfigurationApi { 7 | 8 | @GET("distribution/self-isolation") 9 | suspend fun getIsolationConfiguration(): IsolationConfigurationResponse 10 | } 11 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/include_test_bullet_paragraph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/RiskyPostDistrictsApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.RiskyPostCodeDistributionResponse 5 | 6 | interface RiskyPostDistrictsApi { 7 | @GET("distribution/risky-post-districts-v2") 8 | suspend fun fetchRiskyPostCodeDistribution(): RiskyPostCodeDistributionResponse 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_green_with_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/onboarding/DataAndPrivacyViewModel.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding 2 | 3 | import androidx.lifecycle.ViewModel 4 | import javax.inject.Inject 5 | 6 | class DataAndPrivacyViewModel @Inject constructor( 7 | private val provider: PolicyUpdateProvider 8 | ) : ViewModel() { 9 | 10 | fun markPolicyAccepted() { 11 | provider.markPolicyAccepted() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/RiskyPostCodeDistributionResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class RiskyPostCodeDistributionResponse( 7 | val postDistricts: Map, 8 | val localAuthorities: Map?, 9 | val riskLevels: Map 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/RiskyVenueConfigurationApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.GET 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.RiskyVenueConfigurationResponse 5 | 6 | interface RiskyVenueConfigurationApi { 7 | 8 | @GET("distribution/risky-venue-configuration") 9 | suspend fun getRiskyVenueConfiguration(): RiskyVenueConfigurationResponse 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/BigDecimalAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import java.math.BigDecimal 6 | 7 | object BigDecimalAdapter { 8 | @FromJson 9 | fun fromJson(string: String) = BigDecimal(string) 10 | 11 | @ToJson 12 | fun toJson(value: BigDecimal) = value.toString() 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyTestOrderResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class VirologyTestOrderResponse( 7 | val websiteUrlWithQuery: String, 8 | val tokenParameterValue: String, 9 | val testResultPollingToken: String, 10 | val diagnosisKeySubmissionToken: String 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/scenariosDebug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/onboarding/PolicyUpdateViewModel.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding 2 | 3 | import androidx.lifecycle.ViewModel 4 | import javax.inject.Inject 5 | 6 | class PolicyUpdateViewModel @Inject constructor( 7 | private val policyUpdateProvider: PolicyUpdateProvider 8 | ) : ViewModel() { 9 | 10 | fun markPolicyAccepted() { 11 | policyUpdateProvider.markPolicyAccepted() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/KeysSubmissionApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.Body 4 | import retrofit2.http.POST 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.TemporaryExposureKeysPayload 6 | 7 | interface KeysSubmissionApi { 8 | @POST("submission/diagnosis-keys") 9 | suspend fun submitGeneratedKeys(@Body temporaryExposureKeysPayload: TemporaryExposureKeysPayload) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/questionnaire/review/ReviewData.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.questionnaire.review 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class ReviewData( 8 | val questionnaireOutcome: QuestionnaireOutcome, 9 | val ageResponse: OptOutResponseEntry, 10 | val vaccinationStatusResponses: List 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import timber.log.Timber 4 | import java.io.File 5 | 6 | object FileFactory { 7 | fun createFile(parent: File, child: String): File = File(parent, child) 8 | } 9 | 10 | fun File.tryDelete() { 11 | try { 12 | delete() 13 | } catch (exception: Exception) { 14 | Timber.d(exception, "Can't delete file: $this") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/IsolationPaymentResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class IsolationPaymentCreateTokenResponse( 7 | val isEnabled: Boolean, 8 | val ipcToken: String? 9 | ) 10 | 11 | @JsonClass(generateAdapter = true) 12 | data class IsolationPaymentUrlResponse( 13 | val websiteUrlWithQuery: String 14 | ) 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/viewutils/ViewGroupUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.viewutils 2 | 3 | import android.content.Context 4 | import android.provider.Settings.Global 5 | 6 | fun animationsDisabled(context: Context): Boolean { 7 | val animationDurationScale = Global.getFloat( 8 | context.contentResolver, 9 | Global.ANIMATOR_DURATION_SCALE, 1f 10 | ) 11 | return animationDurationScale == 0.0f 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/packagemanager/AndroidPackageManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.packagemanager 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.content.pm.ResolveInfo 6 | 7 | class AndroidPackageManager : PackageManager { 8 | 9 | override fun resolveActivity(context: Context, intent: Intent, flags: Int): ResolveInfo? = 10 | context.packageManager.resolveActivity(intent, flags) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick_light.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/RiskyVenueConfigurationResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | 5 | @JsonClass(generateAdapter = true) 6 | data class RiskyVenueConfigurationResponse( 7 | val durationDays: RiskyVenueConfigurationDurationDays 8 | ) 9 | 10 | @JsonClass(generateAdapter = true) 11 | data class RiskyVenueConfigurationDurationDays( 12 | val optionToBookATest: Int = 10 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_primary.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/RemoteServiceExceptionCrashReportSubmissionApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.Body 4 | import retrofit2.http.POST 5 | import uk.nhs.nhsx.covid19.android.app.util.crashreporting.CrashReport 6 | 7 | interface RemoteServiceExceptionCrashReportSubmissionApi { 8 | @POST("submission/crash-reports") 9 | suspend fun submitRemoteServiceExceptionCrashReport(@Body crashReport: CrashReport) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_logo.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/AnalyticsApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.Body 4 | import retrofit2.http.POST 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.AnalyticsPayload 6 | 7 | interface AnalyticsApi { 8 | 9 | @POST(PATH) 10 | suspend fun submitAnalytics(@Body analyticsPayload: AnalyticsPayload) 11 | 12 | companion object { 13 | const val PATH = "submission/mobile-analytics" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/crashreporting/SetDefaultUncaughtExceptionHandler.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.crashreporting 2 | 3 | import java.lang.Thread.UncaughtExceptionHandler 4 | import javax.inject.Inject 5 | 6 | class SetDefaultUncaughtExceptionHandler @Inject constructor() { 7 | operator fun invoke(uncaughtExceptionHandler: UncaughtExceptionHandler) { 8 | Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/MockKeysSubmissionApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import uk.nhs.nhsx.covid19.android.app.di.MockApiModule 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.TemporaryExposureKeysPayload 5 | 6 | class MockKeysSubmissionApi : KeysSubmissionApi { 7 | override suspend fun submitGeneratedKeys(temporaryExposureKeysPayload: TemporaryExposureKeysPayload) = 8 | MockApiModule.behaviour.invoke { } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_positive_symptom.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/localstats/FetchLocalStats.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.localstats 2 | 3 | import uk.nhs.nhsx.covid19.android.app.remote.LocalStatsApi 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.LocalStatsResponse 5 | import javax.inject.Inject 6 | 7 | class FetchLocalStats @Inject constructor(private val localStatsApi: LocalStatsApi) { 8 | suspend operator fun invoke(): LocalStatsResponse { 9 | return localStatsApi.fetchLocalStats() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_vert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/testordering/unknownresult/UnknownTestResultViewModel.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testordering.unknownresult 2 | 3 | import androidx.lifecycle.ViewModel 4 | import javax.inject.Inject 5 | 6 | class UnknownTestResultViewModel @Inject constructor( 7 | private val unknownTestResultProvider: ReceivedUnknownTestResultProvider 8 | ) : ViewModel() { 9 | 10 | fun acknowledgeUnknownTestResult() { 11 | unknownTestResultProvider.value = false 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick_green.xml: -------------------------------------------------------------------------------- 1 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/ExposureNotificationActivationResult.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure 2 | 3 | import com.google.android.gms.common.api.Status 4 | 5 | sealed class ExposureNotificationActivationResult { 6 | 7 | data class ResolutionRequired(val status: Status) : ExposureNotificationActivationResult() 8 | 9 | object Success : ExposureNotificationActivationResult() 10 | 11 | data class Error(val exception: Exception) : ExposureNotificationActivationResult() 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/GetRiskyContactEncounterDate.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter 2 | 3 | import uk.nhs.nhsx.covid19.android.app.state.IsolationStateMachine 4 | import java.time.LocalDate 5 | import javax.inject.Inject 6 | 7 | class GetRiskyContactEncounterDate @Inject constructor( 8 | private val isolationStateMachine: IsolationStateMachine 9 | ) { 10 | operator fun invoke(): LocalDate? = isolationStateMachine.readState().contact?.exposureDate 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/receiver/AvailabilityStateProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.receiver 2 | 3 | import android.content.Context 4 | import androidx.lifecycle.LiveData 5 | import uk.nhs.nhsx.covid19.android.app.BuildConfig 6 | 7 | interface AvailabilityStateProvider { 8 | val availabilityState: LiveData 9 | 10 | fun start(context: Context) 11 | fun stop(context: Context) 12 | fun getState(isDebug: Boolean = BuildConfig.DEBUG): AvailabilityState 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_numbered_bullet_point.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/EpidemiologyDataApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import retrofit2.http.Body 4 | import retrofit2.http.POST 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.EpidemiologyRequest 6 | 7 | interface EpidemiologyDataApi { 8 | 9 | @POST(PATH) 10 | suspend fun submitEpidemiologyData(@Body epidemiologyRequest: EpidemiologyRequest) 11 | 12 | companion object { 13 | const val PATH = "submission/mobile-analytics-events" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/user_data_item_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/production/java/uk/nhs/nhsx/covid19/android/app/di/module/QrScannerViewModelModule.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.di.module 2 | 3 | import dagger.Module 4 | import dagger.Provides 5 | import uk.nhs.nhsx.covid19.android.app.qrcode.BaseQrScannerViewModel 6 | import uk.nhs.nhsx.covid19.android.app.qrcode.QrScannerViewModel 7 | 8 | @Module 9 | class QrScannerViewModelModule { 10 | @Provides 11 | fun provideQrScannerViewModel(qrScannerViewModel: QrScannerViewModel): BaseQrScannerViewModel = qrScannerViewModel 12 | } 13 | -------------------------------------------------------------------------------- /custom-a11y-rules/src/main/java/uk/nhs/nhsx/covid19/android/a11y/NhsIssueRegistry.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.a11y 2 | 3 | import com.android.tools.lint.client.api.IssueRegistry 4 | import com.android.tools.lint.detector.api.CURRENT_API 5 | import com.android.tools.lint.detector.api.Issue 6 | 7 | class NhsIssueRegistry : IssueRegistry() { 8 | override val issues: List 9 | get() = listOf(AccessibilityTitleDetector.ISSUE_MISSING_ACCESSIBILITY_LABEL) 10 | 11 | override val api: Int 12 | get() = CURRENT_API 13 | } -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/calculation/RiskScoreCalculatorProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter.calculation 2 | 3 | import uk.nhs.riskscore.RiskScoreCalculator 4 | import uk.nhs.riskscore.RiskScoreCalculatorConfiguration 5 | import javax.inject.Inject 6 | 7 | class RiskScoreCalculatorProvider @Inject constructor() { 8 | fun riskScoreCalculator(config: RiskScoreCalculatorConfiguration) = RiskScoreCalculator(config) 9 | 10 | fun getRiskCalculationVersion(): Int = 2 11 | } 12 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/TestUpdateManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers 2 | 3 | import uk.nhs.nhsx.covid19.android.app.availability.UpdateManager 4 | 5 | class TestUpdateManager : UpdateManager { 6 | 7 | var availableUpdateStatus: UpdateManager.AvailableUpdateStatus = 8 | UpdateManager.AvailableUpdateStatus.NoUpdateAvailable 9 | 10 | override suspend fun getAvailableUpdateVersionCode(): UpdateManager.AvailableUpdateStatus = 11 | availableUpdateStatus 12 | } 13 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/MockRemoteServiceExceptionCrashReportSubmissionApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import uk.nhs.nhsx.covid19.android.app.di.MockApiModule 4 | import uk.nhs.nhsx.covid19.android.app.util.crashreporting.CrashReport 5 | 6 | class MockRemoteServiceExceptionCrashReportSubmissionApi : RemoteServiceExceptionCrashReportSubmissionApi { 7 | override suspend fun submitRemoteServiceExceptionCrashReport(crashReport: CrashReport) = 8 | MockApiModule.behaviour.invoke { } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/scenarios/res/drawable/rounded_corner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 10 | 11 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/analytics/AnalyticsAggregatorReceiver.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.analytics 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import timber.log.Timber 7 | 8 | @Deprecated("Use SubmitAnalytics, this is only for migration") 9 | class AnalyticsAggregatorReceiver : BroadcastReceiver() { 10 | 11 | override fun onReceive(context: Context, intent: Intent) { 12 | Timber.d("analytics aggregator triggered") 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/scenarios/res/menu/menu_debug.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/crashreporting/RemoteServiceExceptionReportRateLimiter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.crashreporting 2 | 3 | import java.security.SecureRandom 4 | import javax.inject.Inject 5 | 6 | class RemoteServiceExceptionReportRateLimiter @Inject constructor(private val random: SecureRandom) { 7 | 8 | fun isAllowed(): Boolean = 9 | random.nextInt(TOTAL) < LIMIT 10 | 11 | companion object { 12 | private const val LIMIT = 5 13 | private const val TOTAL = 100 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_primary.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/accordion_how_we_calculate_close_contact.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/accordion_how_we_calculate_close_contact_wales.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/bluetooth/EnableBluetoothViewModel.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common.bluetooth 2 | 3 | import androidx.lifecycle.ViewModel 4 | import uk.nhs.nhsx.covid19.android.app.status.ShouldShowBluetoothSplashScreen 5 | import javax.inject.Inject 6 | 7 | class EnableBluetoothViewModel @Inject constructor( 8 | private val shouldShowBluetoothSplashScreen: ShouldShowBluetoothSplashScreen 9 | ) : ViewModel() { 10 | 11 | fun onScreenShown() { 12 | shouldShowBluetoothSplashScreen.setHasBeenShown(true) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/RiskyVenuesCircuitBreakerDto.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | import uk.nhs.nhsx.covid19.android.app.common.CircuitBreakerResult 5 | 6 | @JsonClass(generateAdapter = true) 7 | data class RiskyVenuesCircuitBreakerResponse( 8 | val approvalToken: String, 9 | val approval: CircuitBreakerResult 10 | ) 11 | 12 | @JsonClass(generateAdapter = true) 13 | data class RiskyVenuesCircuitBreakerPollingResponse( 14 | val approval: CircuitBreakerResult 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/accordion_how_we_calculate_close_contact_england.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scripts/publish.rb: -------------------------------------------------------------------------------- 1 | if system("git describe --exact-match --tags HEAD") 2 | puts "Tag found, skipping version bump." 3 | elsif not ARGV.empty? 4 | puts "No tag found. Create tag and push." 5 | VERSION_NAME_PATH = "app/versionName" 6 | version_name = File.open(VERSION_NAME_PATH).read.strip 7 | BUILD_NUMBER_PATH = "app/buildNumber" 8 | build_number = File.open(BUILD_NUMBER_PATH).read.to_i 9 | 10 | system("git tag production-v#{version_name}-#{build_number}") 11 | system("git push origin #{ARGV[0]} --tags") 12 | else 13 | puts "No branch provided" 14 | end 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/state/CalculateContactExpiryDate.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.state 2 | 3 | import uk.nhs.nhsx.covid19.android.app.state.IsolationState.Contact 4 | import java.time.LocalDate 5 | import javax.inject.Inject 6 | 7 | class CalculateContactExpiryDate @Inject constructor() { 8 | 9 | operator fun invoke(contact: Contact, isolationConfiguration: IsolationConfiguration): LocalDate = 10 | contact.optOutOfContactIsolation?.date 11 | ?: contact.exposureDate.plusDays(isolationConfiguration.contactCase.toLong()) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/AndroidRandomNonRiskyExposureWindowsLimiter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter 2 | 3 | import java.security.SecureRandom 4 | 5 | class AndroidRandomNonRiskyExposureWindowsLimiter( 6 | private val random: SecureRandom = SecureRandom() 7 | ) : RandomNonRiskyExposureWindowsLimiter { 8 | 9 | override fun isAllowed(): Boolean = 10 | random.nextInt(TOTAL) < LIMIT 11 | 12 | companion object { 13 | private const val LIMIT = 25 14 | private const val TOTAL = 1000 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/questionnaire/review/QuestionnaireOutcome.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.questionnaire.review 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | sealed class QuestionnaireOutcome : Parcelable { 7 | @Parcelize 8 | object Minor : QuestionnaireOutcome() 9 | @Parcelize 10 | object FullyVaccinated : QuestionnaireOutcome() 11 | @Parcelize 12 | object MedicallyExempt : QuestionnaireOutcome() 13 | 14 | @Parcelize 15 | object NotExempt : QuestionnaireOutcome() 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/qrcode/AndroidBarcodeDetectorBuilder.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.qrcode 2 | 3 | import android.content.Context 4 | import com.google.android.gms.vision.Detector 5 | import com.google.android.gms.vision.barcode.Barcode 6 | import com.google.android.gms.vision.barcode.BarcodeDetector.Builder 7 | 8 | class AndroidBarcodeDetectorBuilder( 9 | private val context: Context 10 | ) : BarcodeDetectorBuilder { 11 | 12 | override fun build(): Detector? = 13 | Builder(context).setBarcodeFormats(Barcode.QR_CODE).build() 14 | } 15 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/util/ReflectUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import android.util.Log 4 | import kotlin.reflect.full.memberProperties 5 | import kotlin.reflect.jvm.isAccessible 6 | 7 | inline fun T.getPrivateProperty(name: String): R? { 8 | val r = T::class 9 | .memberProperties 10 | .firstOrNull { it.name == name } 11 | ?.apply { isAccessible = true } 12 | ?.get(this) as? R 13 | Log.d("Reflection", "getPrivateProperty: ${T::class.memberProperties}") 14 | return r 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/battery/AndroidBatteryOptimizationChecker.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.battery 2 | 3 | import android.content.Context 4 | import android.os.PowerManager 5 | 6 | class AndroidBatteryOptimizationChecker constructor( 7 | private val context: Context 8 | ) : BatteryOptimizationChecker { 9 | 10 | override fun isIgnoringBatteryOptimizations(): Boolean { 11 | val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager 12 | return powerManager.isIgnoringBatteryOptimizations(context.packageName) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/KeysDistributionApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import okhttp3.ResponseBody 4 | import retrofit2.http.GET 5 | import retrofit2.http.Path 6 | import retrofit2.http.Streaming 7 | 8 | interface KeysDistributionApi { 9 | @Streaming 10 | @GET("distribution/daily/{timestamp}") 11 | suspend fun fetchDailyKeys(@Path("timestamp") timestamp: String): ResponseBody 12 | 13 | @Streaming 14 | @GET("distribution/two-hourly/{timestamp}") 15 | suspend fun fetchHourlyKeys(@Path("timestamp") timestamp: String): ResponseBody 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/state/CalculateExpirationNotificationTime.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.state 2 | 3 | import java.time.Clock 4 | import java.time.Instant 5 | import java.time.LocalDate 6 | import javax.inject.Inject 7 | 8 | class CalculateExpirationNotificationTime @Inject constructor( 9 | private val clock: Clock 10 | ) { 11 | 12 | operator fun invoke( 13 | expiryDate: LocalDate 14 | ): Instant = 15 | expiryDate 16 | .atStartOfDay() 17 | .atZone(clock.zone) 18 | .minusHours(3) 19 | .toInstant() 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/view_area_risk_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/packagemanager/MockPackageManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.packagemanager 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.content.pm.ResolveInfo 6 | 7 | class MockPackageManager : PackageManager { 8 | 9 | val resolutionsByAction = mutableMapOf() 10 | 11 | override fun resolveActivity(context: Context, intent: Intent, flags: Int): ResolveInfo? = 12 | resolutionsByAction[intent.action] 13 | 14 | fun clear() { 15 | resolutionsByAction.clear() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/di/MockApplicationComponent.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.di 2 | 3 | import dagger.Component 4 | import uk.nhs.nhsx.covid19.android.app.di.module.AppModule 5 | import uk.nhs.nhsx.covid19.android.app.di.module.NetworkModule 6 | import uk.nhs.nhsx.covid19.android.app.di.module.QrScannerViewModelModule 7 | import javax.inject.Singleton 8 | 9 | @Singleton 10 | @Component(modules = [AppModule::class, NetworkModule::class, MockApiModule::class, MockViewModelModule::class, QrScannerViewModelModule::class]) 11 | interface MockApplicationComponent : ApplicationComponent 12 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/PolicyIconAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.PolicyIcon 6 | 7 | class PolicyIconAdapter { 8 | @ToJson 9 | fun toJson(policyIcon: PolicyIcon): String { 10 | return policyIcon.jsonName 11 | } 12 | 13 | @FromJson 14 | fun fromJson(policyIcon: String): PolicyIcon { 15 | return PolicyIcon.values().firstOrNull { it.jsonName == policyIcon } ?: PolicyIcon.DEFAULT 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 128dp 4 | 112dp 5 | 8dp 6 | 8dp 7 | 8dp 8 | 96dp 9 | 128dp 10 | 120dp 11 | 32dp 12 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/item_language.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/AnalyticsReportActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 6 | 7 | class AnalyticsReportActivityTest : EspressoTest(), HasActivity { 8 | override val containerId: Int 9 | get() = R.id.scenarios 10 | 11 | @Test 12 | fun isActivityDisplayed() { 13 | startTestActivity() 14 | checkActivityIsDisplayed() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/analytics/UpdateStatusStorage.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.analytics 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | 7 | class UpdateStatusStorage @Inject constructor(sharedPreferences: SharedPreferences) { 8 | 9 | private val updateStatusPrefs = sharedPreferences.with(UPDATE_STATUS_KEY) 10 | 11 | var value by updateStatusPrefs 12 | 13 | companion object { 14 | const val UPDATE_STATUS_KEY = "UPDATE_STATUS_KEY" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/postcode/GetLocalAuthorityName.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common.postcode 2 | 3 | import javax.inject.Inject 4 | 5 | class GetLocalAuthorityName @Inject constructor( 6 | private val localAuthorityProvider: LocalAuthorityProvider, 7 | private val localAuthorityPostCodesLoader: LocalAuthorityPostCodesLoader 8 | ) { 9 | suspend operator fun invoke(): String? { 10 | val localAuthorityId = localAuthorityProvider.value ?: return null 11 | return localAuthorityPostCodesLoader.load()?.localAuthorities?.get(localAuthorityId)?.name 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_manufacturer.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/QrScannerRobot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.assertion.ViewAssertions.matches 5 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 6 | import androidx.test.espresso.matcher.ViewMatchers.withId 7 | import uk.nhs.nhsx.covid19.android.app.R 8 | 9 | class QrScannerRobot { 10 | 11 | fun checkActivityIsDisplayed() { 12 | onView(withId(R.id.titleScanQRCode)) 13 | .check(matches(isDisplayed())) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/testordering/SubmitFakeExposureWindows.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testordering 2 | 3 | import uk.nhs.nhsx.covid19.android.app.common.SubmitEmptyData 4 | import javax.inject.Inject 5 | 6 | class SubmitFakeExposureWindows @Inject constructor( 7 | private val submitEmptyData: SubmitEmptyData, 8 | private val getEmptyExposureWindowSubmissionCount: GetEmptyExposureWindowSubmissionCount 9 | ) { 10 | operator fun invoke(numberOfExposureWindowsSent: Int = 0) { 11 | submitEmptyData(getEmptyExposureWindowSubmissionCount(numberOfExposureWindowsSent)) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_accordion_collapse.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/analytics/SubmittedOnboardingAnalyticsProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.analytics 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | 7 | class SubmittedOnboardingAnalyticsProvider @Inject constructor(sharedPreferences: SharedPreferences) { 8 | 9 | private val prefs = sharedPreferences.with(VALUE_KEY) 10 | 11 | var value: Boolean? by prefs 12 | 13 | companion object { 14 | private const val VALUE_KEY = "SUBMITTED_ONBOARDING" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/postcode/PostCodeValidator.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common.postcode 2 | 3 | import javax.inject.Inject 4 | import javax.inject.Singleton 5 | 6 | @Singleton 7 | class PostCodeValidator @Inject constructor( 8 | private val postCodeLoader: PostCodeLoader 9 | ) { 10 | suspend fun validate(postCode: String): PostCodeDistrict? { 11 | val postCodeDistrict = 12 | postCodeLoader.loadPostCodes().toList() 13 | .firstOrNull { postCode.trim() in it.second }?.first 14 | return PostCodeDistrict.fromString(postCodeDistrict) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/sharekeys/SubmitObfuscationData.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.sharekeys 2 | 3 | import uk.nhs.nhsx.covid19.android.app.common.SubmitEmptyData 4 | import uk.nhs.nhsx.covid19.android.app.testordering.SubmitFakeExposureWindows 5 | import javax.inject.Inject 6 | 7 | class SubmitObfuscationData @Inject constructor( 8 | private val submitEmptyData: SubmitEmptyData, 9 | private val submitFakeExposureWindows: SubmitFakeExposureWindows, 10 | ) { 11 | 12 | operator fun invoke() { 13 | submitEmptyData() 14 | submitFakeExposureWindows() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/widgets/HeadingTextView.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.widgets 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.appcompat.widget.AppCompatTextView 6 | import uk.nhs.nhsx.covid19.android.app.util.viewutils.setUpAccessibilityHeading 7 | 8 | class HeadingTextView @JvmOverloads constructor( 9 | context: Context, 10 | attrs: AttributeSet? = null, 11 | defStyleAttr: Int = android.R.attr.textViewStyle 12 | ) : AppCompatTextView(context, attrs, defStyleAttr) { 13 | 14 | init { 15 | setUpAccessibilityHeading() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/scenarios/res/layout/activity_test_settings.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/widgets/UnderlinedButton.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.widgets 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.core.text.parseAsHtml 6 | import com.google.android.material.button.MaterialButton 7 | import uk.nhs.nhsx.covid19.android.app.R 8 | 9 | class UnderlinedButton @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = R.style.LinkText 13 | ) : MaterialButton(context, attrs, defStyleAttr) { 14 | 15 | init { 16 | text = ("$text").parseAsHtml() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_venue_visit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/payment/IsolationPaymentActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.payment 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.IsolationPaymentRobot 6 | 7 | class IsolationPaymentActivityTest : EspressoTest() { 8 | 9 | private val isolationPaymentRobot = IsolationPaymentRobot() 10 | 11 | @Test 12 | fun showScreen() { 13 | startTestActivity() 14 | 15 | isolationPaymentRobot.checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/qrcode/riskyvenues/FilterOutdatedVisits.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.qrcode.riskyvenues 2 | 3 | import uk.nhs.nhsx.covid19.android.app.qrcode.VenueVisit 4 | import java.time.Clock 5 | import java.time.Instant 6 | import java.time.temporal.ChronoUnit 7 | import javax.inject.Inject 8 | 9 | class FilterOutdatedVisits @Inject constructor(private val clock: Clock) : (List) -> List { 10 | 11 | override fun invoke(p1: List): List = 12 | p1.filter { 13 | it.to.isAfter(Instant.now(clock).minus(21, ChronoUnit.DAYS)) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/util/DoReToAwareAndroidJUnitRunner.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import android.os.Bundle 4 | import androidx.test.runner.AndroidJUnitRunner 5 | 6 | class DoReToAwareAndroidJUnitRunner : AndroidJUnitRunner() { 7 | override fun onCreate(bundle: Bundle) { 8 | bundle.putString(FILTER_BUNDLE_KEY, ReportedTestsFilter::class.java.name) 9 | super.onCreate(bundle) 10 | } 11 | 12 | companion object { 13 | // androidx.test.internal.runner.RunnerArgs looks for this bundle key 14 | private const val FILTER_BUNDLE_KEY = "filter" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/postcode/PostCodeProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common.postcode 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class PostCodeProvider @Inject constructor(sharedPreferences: SharedPreferences) { 10 | 11 | private val prefs = sharedPreferences.with(VALUE_KEY) 12 | 13 | var value: String? by prefs 14 | 15 | companion object { 16 | private const val VALUE_KEY = "MAIN_POST_CODE" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyCtaExchangeResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | import java.time.Instant 5 | 6 | @JsonClass(generateAdapter = true) 7 | data class VirologyCtaExchangeResponse( 8 | val diagnosisKeySubmissionToken: String?, 9 | val testEndDate: Instant, 10 | val testResult: VirologyTestResult, 11 | val testKit: VirologyTestKitType, 12 | val diagnosisKeySubmissionSupported: Boolean, 13 | val requiresConfirmatoryTest: Boolean, 14 | val shouldOfferFollowUpTest: Boolean, 15 | val confirmatoryDayLimit: Int? 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/qrcode/QrCodeScanResult.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.qrcode 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | sealed class QrCodeScanResult : Parcelable { 7 | 8 | @Parcelize 9 | object Scanning : QrCodeScanResult() 10 | 11 | @Parcelize 12 | data class Success(val venueName: String) : QrCodeScanResult() 13 | 14 | @Parcelize 15 | object CameraPermissionNotGranted : QrCodeScanResult() 16 | 17 | @Parcelize 18 | object InvalidContent : QrCodeScanResult() 19 | 20 | @Parcelize 21 | object ScanningNotSupported : QrCodeScanResult() 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/status/LastAppRatingStartedDateProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.status 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | 7 | class LastAppRatingStartedDateProvider @Inject constructor(sharedPreferences: SharedPreferences) { 8 | 9 | private val prefs = sharedPreferences.with(LAST_APP_RATING_STARTED_DATE_KEY) 10 | 11 | var value by prefs 12 | 13 | companion object { 14 | const val LAST_APP_RATING_STARTED_DATE_KEY = "LAST_APP_RATING_STARTED_DATE_KEY" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/BroadcastProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import android.app.PendingIntent 4 | import android.content.Context 5 | import android.content.Intent 6 | import javax.inject.Inject 7 | import javax.inject.Singleton 8 | 9 | /** 10 | * That class is needed for unit testing, since PendingIntent.getBroadcast returns null in unit tests 11 | */ 12 | @Singleton 13 | class BroadcastProvider @Inject constructor() { 14 | fun getBroadcast(context: Context, requestCode: Int, clazz: Class<*>, flags: Int) = 15 | PendingIntent.getBroadcast(context, requestCode, Intent(context, clazz), flags) 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/TranslatableStringAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import uk.nhs.nhsx.covid19.android.app.common.TranslatableString 6 | 7 | class TranslatableStringAdapter { 8 | 9 | @ToJson 10 | fun toJson(translatableString: TranslatableString): Map { 11 | return translatableString.translations 12 | } 13 | 14 | @FromJson 15 | fun fromJson(translatableJson: Map): TranslatableString { 16 | return TranslatableString(translatableJson) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/postcode/LocalAuthorityProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common.postcode 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class LocalAuthorityProvider @Inject constructor(sharedPreferences: SharedPreferences) { 10 | 11 | private val prefs = sharedPreferences.with(VALUE_KEY) 12 | 13 | var value: String? by prefs 14 | 15 | companion object { 16 | private const val VALUE_KEY = "LOCAL_AUTHORITY_ID" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/MockEpidemiologyDataApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import uk.nhs.nhsx.covid19.android.app.di.MockApiModule 4 | import uk.nhs.nhsx.covid19.android.app.remote.data.EpidemiologyRequest 5 | 6 | class MockEpidemiologyDataApi : EpidemiologyDataApi { 7 | 8 | val requests = mutableListOf() 9 | 10 | override suspend fun submitEpidemiologyData(epidemiologyRequest: EpidemiologyRequest) = 11 | MockApiModule.behaviour.invoke { 12 | requests += epidemiologyRequest 13 | } 14 | 15 | fun clear() { 16 | requests.clear() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/edgecases/DeviceNotSupportedActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.edgecases 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.edgecases.DeviceNotSupportedRobot 6 | 7 | class DeviceNotSupportedActivityTest : EspressoTest() { 8 | 9 | private val deviceNotSupportedRobot = DeviceNotSupportedRobot() 10 | 11 | @Test 12 | fun showScreen() { 13 | startTestActivity() 14 | 15 | deviceNotSupportedRobot.checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/qrcode/QrScannerActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.qrcode 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class QrScannerActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.container 11 | 12 | @Test 13 | fun canActivityLaunchSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/availability/AppStoreUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.availability 2 | 3 | import android.content.ActivityNotFoundException 4 | import android.content.Intent 5 | import android.net.Uri 6 | import androidx.appcompat.app.AppCompatActivity 7 | 8 | fun AppCompatActivity.openAppStore() { 9 | try { 10 | startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=uk.nhs.covid19.production"))) 11 | } catch (exception: ActivityNotFoundException) { 12 | startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=uk.nhs.covid19.production"))) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/onboarding/OnboardingCompletedProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class OnboardingCompletedProvider @Inject constructor(sharedPreferences: SharedPreferences) { 10 | 11 | private val prefs = sharedPreferences.with(VALUE_KEY) 12 | 13 | var value: Boolean? by prefs 14 | 15 | companion object { 16 | private const val VALUE_KEY = "ONBOARDING_COMPLETED" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/WorkerUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util 2 | 3 | import androidx.work.ListenableWorker 4 | import timber.log.Timber 5 | import uk.nhs.nhsx.covid19.android.app.common.Result 6 | import uk.nhs.nhsx.covid19.android.app.common.Result.Failure 7 | import uk.nhs.nhsx.covid19.android.app.common.Result.Success 8 | 9 | fun Result.toWorkerResult(): ListenableWorker.Result = 10 | when (this) { 11 | is Success -> ListenableWorker.Result.success() 12 | is Failure -> { 13 | Timber.e(this.throwable, "WorkerResult") 14 | ListenableWorker.Result.failure() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_exclamation.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /custom-ktlint-rules/src/main/java/uk/nhs/nhsx/covid19/android/ktlint/CustomRuleSetProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.ktlint 2 | 3 | import com.pinterest.ktlint.core.RuleSet 4 | import com.pinterest.ktlint.core.RuleSetProvider 5 | import uk.nhs.nhsx.covid19.android.ktlint.rule.NoSetOnClickListenerRule 6 | import uk.nhs.nhsx.covid19.android.ktlint.rule.ReportedTestRule 7 | import uk.nhs.nhsx.covid19.android.ktlint.rule.TestNameLengthRule 8 | 9 | class CustomRuleSetProvider : RuleSetProvider { 10 | override fun get() = RuleSet("custom-ktlint-rules", 11 | NoSetOnClickListenerRule(), 12 | ReportedTestRule(), 13 | TestNameLengthRule() 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/analytics/NetworkStatsInterceptor.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.analytics 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Interceptor.Chain 5 | import okhttp3.Response 6 | import javax.inject.Inject 7 | 8 | class NetworkStatsInterceptor @Inject constructor( 9 | private val analyticsEventProcessor: AnalyticsEventProcessor 10 | ) : Interceptor { 11 | 12 | override fun intercept(chain: Chain): Response { 13 | val request = chain.request() 14 | val response = chain.proceed(request) 15 | analyticsEventProcessor.track(AnalyticsEvent.UpdateNetworkStats) 16 | return response 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/initial_card_background.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/include_onboarding_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/edgecases/AgeRestrictionRobot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots.edgecases 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.assertion.ViewAssertions.matches 5 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 6 | import androidx.test.espresso.matcher.ViewMatchers.withText 7 | import uk.nhs.nhsx.covid19.android.app.R 8 | 9 | class AgeRestrictionRobot { 10 | 11 | fun checkActivityIsDisplayed() { 12 | onView(withText(R.string.onboarding_age_restriction_title)) 13 | .check(matches(isDisplayed())) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/edgecases/EnableLocationRobot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots.edgecases 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.assertion.ViewAssertions.matches 5 | import androidx.test.espresso.matcher.ViewMatchers.withId 6 | import androidx.test.espresso.matcher.ViewMatchers.withText 7 | import uk.nhs.nhsx.covid19.android.app.R 8 | 9 | class EnableLocationRobot { 10 | fun checkActivityIsDisplayed() { 11 | onView(withId(R.id.edgeCaseTitle)) 12 | .check(matches(withText(R.string.enable_location_service_title))) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/setup/LocalAuthoritySetupHelper.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.setup 2 | 3 | import uk.nhs.nhsx.covid19.android.app.testhelpers.TestApplicationContext 4 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.HasTestAppContext 5 | 6 | interface LocalAuthoritySetupHelper : HasTestAppContext { 7 | fun givenLocalAuthorityIsInEngland() { 8 | testAppContext.setLocalAuthority(TestApplicationContext.ENGLISH_LOCAL_AUTHORITY) 9 | } 10 | 11 | fun givenLocalAuthorityIsInWales() { 12 | testAppContext.setLocalAuthority(TestApplicationContext.WELSH_LOCAL_AUTHORITY) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/DecommissioningNotificationSentProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class DecommissioningNotificationSentProvider @Inject constructor(sharedPreferences: SharedPreferences) { 10 | 11 | private val prefs = sharedPreferences.with(VALUE_KEY) 12 | 13 | var value: Boolean? by prefs 14 | 15 | companion object { 16 | private const val VALUE_KEY = "DECOMMISSIONING_NOTIFICATION_SENT" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/state/IsolationExpirationAlarmProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.state 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | 7 | class IsolationExpirationAlarmProvider @Inject constructor( 8 | sharedPreferences: SharedPreferences 9 | ) { 10 | 11 | private val prefs = sharedPreferences.with(ISOLATION_EXPIRATION_ALARM_TIME) 12 | 13 | var value: Long? by prefs 14 | 15 | companion object { 16 | private const val ISOLATION_EXPIRATION_ALARM_TIME = "ISOLATION_EXPIRATION_ALARM_TIME" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/onboarding/PolicyUpdateActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class PolicyUpdateActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.scrollView 11 | 12 | @Test 13 | fun canActivityLaunchSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/ColorSchemeAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.ColorScheme 6 | import uk.nhs.nhsx.covid19.android.app.remote.data.ColorScheme.NEUTRAL 7 | 8 | class ColorSchemeAdapter { 9 | @ToJson 10 | fun toJson(colorScheme: ColorScheme): String { 11 | return colorScheme.jsonName 12 | } 13 | 14 | @FromJson 15 | fun fromJson(colorScheme: String): ColorScheme { 16 | return ColorScheme.values().firstOrNull { it.jsonName == colorScheme } ?: NEUTRAL 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_paragraph.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 9 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/exposure/AllowShareKeysActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class AllowShareKeysActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.yesButton 11 | 12 | @Test 13 | fun canActivityBeLaunchedSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/localstats/FetchLocalDataProgressActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.localstats 2 | 3 | import org.junit.Ignore 4 | import org.junit.Test 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.ProgressRobot 7 | 8 | class FetchLocalDataProgressActivityTest : EspressoTest() { 9 | 10 | private val progressRobot = ProgressRobot() 11 | 12 | @Test 13 | @Ignore 14 | fun canActivityLaunchSuccessfully() { 15 | startTestActivity() 16 | progressRobot.checkActivityIsDisplayed() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/edgecases/AgeRestrictionActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.edgecases 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class AgeRestrictionActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.edgeCaseContainer 11 | 12 | @Test 13 | fun canActivityLaunchSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/onboarding/postcode/PostCodeActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding.postcode 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class PostCodeActivityTest : EspressoTest(), HasActivity { 9 | 10 | override val containerId: Int 11 | get() = R.id.scrollView 12 | 13 | @Test 14 | fun canActivityLaunchSuccessfully() { 15 | startTestActivity() 16 | checkActivityIsDisplayed() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/viewutils/ThemeUtils.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.viewutils 2 | 3 | import android.content.Context 4 | import android.util.TypedValue 5 | import androidx.annotation.AttrRes 6 | import androidx.annotation.ColorInt 7 | 8 | @ColorInt 9 | fun Context.getThemeColor(@AttrRes attribute: Int): Int { 10 | val typedValue = TypedValue() 11 | theme.resolveAttribute(attribute, typedValue, true) 12 | return typedValue.data 13 | } 14 | 15 | fun Context.getThemeDrawableResId(@AttrRes attribute: Int): Int { 16 | val typedValue = TypedValue() 17 | theme.resolveAttribute(attribute, typedValue, true) 18 | return typedValue.resourceId 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_isolation_hub.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radio_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/onboarding/DataAndPrivacyActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.onboarding 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class DataAndPrivacyActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.dateAndPrivacyContainer 11 | 12 | @Test 13 | fun canActivityLaunchSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/VirologyTestResultResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | import java.time.Instant 5 | 6 | @JsonClass(generateAdapter = true) 7 | data class VirologyTestResultResponse( 8 | val testEndDate: Instant, 9 | val testResult: VirologyTestResult, 10 | val testKit: VirologyTestKitType, 11 | val diagnosisKeySubmissionSupported: Boolean, 12 | val requiresConfirmatoryTest: Boolean, 13 | val shouldOfferFollowUpTest: Boolean, 14 | val confirmatoryDayLimit: Int? 15 | ) 16 | 17 | enum class VirologyTestResult { 18 | POSITIVE, 19 | NEGATIVE, 20 | VOID, 21 | PLOD 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/radio_not_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/questionnaire/review/NoSymptomsActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.questionnaire.review 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class NoSymptomsActivityTest : EspressoTest(), HasActivity { 9 | 10 | override val containerId: Int 11 | get() = R.id.imageNoSymptom 12 | 13 | @Test 14 | fun canActivityLaunchSuccessfully() { 15 | startTestActivity() 16 | checkActivityIsDisplayed() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/questionnaire/review/RiskCalculator.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.questionnaire.review 2 | 3 | import androidx.annotation.VisibleForTesting 4 | import uk.nhs.nhsx.covid19.android.app.questionnaire.selection.Symptom 5 | import javax.inject.Inject 6 | 7 | class RiskCalculator @Inject constructor() { 8 | 9 | fun isRiskAboveThreshold(checkedSymptoms: List, riskThreshold: Float): Boolean { 10 | return calculateRisk(checkedSymptoms) >= riskThreshold 11 | } 12 | 13 | @VisibleForTesting 14 | internal fun calculateRisk(checkedSymptoms: List): Double { 15 | return checkedSymptoms.sumByDouble { it.riskWeight } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_negative_symptom.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_venue_visit_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /app/src/test/java/uk/nhs/nhsx/covid19/android/app/utils/CoroutineTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.utils 2 | 3 | import kotlinx.coroutines.test.TestCoroutineDispatcher 4 | import kotlinx.coroutines.test.TestCoroutineScope 5 | import kotlinx.coroutines.test.runBlockingTest 6 | import org.junit.After 7 | 8 | open class CoroutineTest { 9 | 10 | private val testDispatcher = TestCoroutineDispatcher() 11 | val testScope = TestCoroutineScope(testDispatcher) 12 | 13 | @After 14 | fun tearDown() { 15 | testScope.cleanupTestCoroutines() 16 | } 17 | 18 | fun runBlockingTest(function: suspend TestCoroutineScope.() -> Unit) { 19 | testDispatcher.runBlockingTest(function) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/testordering/unknownresult/ReceivedUnknownTestResultProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testordering.unknownresult 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | 7 | class ReceivedUnknownTestResultProvider @Inject constructor( 8 | sharedPreferences: SharedPreferences 9 | ) { 10 | 11 | private val prefs = sharedPreferences.with(RECEIVED_UNKNOWN_TEST_RESULT) 12 | 13 | var value: Boolean? by prefs 14 | 15 | companion object { 16 | const val RECEIVED_UNKNOWN_TEST_RESULT = "RECEIVED_UNKNOWN_TEST_RESULT" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/battery/BatteryOptimizationAcknowledgementProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.battery 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class BatteryOptimizationAcknowledgementProvider @Inject constructor( 10 | sharedPreferences: SharedPreferences 11 | ) { 12 | 13 | private val prefs = sharedPreferences.with(VALUE_KEY) 14 | 15 | var value: Long? by prefs 16 | 17 | companion object { 18 | private const val VALUE_KEY = "BATTERY_OPTIMIZATION_ACKNOWLEDGEMENT_TIME" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/common/Lce.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.common 2 | 3 | sealed class Lce { 4 | 5 | open val data: T? = null 6 | 7 | abstract fun map(f: (T) -> R): Lce 8 | 9 | data class Success(override val data: T) : Lce() { 10 | override fun map(f: (T) -> R): Lce = Success(f(data)) 11 | } 12 | 13 | data class Error(val message: String) : Lce() { 14 | constructor(t: Throwable) : this(t.message ?: "") 15 | 16 | override fun map(f: (Nothing) -> R): Lce = this 17 | } 18 | 19 | object Loading : Lce() { 20 | override fun map(f: (Nothing) -> R): Lce = this 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/encounter/HasSuccessfullyProcessedNewExposureProvider.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.encounter 2 | 3 | import android.content.SharedPreferences 4 | import uk.nhs.nhsx.covid19.android.app.util.SharedPrefsDelegate.Companion.with 5 | import javax.inject.Inject 6 | import javax.inject.Singleton 7 | 8 | @Singleton 9 | class HasSuccessfullyProcessedNewExposureProvider @Inject constructor(sharedPreferences: SharedPreferences) { 10 | private val prefs = sharedPreferences.with(VALUE_KEY) 11 | 12 | var value: Boolean? by prefs 13 | 14 | companion object { 15 | const val VALUE_KEY = "HAS_FAILED_PROCESSING_NEW_EXPOSURE_KEY" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/questionnaire/GetLastDoseDateLimit.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.questionnaire 2 | 3 | import uk.nhs.nhsx.covid19.android.app.exposure.encounter.GetRiskyContactEncounterDate 4 | import java.time.LocalDate 5 | import java.time.temporal.ChronoUnit 6 | import javax.inject.Inject 7 | 8 | class GetLastDoseDateLimit @Inject constructor( 9 | private val getRiskyContactEncounterDate: GetRiskyContactEncounterDate 10 | ) { 11 | 12 | operator fun invoke(): LocalDate? = getRiskyContactEncounterDate()?.minus(exposureDoseDateThreshold, ChronoUnit.DAYS) 13 | 14 | companion object { 15 | private const val exposureDoseDateThreshold = 15L 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/remote/data/QuestionnaireResponse.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote.data 2 | 3 | import com.squareup.moshi.JsonClass 4 | import uk.nhs.nhsx.covid19.android.app.questionnaire.selection.Cardinal 5 | import uk.nhs.nhsx.covid19.android.app.questionnaire.selection.NonCardinal 6 | import uk.nhs.nhsx.covid19.android.app.questionnaire.selection.Symptom 7 | 8 | @JsonClass(generateAdapter = true) 9 | data class QuestionnaireResponse( 10 | val symptoms: List, 11 | val cardinal: Cardinal, 12 | val noncardinal: NonCardinal, 13 | val riskThreshold: Float, 14 | val symptomsOnsetWindowDays: Int, 15 | val isSymptomaticSelfIsolationForWalesEnabled: Boolean 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/test/java/uk/nhs/nhsx/covid19/android/app/testordering/unknownresult/UnknownTestResultViewModelTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testordering.unknownresult 2 | 3 | import io.mockk.mockk 4 | import io.mockk.verify 5 | import org.junit.Test 6 | 7 | class UnknownTestResultViewModelTest { 8 | private val receivedUnknownTestResultProvider = mockk(relaxUnitFun = true) 9 | 10 | val testSubject = UnknownTestResultViewModel(receivedUnknownTestResultProvider) 11 | 12 | @Test 13 | fun `acknowledging unknown test result resets flag`() { 14 | testSubject.acknowledgeUnknownTestResult() 15 | verify { receivedUnknownTestResultProvider.value = false } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/exposure/EnableExposureNotificationActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class EnableExposureNotificationActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.yesButton 11 | 12 | @Test 13 | fun canActivityBeLaunchedSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/questionnaire/review/ReviewSymptomsActivityTest.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.questionnaire.review 2 | 3 | import org.junit.Test 4 | import uk.nhs.nhsx.covid19.android.app.R 5 | import uk.nhs.nhsx.covid19.android.app.testhelpers.base.EspressoTest 6 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 7 | 8 | class ReviewSymptomsActivityTest : EspressoTest(), HasActivity { 9 | override val containerId: Int 10 | get() = R.id.scrollViewReviewSymptoms 11 | 12 | @Test 13 | fun canActivityLaunchSuccessfully() { 14 | startTestActivity() 15 | checkActivityIsDisplayed() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/HowAppWorksRobot.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots 2 | 3 | import androidx.test.espresso.Espresso.onView 4 | import androidx.test.espresso.action.ViewActions.click 5 | import androidx.test.espresso.matcher.ViewMatchers.withId 6 | import uk.nhs.nhsx.covid19.android.app.R.id 7 | import uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces.HasActivity 8 | 9 | class HowAppWorksRobot : HasActivity { 10 | override val containerId: Int 11 | get() = id.howAppWorksContainer 12 | 13 | fun clickContinueOnboarding() { 14 | onView(withId(id.continueHowAppWorks)) 15 | .perform(click()) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/LocalDateAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.JsonDataException 5 | import com.squareup.moshi.ToJson 6 | import java.time.LocalDate 7 | 8 | class LocalDateAdapter { 9 | @ToJson 10 | fun toJson(localDate: LocalDate): String { 11 | return localDate.toString() 12 | } 13 | 14 | @FromJson 15 | fun fromJson(localDate: String): LocalDate { 16 | return try { 17 | LocalDate.parse(localDate) 18 | } catch (exception: Exception) { 19 | throw JsonDataException("Wrong LocalDate format: $localDate") 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/scenarios/java/uk/nhs/nhsx/covid19/android/app/remote/MockAnalyticsApi.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.remote 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import uk.nhs.nhsx.covid19.android.app.di.MockApiModule 6 | import uk.nhs.nhsx.covid19.android.app.remote.data.AnalyticsPayload 7 | 8 | class MockAnalyticsApi : AnalyticsApi { 9 | private val lastRequestLiveData = MutableLiveData() 10 | fun lastRequest(): LiveData = lastRequestLiveData 11 | 12 | override suspend fun submitAnalytics(analyticsPayload: AnalyticsPayload) = MockApiModule.behaviour.invoke { 13 | lastRequestLiveData.postValue(analyticsPayload) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/androidTestScenarios/java/uk/nhs/nhsx/covid19/android/app/testhelpers/robots/interfaces/HasActivity.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testhelpers.robots.interfaces 2 | 3 | import androidx.annotation.IdRes 4 | import androidx.test.espresso.Espresso.onView 5 | import androidx.test.espresso.assertion.ViewAssertions.matches 6 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 7 | import androidx.test.espresso.matcher.ViewMatchers.withId 8 | import uk.nhs.nhsx.covid19.android.app.testhelpers.waitFor 9 | 10 | interface HasActivity { 11 | @get:IdRes 12 | val containerId: Int 13 | 14 | fun checkActivityIsDisplayed() = waitFor { 15 | onView(withId(containerId)).check(matches(isDisplayed())) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/permissions/AndroidPermissionsManager.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.permissions 2 | 3 | import android.app.Activity 4 | import android.content.Context 5 | import androidx.core.app.ActivityCompat 6 | import androidx.core.content.ContextCompat 7 | 8 | class AndroidPermissionsManager : PermissionsManager { 9 | 10 | override fun requestPermissions(activity: Activity, permissions: Array, requestCode: Int) { 11 | ActivityCompat.requestPermissions(activity, permissions, requestCode) 12 | } 13 | 14 | override fun checkSelfPermission(context: Context, permission: String): Int { 15 | return ContextCompat.checkSelfPermission(context, permission) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/testordering/GetEmptyExposureWindowSubmissionCount.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.testordering 2 | 3 | import java.security.SecureRandom 4 | import javax.inject.Inject 5 | import kotlin.math.max 6 | 7 | class GetEmptyExposureWindowSubmissionCount @Inject constructor(private val secureRandom: SecureRandom) { 8 | 9 | operator fun invoke(numberOfExposureWindowsSent: Int = 0): Int { 10 | val totalCallCount = secureRandom.nextInt(MAX_CALLS - MIN_CALLS) + MIN_CALLS 11 | return max(0, totalCallCount - numberOfExposureWindowsSent) 12 | } 13 | 14 | companion object { 15 | private const val MIN_CALLS = 2 16 | private const val MAX_CALLS = 16 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/exposure/sharekeys/ShareKeysNavigation.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.exposure.sharekeys 2 | 3 | import uk.nhs.nhsx.covid19.android.app.remote.data.NHSTemporaryExposureKey 4 | 5 | interface ShareKeysNavigationTarget 6 | 7 | sealed class ShareKeysNavigateTo : ShareKeysNavigationTarget { 8 | data class SubmitKeysProgressActivity( 9 | val temporaryExposureKeys: List, 10 | val diagnosisKeySubmissionToken: String 11 | ) : ShareKeysNavigateTo() 12 | 13 | data class ShareKeysResultActivity(val bookFollowUpTest: Boolean) : ShareKeysNavigateTo() 14 | object StatusActivity : ShareKeysNavigateTo() 15 | object Finish : ShareKeysNavigateTo() 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/ContentBlockTypeAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.ContentBlockType 6 | import uk.nhs.nhsx.covid19.android.app.remote.data.ContentBlockType.UNKNOWN 7 | 8 | class ContentBlockTypeAdapter { 9 | @ToJson 10 | fun toJson(contentBlockType: ContentBlockType): String { 11 | return contentBlockType.jsonName 12 | } 13 | 14 | @FromJson 15 | fun fromJson(contentBlockType: String): ContentBlockType { 16 | return ContentBlockType.values().firstOrNull { it.jsonName == contentBlockType } ?: UNKNOWN 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/uk/nhs/nhsx/covid19/android/app/util/adapters/LocalMessageTypeAdapter.kt: -------------------------------------------------------------------------------- 1 | package uk.nhs.nhsx.covid19.android.app.util.adapters 2 | 3 | import com.squareup.moshi.FromJson 4 | import com.squareup.moshi.ToJson 5 | import uk.nhs.nhsx.covid19.android.app.remote.data.LocalMessageType 6 | import uk.nhs.nhsx.covid19.android.app.remote.data.LocalMessageType.UNKNOWN 7 | 8 | class LocalMessageTypeAdapter { 9 | @ToJson 10 | fun toJson(localMessageType: LocalMessageType): String { 11 | return localMessageType.jsonName 12 | } 13 | 14 | @FromJson 15 | fun fromJson(localMessageType: String): LocalMessageType { 16 | return LocalMessageType.values().firstOrNull { it.jsonName == localMessageType } ?: UNKNOWN 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_policy_international_travel.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_multiline_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | --------------------------------------------------------------------------------