From 696e4ed498623a763b3fefc6982d2567691ea48d Mon Sep 17 00:00:00 2001 From: COVIDSafe Support <64945427+covidsafe-support@users.noreply.github.com> Date: Fri, 15 May 2020 18:19:59 +1000 Subject: [PATCH] COVIDSafe code from version 1.0.17 (#1) --- README.md | 2 + app/build.gradle | 9 ++++- .../covidsafe/bluetooth/BLEAdvertiser.kt | 14 +++---- .../health/covidsafe/bluetooth/BLEScanner.kt | 39 ++++++++++++++----- .../covidsafe/bluetooth/gatt/GattServer.kt | 1 + .../notifications/NotificationTemplates.kt | 4 -- .../health/covidsafe/ui/home/HomeFragment.kt | 4 ++ .../dataprivacy/DataPrivacyFragment.kt | 8 ++++ .../fragment/howitworks/HowItWorksFragment.kt | 8 ++++ .../introduction/IntroductionFragment.kt | 8 ++++ .../personal/PersonalDetailsFragment.kt | 6 +-- .../RegistrationConsentFragment.kt} | 10 +++-- .../main/res/drawable/ic_question_circle.xml | 18 +++++++++ .../main/res/layout/activity_onboarding.xml | 3 +- .../main/res/layout/fragment_data_privacy.xml | 1 + app/src/main/res/layout/fragment_home.xml | 5 ++- .../layout/fragment_home_external_links.xml | 32 ++++++++++++--- .../fragment_home_setup_complete_header.xml | 1 + .../main/res/layout/fragment_how_it_works.xml | 1 + app/src/main/res/layout/fragment_intro.xml | 1 + .../res/layout/fragment_personal_details.xml | 10 +++-- .../layout/fragment_registration_consent.xml | 4 ++ .../res/layout/fragment_under_sixteen.xml | 4 ++ .../res/layout/fragment_upload_page_4.xml | 11 +++--- .../layout/view_card_external_link_card.xml | 18 +++------ .../main/res/navigation/nav_onboarding.xml | 2 +- app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/strings.xml | 25 +++++++++--- app/src/main/res/values/type.xml | 1 + gradle.properties | 4 ++ security.txt | 17 ++++++++ 31 files changed, 205 insertions(+), 68 deletions(-) rename app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/{registrationcontent/RegistrationContentFragment.kt => registrationconsent/RegistrationConsentFragment.kt} (80%) create mode 100644 app/src/main/res/drawable/ic_question_circle.xml create mode 100644 security.txt diff --git a/README.md b/README.md index fe7084e..12aa027 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # COVIDSafe app +# Please report any security vulnerabilities using the details from [https://covidsafe.gov.au/.well-known/security.txt](https://covidsafe.gov.au/.well-known/security.txt) + # [Terms and Conditions for access to COVIDSafe App code](https://github.com/AU-COVIDSafe/mobile-android/blob/master/LICENSE.md) By accessing the App Code I accept and agree to the following terms: diff --git a/app/build.gradle b/app/build.gradle index b783f5d..941333b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,8 +36,8 @@ android { resValue "string", "build_config_package", "au.gov.health.covidsafe" minSdkVersion 23 targetSdkVersion 29 - versionCode 16 - versionName "1.0.16" + versionCode 17 + versionName "1.0.17" buildConfigField "String", "GITHASH", "\"${getGitHash()}\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -90,6 +90,7 @@ android { buildConfigField "boolean", "ENABLE_DEBUG_SCREEN", "true" buildConfigField "String", "END_POINT_PREFIX", TEST_END_POINT_PREFIX buildConfigField "String", "BASE_URL", TEST_BASE_URL + buildConfigField "String", "IOS_BACKGROUND_UUID", DEBUG_BACKGROUND_IOS_SERVICE_UUID String ssid = STAGING_SERVICE_UUID @@ -104,6 +105,8 @@ android { buildConfigField "boolean", "ENABLE_DEBUG_SCREEN", "true" buildConfigField "String", "END_POINT_PREFIX", STAGING_END_POINT_PREFIX buildConfigField "String", "BASE_URL", STAGING_BASE_URL + buildConfigField "String", "IOS_BACKGROUND_UUID", STAGING_BACKGROUND_IOS_SERVICE_UUID + // Retrieve bluetooth ssid from staging's strings.xml @@ -126,6 +129,8 @@ android { buildConfigField "String", "BLE_SSID", PRODUCTION_SERVICE_UUID buildConfigField "String", "END_POINT_PREFIX", PRODUCTION_END_POINT_PREFIX buildConfigField "String", "BASE_URL", PROD_BASE_URL + buildConfigField "String", "IOS_BACKGROUND_UUID", PRODUCTION_BACKGROUND_IOS_SERVICE_UUID + debuggable false jniDebuggable false diff --git a/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEAdvertiser.kt b/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEAdvertiser.kt index 5a39480..394c164 100644 --- a/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEAdvertiser.kt +++ b/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEAdvertiser.kt @@ -89,14 +89,12 @@ class BLEAdvertiser constructor(serviceUUID: String) { CentralLog.d(TAG, "Unique string: $finalString") val serviceDataByteArray = finalString.toByteArray() - if (data == null) { - data = AdvertiseData.Builder() - .setIncludeDeviceName(false) - .setIncludeTxPowerLevel(true) - .addServiceUuid(pUuid) - .addManufacturerData(1023, serviceDataByteArray) - .build() - } + data = AdvertiseData.Builder() + .setIncludeDeviceName(false) + .setIncludeTxPowerLevel(true) + .addServiceUuid(pUuid) + .addManufacturerData(1023, serviceDataByteArray) + .build() try { CentralLog.d(TAG, "Start advertising") diff --git a/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEScanner.kt b/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEScanner.kt index 03061af..b2de214 100644 --- a/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEScanner.kt +++ b/app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEScanner.kt @@ -7,7 +7,12 @@ import android.bluetooth.le.ScanFilter import android.bluetooth.le.ScanSettings import android.content.Context import android.os.ParcelUuid +import android.util.Base64 +import android.util.Base64.decode +import au.gov.health.covidsafe.BuildConfig import au.gov.health.covidsafe.Utils +import au.gov.health.covidsafe.bluetooth.BLEScanner.FilterConstant.APPLE_MANUFACTURER_ID +import au.gov.health.covidsafe.bluetooth.BLEScanner.FilterConstant.BACKGROUND_IOS_SERVICE_UUID import au.gov.health.covidsafe.logging.CentralLog import java.util.* import kotlin.collections.ArrayList @@ -15,13 +20,18 @@ import kotlin.properties.Delegates class BLEScanner constructor(context: Context, uuid: String, reportDelay: Long) { + object FilterConstant { + const val APPLE_MANUFACTURER_ID = 76 + val BACKGROUND_IOS_SERVICE_UUID: ByteArray = decode(BuildConfig.IOS_BACKGROUND_UUID, Base64.DEFAULT) + } + private var serviceUUID: String by Delegates.notNull() private var context: Context by Delegates.notNull() private var scanCallback: ScanCallback? = null private var reportDelay: Long by Delegates.notNull() private var scanner: BluetoothLeScanner? = - BluetoothAdapter.getDefaultAdapter().bluetoothLeScanner + BluetoothAdapter.getDefaultAdapter().bluetoothLeScanner private val TAG = "BLEScanner" @@ -32,17 +42,26 @@ class BLEScanner constructor(context: Context, uuid: String, reportDelay: Long) } fun startScan(scanCallback: ScanCallback) { - val filter = ScanFilter.Builder() - .setServiceUuid(ParcelUuid(UUID.fromString(serviceUUID))) - .build() + val serviceUUIDFilter = ScanFilter.Builder() + .setServiceUuid(ParcelUuid(UUID.fromString(serviceUUID))) + .build() + + val backgroundedIPhoneFilter = ScanFilter.Builder() + .setServiceUuid(null) + .setManufacturerData( + APPLE_MANUFACTURER_ID, + BACKGROUND_IOS_SERVICE_UUID + ) + .build() val filters: ArrayList = ArrayList() - filters.add(filter) + filters.add(serviceUUIDFilter) + filters.add(backgroundedIPhoneFilter) val settings = ScanSettings.Builder() - .setReportDelay(reportDelay) - .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) - .build() + .setReportDelay(reportDelay) + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .build() this.scanCallback = scanCallback scanner = scanner ?: BluetoothAdapter.getDefaultAdapter().bluetoothLeScanner @@ -58,8 +77,8 @@ class BLEScanner constructor(context: Context, uuid: String, reportDelay: Long) } } catch (e: Throwable) { CentralLog.e( - TAG, - "unable to stop scanning - callback null or bluetooth off? : ${e.localizedMessage}" + TAG, + "unable to stop scanning - callback null or bluetooth off? : ${e.localizedMessage}" ) } } diff --git a/app/src/main/java/au/gov/health/covidsafe/bluetooth/gatt/GattServer.kt b/app/src/main/java/au/gov/health/covidsafe/bluetooth/gatt/GattServer.kt index 057cf08..86ac409 100644 --- a/app/src/main/java/au/gov/health/covidsafe/bluetooth/gatt/GattServer.kt +++ b/app/src/main/java/au/gov/health/covidsafe/bluetooth/gatt/GattServer.kt @@ -42,6 +42,7 @@ class GattServer constructor(val context: Context, serviceUUIDString: String) { BluetoothProfile.STATE_DISCONNECTED -> { CentralLog.i(TAG, "${device?.address} Disconnected from local GATT server.") + readPayloadMap.remove(device?.address) device?.let { Utils.broadcastDeviceDisconnected(context, device) } diff --git a/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt b/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt index e3596d1..e4a4a14 100644 --- a/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt +++ b/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt @@ -26,14 +26,10 @@ class NotificationTemplates { ) val builder = NotificationCompat.Builder(context, channel) - .setContentTitle(context.getText(R.string.service_ok_title)) - .setContentText(context.getText(R.string.service_ok_body)) .setOngoing(true) .setPriority(NotificationCompat.PRIORITY_LOW) .setSmallIcon(R.drawable.ic_notification_icon) .setContentIntent(activityPendingIntent) - .setTicker(context.getText(R.string.service_ok_body)) - .setStyle(NotificationCompat.BigTextStyle().bigText(context.getText(R.string.service_ok_body))) .setWhen(System.currentTimeMillis()) .setSound(null) .setVibrate(null) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt index 3141017..aa0b795 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt @@ -99,6 +99,9 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { home_setup_complete_app.setOnClickListener { goToCovidApp() } + help_topics_link.setOnClickListener { + findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToHelpFragment()) + } if (!mIsBroadcastListenerRegistered) { registerBroadcast() @@ -115,6 +118,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { home_setup_complete_share.setOnClickListener(null) home_setup_complete_news.setOnClickListener(null) home_setup_complete_app.setOnClickListener(null) + help_topics_link.setOnClickListener(null) activity?.let { activity -> if (mIsBroadcastListenerRegistered) { activity.unregisterReceiver(mBroadcastListener) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt index b12d786..7c5dccf 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt @@ -5,6 +5,7 @@ import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import au.gov.health.covidsafe.R import au.gov.health.covidsafe.ui.PagerChildFragment import au.gov.health.covidsafe.ui.UploadButtonLayout @@ -24,6 +25,13 @@ class DataPrivacyFragment : PagerChildFragment() { view.data_privacy_content.movementMethod = LinkMovementMethod.getInstance() } + override fun onResume() { + super.onResume() + + // set accessibility focus to the title "Registration and privacy" + data_privacy_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + override fun getUploadButtonLayout() = UploadButtonLayout.ContinueLayout(R.string.data_privacy_button) { navigateTo(DataPrivacyFragmentDirections.actionDataPrivacyToRegistrationConsentFragment().actionId) } diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt index 14688d0..7038983 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt @@ -5,6 +5,7 @@ import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import au.gov.health.covidsafe.R import au.gov.health.covidsafe.ui.PagerChildFragment import au.gov.health.covidsafe.ui.UploadButtonLayout @@ -24,6 +25,13 @@ class HowItWorksFragment : PagerChildFragment() { view.how_it_works_content.movementMethod = LinkMovementMethod.getInstance() } + override fun onResume() { + super.onResume() + + // set accessibility focus to the title "How COVIDSafe works" + how_it_works_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + override fun getUploadButtonLayout() = UploadButtonLayout.ContinueLayout(R.string.how_it_works_button) { navigateTo(R.id.action_howItWorksFragment_to_dataPrivacy) } diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt index 26bc4f6..04f8368 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import au.gov.health.covidsafe.R import au.gov.health.covidsafe.ui.PagerChildFragment import au.gov.health.covidsafe.ui.UploadButtonLayout @@ -21,6 +22,13 @@ class IntroductionFragment : PagerChildFragment() { navigateTo(R.id.action_introFragment_to_howItWorksFragment) } + override fun onResume() { + super.onResume() + + // set accessibility focus to the title "Together we can stop ..." + intro_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + override fun updateButtonState() { enableContinueButton() } diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt index 362ce14..a58393a 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt @@ -1,16 +1,14 @@ package au.gov.health.covidsafe.ui.onboarding.fragment.personal -import android.app.Activity import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager +import android.view.accessibility.AccessibilityEvent import android.widget.NumberPicker import androidx.appcompat.app.AlertDialog import androidx.core.os.bundleOf @@ -69,6 +67,8 @@ class PersonalDetailsFragment : PagerChildFragment() { } personal_details_age.text = ageSelected?.second + // set accessibility focus to the title "Enter your details" + personal_details_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) } override fun onPause() { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationcontent/RegistrationContentFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt similarity index 80% rename from app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationcontent/RegistrationContentFragment.kt rename to app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt index 11654d3..4b5bf9a 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationcontent/RegistrationContentFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt @@ -1,16 +1,17 @@ -package au.gov.health.covidsafe.ui.onboarding.fragment.registrationcontent +package au.gov.health.covidsafe.ui.onboarding.fragment.registrationconsent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import au.gov.health.covidsafe.R import au.gov.health.covidsafe.ui.PagerChildFragment import au.gov.health.covidsafe.ui.PagerContainer import au.gov.health.covidsafe.ui.UploadButtonLayout import kotlinx.android.synthetic.main.fragment_registration_consent.* -class RegistrationContentFragment : PagerChildFragment() { +class RegistrationConsentFragment : PagerChildFragment() { override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null @@ -23,6 +24,9 @@ class RegistrationContentFragment : PagerChildFragment() { registration_consent_checkbox.setOnCheckedChangeListener { buttonView, isChecked -> updateButtonState() } + + // set accessibility focus to the title "I consent to the Australian ..." + registration_consent_text.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) } override fun updateButtonState() { @@ -39,6 +43,6 @@ class RegistrationContentFragment : PagerChildFragment() { } override fun getUploadButtonLayout() = UploadButtonLayout.ContinueLayout(R.string.registration_consent_button) { - navigateTo(RegistrationContentFragmentDirections.actionRegistrationConsentFragmentToPersonalDetailsFragment().actionId) + navigateTo(RegistrationConsentFragmentDirections.actionRegistrationConsentFragmentToPersonalDetailsFragment().actionId) } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_question_circle.xml b/app/src/main/res/drawable/ic_question_circle.xml new file mode 100644 index 0000000..8ecb6d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_question_circle.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml index 4996935..e0bbe66 100644 --- a/app/src/main/res/layout/activity_onboarding.xml +++ b/app/src/main/res/layout/activity_onboarding.xml @@ -14,7 +14,8 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:navigationIcon="@drawable/ic_up" /> + app:navigationIcon="@drawable/ic_up" + app:navigationContentDescription="@string/navigation_back_button_content_description"/> @@ -34,6 +35,8 @@ android:layout_marginTop="@dimen/keyline_7" android:layout_marginRight="@dimen/keyline_4" android:background="?attr/selectableItemBackground" + android:contentDescription="@string/title_help" + android:accessibilityTraversalAfter="@id/home_header_setup_complete_header" android:src="@drawable/ic_help_outline_black" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -57,7 +60,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="bottom" - app:constraint_referenced_ids="push_card_view,external_links_bottom_card" /> + app:constraint_referenced_ids="push_card_view, help_topics_card" /> + + + + diff --git a/app/src/main/res/layout/fragment_home_setup_complete_header.xml b/app/src/main/res/layout/fragment_home_setup_complete_header.xml index 5f4ed66..fe3f580 100644 --- a/app/src/main/res/layout/fragment_home_setup_complete_header.xml +++ b/app/src/main/res/layout/fragment_home_setup_complete_header.xml @@ -68,6 +68,7 @@ android:paddingLeft="@dimen/keyline_5" android:paddingRight="@dimen/keyline_5" android:gravity="center_horizontal" + android:accessibilityTraversalBefore="@id/home_header_help" android:text="@string/home_header_active_title" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" diff --git a/app/src/main/res/layout/fragment_how_it_works.xml b/app/src/main/res/layout/fragment_how_it_works.xml index 5b62caa..ec25b5c 100644 --- a/app/src/main/res/layout/fragment_how_it_works.xml +++ b/app/src/main/res/layout/fragment_how_it_works.xml @@ -26,6 +26,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_6" android:text="@string/how_it_works_headline" + android:contentDescription="@string/how_it_works_headline_content_description" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_intro.xml b/app/src/main/res/layout/fragment_intro.xml index 5f0000a..a9c276b 100644 --- a/app/src/main/res/layout/fragment_intro.xml +++ b/app/src/main/res/layout/fragment_intro.xml @@ -26,6 +26,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_6" android:text="@string/intro_headline" + android:contentDescription="@string/intro_headline_content_description" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_personal_details.xml b/app/src/main/res/layout/fragment_personal_details.xml index ddc2d1f..d0271ec 100644 --- a/app/src/main/res/layout/fragment_personal_details.xml +++ b/app/src/main/res/layout/fragment_personal_details.xml @@ -19,6 +19,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_6" android:text="@string/personal_details_headline" + android:contentDescription="@string/personal_details_headline_content_description" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -31,6 +32,7 @@ android:layout_marginTop="@dimen/keyline_4" android:text="@string/personal_details_name_title" android:textAppearance="?textAppearanceBody1" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_headline" /> @@ -41,7 +43,6 @@ android:layout_height="@dimen/text_field_height" android:layout_marginTop="@dimen/keyline_1" android:background="@drawable/edittext_modified_states" - android:hint="@string/personal_details_name_hint" android:inputType="textPersonName" android:maxLines="1" android:paddingStart="@dimen/keyline_1" @@ -51,6 +52,7 @@ android:textColorHighlight="@color/dark_cerulean_3" android:textCursorDrawable="@null" android:textSize="@dimen/text_body_small" + android:contentDescription="@string/personal_details_name_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_name_title" @@ -83,6 +85,7 @@ android:layout_marginTop="@dimen/keyline_4" android:text="@string/personal_details_age_title" android:textAppearance="?textAppearanceBody1" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_name_barrier" /> @@ -94,7 +97,6 @@ android:layout_marginTop="@dimen/keyline_1" android:background="@drawable/edit_text_black_background" android:gravity="center_vertical" - android:hint="@string/personal_details_age_hint" android:paddingStart="@dimen/keyline_1" android:paddingEnd="@dimen/keyline_1" android:textColor="@color/slack_black" @@ -103,6 +105,7 @@ android:textSize="@dimen/text_body_small" android:drawableRight="@drawable/ic_arrow_drop_down" android:drawableTint="@color/black" + android:contentDescription="@string/personal_details_age_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_age_title" @@ -135,6 +138,7 @@ android:layout_marginTop="@dimen/keyline_4" android:text="@string/personal_details_post_code" android:textAppearance="?textAppearanceBody1" + android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_age_barrier" /> @@ -147,7 +151,6 @@ android:background="@drawable/edittext_modified_states" android:digits="0123456789" android:gravity="center_vertical" - android:hint="@string/personal_details_post_code_hint" android:inputType="number" android:maxLength="4" android:paddingStart="@dimen/keyline_1" @@ -157,6 +160,7 @@ android:textCursorDrawable="@null" android:textSize="@dimen/text_body_small" android:imeOptions="actionDone" + android:contentDescription="@string/personal_details_post_code_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_post_code_title" diff --git a/app/src/main/res/layout/fragment_registration_consent.xml b/app/src/main/res/layout/fragment_registration_consent.xml index 2373c20..99363a6 100644 --- a/app/src/main/res/layout/fragment_registration_consent.xml +++ b/app/src/main/res/layout/fragment_registration_consent.xml @@ -63,7 +63,11 @@ android:id="@+id/registration_consent_checkbox" android:layout_width="0dp" android:layout_height="wrap_content" + android:minHeight="@dimen/keyline_8" android:text="@string/registration_consent_checkbox" + android:textSize="18sp" + android:gravity="center_vertical" + android:layout_marginTop="@dimen/keyline_2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/registration_consent_second_paragraph" /> diff --git a/app/src/main/res/layout/fragment_under_sixteen.xml b/app/src/main/res/layout/fragment_under_sixteen.xml index 71e4376..cc737f8 100644 --- a/app/src/main/res/layout/fragment_under_sixteen.xml +++ b/app/src/main/res/layout/fragment_under_sixteen.xml @@ -18,6 +18,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_6" android:text="@string/under_sixteen_headline" + android:contentDescription="@string/under_sixteen_headline_content_description" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -63,7 +64,10 @@ android:id="@+id/under_sixteen_checkbox" android:layout_width="0dp" android:layout_height="wrap_content" + android:minHeight="@dimen/keyline_8" + android:textSize="18sp" android:text="@string/under_sixteen_further_checkbox" + android:layout_marginTop="@dimen/keyline_2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/under_sixteen_second_paragraph" /> diff --git a/app/src/main/res/layout/fragment_upload_page_4.xml b/app/src/main/res/layout/fragment_upload_page_4.xml index 14d4e4f..f9c1ffe 100644 --- a/app/src/main/res/layout/fragment_upload_page_4.xml +++ b/app/src/main/res/layout/fragment_upload_page_4.xml @@ -32,15 +32,14 @@ + android:minHeight="@dimen/keyline_8" + android:text="@string/upload_consent" /> diff --git a/app/src/main/res/layout/view_card_external_link_card.xml b/app/src/main/res/layout/view_card_external_link_card.xml index 24a9fbd..6f330c7 100644 --- a/app/src/main/res/layout/view_card_external_link_card.xml +++ b/app/src/main/res/layout/view_card_external_link_card.xml @@ -8,9 +8,9 @@ @@ -22,21 +22,13 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/keyline_4" android:layout_marginTop="16dp" - app:layout_constraintBottom_toTopOf="@+id/external_link_space" + app:layout_constraintBottom_toTopOf="@+id/external_link_content" app:layout_constraintEnd_toStartOf="@+id/next" app:layout_constraintStart_toEndOf="@+id/external_link_round_image" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" tools:text="@string/home_set_complete_external_link_app_title" /> - - diff --git a/app/src/main/res/navigation/nav_onboarding.xml b/app/src/main/res/navigation/nav_onboarding.xml index efc55bf..d7d6310 100644 --- a/app/src/main/res/navigation/nav_onboarding.xml +++ b/app/src/main/res/navigation/nav_onboarding.xml @@ -51,7 +51,7 @@ #DBDDDD #788586 #0C3155 - #008A23 + #00661B #F6FCF4 #E2E2E2 #C8FFB9 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 971942a..e99a87b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,19 +20,21 @@ COVIDSafe is active Keep COVIDSafe active when you leave home or are in public places. - Make sure COVIDSafe is active - COVIDSafe is currently inactive. Make sure it’s active before you leave home and when in public places. + COVIDSafe is not active + Make sure COVIDSafe is active before you leave home or when in public places. Check app now Together we can stop the spread of COVID-19 + Heading, Together we can stop the spread of COVID-19 COVIDSafe has been developed by the Australian Government to help keep the community safe from the spread of coronavirus.\n\nCOVIDSafe will securely note contact that you have with other users of the app. This will allow state and territory health officials to contact you, if you have been in close contact with someone who has tested positive to the virus.\n\nTogether we can help stop the spread and stay healthy. Please head to aus.gov.au for the latest Coronavirus news I want to help How COVIDSafe works - Bluetooth® signals are used to determine when you\'re near another COVIDSafe user.\n\nEvery instance of close contact between you and other COVIDSafe users is noted to create close contact information. The information is encrypted and only stored in your phone.\n\nIf you test positive to COVID-19 as a COVIDSafe user, a state ot territory health official will contact you. They will assist with voluntary upload of your close contact information to a highly secure information storage system\n\nState or territory health officials can also contact you if you came in close contact with another COVIDSafe user who tested positive.\n\nFor more information please refer to the Help Topics page + Heading, How COVIDSafe works + Bluetooth® signals are used to determine when you\'re near another COVIDSafe user.\n\nEvery instance of close contact between you and other COVIDSafe users is noted to create close contact information. The information is encrypted and only stored in your phone.\n\nIf you test positive to COVID-19 as a COVIDSafe user, a state or territory health official will contact you. They will assist with voluntary upload of your close contact information to a highly secure information storage system\n\nState or territory health officials can also contact you if you came in close contact with another COVIDSafe user who tested positive.\n\nFor more information please refer to the Help Topics page Your consent will always be requested if health tracing is required. Read our Privacy Notice Read our Terms and conditions @@ -40,6 +42,7 @@ Registration and privacy + Heading, Registration and privacy It is important that you read the COVIDSafe privacy policy before you register for COVIDSafe.\n\nIf you are under 16 years of age, your parent/guardian must also read the privacy policy.\n\nUse of COVIDSafe is completely voluntary. You can install or delete the application at any time. If you delete COVIDSafe, you may also ask for your information to be deleted from the secure server.\n\nTo register for COVIDSafe, you will need to enter a name, mobile number, age range and postcode.\n\nInformation you submit when you register, and information about your use of COVIDSafe will be collected and stored on a highly secure server.\n\nCOVIDSafe will not collect your location information.\n\nCOVIDSafe will note the time of contact and an anonymous ID code of other COVIDSafe users you come into contact with.\n\nOther COVIDSafe users you come into contact with will record an anonymous ID code and the time of contact with your device.\n\nIf another user tests positive to COVID-19, they may upload their contact information and a state or territory health official may contact you for tracing purposes.\n\nYour registration details will only be used or disclosed for contact tracing and for the proper and lawful functioning of COVIDSafe.\n\nMore information is available at the Australian Government Department of Health website.\n\nSee the COVIDSafe privacy policy for further details about your rights about your information and how it will be handled and shared. Next @@ -49,16 +52,20 @@ My registration information to allow contact tracing by state and territory health officials. My contact information from other COVIDSafe users after they test positive for COVID-19. I consent. - I agree + Continue Enter your details - Full name + Heading, Enter your details + Full name (First, Last) Firstname Lastname - Age + Enter full name (First, Last) + Age (select) Age range + Select age range Postcode e.g. 2000 + Enter postcode privacy policy Postcode Invalid postcode @@ -67,6 +74,7 @@ Select your age Select + Previous page Continue 8:0–15 @@ -83,6 +91,7 @@ You need the consent of your parent/guardian to proceed + Heading, You need the consent of your parent/guardian to proceed I confirm my parent or guardian consents to the Australian Department of Health collecting: My registration information to allow contact tracing by state and territory health officials. My contact information from other COVIDSafe users after they test positive for COVID-19. @@ -156,6 +165,10 @@ Has a health official contacted you? You can only upload your information if you have tested positive. https://www.health.gov.au/resources/apps-and-tools/coronavirus-australia-app + Help topics + If you have issues or questions about the app. + + Version Number:%s Report an issue diff --git a/app/src/main/res/values/type.xml b/app/src/main/res/values/type.xml index 9ab72eb..66576c6 100755 --- a/app/src/main/res/values/type.xml +++ b/app/src/main/res/values/type.xml @@ -99,6 +99,7 @@ @drawable/default_button_selector @color/default_button_text_color false + bold @dimen/text_button diff --git a/gradle.properties b/gradle.properties index b54d1db..6d1fd87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -43,3 +43,7 @@ PROD_BASE_URL="https://device-api.prod.lp.aws.covidsafe.gov.au" TEST_END_POINT_PREFIX="/uat" STAGING_END_POINT_PREFIX="/uat" PRODUCTION_END_POINT_PREFIX="/prod" + +DEBUG_BACKGROUND_IOS_SERVICE_UUID="AQAgAAAAAAAAAAAAAAAAAAA=" +STAGING_BACKGROUND_IOS_SERVICE_UUID="AQAgAAAAAAAAAAAAAAAAAAA=" +PRODUCTION_BACKGROUND_IOS_SERVICE_UUID="AQEAAAAAAAAAAAAAAAAAAAA=" diff --git a/security.txt b/security.txt new file mode 100644 index 0000000..8056377 --- /dev/null +++ b/security.txt @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Contact: mailto:support@covidsafe.gov.au +Canonical: https://www.covidsafe.gov.au/.well-known/security.txt +Encryption: https://www.covidsafe.gov.au/.well-known/pgp-key.txt +-----BEGIN PGP SIGNATURE----- + +iQFNBAEBCAA3FiEEbUgetBuPAas8w7zHDyQUNNekxBkFAl6xF6AZHHN1cHBvcnRA +Y292aWRzYWZlLmdvdi5hdQAKCRAPJBQ016TEGd+bCACLrYjCbKRsTsQQyZVVtGxj +wYKW2AWclnKZWX/sxnTexg6D1tlGbZbB0OJpw0gJ0NpMoOLFd0kRZXOzv8RocIdx +xd90Nwwl3NQ2ygGCDXR0Y7uRKX/P/Y1xO7XkyiYXAqVq3YWvI9M04pY/TCRvRZ/1 +qBs/WDHv/6eRh2qNy/WGXD66CmTLHBcXilTeihcTZ/27Mny5SPthdfy8odQnhUja +NfFxDm+8gQuFKUUQmr9rd8FEMPSl6BWf/kQtn0YmTeZRzD01uT1ydeHkyPSgn+nq +k9us35AlkI7aZNfNkFVWJ2v5ZVAdTHDh3pgBRZETwVg1of5DEXhc5XJV6mLsu9bM +=tik2 +-----END PGP SIGNATURE-----