COVIDSafe code from version 1.14 (#29)

This commit is contained in:
COVIDSafe Support 2020-11-09 16:47:22 -08:00 committed by GitHub
parent 415682238d
commit 6bf46ded07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 312 additions and 27 deletions

View file

@ -29,8 +29,8 @@ android {
applicationId "au.gov.health.covidsafe" applicationId "au.gov.health.covidsafe"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 78 versionCode 80
versionName "1.13.0" versionName "1.14.0"
buildConfigField "String", "GITHASH", "\"${getGitHash()}\"" buildConfigField "String", "GITHASH", "\"${getGitHash()}\""
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View file

@ -134,7 +134,9 @@ class PeekActivity : AppCompatActivity() {
stop.visibility = View.GONE stop.visibility = View.GONE
delete.visibility = View.GONE delete.visibility = View.GONE
} }
btn_de_active_token.setOnClickListener {
Preference.putEncrypterJWTToken(this, "123456789" )
}
} }
private fun showPushTokenOnDebugBuild() { private fun showPushTokenOnDebugBuild() {

View file

@ -16,14 +16,17 @@ import au.gov.health.covidsafe.ui.utils.Utils
import au.gov.health.covidsafe.utils.NetworkConnectionCheck import au.gov.health.covidsafe.utils.NetworkConnectionCheck
import com.google.android.gms.tasks.OnCompleteListener import com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.iid.FirebaseInstanceId import com.google.firebase.iid.FirebaseInstanceId
import kotlinx.android.synthetic.main.view_home_setup_incomplete.*
private const val TAG = "HomeActivity" private const val TAG = "HomeActivity"
private const val UNAUTHORIZED = "Unauthorized"
class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectionListener { class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectionListener {
var isAppUpdateAvailableLiveData = MutableLiveData<Boolean>() var isAppUpdateAvailableLiveData = MutableLiveData<Boolean>()
var appUpdateAvailableMessageResponseLiveData = MutableLiveData<MessagesResponse>() var appUpdateAvailableMessageResponseLiveData = MutableLiveData<MessagesResponse>()
var isWindowFocusChangeLiveData = MutableLiveData<Boolean>() var isWindowFocusChangeLiveData = MutableLiveData<Boolean>()
var isJWTCorrupted = MutableLiveData<Boolean>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -60,6 +63,13 @@ class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectio
private fun checkAndUpdateHealthStatus() { private fun checkAndUpdateHealthStatus() {
GetMessagesScheduler.scheduleGetMessagesJob { GetMessagesScheduler.scheduleGetMessagesJob {
if (it.errorBodyMessage.equals(UNAUTHORIZED)) {
isJWTCorrupted.postValue(true)
} else{
isJWTCorrupted.postValue(false)
}
val isAppWithLatestVersion = it.messages.isNullOrEmpty() val isAppWithLatestVersion = it.messages.isNullOrEmpty()
isAppUpdateAvailableLiveData.postValue(isAppWithLatestVersion) isAppUpdateAvailableLiveData.postValue(isAppWithLatestVersion)
CentralLog.d(TAG, "isAppWithLatestVersion: $it") CentralLog.d(TAG, "isAppWithLatestVersion: $it")
@ -75,7 +85,7 @@ class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectio
body, body,
"https://play.google.com/store/apps/details?id=au.gov.health.covidsafe") "https://play.google.com/store/apps/details?id=au.gov.health.covidsafe")
) )
)) , it.message, it.forceappupgrade, it.errorBodyMessage))
} }
} }
} }

View file

@ -3,7 +3,10 @@ package au.gov.health.covidsafe.networking.response
import androidx.annotation.Keep import androidx.annotation.Keep
@Keep @Keep
data class MessagesResponse(val messages: List<Message>?) data class MessagesResponse(val messages: List<Message>?, val message: String?, val forceappupgrade: Boolean?, val errorBodyMessage:String?)
@Keep @Keep
data class Message(val title: String, val body: String, val destination: String) data class Message(val title: String, val body: String, val destination: String)
@Keep
data class ErrorMessage(val message: String?)

