mirror of
https://github.com/AU-COVIDSafe/mobile-android.git
synced 2025-01-18 16:56:34 +00:00
COVIDSafe code from version 1.14 (#29)
This commit is contained in:
parent
415682238d
commit
6bf46ded07
18 changed files with 312 additions and 27 deletions
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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?)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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.")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
13
app/src/main/res/drawable/ic_vector.xml
Normal file
13
app/src/main/res/drawable/ic_vector.xml
Normal 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>
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
138
app/src/main/res/navigation/nav_re_register.xml
Normal file
138
app/src/main/res/navigation/nav_re_register.xml
Normal 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>
|
|
@ -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>
|
||||||
|
|
|
@ -347,6 +347,7 @@
|
||||||
<string name="IssueFooter">We may contact you for further details about your feedback. Your email address won’t be used for any other purpose.</string>
|
<string name="IssueFooter">We may contact you for further details about your feedback. Your email address won’t 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>
|
||||||
|
|
Loading…
Reference in a new issue