Skip to content

Commit

Permalink
COVIDSafe code from version 1.0.17 (#1)
Browse files Browse the repository at this point in the history
  • Loading branch information
covidsafe-support committed May 15, 2020
1 parent b827cf3 commit 696e4ed
Show file tree
Hide file tree
Showing 31 changed files with 205 additions and 68 deletions.
2 changes: 2 additions & 0 deletions 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:

Expand Down
9 changes: 7 additions & 2 deletions app/build.gradle
Expand Up @@ -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"

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Expand Up @@ -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")
Expand Down
39 changes: 29 additions & 10 deletions app/src/main/java/au/gov/health/covidsafe/bluetooth/BLEScanner.kt
Expand Up @@ -7,21 +7,31 @@ 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
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"

Expand All @@ -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<ScanFilter> = 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
Expand All @@ -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}"
)
}
}
Expand Down
Expand Up @@ -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)
}
Expand Down
Expand Up @@ -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)
Expand Down
Expand Up @@ -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()
Expand All @@ -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)
Expand Down
Expand Up @@ -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
Expand All @@ -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)
}
Expand Down
Expand Up @@ -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
Expand All @@ -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)
}
Expand Down
Expand Up @@ -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
Expand All @@ -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()
}
Expand Down
@@ -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
Expand Down Expand Up @@ -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() {
Expand Down
@@ -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
Expand All @@ -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() {
Expand All @@ -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)
}
}
18 changes: 18 additions & 0 deletions app/src/main/res/drawable/ic_question_circle.xml
@@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M19.9998,5C11.7156,5 4.9998,11.7157 4.9998,20C4.9998,28.2842 11.7156,35 19.9998,35C28.2841,35 34.9998,28.2842 34.9998,20C34.9998,11.7157 28.2841,5 19.9998,5ZM1.6665,20C1.6665,9.8747 9.8746,1.6666 19.9998,1.6666C30.1251,1.6666 38.3332,9.8747 38.3332,20C38.3332,30.1252 30.1251,38.3333 19.9998,38.3333C9.8746,38.3333 1.6665,30.1252 1.6665,20Z"
android:fillColor="#131313"
android:fillType="evenOdd"/>
<path
android:pathData="M20.4302,13.3739C19.6544,13.2408 18.8564,13.3866 18.1778,13.7855C17.4991,14.1843 16.9835,14.8105 16.7223,15.5531C16.4168,16.4214 15.4653,16.8777 14.597,16.5722C13.7286,16.2668 13.2724,15.3153 13.5778,14.4469C14.1003,12.9618 15.1315,11.7094 16.4888,10.9117C17.8462,10.114 19.442,9.8224 20.9938,10.0885C22.5455,10.3547 23.953,11.1614 24.9669,12.3659C25.9806,13.5701 26.5355,15.0941 26.5334,16.6682C26.5326,19.2188 24.6416,20.9032 23.2912,21.8034C22.5651,22.2875 21.851,22.6434 21.3248,22.8772C21.0594,22.9952 20.8359,23.0847 20.6749,23.146C20.5942,23.1768 20.5288,23.2006 20.4812,23.2175L20.4233,23.2378L20.4049,23.2441L20.3984,23.2463L20.3958,23.2471C20.3953,23.2473 20.3937,23.2478 19.8667,21.6667L20.3937,23.2478C19.5205,23.5389 18.5766,23.067 18.2856,22.1937C17.9947,21.3211 18.4658,20.3779 19.3379,20.0861L19.3358,20.0868C19.3359,20.0868 19.3361,20.0868 19.3379,20.0861L19.3645,20.0768C19.3901,20.0677 19.4322,20.0524 19.4882,20.0311C19.6006,19.9883 19.7677,19.9215 19.971,19.8312C20.3824,19.6483 20.9182,19.3792 21.4422,19.0299C22.5915,18.2637 23.2,17.4486 23.2,16.6667L23.2,16.6642C23.2012,15.877 22.9237,15.1148 22.4168,14.5126C21.9098,13.9103 21.2061,13.507 20.4302,13.3739Z"
android:fillColor="#131313"
android:fillType="evenOdd"/>
<path
android:pathData="M18.3335,28.3333C18.3335,27.4128 19.0797,26.6666 20.0002,26.6666H20.0168C20.9373,26.6666 21.6835,27.4128 21.6835,28.3333C21.6835,29.2538 20.9373,30 20.0168,30H20.0002C19.0797,30 18.3335,29.2538 18.3335,28.3333Z"
android:fillColor="#131313"
android:fillType="evenOdd"/>
</vector>
3 changes: 2 additions & 1 deletion app/src/main/res/layout/activity_onboarding.xml
Expand Up @@ -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"/>

<fragment
android:id="@+id/fragment_nav_host"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/fragment_data_privacy.xml
Expand Up @@ -27,6 +27,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/keyline_6"
android:text="@string/data_privacy_headline"
android:contentDescription="@string/data_privacy_headline_content_description"
android:textAppearance="?textAppearanceHeadline2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/res/layout/fragment_home.xml
Expand Up @@ -17,6 +17,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/lighter_green"
android:importantForAccessibility="no"
app:layout_constraintBottom_toBottomOf="@+id/header_background_overlap"
app:layout_constraintTop_toTopOf="parent" />

Expand All @@ -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" />
Expand All @@ -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" />

<TextView
android:id="@+id/home_version_number"
Expand Down

0 comments on commit 696e4ed

Please sign in to comment.