View file

@ -37,6 +37,7 @@ object Preference {
private const val IS_DEVICE_NAME_CHANGE_PROMPT_DISPLAYED = "IS_DEVICE_NAME_CHANGE_DISPLAYED" private const val IS_DEVICE_NAME_CHANGE_PROMPT_DISPLAYED = "IS_DEVICE_NAME_CHANGE_DISPLAYED"
private const val BUILD_NUMBER_FOR_POP_UP_NOTIFICATION = "BUILD_NUMBER_FOR_POP_UP_NOTIFICATION" private const val BUILD_NUMBER_FOR_POP_UP_NOTIFICATION = "BUILD_NUMBER_FOR_POP_UP_NOTIFICATION"
private const val TURN_CASE_NUMBER = "TURN_CASE_NUMBER" private const val TURN_CASE_NUMBER = "TURN_CASE_NUMBER"
private const val IS_REREGISTER = "IS_REREGISTER"
fun putDeviceID(context: Context, value: String) { fun putDeviceID(context: Context, value: String) {
context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE) context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
@ -126,6 +127,16 @@ object Preference {
.getBoolean(IS_ONBOARDED, false) .getBoolean(IS_ONBOARDED, false)
} }
fun putIsReRegister(context: Context, value: Boolean) {
context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
.edit().putBoolean(IS_REREGISTER, value).apply()
}
fun isReRegister(context: Context): Boolean {
return context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
.getBoolean(IS_REREGISTER, false)
}
fun putHasDeviceNameNotificationDisplayed(context: Context, value: Boolean) { fun putHasDeviceNameNotificationDisplayed(context: Context, value: Boolean) {
context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE) context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
.edit().putBoolean(HAS_DEVICE_NAME_NOTIFICATION_DISPLAYED, value).apply() .edit().putBoolean(HAS_DEVICE_NAME_NOTIFICATION_DISPLAYED, value).apply()

View file

@ -7,7 +7,6 @@ import android.app.job.JobService
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import au.gov.health.covidsafe.BuildConfig import au.gov.health.covidsafe.BuildConfig
import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.app.TracerApp import au.gov.health.covidsafe.app.TracerApp
import au.gov.health.covidsafe.extensions.isBatteryOptimizationDisabled import au.gov.health.covidsafe.extensions.isBatteryOptimizationDisabled
import au.gov.health.covidsafe.extensions.isBlueToothEnabled import au.gov.health.covidsafe.extensions.isBlueToothEnabled
@ -15,10 +14,13 @@ import au.gov.health.covidsafe.extensions.isLocationEnabledOnDevice
import au.gov.health.covidsafe.extensions.isLocationPermissionAllowed import au.gov.health.covidsafe.extensions.isLocationPermissionAllowed
import au.gov.health.covidsafe.factory.NetworkFactory.Companion.awsClient import au.gov.health.covidsafe.factory.NetworkFactory.Companion.awsClient
import au.gov.health.covidsafe.logging.CentralLog import au.gov.health.covidsafe.logging.CentralLog
import au.gov.health.covidsafe.networking.response.ErrorMessage
import au.gov.health.covidsafe.networking.response.MessagesResponse import au.gov.health.covidsafe.networking.response.MessagesResponse
import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.scheduler.GetMessagesScheduler.mostRecentRecordTimestamp import au.gov.health.covidsafe.scheduler.GetMessagesScheduler.mostRecentRecordTimestamp
import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecord import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecord
import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecordDatabase import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecordDatabase
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -175,9 +177,14 @@ object GetMessagesScheduler {
response.body()?.let { response.body()?.let {
CentralLog.d(TAG, "onResponse() MessagesResponse = $it") CentralLog.d(TAG, "onResponse() MessagesResponse = $it")
messagesResponseCallback?.invoke(it) messagesResponseCallback?.invoke(it)
} }
} else if (responseCode == 401) {
response.errorBody()?.let {
val errorMessage: ErrorMessage = Gson().fromJson(it.string(), ErrorMessage::class.java)
val messageResponse = MessagesResponse(emptyList(), null, false, errorMessage.message)
messagesResponseCallback?.invoke(messageResponse)
}
} else { } else {
CentralLog.w(TAG, "onResponse() got error response code = $responseCode.") CentralLog.w(TAG, "onResponse() got error response code = $responseCode.")
} }

View file

@ -50,7 +50,7 @@ fun setDateFormat(textView: TextView, dateString: String?) {
val convertedDateString = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format(cal.time) val convertedDateString = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format(cal.time)
val convertedTimeString = SimpleDateFormat("h a", Locale.getDefault()).format(cal.time) val convertedTimeString = SimpleDateFormat("h a", Locale.getDefault()).format(cal.time)
val finalDisplayDateFormat = "$convertedDateString at $convertedTimeString AEST" val finalDisplayDateFormat = "$convertedDateString at $convertedTimeString"
textView.text = finalDisplayDateFormat textView.text = finalDisplayDateFormat
} }
} }

