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"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 78
versionName "1.13.0"
versionCode 80
versionName "1.14.0"
buildConfigField "String", "GITHASH", "\"${getGitHash()}\""
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View file

@ -134,7 +134,9 @@ class PeekActivity : AppCompatActivity() {
stop.visibility = View.GONE
delete.visibility = View.GONE
}
btn_de_active_token.setOnClickListener {
Preference.putEncrypterJWTToken(this, "123456789" )
}
}
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 com.google.android.gms.tasks.OnCompleteListener
import com.google.firebase.iid.FirebaseInstanceId
import kotlinx.android.synthetic.main.view_home_setup_incomplete.*
private const val TAG = "HomeActivity"
private const val UNAUTHORIZED = "Unauthorized"
class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectionListener {
var isAppUpdateAvailableLiveData = MutableLiveData<Boolean>()
var appUpdateAvailableMessageResponseLiveData = MutableLiveData<MessagesResponse>()
var isWindowFocusChangeLiveData = MutableLiveData<Boolean>()
var isJWTCorrupted = MutableLiveData<Boolean>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -60,6 +63,13 @@ class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectio
private fun checkAndUpdateHealthStatus() {
GetMessagesScheduler.scheduleGetMessagesJob {
if (it.errorBodyMessage.equals(UNAUTHORIZED)) {
isJWTCorrupted.postValue(true)
} else{
isJWTCorrupted.postValue(false)
}
val isAppWithLatestVersion = it.messages.isNullOrEmpty()
isAppUpdateAvailableLiveData.postValue(isAppWithLatestVersion)
CentralLog.d(TAG, "isAppWithLatestVersion: $it")
@ -75,7 +85,7 @@ class HomeActivity : FragmentActivity(), NetworkConnectionCheck.NetworkConnectio
body,
"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
@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
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 BUILD_NUMBER_FOR_POP_UP_NOTIFICATION = "BUILD_NUMBER_FOR_POP_UP_NOTIFICATION"
private const val TURN_CASE_NUMBER = "TURN_CASE_NUMBER"
private const val IS_REREGISTER = "IS_REREGISTER"
fun putDeviceID(context: Context, value: String) {
context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
@ -126,6 +127,16 @@ object Preference {
.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) {
context.getSharedPreferences(PREF_ID, Context.MODE_PRIVATE)
.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.Context
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.extensions.isBatteryOptimizationDisabled
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.factory.NetworkFactory.Companion.awsClient
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.preference.Preference
import au.gov.health.covidsafe.scheduler.GetMessagesScheduler.mostRecentRecordTimestamp
import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecord
import au.gov.health.covidsafe.streetpass.persistence.StreetPassRecordDatabase
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
@ -175,9 +177,14 @@ object GetMessagesScheduler {
response.body()?.let {
CentralLog.d(TAG, "onResponse() MessagesResponse = $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 {
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 convertedTimeString = SimpleDateFormat("h a", Locale.getDefault()).format(cal.time)
val finalDisplayDateFormat = "$convertedDateString at $convertedTimeString AEST"
val finalDisplayDateFormat = "$convertedDateString at $convertedTimeString"
textView.text = finalDisplayDateFormat
}
}

View file

@ -16,6 +16,7 @@ import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.view.accessibility.AccessibilityEvent
import androidx.constraintlayout.solver.GoalRow
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
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.talkback.setHeading
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.NetworkConnectionCheck
import au.gov.health.covidsafe.utils.SlideDirection
@ -67,6 +69,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private var mIsBroadcastListenerRegistered = false
private var counter: Int = 0
private var jwtExpired: Boolean = false
private var checkIsInternetConnected = false
private var isAppWithLatestVersion = false
@ -95,8 +98,8 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
initializeDebugTestActivity()
initializeNoNetworkError()
initializeRefreshButton()
initializePullToRefresh()
initialiseReRegistration()
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() {
lifecycleScope.launch {
homeFragmentViewModel.fetchGetCaseStatistics(lifecycle)
@ -127,6 +138,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun initializeObservers() {
(activity as HomeActivity?)?.run {
isJWTCorrupted.observe(this@HomeFragment, isJwtExpired)
isAppUpdateAvailableLiveData.observe(this@HomeFragment, latestAppAvailable)
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() {
super.onResume()
@ -337,12 +353,12 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
lifecycleScope.launch(Dispatchers.Main) {
CentralLog.d(TAG, "refreshSetupCompleteOrIncompleteUi")
context?.let {
val isAllPermissionsEnabled = it.allPermissionsEnabled()
val isAllPermissionsEnabled = it.allPermissionsEnabled() && !jwtExpired
if (!isAllPermissionsEnabled) {
NotificationBuilder.clearPossibleIssueNotificationCheck()
updateJwtExpiredHeader()
}
val isDataUploadedInPast14Days = isDataUploadedInPast14Days(it)
updateSetupCompleteStatus(isAllPermissionsEnabled)
updateSetupCompleteHeaderTitle1(it, isAllPermissionsEnabled, isDataUploadedInPast14Days)
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) {
if (isDataUploadedInPast14Days) {
data_last_uploaded_layout.visibility = VISIBLE
@ -430,7 +456,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun updateBlueToothStatus() {
requireContext().isBlueToothEnabled()?.let {
if (!it) {
if (!it && !jwtExpired) {
bluetooth_card_view_layout.visibility = VISIBLE
bluetooth_card_view.render(formatBlueToothTitle(it), it)
} else {
@ -443,7 +469,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
private fun updateBatteryOptimizationStatus() {
requireContext().isBatteryOptimizationDisabled()?.let {
if (!it) {
if (!it && !jwtExpired) {
battery_card_view_layout.visibility = VISIBLE
battery_card_view.render(
formatNonBatteryOptimizationTitle(!it),
@ -462,7 +488,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks, Networ
requireContext().isLocationPermissionAllowed()?.let {
val locationWorking = it && requireContext().isLocationEnabledOnDevice()
val locationOffPrompts = getString(R.string.home_set_location_why)
if (!locationWorking) {
if (!locationWorking && !jwtExpired) {
location_card_view_layout.visibility = VISIBLE
location_card_view.render(formatLocationTitle(locationWorking), locationWorking, locationOffPrompts)
} else {

View file

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

View file

@ -8,6 +8,7 @@ import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.navigation.fragment.NavHostFragment
import au.gov.health.covidsafe.ui.base.HasBlockingState
import au.gov.health.covidsafe.preference.Preference
import au.gov.health.covidsafe.R
@ -33,6 +34,16 @@ class OnboardingActivity : FragmentActivity(), HasBlockingState, PagerContainer
if (isUiBlocked) {
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) {

View file

@ -10,6 +10,7 @@ import android.view.accessibility.AccessibilityEvent
import au.gov.health.covidsafe.HomeActivity
import au.gov.health.covidsafe.R
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.ui.base.PagerChildFragment
import au.gov.health.covidsafe.ui.base.UploadButtonLayout
@ -28,6 +29,12 @@ class PermissionSuccessFragment : PagerChildFragment() {
permission_success_headline.setHeading()
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.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_width="match_parent"
android:layout_weight="1"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_onboarding" />
app:defaultNavHost="true"/>
<FrameLayout
android:id="@+id/loadingProgressBarFrame"

View file

@ -23,9 +23,17 @@
<Space
android:id="@+id/push_token_space"
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" />
<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
android:id="@+id/recyclerview"
android:layout_width="0dp"
@ -35,7 +43,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="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" />
<com.google.android.material.floatingactionbutton.FloatingActionButton

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/home_setup_incomplete_permissions_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -40,7 +41,7 @@
style="@style/fontRobotoRegular16"
android:layout_width="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:textColor="@color/slate_black_1" />
@ -98,4 +99,58 @@
</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>

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_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_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_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>

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="jwt_description">There is an issue with your registration details.</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>
<!-- 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>