View file

@ -16,6 +16,7 @@ import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.view.ViewGroup import android.view.ViewGroup
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import androidx.constraintlayout.solver.GoalRow
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
@ -34,6 +35,7 @@ import au.gov.health.covidsafe.notifications.NotificationBuilder
import au.gov.health.covidsafe.preference.Preference import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.talkback.setHeading import au.gov.health.covidsafe.talkback.setHeading
import au.gov.health.covidsafe.ui.base.BaseFragment import au.gov.health.covidsafe.ui.base.BaseFragment
import au.gov.health.covidsafe.ui.onboarding.OnboardingActivity
import au.gov.health.covidsafe.utils.AnimationUtils.slideAnimation import au.gov.health.covidsafe.utils.AnimationUtils.slideAnimation
import au.gov.health.covidsafe.utils.NetworkConnectionCheck import au.gov.health.covidsafe.utils.NetworkConnectionCheck
import au.gov.health.covidsafe.utils.SlideDirection import au.gov.health.covidsafe.utils.SlideDirection
@ -67,6 +69,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private var mIsBroadcastListenerRegistered = false private var mIsBroadcastListenerRegistered = false
private var counter: Int = 0 private var counter: Int = 0
private var jwtExpired: Boolean = false
private var checkIsInternetConnected = false private var checkIsInternetConnected = false
private var isAppWithLatestVersion = false private var isAppWithLatestVersion = false
@ -95,8 +98,8 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
initializeDebugTestActivity() initializeDebugTestActivity()
initializeNoNetworkError() initializeNoNetworkError()
initializeRefreshButton() initializeRefreshButton()
initializePullToRefresh() initializePullToRefresh()
initialiseReRegistration()
NetworkConnectionCheck.addNetworkChangedListener(requireContext(), this) NetworkConnectionCheck.addNetworkChangedListener(requireContext(), this)
} }
@ -119,6 +122,14 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
} }
} }
private fun initialiseReRegistration() {
registration_layout.setOnClickListener {
Preference.putIsOnBoarded(requireContext(), false)
Preference.putIsReRegister(requireContext(), true)
startActivity(Intent(requireContext(), OnboardingActivity::class.java))
}
}
private fun initiateFetchingCaseNumbers() { private fun initiateFetchingCaseNumbers() {
lifecycleScope.launch { lifecycleScope.launch {
homeFragmentViewModel.fetchGetCaseStatistics(lifecycle) homeFragmentViewModel.fetchGetCaseStatistics(lifecycle)
@ -127,6 +138,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun initializeObservers() { private fun initializeObservers() {
(activity as HomeActivity?)?.run { (activity as HomeActivity?)?.run {
isJWTCorrupted.observe(this@HomeFragment, isJwtExpired)
isAppUpdateAvailableLiveData.observe(this@HomeFragment, latestAppAvailable) isAppUpdateAvailableLiveData.observe(this@HomeFragment, latestAppAvailable)
isWindowFocusChangeLiveData.observe(this@HomeFragment, refreshUiObserver) isWindowFocusChangeLiveData.observe(this@HomeFragment, refreshUiObserver)
} }
@ -166,6 +178,10 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
} }
} }
private val isJwtExpired = Observer<Boolean> { expired ->
jwtExpired = expired
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
@ -337,12 +353,12 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
lifecycleScope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
CentralLog.d(TAG, "refreshSetupCompleteOrIncompleteUi") CentralLog.d(TAG, "refreshSetupCompleteOrIncompleteUi")
context?.let { context?.let {
val isAllPermissionsEnabled = it.allPermissionsEnabled() val isAllPermissionsEnabled = it.allPermissionsEnabled() && !jwtExpired
if (!isAllPermissionsEnabled) { if (!isAllPermissionsEnabled) {
NotificationBuilder.clearPossibleIssueNotificationCheck() NotificationBuilder.clearPossibleIssueNotificationCheck()
updateJwtExpiredHeader()
} }
val isDataUploadedInPast14Days = isDataUploadedInPast14Days(it) val isDataUploadedInPast14Days = isDataUploadedInPast14Days(it)
updateSetupCompleteStatus(isAllPermissionsEnabled) updateSetupCompleteStatus(isAllPermissionsEnabled)
updateSetupCompleteHeaderTitle1(it, isAllPermissionsEnabled, isDataUploadedInPast14Days) updateSetupCompleteHeaderTitle1(it, isAllPermissionsEnabled, isDataUploadedInPast14Days)
updateSetupCompleteHeaderTitle2(isAllPermissionsEnabled) updateSetupCompleteHeaderTitle2(isAllPermissionsEnabled)
@ -379,6 +395,16 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
} }
} }
private fun updateJwtExpiredHeader() {
if (jwtExpired) {
permissions_card_subtitle.visibility = GONE
registration_layout.visibility = VISIBLE
} else {
permissions_card_subtitle.visibility = VISIBLE
registration_layout.visibility = GONE
}
}
private fun showLastDataUploadedInfo(context: Context, isDataUploadedInPast14Days: Boolean) { private fun showLastDataUploadedInfo(context: Context, isDataUploadedInPast14Days: Boolean) {
if (isDataUploadedInPast14Days) { if (isDataUploadedInPast14Days) {
data_last_uploaded_layout.visibility = VISIBLE data_last_uploaded_layout.visibility = VISIBLE
@ -430,7 +456,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun updateBlueToothStatus() { private fun updateBlueToothStatus() {
requireContext().isBlueToothEnabled()?.let { requireContext().isBlueToothEnabled()?.let {
if (!it) { if (!it && !jwtExpired) {
bluetooth_card_view_layout.visibility = VISIBLE bluetooth_card_view_layout.visibility = VISIBLE
bluetooth_card_view.render(formatBlueToothTitle(it), it) bluetooth_card_view.render(formatBlueToothTitle(it), it)
} else { } else {
@ -443,7 +469,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun updateBatteryOptimizationStatus() { private fun updateBatteryOptimizationStatus() {
requireContext().isBatteryOptimizationDisabled()?.let { requireContext().isBatteryOptimizationDisabled()?.let {
if (!it) { if (!it && !jwtExpired) {
battery_card_view_layout.visibility = VISIBLE battery_card_view_layout.visibility = VISIBLE
battery_card_view.render( battery_card_view.render(
formatNonBatteryOptimizationTitle(!it), formatNonBatteryOptimizationTitle(!it),
@ -462,7 +488,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
requireContext().isLocationPermissionAllowed()?.let { requireContext().isLocationPermissionAllowed()?.let {
val locationWorking = it && requireContext().isLocationEnabledOnDevice() val locationWorking = it && requireContext().isLocationEnabledOnDevice()
val locationOffPrompts = getString(R.string.home_set_location_why) val locationOffPrompts = getString(R.string.home_set_location_why)
if (!locationWorking) { if (!locationWorking && !jwtExpired) {
location_card_view_layout.visibility = VISIBLE location_card_view_layout.visibility = VISIBLE
location_card_view.render(formatLocationTitle(locationWorking), locationWorking, locationOffPrompts) location_card_view.render(formatLocationTitle(locationWorking), locationWorking, locationOffPrompts)
} else { } else {

View file

@ -1,13 +1,9 @@
package au.gov.health.covidsafe.ui.home package au.gov.health.covidsafe.ui.home
import android.Manifest
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import androidx.lifecycle.* import androidx.lifecycle.*
import au.gov.health.covidsafe.BuildConfig import au.gov.health.covidsafe.BuildConfig
import au.gov.health.covidsafe.R
import au.gov.health.covidsafe.extensions.LOCATION
import au.gov.health.covidsafe.extensions.askForLocationPermission
import au.gov.health.covidsafe.factory.RetrofitServiceGenerator import au.gov.health.covidsafe.factory.RetrofitServiceGenerator
import au.gov.health.covidsafe.interactor.usecase.GetCaseStatisticsUseCase import au.gov.health.covidsafe.interactor.usecase.GetCaseStatisticsUseCase
import au.gov.health.covidsafe.logging.CentralLog import au.gov.health.covidsafe.logging.CentralLog
@ -18,8 +14,6 @@ import au.gov.health.covidsafe.preference.Preference
import com.google.gson.Gson import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import pub.devrel.easypermissions.EasyPermissions
import pub.devrel.easypermissions.PermissionRequest
private const val TAG = "HomeFragmentViewModel" private const val TAG = "HomeFragmentViewModel"

View file

@ -8,6 +8,7 @@ import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.navigation.fragment.NavHostFragment
import au.gov.health.covidsafe.ui.base.HasBlockingState import au.gov.health.covidsafe.ui.base.HasBlockingState
import au.gov.health.covidsafe.preference.Preference import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.R import au.gov.health.covidsafe.R
@ -33,6 +34,16 @@ class OnboardingActivity : FragmentActivity(), HasBlockingState, PagerContainer
if (isUiBlocked) { if (isUiBlocked) {
loadingProgressBarFrame?.isVisible = true loadingProgressBarFrame?.isVisible = true
} }
val myNavHostFragment: NavHostFragment = fragment_nav_host as NavHostFragment
val inflater = myNavHostFragment.navController.navInflater
if (Preference.isReRegister(this)) {
val graph = inflater.inflate(R.navigation.nav_re_register)
myNavHostFragment.navController.graph = graph
} else {
val graph = inflater.inflate(R.navigation.nav_onboarding)
myNavHostFragment.navController.graph = graph
}
} }
override fun onAttachFragment(fragment: Fragment) { override fun onAttachFragment(fragment: Fragment) {

View file

@ -10,6 +10,7 @@ import android.view.accessibility.AccessibilityEvent
import au.gov.health.covidsafe.HomeActivity import au.gov.health.covidsafe.HomeActivity
import au.gov.health.covidsafe.R import au.gov.health.covidsafe.R
import au.gov.health.covidsafe.links.LinkBuilder import au.gov.health.covidsafe.links.LinkBuilder
import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.talkback.setHeading import au.gov.health.covidsafe.talkback.setHeading
import au.gov.health.covidsafe.ui.base.PagerChildFragment import au.gov.health.covidsafe.ui.base.PagerChildFragment
import au.gov.health.covidsafe.ui.base.UploadButtonLayout import au.gov.health.covidsafe.ui.base.UploadButtonLayout
@ -28,6 +29,12 @@ class PermissionSuccessFragment : PagerChildFragment() {
permission_success_headline.setHeading() permission_success_headline.setHeading()
permission_success_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) permission_success_headline.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
if (Preference.isReRegister(requireContext())) {
permission_success_headline.text = requireContext().getString(R.string.jwt_success)
} else {
permission_success_headline.text = requireContext().getString(R.string.permission_success_headline)
}
permission_success_content.text = LinkBuilder.getHowPermissionSuccessContent(requireContext()) permission_success_content.text = LinkBuilder.getHowPermissionSuccessContent(requireContext())
permission_success_content.movementMethod = LinkMovementMethod.getInstance() permission_success_content.movementMethod = LinkMovementMethod.getInstance()

View file

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="8dp"
android:height="14dp"
android:viewportWidth="8"
android:viewportHeight="14">
<path
android:pathData="M1,13L7,7L1,1"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#A31919"
android:strokeLineCap="round"/>
</vector>

View file

@ -37,8 +37,7 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_weight="1" android:layout_weight="1"
app:defaultNavHost="true" app:defaultNavHost="true"/>
app:navGraph="@navigation/nav_onboarding" />
<FrameLayout <FrameLayout
android:id="@+id/loadingProgressBarFrame" android:id="@+id/loadingProgressBarFrame"

View file

@ -23,9 +23,17 @@
<Space <Space
android:id="@+id/push_token_space" android:id="@+id/push_token_space"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/space_24" android:layout_height="@dimen/space_4"
app:layout_constraintTop_toBottomOf="@+id/home_push_notification_token" /> app:layout_constraintTop_toBottomOf="@+id/home_push_notification_token" />
<Button
android:id="@+id/btn_de_active_token"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="De-Active Token"
android:layout_margin="16dp"
app:layout_constraintTop_toBottomOf="@+id/push_token_space"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview" android:id="@+id/recyclerview"
android:layout_width="0dp" android:layout_width="0dp"
@ -35,7 +43,7 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/push_token_space" app:layout_constraintTop_toBottomOf="@+id/btn_de_active_token"
tools:listitem="@layout/recycler_view_item" /> tools:listitem="@layout/recycler_view_item" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home_setup_incomplete_permissions_layout" android:id="@+id/home_setup_incomplete_permissions_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -40,7 +41,7 @@
style="@style/fontRobotoRegular16" style="@style/fontRobotoRegular16"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/space_16" android:padding="@dimen/space_16"
android:text="@string/home_app_permission_status_subtitle" android:text="@string/home_app_permission_status_subtitle"
android:textColor="@color/slate_black_1" /> android:textColor="@color/slate_black_1" />
@ -98,4 +99,58 @@
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/jwt_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/registration_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:selectableItemBackground"
android:padding="@dimen/space_16"
android:visibility="gone">
<ImageView
android:id="@+id/ic_register_again"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_vector"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/re_register"
style="@style/fontRobotoRegular20"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="start"
android:maxLines="2"
android:textColor="@color/error_red"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/permission_icon"
app:layout_constraintTop_toTopOf="parent"
android:text="@string/jwt_heading"
tools:text="Please register again" />
<TextView
android:id="@+id/register_body"
style="@style/fontRobotoRegular16"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="start"
android:paddingTop="@dimen/space_8"
android:textColor="@color/error_red"
app:layout_constraintTop_toBottomOf="@id/re_register"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/ic_register_again"
tools:visibility="visible"
android:text="@string/jwt_description"
tools:text="There is an issue with your registration details." />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
</LinearLayout> </LinearLayout>

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_onboarding"
app:startDestination="@id/personalDetailsFragment">
<include app:graph="@navigation/nav_register" />
<fragment
android:id="@+id/introFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.introduction.IntroductionFragment"
android:label="IntroductionFragment"
tools:layout="@layout/fragment_intro">
<action
android:id="@+id/action_introFragment_to_howItWorksFragment"
app:destination="@id/howItWorksFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/howItWorksFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.howitworks.HowItWorksFragment"
android:label="HowItWorksFragment"
tools:layout="@layout/fragment_how_it_works">
<action
android:id="@+id/action_howItWorksFragment_to_dataPrivacy"
app:destination="@id/dataPrivacyFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/dataPrivacyFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.dataprivacy.DataPrivacyFragment"
android:label="DataPrivacyFragment"
tools:layout="@layout/fragment_data_privacy">
<action
android:id="@+id/action_dataPrivacy_to_registrationConsentFragment"
app:destination="@id/resistrationConsentFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/resistrationConsentFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.registrationconsent.RegistrationConsentFragment"
android:label="RegistrationContentFragment"
tools:layout="@layout/fragment_registration_consent">
<action
android:id="@+id/action_registrationConsentFragment_to_personalDetailsFragment"
app:destination="@id/personalDetailsFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/personalDetailsFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.personal.PersonalDetailsFragment"
android:label="PersonalDetailsFragment"
tools:layout="@layout/fragment_personal_details">
<action
android:id="@+id/action_personalDetails_to_enterNumberFragment"
app:destination="@id/nav_register"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
<action
android:id="@+id/action_personalDetails_to_underSixteenFragment"
app:destination="@id/underSixteenFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/underSixteenFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.undersixteen.UnderSixteenFragment"
android:label="UnderSixteenFragment"
tools:layout="@layout/fragment_under_sixteen" >
<action
android:id="@+id/action_underSixteenFragment_to_enterNumberFragment"
app:destination="@id/nav_register"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/permissionFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.permission.PermissionFragment"
android:label="PermissionFragment"
tools:layout="@layout/fragment_permission">
<action
android:id="@+id/action_permissionFragment_to_permissionDeviceNameFragment"
app:destination="@id/permissionDeviceNameFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/permissionDeviceNameFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.permission.PermissionDeviceNameFragment"
android:label="PermissionDeviceNameFragment"
tools:layout="@layout/fragment_permission_device_name">
<action
android:id="@+id/action_permissionDeviceNameFragment_to_permissionSuccessFragment"
app:destination="@id/permissionSuccessFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/permissionSuccessFragment"
android:name="au.gov.health.covidsafe.ui.onboarding.fragment.permissionsuccess.PermissionSuccessFragment"
android:label="PermissionSuccessFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
tools:layout="@layout/fragment_permission_success" />
</navigation>

View file

@ -253,7 +253,7 @@
<string name="enter_number_button">Nhận mã PIN</string> <string name="enter_number_button">Nhận mã PIN</string>
<string name="enter_number_content">Chúng tôi sẽ gửi cho bạn mã PIN gồm 6 chữ số để xác minh số điện thoại của bạn.</string> <string name="enter_number_content">Chúng tôi sẽ gửi cho bạn mã PIN gồm 6 chữ số để xác minh số điện thoại của bạn.</string>
<string name="enter_number_for_example">Ví dụ:</string> <string name="enter_number_for_example">Ví dụ:</string>
<string name="enter_number_headline">Nhập sô điện thoại di động của bạn</string> <string name="enter_number_headline">Nhập s điện thoại di động của bạn</string>
<string name="enter_number_prefix">+61</string> <string name="enter_number_prefix">+61</string>
<string name="enter_number_relative">Đăng ký dùm bạn bè hoặc người thân? \n\nHọ cần phải đăng ký bằng máy điện thoại và số điện thoại của riêng họ để COVIDSafe có thể hoạt động cho họ.</string> <string name="enter_number_relative">Đăng ký dùm bạn bè hoặc người thân? \n\nHọ cần phải đăng ký bằng máy điện thoại và số điện thoại của riêng họ để COVIDSafe có thể hoạt động cho họ.</string>
<string name="enter_pin_button">Xác minh</string> <string name="enter_pin_button">Xác minh</string>

View file

@ -347,6 +347,7 @@
<string name="IssueFooter">We may contact you for further details about your feedback. Your email address wont be used for any other purpose.</string> <string name="IssueFooter">We may contact you for further details about your feedback. Your email address wont be used for any other purpose.</string>
<string name="jwt_description">There is an issue with your registration details.</string> <string name="jwt_description">There is an issue with your registration details.</string>
<string name="jwt_heading">Please register again</string> <string name="jwt_heading">Please register again</string>
<string name="jwt_success">Registration successfully renewed</string>
<string name="loading_numbers">Loading latest numbers</string> <string name="loading_numbers">Loading latest numbers</string>
<!-- Splash Screen --> <!-- Splash Screen -->
<string name="migration_in_progress"> COVIDSafe update in progress. \n\n Please make sure you phone is not switched off until the update is complete.</string> <string name="migration_in_progress"> COVIDSafe update in progress. \n\n Please make sure you phone is not switched off until the update is complete.</string>