diff --git a/app/build.gradle b/app/build.gradle index 8d3d148..f7fe002 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,8 +40,8 @@ android { Before you increase the targetSdkVersion make sure that all its usage are still working */ targetSdkVersion 28 - versionCode 28 - versionName "1.0.28" + versionCode 33 + versionName "1.0.33" buildConfigField "String", "GITHASH", "\"${getGitHash()}\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 61be7a7..4da99dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,14 +20,14 @@ + android:theme="@style/MyTheme.DayNight" + tools:replace="android:supportsRtl"> + + context.getSystemService(Context.ACCESSIBILITY_SERVICE) + .let { it as AccessibilityManager } + .let { accessibilityManager -> + if (accessibilityManager.isEnabled) { + AccessibilityEvent + .obtain() + .apply { + eventType = AccessibilityEvent.TYPE_ANNOUNCEMENT + className = context.javaClass.name + packageName = context.packageName + text.add(announcement) + } + .let { + accessibilityManager.sendAccessibilityEvent(it) + } + } + } + } + } catch (e: Exception) { + CentralLog.e(TAG, "announceForAccessibility throws exception.", e) + } + } } diff --git a/app/src/main/java/au/gov/health/covidsafe/extensions/PermissionExtensions.kt b/app/src/main/java/au/gov/health/covidsafe/extensions/PermissionExtensions.kt index de8f6c0..841b489 100644 --- a/app/src/main/java/au/gov/health/covidsafe/extensions/PermissionExtensions.kt +++ b/app/src/main/java/au/gov/health/covidsafe/extensions/PermissionExtensions.kt @@ -119,7 +119,7 @@ fun Fragment.isFineLocationEnabled(): Boolean? { } } -fun Fragment.isNonBatteryOptimizationAllowed(): Boolean? { +fun Fragment.isBatteryOptimizationDisabled(): Boolean? { return activity?.let { activity -> val powerManager = activity.getSystemService(AppCompatActivity.POWER_SERVICE) as PowerManager? val packageName = activity.packageName diff --git a/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt b/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt index e4a4a14..4003c50 100644 --- a/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt +++ b/app/src/main/java/au/gov/health/covidsafe/notifications/NotificationTemplates.kt @@ -4,6 +4,7 @@ import android.app.Notification import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.widget.RemoteViews import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import au.gov.health.covidsafe.HomeActivity @@ -25,7 +26,13 @@ class NotificationTemplates { intent, 0 ) + val zeroHeightView = RemoteViews(context.packageName, R.layout.zero_height_view) + val builder = NotificationCompat.Builder(context, channel) + .setContentTitle(context.getText(R.string.service_ok_title)) + .setContentText(context.getText(R.string.service_ok_body)) + .setTicker(context.getText(R.string.service_ok_body)) + .setStyle(NotificationCompat.BigTextStyle().bigText(context.getText(R.string.service_ok_body))) .setOngoing(true) .setPriority(NotificationCompat.PRIORITY_LOW) .setSmallIcon(R.drawable.ic_notification_icon) @@ -34,6 +41,7 @@ class NotificationTemplates { .setSound(null) .setVibrate(null) .setColor(ContextCompat.getColor(context, R.color.notification_tint)) + .setCustomContentView(zeroHeightView) return builder.build() } diff --git a/app/src/main/java/au/gov/health/covidsafe/services/BluetoothMonitoringService.kt b/app/src/main/java/au/gov/health/covidsafe/services/BluetoothMonitoringService.kt index f734465..97868dd 100644 --- a/app/src/main/java/au/gov/health/covidsafe/services/BluetoothMonitoringService.kt +++ b/app/src/main/java/au/gov/health/covidsafe/services/BluetoothMonitoringService.kt @@ -9,6 +9,7 @@ import android.os.Build import android.os.IBinder import android.os.PowerManager import androidx.annotation.Keep +import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.LifecycleService import androidx.localbroadcastmanager.content.LocalBroadcastManager import au.gov.health.covidsafe.* @@ -45,6 +46,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import pub.devrel.easypermissions.EasyPermissions +import java.lang.Exception import java.lang.ref.WeakReference import kotlin.coroutines.CoroutineContext @@ -182,6 +184,22 @@ class BluetoothMonitoringService : LifecycleService(), CoroutineScope { return btOn } + private fun isBatteryOptimizationDisabled(): Boolean { + return try { + val powerManager = TracerApp.AppContext.getSystemService(AppCompatActivity.POWER_SERVICE) as PowerManager? + val packageName = TracerApp.AppContext.packageName + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + powerManager?.isIgnoringBatteryOptimizations(packageName) ?: true + } else { + true + } + } catch (e: Exception) { + CentralLog.e(TAG, "isBatteryOptimizationDisabled() throws exception", e) + true + } + } + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) CentralLog.i(TAG, "Service onStartCommand") @@ -192,7 +210,7 @@ class BluetoothMonitoringService : LifecycleService(), CoroutineScope { } //check for permissions - if (!hasLocationPermissions() || !isBluetoothEnabled()) { + if (!hasLocationPermissions() || !isBluetoothEnabled() || !isBatteryOptimizationDisabled()) { CentralLog.i( TAG, "location permission: ${hasLocationPermissions()} bluetooth: ${isBluetoothEnabled()}" @@ -430,7 +448,7 @@ class BluetoothMonitoringService : LifecycleService(), CoroutineScope { CentralLog.i(TAG, "Performing self diagnosis") - if (!hasLocationPermissions() || !isBluetoothEnabled()) { + if (!hasLocationPermissions() || !isBluetoothEnabled() || !isBatteryOptimizationDisabled()) { CentralLog.i(TAG, "no location permission") val notif = NotificationTemplates.lackingThingsNotification(this.applicationContext, CHANNEL_ID) @@ -580,19 +598,19 @@ class BluetoothMonitoringService : LifecycleService(), CoroutineScope { val remoteBlob: String = if (connRecord.version == VERSION_ONE) { with(receiver = connRecord) { - val plainRecordByteArray = gson.toJson(StreetPassRecordDatabase.Companion.EncryptedRecord( - peripheral.modelP, central.modelC, rssi, txPower, msg = msg)) - .toByteArray(Charsets.UTF_8) - Encryption.encryptPayload(plainRecordByteArray) + val plainRecordByteArray = gson.toJson(StreetPassRecordDatabase.Companion.EncryptedRecord( + peripheral.modelP, central.modelC, rssi, txPower, msg = msg)) + .toByteArray(Charsets.UTF_8) + Encryption.encryptPayload(plainRecordByteArray) } } else { //For version after version 1, the message is already encrypted in msg and we can store it as remote BLOB connRecord.msg } - val localBlob : String = if (connRecord.version == VERSION_ONE) { + val localBlob: String = if (connRecord.version == VERSION_ONE) { ENCRYPTED_EMPTY_DICT } else { - with (receiver = connRecord) { + with(receiver = connRecord) { val modelP = if (DUMMY_DEVICE == peripheral.modelP) null else peripheral.modelP val modelC = if (DUMMY_DEVICE == central.modelC) null else central.modelC val rssi = if (rssi == DUMMY_RSSI) null else rssi diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/PagerChildFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/PagerChildFragment.kt index b055a60..0361612 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/PagerChildFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/PagerChildFragment.kt @@ -1,5 +1,6 @@ package au.gov.health.covidsafe.ui +import android.view.View import androidx.annotation.StringRes abstract class PagerChildFragment : BaseFragment() { @@ -17,8 +18,14 @@ abstract class PagerChildFragment : BaseFragment() { } private fun updateToolBar() { - (parentFragment?.parentFragment as? PagerContainer)?.setNavigationIcon(navigationIcon) - (activity as? PagerContainer)?.setNavigationIcon(navigationIcon) + if (navigationIconResId == au.gov.health.covidsafe.R.drawable.ic_up) { + if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL){ + navigationIconResId = au.gov.health.covidsafe.R.drawable.ic_up_rtl + } + } + + (parentFragment?.parentFragment as? PagerContainer)?.setNavigationIcon(navigationIconResId) + (activity as? PagerContainer)?.setNavigationIcon(navigationIconResId) } private fun updateButton() { @@ -50,7 +57,8 @@ abstract class PagerChildFragment : BaseFragment() { (activity as? PagerContainer)?.hideLoading((getUploadButtonLayout() as? UploadButtonLayout.ContinueLayout)?.buttonText) } - abstract val navigationIcon: Int? + protected open var navigationIconResId: Int? = au.gov.health.covidsafe.R.drawable.ic_up + abstract var stepProgress: Int? abstract fun getUploadButtonLayout(): UploadButtonLayout abstract fun updateButtonState() @@ -64,7 +72,7 @@ sealed class UploadButtonLayout { val primaryButtonListener: (() -> Unit)?, @StringRes val secondaryButtonText: Int, val secondaryButtonListener: (() -> Unit)? - ) : UploadButtonLayout() + ) : UploadButtonLayout() class QuestionLayout(val buttonYesListener: () -> Unit, val buttonNoListener: () -> Unit) : UploadButtonLayout() } diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/home/HelpFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/home/HelpFragment.kt index 89bcd9d..530a779 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/home/HelpFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/home/HelpFragment.kt @@ -16,7 +16,20 @@ import com.atlassian.mobilekit.module.feedback.FeedbackModule import kotlinx.android.synthetic.main.fragment_help.* import kotlinx.android.synthetic.main.fragment_help.view.* import au.gov.health.covidsafe.R +import au.gov.health.covidsafe.logging.CentralLog import au.gov.health.covidsafe.ui.BaseFragment +import kotlinx.android.synthetic.main.activity_country_code_selection.* +import java.util.* + +private const val HELP_URL_BASE = "https://www.covidsafe.gov.au/help-topics" +private const val HELP_URL_ENGLISH_PAGE = ".html" +private const val HELP_URL_ARABIC_PAGE = "/ar.html" +private const val HELP_URL_VIETNAMESE_PAGE = "/vi.html" +private const val HELP_URL_KOREAN_PAGE = "/ko.html" +private const val HELP_URL_SIMPLIFIED_CHINESE_PAGE = "/zh-hans.html" +private const val HELP_URL_TRADITIONAL_CHINESE_PAGE = "/zh-hant.html" + +private const val TAG = "HelpFragment" class HelpFragment : BaseFragment() { @@ -31,11 +44,16 @@ class HelpFragment : BaseFragment() { val webView = view.helpWebView webView.settings.javaScriptEnabled = true webView.webViewClient = createWebVieClient(view) - webView.loadUrl(HELP_URL) + webView.loadUrl(getHelpUrlBasedOnLocaleLanguage()) reportAnIssue.setOnClickListener { FeedbackModule.showFeedbackScreen() } toolbar.setNavigationOnClickListener { findNavController().popBackStack() } + + if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + toolbar.navigationIcon = + requireContext().getDrawable(R.drawable.ic_up_rtl) + } } private fun createWebVieClient(view: View): WebViewClient = @@ -47,7 +65,7 @@ class HelpFragment : BaseFragment() { if (!loadFinished) isRedirecting = true loadFinished = false val urlString = request.url.toString() - if (urlString == HELP_URL) { + if (urlString.startsWith(HELP_URL_BASE)) { webView.loadUrl(request.url.toString()) } else { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(urlString)) @@ -74,6 +92,27 @@ class HelpFragment : BaseFragment() { } } } + + + private fun getHelpUrlBasedOnLocaleLanguage(): String { + val localeLanguageTag = Locale.getDefault().toLanguageTag() + + val url = HELP_URL_BASE + when { + localeLanguageTag.startsWith("zh-Hans") -> HELP_URL_SIMPLIFIED_CHINESE_PAGE + localeLanguageTag.startsWith("zh-Hant") -> HELP_URL_TRADITIONAL_CHINESE_PAGE + localeLanguageTag.startsWith("ar") -> HELP_URL_ARABIC_PAGE + localeLanguageTag.startsWith("vi") -> HELP_URL_VIETNAMESE_PAGE + localeLanguageTag.startsWith("ko") -> HELP_URL_KOREAN_PAGE + else -> HELP_URL_ENGLISH_PAGE + } + + + CentralLog.d(TAG, "getHelpUrlBasedOnLocaleLanguage() " + + "localeLanguageTag = $localeLanguageTag " + + "url = $url") + + return url + } } -private const val HELP_URL = "https://www.covidsafe.gov.au/help-topics.html" + diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt index 2ef234f..9abd8a9 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/home/HomeFragment.kt @@ -200,6 +200,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { if (isAllPermissionsEnabled) { home_header_picture_setup_complete.setAnimation("spinner_home.json") + home_header_picture_setup_complete.resumeAnimation() content_setup_incomplete_group.visibility = GONE ContextCompat.getColor(it, R.color.lighter_green).let { bgColor -> header_background.setBackgroundColor(bgColor) @@ -225,7 +226,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { private fun allPermissionsEnabled(): Boolean { val bluetoothEnabled = isBlueToothEnabled() ?: false val pushNotificationEnabled = isPushNotificationEnabled() ?: true - val nonBatteryOptimizationAllowed = isNonBatteryOptimizationAllowed() ?: true + val nonBatteryOptimizationAllowed = isBatteryOptimizationDisabled() ?: true val locationStatusAllowed = isFineLocationEnabled() ?: true return bluetoothEnabled && @@ -277,9 +278,13 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { } private fun updateBatteryOptimizationStatus() { - isNonBatteryOptimizationAllowed()?.let { + isBatteryOptimizationDisabled()?.let { battery_card_view.visibility = VISIBLE - battery_card_view.render(formatNonBatteryOptimizationTitle(!it), it) + battery_card_view.render( + formatNonBatteryOptimizationTitle(!it), + it, + getString(R.string.battery_optimisation_prompt) + ) } ?: run { battery_card_view.visibility = GONE } @@ -303,7 +308,7 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { } private fun formatNonBatteryOptimizationTitle(on: Boolean): String { - return resources.getString(R.string.home_non_battery_optimization_permission, getPermissionEnabledTitle(on)) + return resources.getString(R.string.home_non_battery_optimization_permission, getEnabledOrDisabledString(on)) } private fun formatPushNotificationTitle(on: Boolean): String { @@ -314,6 +319,10 @@ class HomeFragment : BaseFragment(), EasyPermissions.PermissionCallbacks { return resources.getString(if (on) R.string.home_permission_on else R.string.home_permission_off) } + private fun getEnabledOrDisabledString(isEnabled: Boolean): String { + return resources.getString(if (isEnabled) R.string.enabled else R.string.disabled) + } + private fun goToNewsWebsite() { val url = getString(R.string.home_set_complete_external_link_news_url) try { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/home/view/ExternalLinkCard.kt b/app/src/main/java/au/gov/health/covidsafe/ui/home/view/ExternalLinkCard.kt index f5f1efe..1cf2f83 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/home/view/ExternalLinkCard.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/home/view/ExternalLinkCard.kt @@ -1,10 +1,12 @@ package au.gov.health.covidsafe.ui.home.view import android.content.Context +import android.content.res.Resources import android.content.res.TypedArray import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat import au.gov.health.covidsafe.R import kotlinx.android.synthetic.main.view_card_external_link_card.view.* @@ -30,5 +32,11 @@ class ExternalLinkCard @JvmOverloads constructor( external_link_headline.text = title external_link_content.text = content a.recycle() + + next_arrow.setImageDrawable( + ContextCompat.getDrawable(context, R.drawable.ic_chevron_right).also { + it?.isAutoMirrored = true + } + ) } } \ No newline at end of file diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryCodeSelectionActivity.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryCodeSelectionActivity.kt index 6acd06f..d2cffa0 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryCodeSelectionActivity.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryCodeSelectionActivity.kt @@ -31,9 +31,14 @@ fun RecyclerView.smoothSnapToPosition( const val VOICE_TO_TEXT_REQUEST_CODE = 2020 class CountryCodeSelectionActivity : Activity() { - val countryListItem = CountryList.getCountryList() + private lateinit var countryListItem: List private fun setupToolbar() { + if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + countrySelectionToolbar.navigationIcon = + getDrawable(R.drawable.ic_up_rtl) + } + countrySelectionToolbar.setNavigationOnClickListener { super.onBackPressed() } @@ -81,8 +86,9 @@ class CountryCodeSelectionActivity : Activity() { fun getPositionOfCountryName(searchText: String): Int { countryListItem.forEachIndexed { index, countryListItemInterface -> if (countryListItemInterface is CountryGroupTitle) { - val groupTitle = getString(countryListItemInterface.titleResId) - if (groupTitle.startsWith(searchText, ignoreCase = true) + if (countryListItemInterface.getTitle( + this@CountryCodeSelectionActivity + ).startsWith(searchText, ignoreCase = true) ) { return index } @@ -131,26 +137,23 @@ class CountryCodeSelectionActivity : Activity() { } } - private fun setupInitialLetterRecyclerView() { - val alphabet = ArrayList() - var letter = 'A' - while (letter <= 'Z') { - if (letter != 'W' && letter != 'X') { - alphabet.add(letter.toString()) - } - ++letter + private fun setupGroupNameRecyclerView() { + val alphabet = countryListItem.filterIsInstance().map { + it.getTitle(this) + }.filter { + it != this.getString(R.string.options_for_australia) } - countryInitialLetterRecyclerView.layoutManager = LinearLayoutManager(this) - countryInitialLetterRecyclerView.adapter = CountryInitialLetterRecyclerViewAdapter( + countryGroupNameRecyclerView.layoutManager = LinearLayoutManager(this) + countryGroupNameRecyclerView.adapter = CountryGroupNameRecyclerViewAdapter( this, alphabet - ) { letterClicked -> - fun getPositionOfLetter(letter: String): Int { + ) { groupNameClicked -> + fun getPositionOfGroupName(letter: String): Int { countryListItem.forEachIndexed { index, countryListItemInterface -> if (countryListItemInterface is CountryGroupTitle) { - val groupTitle = getString(countryListItemInterface.titleResId) - if (groupTitle.startsWith(letter, ignoreCase = true)) { + if (countryListItemInterface.getTitle(this) + .startsWith(letter, ignoreCase = true)) { return index } } @@ -159,7 +162,7 @@ class CountryCodeSelectionActivity : Activity() { return 0 } - val positionOfLetter = getPositionOfLetter(letterClicked) + val positionOfLetter = getPositionOfGroupName(groupNameClicked) countryListScrollToPosition(positionOfLetter) } @@ -180,8 +183,11 @@ class CountryCodeSelectionActivity : Activity() { setContentView(R.layout.activity_country_code_selection) setupToolbar() + + countryListItem = CountryList.getCountryList(this) + setupCountryListRecyclerView() - setupInitialLetterRecyclerView() + setupGroupNameRecyclerView() // set up the search functions setupSearchFunctions() diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryInitialLetterRecyclerView.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryGroupNameRecyclerView.kt similarity index 51% rename from app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryInitialLetterRecyclerView.kt rename to app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryGroupNameRecyclerView.kt index f31a320..694044a 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryInitialLetterRecyclerView.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryGroupNameRecyclerView.kt @@ -8,41 +8,41 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import au.gov.health.covidsafe.R -class CountryInitialLetterHolder( +class CountryGroupNameHolder( itemView: View, - private val onLetterClicked: (letter: String) -> Unit + private val onGroupNameClicked: (groupName: String) -> Unit ) : RecyclerView.ViewHolder(itemView) { fun setLetter(letter: String) { - val letterTextView = itemView.findViewById(R.id.country_initial_letter) + val letterTextView = itemView.findViewById(R.id.country_group_name) letterTextView.text = letter letterTextView.setOnClickListener { - onLetterClicked(letter) + onGroupNameClicked(letter) } } } -class CountryInitialLetterRecyclerViewAdapter( - private val context: Context, - private val initialLetters: List, - private val onLetterClicked: (letter: String) -> Unit -) : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CountryInitialLetterHolder { - return CountryInitialLetterHolder( +class CountryGroupNameRecyclerViewAdapter( + private val context: Context, + private val groupNames: List, + private val onGroupNameClicked: (groupName: String) -> Unit +) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CountryGroupNameHolder { + return CountryGroupNameHolder( LayoutInflater.from(context).inflate( - R.layout.view_list_item_country_initial_letter, + R.layout.view_list_item_country_group_name, parent, false ), - onLetterClicked + onGroupNameClicked ) } override fun getItemCount(): Int { - return initialLetters.size + return groupNames.size } - override fun onBindViewHolder(holder: CountryInitialLetterHolder, position: Int) { - holder.setLetter(initialLetters[position]) + override fun onBindViewHolder(holder: CountryGroupNameHolder, position: Int) { + holder.setLetter(groupNames[position]) } } \ No newline at end of file diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryList.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryList.kt index 8063129..c1ab807 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryList.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryList.kt @@ -1,253 +1,306 @@ package au.gov.health.covidsafe.ui.onboarding +import android.content.Context +import android.content.res.Configuration +import android.icu.text.AlphabeticIndex +import android.os.Build +import androidx.annotation.RequiresApi import au.gov.health.covidsafe.R +import java.util.* object CountryList { - fun getCountryList() : List{ - // for now, it returns the grouping for English only, in the future, it should return - // different groupings according to different language - return groupingForEnglish + fun getCountryList(context: Context): List { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + getSortedAndGroupedCountryListBasedOnLocaleLanguage(context) + } else { + getSortedAndGroupedCountryListBasedOnEnglish(context) + } } - private val groupingForEnglish = listOf( - CountryGroupTitle(R.string.options_for_australia), - CountryListItem(R.string.country_au, 61, R.drawable.ic_list_country_au), - CountryListItem(R.string.country_nf, 672, R.drawable.ic_list_country_nf), - CountryGroupTitle(R.string.group_title_a), -// CountryListItem(R.string.country_af, 93, R.drawable.ic_list_country_af), - CountryListItem(R.string.country_al, 355, R.drawable.ic_list_country_al), - CountryListItem(R.string.country_dz, 213, R.drawable.ic_list_country_dz), + private fun getCountries(): List { + return listOf( + CountryListItem(R.string.country_al, 355, R.drawable.ic_list_country_al), + CountryListItem(R.string.country_dz, 213, R.drawable.ic_list_country_dz), // CountryListItem(R.string.country_ad, 376, R.drawable.ic_list_country_ad), - CountryListItem(R.string.country_ao, 244, R.drawable.ic_list_country_ao), - CountryListItem(R.string.country_ai, 1, R.drawable.ic_list_country_ai), - CountryListItem(R.string.country_ag, 1, R.drawable.ic_list_country_ag), - CountryListItem(R.string.country_ar, 54, R.drawable.ic_list_country_ar), - CountryListItem(R.string.country_am, 374, R.drawable.ic_list_country_am), - CountryListItem(R.string.country_aw, 297, R.drawable.ic_list_country_aw), - CountryListItem(R.string.country_au, 61, R.drawable.ic_list_country_au), - CountryListItem(R.string.country_at, 43, R.drawable.ic_list_country_at), - CountryListItem(R.string.country_az, 994, R.drawable.ic_list_country_az), - CountryGroupTitle(R.string.group_title_b), - CountryListItem(R.string.country_bs, 1, R.drawable.ic_list_country_bs), - CountryListItem(R.string.country_bh, 973, R.drawable.ic_list_country_bh), - CountryListItem(R.string.country_bd, 880, R.drawable.ic_list_country_bd), - CountryListItem(R.string.country_bb, 1, R.drawable.ic_list_country_bb), - CountryListItem(R.string.country_by, 375, R.drawable.ic_list_country_by), - CountryListItem(R.string.country_be, 32, R.drawable.ic_list_country_be), - CountryListItem(R.string.country_bz, 501, R.drawable.ic_list_country_bz), - CountryListItem(R.string.country_bj, 229, R.drawable.ic_list_country_bj), - CountryListItem(R.string.country_bm, 1, R.drawable.ic_list_country_bm), + CountryListItem(R.string.country_ao, 244, R.drawable.ic_list_country_ao), + CountryListItem(R.string.country_ai, 1, R.drawable.ic_list_country_ai), + CountryListItem(R.string.country_ag, 1, R.drawable.ic_list_country_ag), + CountryListItem(R.string.country_ar, 54, R.drawable.ic_list_country_ar), + CountryListItem(R.string.country_am, 374, R.drawable.ic_list_country_am), + CountryListItem(R.string.country_aw, 297, R.drawable.ic_list_country_aw), + CountryListItem(R.string.country_au, 61, R.drawable.ic_list_country_au), + CountryListItem(R.string.country_at, 43, R.drawable.ic_list_country_at), + CountryListItem(R.string.country_az, 994, R.drawable.ic_list_country_az), + CountryListItem(R.string.country_bs, 1, R.drawable.ic_list_country_bs), + CountryListItem(R.string.country_bh, 973, R.drawable.ic_list_country_bh), + CountryListItem(R.string.country_bd, 880, R.drawable.ic_list_country_bd), + CountryListItem(R.string.country_bb, 1, R.drawable.ic_list_country_bb), + CountryListItem(R.string.country_by, 375, R.drawable.ic_list_country_by), + CountryListItem(R.string.country_be, 32, R.drawable.ic_list_country_be), + CountryListItem(R.string.country_bz, 501, R.drawable.ic_list_country_bz), + CountryListItem(R.string.country_bj, 229, R.drawable.ic_list_country_bj), + CountryListItem(R.string.country_bm, 1, R.drawable.ic_list_country_bm), // CountryListItem(R.string.country_bt, 975, R.drawable.ic_list_country_bt), - CountryListItem(R.string.country_bo, 591, R.drawable.ic_list_country_bo), - CountryListItem(R.string.country_ba, 387, R.drawable.ic_list_country_ba), - CountryListItem(R.string.country_bw, 267, R.drawable.ic_list_country_bw), - CountryListItem(R.string.country_br, 55, R.drawable.ic_list_country_br), + CountryListItem(R.string.country_bo, 591, R.drawable.ic_list_country_bo), + CountryListItem(R.string.country_ba, 387, R.drawable.ic_list_country_ba), + CountryListItem(R.string.country_bw, 267, R.drawable.ic_list_country_bw), + CountryListItem(R.string.country_br, 55, R.drawable.ic_list_country_br), // CountryListItem(R.string.country_bn, 673, R.drawable.ic_list_country_bn), - CountryListItem(R.string.country_vg, 1, R.drawable.ic_list_country_vg), - CountryListItem(R.string.country_bg, 359, R.drawable.ic_list_country_bg), - CountryListItem(R.string.country_bf, 226, R.drawable.ic_list_country_bf), + CountryListItem(R.string.country_vg, 1, R.drawable.ic_list_country_vg), + CountryListItem(R.string.country_bg, 359, R.drawable.ic_list_country_bg), + CountryListItem(R.string.country_bf, 226, R.drawable.ic_list_country_bf), // CountryListItem(R.string.country_bi, 257, R.drawable.ic_list_country_bi), - CountryGroupTitle(R.string.group_title_c), - CountryListItem(R.string.country_kh, 855, R.drawable.ic_list_country_kh), - CountryListItem(R.string.country_cm, 237, R.drawable.ic_list_country_cm), - CountryListItem(R.string.country_ca, 1, R.drawable.ic_list_country_ca), - CountryListItem(R.string.country_cv, 238, R.drawable.ic_list_country_cv), - CountryListItem(R.string.country_ky, 1, R.drawable.ic_list_country_ky), + CountryListItem(R.string.country_kh, 855, R.drawable.ic_list_country_kh), + CountryListItem(R.string.country_cm, 237, R.drawable.ic_list_country_cm), + CountryListItem(R.string.country_ca, 1, R.drawable.ic_list_country_ca), + CountryListItem(R.string.country_cv, 238, R.drawable.ic_list_country_cv), + CountryListItem(R.string.country_ky, 1, R.drawable.ic_list_country_ky), // CountryListItem(R.string.country_cf, 236, R.drawable.ic_list_country_cf), // CountryListItem(R.string.country_td, 235, R.drawable.ic_list_country_td), - CountryListItem(R.string.country_cl, 56, R.drawable.ic_list_country_cl), - CountryListItem(R.string.country_cn, 86, R.drawable.ic_list_country_cn), - CountryListItem(R.string.country_co, 57, R.drawable.ic_list_country_co), + CountryListItem(R.string.country_cl, 56, R.drawable.ic_list_country_cl), + CountryListItem(R.string.country_cn, 86, R.drawable.ic_list_country_cn), + CountryListItem(R.string.country_co, 57, R.drawable.ic_list_country_co), // CountryListItem(R.string.country_km, 269, R.drawable.ic_list_country_km), // CountryListItem(R.string.country_ck, 682, R.drawable.ic_list_country_ck), - CountryListItem(R.string.country_cr, 506, R.drawable.ic_list_country_cr), - CountryListItem(R.string.country_hr, 385, R.drawable.ic_list_country_hr), - CountryListItem(R.string.country_cu, 53, R.drawable.ic_list_country_cu), - CountryListItem(R.string.country_cw, 599, R.drawable.ic_list_country_cw), - CountryListItem(R.string.country_cy, 357, R.drawable.ic_list_country_cy), - CountryListItem(R.string.country_cz, 420, R.drawable.ic_list_country_cz), + CountryListItem(R.string.country_cr, 506, R.drawable.ic_list_country_cr), + CountryListItem(R.string.country_hr, 385, R.drawable.ic_list_country_hr), + CountryListItem(R.string.country_cu, 53, R.drawable.ic_list_country_cu), + CountryListItem(R.string.country_cw, 599, R.drawable.ic_list_country_cw), + CountryListItem(R.string.country_cy, 357, R.drawable.ic_list_country_cy), + CountryListItem(R.string.country_cz, 420, R.drawable.ic_list_country_cz), // CountryListItem(R.string.country_cd, 243, R.drawable.ic_list_country_cd), - CountryGroupTitle(R.string.group_title_d), - CountryListItem(R.string.country_dk, 45, R.drawable.ic_list_country_dk), + CountryListItem(R.string.country_dk, 45, R.drawable.ic_list_country_dk), // CountryListItem(R.string.country_dj, 253, R.drawable.ic_list_country_dj), - CountryListItem(R.string.country_dm, 1, R.drawable.ic_list_country_dm), - CountryListItem(R.string.country_do, 1, R.drawable.ic_list_country_do), - CountryGroupTitle(R.string.group_title_e), - CountryListItem(R.string.country_ec, 593, R.drawable.ic_list_country_ec), + CountryListItem(R.string.country_dm, 1, R.drawable.ic_list_country_dm), + CountryListItem(R.string.country_do, 1, R.drawable.ic_list_country_do), + CountryListItem(R.string.country_ec, 593, R.drawable.ic_list_country_ec), // CountryListItem(R.string.country_eg, 20, R.drawable.ic_list_country_eg), - CountryListItem(R.string.country_sv, 503, R.drawable.ic_list_country_sv), + CountryListItem(R.string.country_sv, 503, R.drawable.ic_list_country_sv), // CountryListItem(R.string.country_gq, 240, R.drawable.ic_list_country_gq), - CountryListItem(R.string.country_ee, 372, R.drawable.ic_list_country_ee), + CountryListItem(R.string.country_ee, 372, R.drawable.ic_list_country_ee), // CountryListItem(R.string.country_et, 251, R.drawable.ic_list_country_et), - CountryGroupTitle(R.string.group_title_f), // CountryListItem(R.string.country_fo, 298, R.drawable.ic_list_country_fo), - CountryListItem(R.string.country_fj, 679, R.drawable.ic_list_country_fj), - CountryListItem(R.string.country_fi, 358, R.drawable.ic_list_country_fi), - CountryListItem(R.string.country_fr, 33, R.drawable.ic_list_country_fr), - CountryGroupTitle(R.string.group_title_g), + CountryListItem(R.string.country_fj, 679, R.drawable.ic_list_country_fj), + CountryListItem(R.string.country_fi, 358, R.drawable.ic_list_country_fi), + CountryListItem(R.string.country_fr, 33, R.drawable.ic_list_country_fr), // CountryListItem(R.string.country_gf, 995, R.drawable.ic_list_country_fr), - CountryListItem(R.string.country_ga, 241, R.drawable.ic_list_country_ga), + CountryListItem(R.string.country_ga, 241, R.drawable.ic_list_country_ga), // CountryListItem(R.string.country_gm, 220, R.drawable.ic_list_country_gm), - CountryListItem(R.string.country_ge, 995, R.drawable.ic_list_country_ge), - CountryListItem(R.string.country_de, 49, R.drawable.ic_list_country_de), - CountryListItem(R.string.country_gh, 233, R.drawable.ic_list_country_gh), + CountryListItem(R.string.country_ge, 995, R.drawable.ic_list_country_ge), + CountryListItem(R.string.country_de, 49, R.drawable.ic_list_country_de), + CountryListItem(R.string.country_gh, 233, R.drawable.ic_list_country_gh), // CountryListItem(R.string.country_gi, 350, R.drawable.ic_list_country_gi), - CountryListItem(R.string.country_gr, 30, R.drawable.ic_list_country_gr), + CountryListItem(R.string.country_gr, 30, R.drawable.ic_list_country_gr), // CountryListItem(R.string.country_gl, 299, R.drawable.ic_list_country_gl), - CountryListItem(R.string.country_gd, 1, R.drawable.ic_list_country_gd), + CountryListItem(R.string.country_gd, 1, R.drawable.ic_list_country_gd), // CountryListItem(R.string.country_gp, 224, R.drawable.ic_list_country_fr), - CountryListItem(R.string.country_gu, 1, R.drawable.ic_list_country_gu), - CountryListItem(R.string.country_gt, 502, R.drawable.ic_list_country_gt), + CountryListItem(R.string.country_gu, 1, R.drawable.ic_list_country_gu), + CountryListItem(R.string.country_gt, 502, R.drawable.ic_list_country_gt), // CountryListItem(R.string.country_gn, 224, R.drawable.ic_list_country_gn), - CountryListItem(R.string.country_gw, 245, R.drawable.ic_list_country_gw), + CountryListItem(R.string.country_gw, 245, R.drawable.ic_list_country_gw), // CountryListItem(R.string.country_gy, 592, R.drawable.ic_list_country_gy), - CountryGroupTitle(R.string.group_title_h), - CountryListItem(R.string.country_ht, 509, R.drawable.ic_list_country_ht), - CountryListItem(R.string.country_hn, 504, R.drawable.ic_list_country_hn), - CountryListItem(R.string.country_hk, 852, R.drawable.ic_list_country_hk), - CountryListItem(R.string.country_hu, 36, R.drawable.ic_list_country_hu), - CountryGroupTitle(R.string.group_title_i), - CountryListItem(R.string.country_is, 354, R.drawable.ic_list_country_is), - CountryListItem(R.string.country_in, 91, R.drawable.ic_list_country_in), - CountryListItem(R.string.country_id, 62, R.drawable.ic_list_country_id), - CountryListItem(R.string.country_ir, 964, R.drawable.ic_list_country_ir), - CountryListItem(R.string.country_iq, 964, R.drawable.ic_list_country_iq), - CountryListItem(R.string.country_ie, 353, R.drawable.ic_list_country_ie), - CountryListItem(R.string.country_il, 972, R.drawable.ic_list_country_il), + CountryListItem(R.string.country_ht, 509, R.drawable.ic_list_country_ht), + CountryListItem(R.string.country_hn, 504, R.drawable.ic_list_country_hn), + CountryListItem(R.string.country_hk, 852, R.drawable.ic_list_country_hk), + CountryListItem(R.string.country_hu, 36, R.drawable.ic_list_country_hu), + CountryListItem(R.string.country_is, 354, R.drawable.ic_list_country_is), + CountryListItem(R.string.country_in, 91, R.drawable.ic_list_country_in), + CountryListItem(R.string.country_id, 62, R.drawable.ic_list_country_id), + CountryListItem(R.string.country_ir, 964, R.drawable.ic_list_country_ir), + CountryListItem(R.string.country_iq, 964, R.drawable.ic_list_country_iq), + CountryListItem(R.string.country_ie, 353, R.drawable.ic_list_country_ie), + CountryListItem(R.string.country_il, 972, R.drawable.ic_list_country_il), // CountryListItem(R.string.country_it, 39, R.drawable.ic_list_country_it), - CountryListItem(R.string.country_ci, 225, R.drawable.ic_list_country_ci), - CountryGroupTitle(R.string.group_title_j), - CountryListItem(R.string.country_jm, 1, R.drawable.ic_list_country_jm), - CountryListItem(R.string.country_jp, 81, R.drawable.ic_list_country_jp), - CountryListItem(R.string.country_jo, 962, R.drawable.ic_list_country_jo), - CountryGroupTitle(R.string.group_title_k), - CountryListItem(R.string.country_kz, 7, R.drawable.ic_list_country_kz), - CountryListItem(R.string.country_ke, 254, R.drawable.ic_list_country_ke), + CountryListItem(R.string.country_ci, 225, R.drawable.ic_list_country_ci), + CountryListItem(R.string.country_jm, 1, R.drawable.ic_list_country_jm), + CountryListItem(R.string.country_jp, 81, R.drawable.ic_list_country_jp), + CountryListItem(R.string.country_jo, 962, R.drawable.ic_list_country_jo), + CountryListItem(R.string.country_kz, 7, R.drawable.ic_list_country_kz), + CountryListItem(R.string.country_ke, 254, R.drawable.ic_list_country_ke), // CountryListItem(R.string.country_ki, 686, R.drawable.ic_list_country_ki), - CountryListItem(R.string.country_kw, 965, R.drawable.ic_list_country_kw), - CountryListItem(R.string.country_kg, 996, R.drawable.ic_list_country_kg), - CountryGroupTitle(R.string.group_title_l), - CountryListItem(R.string.country_la, 856, R.drawable.ic_list_country_la), - CountryListItem(R.string.country_lv, 371, R.drawable.ic_list_country_lv), - CountryListItem(R.string.country_lb, 961, R.drawable.ic_list_country_lb), + CountryListItem(R.string.country_kw, 965, R.drawable.ic_list_country_kw), + CountryListItem(R.string.country_kg, 996, R.drawable.ic_list_country_kg), + CountryListItem(R.string.country_la, 856, R.drawable.ic_list_country_la), + CountryListItem(R.string.country_lv, 371, R.drawable.ic_list_country_lv), + CountryListItem(R.string.country_lb, 961, R.drawable.ic_list_country_lb), // CountryListItem(R.string.country_ls, 266, R.drawable.ic_list_country_ls), // CountryListItem(R.string.country_lr, 231, R.drawable.ic_list_country_lr), // CountryListItem(R.string.country_ly, 218, R.drawable.ic_list_country_ly), - CountryListItem(R.string.country_li, 423, R.drawable.ic_list_country_li), - CountryListItem(R.string.country_lt, 370, R.drawable.ic_list_country_lt), - CountryListItem(R.string.country_lu, 352, R.drawable.ic_list_country_lu), - CountryGroupTitle(R.string.group_title_m), - CountryListItem(R.string.country_mo, 853, R.drawable.ic_list_country_mo), + CountryListItem(R.string.country_li, 423, R.drawable.ic_list_country_li), + CountryListItem(R.string.country_lt, 370, R.drawable.ic_list_country_lt), + CountryListItem(R.string.country_lu, 352, R.drawable.ic_list_country_lu), + CountryListItem(R.string.country_mo, 853, R.drawable.ic_list_country_mo), // CountryListItem(R.string.country_mg, 261, R.drawable.ic_list_country_mg), // CountryListItem(R.string.country_mw, 265, R.drawable.ic_list_country_mw), - CountryListItem(R.string.country_my, 60, R.drawable.ic_list_country_my), + CountryListItem(R.string.country_my, 60, R.drawable.ic_list_country_my), // CountryListItem(R.string.country_mv, 960, R.drawable.ic_list_country_mv), - CountryListItem(R.string.country_ml, 223, R.drawable.ic_list_country_ml), - CountryListItem(R.string.country_mt, 356, R.drawable.ic_list_country_mt), - CountryListItem(R.string.country_mq, 1, R.drawable.ic_list_country_mq), + CountryListItem(R.string.country_ml, 223, R.drawable.ic_list_country_ml), + CountryListItem(R.string.country_mt, 356, R.drawable.ic_list_country_mt), + CountryListItem(R.string.country_mq, 1, R.drawable.ic_list_country_mq), // CountryListItem(R.string.country_mr, 222, R.drawable.ic_list_country_mr), - CountryListItem(R.string.country_mu, 230, R.drawable.ic_list_country_mu), - CountryListItem(R.string.country_mx, 52, R.drawable.ic_list_country_mx), - CountryListItem(R.string.country_md, 373, R.drawable.ic_list_country_md), + CountryListItem(R.string.country_mu, 230, R.drawable.ic_list_country_mu), + CountryListItem(R.string.country_mx, 52, R.drawable.ic_list_country_mx), + CountryListItem(R.string.country_md, 373, R.drawable.ic_list_country_md), // CountryListItem(R.string.country_mc, 377, R.drawable.ic_list_country_mc), // CountryListItem(R.string.country_mn, 976, R.drawable.ic_list_country_mn), // CountryListItem(R.string.country_me, 382, R.drawable.ic_list_country_me), - CountryListItem(R.string.country_ms, 1, R.drawable.ic_list_country_ms), - CountryListItem(R.string.country_ma, 212, R.drawable.ic_list_country_ma), - CountryListItem(R.string.country_mz, 258, R.drawable.ic_list_country_mz), - CountryListItem(R.string.country_mm, 95, R.drawable.ic_list_country_mm), - CountryGroupTitle(R.string.group_title_n), - CountryListItem(R.string.country_na, 264, R.drawable.ic_list_country_na), - CountryListItem(R.string.country_np, 977, R.drawable.ic_list_country_np), - CountryListItem(R.string.country_nl, 31, R.drawable.ic_list_country_nl), + CountryListItem(R.string.country_ms, 1, R.drawable.ic_list_country_ms), + CountryListItem(R.string.country_ma, 212, R.drawable.ic_list_country_ma), + CountryListItem(R.string.country_mz, 258, R.drawable.ic_list_country_mz), + CountryListItem(R.string.country_mm, 95, R.drawable.ic_list_country_mm), + CountryListItem(R.string.country_na, 264, R.drawable.ic_list_country_na), + CountryListItem(R.string.country_np, 977, R.drawable.ic_list_country_np), + CountryListItem(R.string.country_nl, 31, R.drawable.ic_list_country_nl), // CountryListItem(R.string.country_an, 599, R.drawable.ic_list_country_an), // CountryListItem(R.string.country_nc, 687, R.drawable.ic_list_country_nc), - CountryListItem(R.string.country_nz, 64, R.drawable.ic_list_country_nz), - CountryListItem(R.string.country_ni, 505, R.drawable.ic_list_country_ni), - CountryListItem(R.string.country_ne, 227, R.drawable.ic_list_country_ne), - CountryListItem(R.string.country_ng, 234, R.drawable.ic_list_country_ng), - CountryListItem(R.string.country_nf, 672, R.drawable.ic_list_country_nf), - CountryListItem(R.string.country_mk, 389, R.drawable.ic_list_country_mk), - CountryListItem(R.string.country_no, 47, R.drawable.ic_list_country_no), - CountryGroupTitle(R.string.group_title_o), - CountryListItem(R.string.country_om, 968, R.drawable.ic_list_country_om), - CountryGroupTitle(R.string.group_title_p), - CountryListItem(R.string.country_pk, 92, R.drawable.ic_list_country_pk), + CountryListItem(R.string.country_nz, 64, R.drawable.ic_list_country_nz), + CountryListItem(R.string.country_ni, 505, R.drawable.ic_list_country_ni), + CountryListItem(R.string.country_ne, 227, R.drawable.ic_list_country_ne), + CountryListItem(R.string.country_ng, 234, R.drawable.ic_list_country_ng), + CountryListItem(R.string.country_nf, 672, R.drawable.ic_list_country_nf), + CountryListItem(R.string.country_mk, 389, R.drawable.ic_list_country_mk), + CountryListItem(R.string.country_no, 47, R.drawable.ic_list_country_no), + CountryListItem(R.string.country_om, 968, R.drawable.ic_list_country_om), + CountryListItem(R.string.country_pk, 92, R.drawable.ic_list_country_pk), // CountryListItem(R.string.country_pw, 680, R.drawable.ic_list_country_pw), // CountryListItem(R.string.country_ps, 970, R.drawable.ic_list_country_ps), - CountryListItem(R.string.country_pa, 507, R.drawable.ic_list_country_pa), - CountryListItem(R.string.country_pg, 675, R.drawable.ic_list_country_pg), - CountryListItem(R.string.country_py, 595, R.drawable.ic_list_country_py), - CountryListItem(R.string.country_pe, 51, R.drawable.ic_list_country_pe), - CountryListItem(R.string.country_ph, 63, R.drawable.ic_list_country_ph), - CountryListItem(R.string.country_pl, 48, R.drawable.ic_list_country_pl), - CountryListItem(R.string.country_pt, 351, R.drawable.ic_list_country_pt), - CountryListItem(R.string.country_pr, 1, R.drawable.ic_list_country_pr), - CountryGroupTitle(R.string.group_title_q), - CountryListItem(R.string.country_qa, 974, R.drawable.ic_list_country_qa), - CountryGroupTitle(R.string.group_title_r), + CountryListItem(R.string.country_pa, 507, R.drawable.ic_list_country_pa), + CountryListItem(R.string.country_pg, 675, R.drawable.ic_list_country_pg), + CountryListItem(R.string.country_py, 595, R.drawable.ic_list_country_py), + CountryListItem(R.string.country_pe, 51, R.drawable.ic_list_country_pe), + CountryListItem(R.string.country_ph, 63, R.drawable.ic_list_country_ph), + CountryListItem(R.string.country_pl, 48, R.drawable.ic_list_country_pl), + CountryListItem(R.string.country_pt, 351, R.drawable.ic_list_country_pt), + CountryListItem(R.string.country_pr, 1, R.drawable.ic_list_country_pr), + CountryListItem(R.string.country_qa, 974, R.drawable.ic_list_country_qa), // CountryListItem(R.string.country_cg, 242, R.drawable.ic_list_country_cg), // CountryListItem(R.string.country_re, 262, R.drawable.ic_list_country_fr), // CountryListItem(R.string.country_ro, 40, R.drawable.ic_list_country_ro), - CountryListItem(R.string.country_ru, 7, R.drawable.ic_list_country_ru), - CountryListItem(R.string.country_rw, 250, R.drawable.ic_list_country_rw), - CountryGroupTitle(R.string.group_title_s), - CountryListItem(R.string.country_kn, 1, R.drawable.ic_list_country_kn), - CountryListItem(R.string.country_lc, 1, R.drawable.ic_list_country_lc), - CountryListItem(R.string.country_vc, 1, R.drawable.ic_list_country_vc), + CountryListItem(R.string.country_ru, 7, R.drawable.ic_list_country_ru), + CountryListItem(R.string.country_rw, 250, R.drawable.ic_list_country_rw), + CountryListItem(R.string.country_kn, 1, R.drawable.ic_list_country_kn), + CountryListItem(R.string.country_lc, 1, R.drawable.ic_list_country_lc), + CountryListItem(R.string.country_vc, 1, R.drawable.ic_list_country_vc), // CountryListItem(R.string.country_ws, 685, R.drawable.ic_list_country_ws), // CountryListItem(R.string.country_st, 239, R.drawable.ic_list_country_st), // CountryListItem(R.string.country_sa, 966, R.drawable.ic_list_country_sa), - CountryListItem(R.string.country_sn, 221, R.drawable.ic_list_country_sn), - CountryListItem(R.string.country_rs, 381, R.drawable.ic_list_country_rs), + CountryListItem(R.string.country_sn, 221, R.drawable.ic_list_country_sn), + CountryListItem(R.string.country_rs, 381, R.drawable.ic_list_country_rs), // CountryListItem(R.string.country_sc, 248, R.drawable.ic_list_country_sc), // CountryListItem(R.string.country_sl, 232, R.drawable.ic_list_country_sl), - CountryListItem(R.string.country_sg, 65, R.drawable.ic_list_country_sg), - CountryListItem(R.string.country_sk, 421, R.drawable.ic_list_country_sk), - CountryListItem(R.string.country_si, 386, R.drawable.ic_list_country_si), - CountryListItem(R.string.country_sb, 677, R.drawable.ic_list_country_sb), + CountryListItem(R.string.country_sg, 65, R.drawable.ic_list_country_sg), + CountryListItem(R.string.country_sk, 421, R.drawable.ic_list_country_sk), + CountryListItem(R.string.country_si, 386, R.drawable.ic_list_country_si), + CountryListItem(R.string.country_sb, 677, R.drawable.ic_list_country_sb), // CountryListItem(R.string.country_so, 252, R.drawable.ic_list_country_so), - CountryListItem(R.string.country_za, 27, R.drawable.ic_list_country_za), - CountryListItem(R.string.country_kr, 82, R.drawable.ic_list_country_kr), + CountryListItem(R.string.country_za, 27, R.drawable.ic_list_country_za), + CountryListItem(R.string.country_kr, 82, R.drawable.ic_list_country_kr), // CountryListItem(R.string.country_ss, 211, R.drawable.ic_list_country_ss), - CountryListItem(R.string.country_es, 34, R.drawable.ic_list_country_es), - CountryListItem(R.string.country_lk, 94, R.drawable.ic_list_country_lk), - CountryListItem(R.string.country_sd, 249, R.drawable.ic_list_country_sd), + CountryListItem(R.string.country_es, 34, R.drawable.ic_list_country_es), + CountryListItem(R.string.country_lk, 94, R.drawable.ic_list_country_lk), + CountryListItem(R.string.country_sd, 249, R.drawable.ic_list_country_sd), // CountryListItem(R.string.country_sr, 597, R.drawable.ic_list_country_sr), // CountryListItem(R.string.country_sz, 268, R.drawable.ic_list_country_sz), - CountryListItem(R.string.country_se, 46, R.drawable.ic_list_country_se), - CountryListItem(R.string.country_ch, 41, R.drawable.ic_list_country_ch), - CountryGroupTitle(R.string.group_title_t), - CountryListItem(R.string.country_tw, 886, R.drawable.ic_list_country_tw), - CountryListItem(R.string.country_tj, 992, R.drawable.ic_list_country_tj), - CountryListItem(R.string.country_tz, 255, R.drawable.ic_list_country_tz), - CountryListItem(R.string.country_th, 66, R.drawable.ic_list_country_th), + CountryListItem(R.string.country_se, 46, R.drawable.ic_list_country_se), + CountryListItem(R.string.country_ch, 41, R.drawable.ic_list_country_ch), + CountryListItem(R.string.country_tw, 886, R.drawable.ic_list_country_tw), + CountryListItem(R.string.country_tj, 992, R.drawable.ic_list_country_tj), + CountryListItem(R.string.country_tz, 255, R.drawable.ic_list_country_tz), + CountryListItem(R.string.country_th, 66, R.drawable.ic_list_country_th), // CountryListItem(R.string.country_tl, 670, R.drawable.ic_list_country_tl), - CountryListItem(R.string.country_tg, 228, R.drawable.ic_list_country_tg), + CountryListItem(R.string.country_tg, 228, R.drawable.ic_list_country_tg), // CountryListItem(R.string.country_to, 676, R.drawable.ic_list_country_to), - CountryListItem(R.string.country_tt, 1, R.drawable.ic_list_country_tt), - CountryListItem(R.string.country_tn, 216, R.drawable.ic_list_country_tn), - CountryListItem(R.string.country_tr, 90, R.drawable.ic_list_country_tr), - CountryListItem(R.string.country_tm, 993, R.drawable.ic_list_country_tm), - CountryListItem(R.string.country_tc, 1, R.drawable.ic_list_country_tc), - CountryGroupTitle(R.string.group_title_u), - CountryListItem(R.string.country_ug, 256, R.drawable.ic_list_country_ug), - CountryListItem(R.string.country_ua, 380, R.drawable.ic_list_country_ua), - CountryListItem(R.string.country_ae, 971, R.drawable.ic_list_country_ae), - CountryListItem(R.string.country_gb, 44, R.drawable.ic_list_country_gb), - CountryListItem(R.string.country_us, 1, R.drawable.ic_list_country_us), - CountryListItem(R.string.country_uy, 598, R.drawable.ic_list_country_uy), - CountryListItem(R.string.country_uz, 998, R.drawable.ic_list_country_uz), - CountryGroupTitle(R.string.group_title_v), + CountryListItem(R.string.country_tt, 1, R.drawable.ic_list_country_tt), + CountryListItem(R.string.country_tn, 216, R.drawable.ic_list_country_tn), + CountryListItem(R.string.country_tr, 90, R.drawable.ic_list_country_tr), + CountryListItem(R.string.country_tm, 993, R.drawable.ic_list_country_tm), + CountryListItem(R.string.country_tc, 1, R.drawable.ic_list_country_tc), + CountryListItem(R.string.country_ug, 256, R.drawable.ic_list_country_ug), + CountryListItem(R.string.country_ua, 380, R.drawable.ic_list_country_ua), + CountryListItem(R.string.country_ae, 971, R.drawable.ic_list_country_ae), + CountryListItem(R.string.country_gb, 44, R.drawable.ic_list_country_gb), + CountryListItem(R.string.country_us, 1, R.drawable.ic_list_country_us), + CountryListItem(R.string.country_uy, 598, R.drawable.ic_list_country_uy), + CountryListItem(R.string.country_uz, 998, R.drawable.ic_list_country_uz), // CountryListItem(R.string.country_vu, 678, R.drawable.ic_list_country_vu), - CountryListItem(R.string.country_ve, 58, R.drawable.ic_list_country_ve), - CountryListItem(R.string.country_vn, 84, R.drawable.ic_list_country_vn), - CountryListItem(R.string.country_vi, 1, R.drawable.ic_list_country_vi), - CountryGroupTitle(R.string.group_title_y), - CountryListItem(R.string.country_ye, 967, R.drawable.ic_list_country_ye), - CountryGroupTitle(R.string.group_title_z), - CountryListItem(R.string.country_zm, 260, R.drawable.ic_list_country_zm), - CountryListItem(R.string.country_zw, 263, R.drawable.ic_list_country_zw) - ) + CountryListItem(R.string.country_ve, 58, R.drawable.ic_list_country_ve), + CountryListItem(R.string.country_vn, 84, R.drawable.ic_list_country_vn), + CountryListItem(R.string.country_vi, 1, R.drawable.ic_list_country_vi), + CountryListItem(R.string.country_ye, 967, R.drawable.ic_list_country_ye), + CountryListItem(R.string.country_zm, 260, R.drawable.ic_list_country_zm), + CountryListItem(R.string.country_zw, 263, R.drawable.ic_list_country_zw) + ) + } + + private fun getCountryListInitialisedWithOptionsForAustralia(): MutableList { + return mutableListOf( + CountryGroupTitle(R.string.options_for_australia), + CountryListItem(R.string.country_au, 61, R.drawable.ic_list_country_au), + CountryListItem(R.string.country_nf, 672, R.drawable.ic_list_country_nf) + ) + } + + private fun getSortedAndGroupedCountryListBasedOnEnglish(context: Context): List { + val config = Configuration(context.resources.configuration) + config.setLocale(Locale.ENGLISH) + val configurationContext = context.createConfigurationContext(config) + + var groupTitle = "" + + val retVal = getCountryListInitialisedWithOptionsForAustralia() + + getCountries().sortedBy { + configurationContext.getText(it.countryNameResId).toString() + }.forEach { + val firstLetter = configurationContext.getText(it.countryNameResId).toString().first().toString() + + if (groupTitle != firstLetter) { + groupTitle = firstLetter + + retVal.add(CountryGroupTitle(null, groupTitle)) + } + + retVal.add(it) + } + + return retVal + } + + private fun getSortedCountryListBasedOnLocaleLanguage(context: Context): List { + val retVal = getCountryListInitialisedWithOptionsForAustralia() + + getCountries().sortedBy { + context.getString(it.countryNameResId) + }.forEach { + retVal.add(it) + } + + return retVal + } + + @RequiresApi(Build.VERSION_CODES.N) + private fun getSortedAndGroupedCountryListBasedOnLocaleLanguage(context: Context): List { + val alphabeticIndex: AlphabeticIndex = + AlphabeticIndex(Locale.getDefault()) + + getCountries().forEach { + val countryNameInLocaleLanguage = context.getString(it.countryNameResId) + alphabeticIndex.addRecord(countryNameInLocaleLanguage, it) + } + + val retVal = getCountryListInitialisedWithOptionsForAustralia() + + alphabeticIndex.forEach { bucket -> + if (bucket.size() > 0) { + retVal.add(CountryGroupTitle(null, bucket.label)) + + bucket.forEach { record -> + retVal.add(record.data) + } + } + } + + return retVal + } } \ No newline at end of file diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryListRecyclerView.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryListRecyclerView.kt index 7c1325d..0cf0b59 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryListRecyclerView.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/CountryListRecyclerView.kt @@ -23,8 +23,19 @@ class CountryListItem( ) : CountryListItemInterface class CountryGroupTitle( - val titleResId: Int -) : CountryListItemInterface + private val titleResId: Int?, + private val title: String? = null +) : CountryListItemInterface { + fun getTitle(context: Context): String { + return when (title) { + null -> titleResId?.let { + context.getString(it) + } ?: "" + else -> title + } + } +} + class CountryGroupTitleHolder( itemView: View @@ -107,8 +118,8 @@ class CountryListRecyclerViewAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is CountryGroupTitleHolder -> { - val title = context.getString((countryListItem[position] as CountryGroupTitle).titleResId) - holder.setCountryGroupTitle(title) + val countryGroupTitle = countryListItem[position] as CountryGroupTitle + holder.setCountryGroupTitle(countryGroupTitle.getTitle(context)) } is CountryListItemHolder -> { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt index 7c5dccf..843830c 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/dataprivacy/DataPrivacyFragment.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_data_privacy.view.* class DataPrivacyFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberFragment.kt index 4c59b8c..1c51f90 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberFragment.kt @@ -38,7 +38,6 @@ class EnterNumberFragment : PagerChildFragment() { const val ENTER_NUMBER_PROGRESS = "progress" } - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = 2 private val enterNumberPresenter = EnterNumberPresenter(this) @@ -154,8 +153,8 @@ class EnterNumberFragment : PagerChildFragment() { } fun navigateToOTPPage( - session: String?, - challengeName: String?, + session: String, + challengeName: String, callingCode: Int, phoneNumber: String) { val bundle = bundleOf( diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberPresenter.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberPresenter.kt index 53ae16e..4a12968 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberPresenter.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enternumber/EnterNumberPresenter.kt @@ -36,12 +36,7 @@ class EnterNumberPresenter(private val enterNumberFragment: EnterNumberFragment) val prefixZeroRemovedPhoneNumber = adjustPrefixForAustralianAndNorfolkPhoneNumber(callingCode, phoneNumber) - when { - enterNumberFragment.activity?.isInternetAvailable() == false -> { - enterNumberFragment.showCheckInternetError() - } - else -> makeOTPCall(callingCode, prefixZeroRemovedPhoneNumber) - } + makeOTPCall(callingCode, prefixZeroRemovedPhoneNumber) } /** @@ -73,11 +68,18 @@ class EnterNumberPresenter(private val enterNumberFragment: EnterNumberFragment) phoneNumber) }, onFailure = { - if (it is GetOnboardingOtpException.GetOtpInvalidNumberException) { - enterNumberFragment.showInvalidPhoneNumberPrompt(R.string.invalid_phone_number) - } else { - enterNumberFragment.showGenericError() + when { + it is GetOnboardingOtpException.GetOtpInvalidNumberException -> { + enterNumberFragment.showInvalidPhoneNumberPrompt(R.string.invalid_phone_number) + } + context.isInternetAvailable() -> { + enterNumberFragment.showGenericError() + } + else -> { + enterNumberFragment.showCheckInternetError() + } } + enterNumberFragment.hideLoading() enterNumberFragment.enableContinueButton() }) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinFragment.kt index e3bb502..40d1e29 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinFragment.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import androidx.annotation.NavigationRes import androidx.core.content.ContextCompat import au.gov.health.covidsafe.R +import au.gov.health.covidsafe.Utils.announceForAccessibility import au.gov.health.covidsafe.extensions.toHyperlink import au.gov.health.covidsafe.ui.PagerChildFragment import au.gov.health.covidsafe.ui.UploadButtonLayout @@ -30,7 +31,6 @@ class EnterPinFragment : PagerChildFragment() { const val ENTER_PIN_PROGRESS = "progress" } - override val navigationIcon = R.drawable.ic_up override var stepProgress: Int? = 3 private val COUNTDOWN_DURATION = 5 * 60L // OTP Code expiry @@ -38,6 +38,7 @@ class EnterPinFragment : PagerChildFragment() { private var alertDialog: AlertDialog? = null private var stopWatch: CountDownTimer? = null private lateinit var presenter: EnterPinPresenter + @NavigationRes private var destinationId: Int? = null @@ -47,10 +48,10 @@ class EnterPinFragment : PagerChildFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) arguments?.let { - val session = it.getString(ENTER_PIN_SESSION) - val challengeName = it.getString(ENTER_PIN_CHALLENGE_NAME) + val session = it.getString(ENTER_PIN_SESSION)!! + val challengeName = it.getString(ENTER_PIN_CHALLENGE_NAME)!! val callingCode = it.getInt(ENTER_PIN_CALLING_CODE) - val phoneNumber = it.getString(ENTER_PIN_PHONE_NUMBER) + val phoneNumber = it.getString(ENTER_PIN_PHONE_NUMBER)!! destinationId = it.getInt(ENTER_PIN_DESTINATION_ID) stepProgress = if (it.containsKey(ENTER_PIN_PROGRESS)) it.getInt(ENTER_PIN_PROGRESS) else null @@ -144,6 +145,8 @@ class EnterPinFragment : PagerChildFragment() { fun showInvalidOtp() { enter_pin_error_label.visibility = View.VISIBLE + // make the announcement in voice if talkback is turned on + announceForAccessibility(requireContext().getString(R.string.wrong_pin_number)) } private fun hideInvalidOtp() { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinPresenter.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinPresenter.kt index 17e1b9c..6ac28d9 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinPresenter.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/enterpin/EnterPinPresenter.kt @@ -17,10 +17,10 @@ import retrofit2.Callback import retrofit2.Response class EnterPinPresenter(private val enterPinFragment: EnterPinFragment, - private var session: String?, - private var challengeName: String?, + private var session: String, + private var challengeName: String, private val callingCode: Int, - private val phoneNumber: String?) : LifecycleObserver { + private val phoneNumber: String) : LifecycleObserver { private val TAG = this.javaClass.simpleName @@ -38,35 +38,29 @@ class EnterPinPresenter(private val enterPinFragment: EnterPinFragment, internal fun resendCode() { enterPinFragment.activity?.let { - when { - !it.isInternetAvailable() -> { - enterPinFragment.showCheckInternetError() - } - phoneNumber == null -> { - enterPinFragment.showGenericError() - } - else -> { - val context = enterPinFragment.requireContext() + val context = enterPinFragment.requireContext() - getOtp.invoke( - GetOtpParams( - countryCode = "+$callingCode", - phoneNumber = phoneNumber, - deviceId = Preference.getDeviceID(context), - postCode = Preference.getPostCode(context), - age = Preference.getAge(context), - name = Preference.getName(context) - ), - onSuccess = { - session = it.session - challengeName = it.challengeName - enterPinFragment.resetTimer() - }, - onFailure = { - enterPinFragment.showGenericError() - }) - } - } + getOtp.invoke( + GetOtpParams( + countryCode = "+$callingCode", + phoneNumber = phoneNumber, + deviceId = Preference.getDeviceID(context), + postCode = Preference.getPostCode(context), + age = Preference.getAge(context), + name = Preference.getName(context) + ), + onSuccess = { + session = it.session + challengeName = it.challengeName + enterPinFragment.resetTimer() + }, + onFailure = { + if (context.isInternetAvailable()) { + enterPinFragment.showGenericError() + } else { + enterPinFragment.showCheckInternetError() + } + }) } } @@ -75,10 +69,7 @@ class EnterPinPresenter(private val enterPinFragment: EnterPinFragment, enterPinFragment.showErrorOtpMustBeSixDigits() return } - if (enterPinFragment.activity?.isInternetAvailable() == false) { - enterPinFragment.showCheckInternetError() - return - } + enterPinFragment.disableContinueButton() enterPinFragment.showLoading() val authChallengeCall: Call = awsClient.respondToAuthChallenge(AuthChallengeRequest(session, otp)) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt index 7038983..1b61acc 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/howitworks/HowItWorksFragment.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_how_it_works.view.* class HowItWorksFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt index 04f8368..1817111 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/introduction/IntroductionFragment.kt @@ -12,7 +12,7 @@ import kotlinx.android.synthetic.main.fragment_intro.* class IntroductionFragment : PagerChildFragment() { - override val navigationIcon: Int? = null + override var navigationIconResId: Int? = null override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionDeviceNameFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionDeviceNameFragment.kt index e81d4a9..7ee9757 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionDeviceNameFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionDeviceNameFragment.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_permission_device_name.* class PermissionDeviceNameFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = 5 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionFragment.kt index c1a47fd..2295531 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permission/PermissionFragment.kt @@ -32,7 +32,6 @@ class PermissionFragment : PagerChildFragment(), EasyPermissions.PermissionCallb ) } - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = 4 private var navigationStarted = false diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permissionsuccess/PermissionSuccessFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permissionsuccess/PermissionSuccessFragment.kt index 2b6ace2..a67eb9a 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permissionsuccess/PermissionSuccessFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/permissionsuccess/PermissionSuccessFragment.kt @@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_permission_success.* class PermissionSuccessFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt index e366f77..704d045 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/personal/PersonalDetailsFragment.kt @@ -24,6 +24,7 @@ import java.util.regex.Pattern private val POST_CODE_REGEX = Pattern.compile("^(?:(?:[2-8]\\d|9[0-7]|0?[28]|0?9(?=09))(?:\\d{2}))$") +private val NAME_REGEX = Pattern.compile("^[A-Za-z0-9][A-Za-z'0-9\\\\-\\\\u00C0-\\\\u017F ]{0,80}\$") class PersonalDetailsFragment : PagerChildFragment() { @@ -31,7 +32,6 @@ class PersonalDetailsFragment : PagerChildFragment() { private var alertDialog: AlertDialog? = null override var stepProgress: Int? = 1 - override val navigationIcon: Int = R.drawable.ic_up private var ageSelected: Pair = Pair(-1, "") @@ -45,7 +45,8 @@ class PersonalDetailsFragment : PagerChildFragment() { age = ageSelected.first } - private fun isFullName() = name.trim().length > 1 + private fun isValidName() = NAME_REGEX.matcher(name).matches() + private fun isValidAge() = age >= 0 private fun isValidPostcode() = postcode.length == 4 && POST_CODE_REGEX.matcher(postcode).matches() @@ -107,7 +108,7 @@ class PersonalDetailsFragment : PagerChildFragment() { updatePersonalDetailsDataField() updateButtonState() - personal_details_name_error.visibility = if (hasFocus || isFullName()) { + personal_details_name_error.visibility = if (hasFocus || isValidName()) { View.GONE } else { View.VISIBLE @@ -189,7 +190,7 @@ class PersonalDetailsFragment : PagerChildFragment() { override fun updateButtonState() { updatePersonalDetailsDataField() - if (isFullName() && isValidAge() && isValidPostcode()) { + if (isValidName() && isValidAge() && isValidPostcode()) { enableContinueButton() } else { disableContinueButton() diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt index 850e400..2dcfc03 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/registrationconsent/RegistrationConsentFragment.kt @@ -13,7 +13,6 @@ import kotlinx.android.synthetic.main.fragment_registration_consent.* class RegistrationConsentFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/undersixteen/UnderSixteenFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/undersixteen/UnderSixteenFragment.kt index 93b8705..5a2d305 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/undersixteen/UnderSixteenFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/onboarding/fragment/undersixteen/UnderSixteenFragment.kt @@ -14,11 +14,8 @@ import kotlinx.android.synthetic.main.fragment_under_sixteen.* class UnderSixteenFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up - override var stepProgress: Int? = null - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View? = inflater.inflate(R.layout.fragment_under_sixteen, container, false) diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/UploadContainerFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/UploadContainerFragment.kt index 489b42f..774b2e3 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/UploadContainerFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/UploadContainerFragment.kt @@ -13,7 +13,9 @@ import au.gov.health.covidsafe.ui.PagerContainer import au.gov.health.covidsafe.ui.UploadButtonLayout import com.github.razir.progressbutton.hideProgress import com.github.razir.progressbutton.showProgress +import kotlinx.android.synthetic.main.fragment_help.* import kotlinx.android.synthetic.main.fragment_upload_master.* +import kotlinx.android.synthetic.main.fragment_upload_master.toolbar class UploadContainerFragment : Fragment(), PagerContainer { @@ -24,6 +26,11 @@ class UploadContainerFragment : Fragment(), PagerContainer { toolbar.setNavigationOnClickListener { activity?.onBackPressed() } + + if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + toolbar.navigationIcon = + requireContext().getDrawable(R.drawable.ic_up_rtl) + } } override fun onPause() { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadFinishedFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadFinishedFragment.kt index 119577b..0e208c4 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadFinishedFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadFinishedFragment.kt @@ -12,7 +12,7 @@ import kotlinx.android.synthetic.main.fragment_upload_finished.* class UploadFinishedFragment : PagerChildFragment() { - override val navigationIcon: Int? = null + override var navigationIconResId: Int? = null override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadInitialFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadInitialFragment.kt index 9d706ec..01a70b6 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadInitialFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadInitialFragment.kt @@ -13,8 +13,6 @@ import kotlinx.android.synthetic.main.fragment_upload_page_4.root class UploadInitialFragment : PagerChildFragment() { - override val navigationIcon: Int? = R.drawable.ic_up - override var stepProgress: Int? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadStepFourFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadStepFourFragment.kt index c3df3dc..7a6ed7f 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadStepFourFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/UploadStepFourFragment.kt @@ -38,8 +38,6 @@ class UploadStepFourFragment : PagerChildFragment() { enableContinueButton() } - override val navigationIcon: Int? = R.drawable.ic_up - override fun getUploadButtonLayout() = UploadButtonLayout.ContinueLayout( R.string.consent_button) { navigateToVerifyUploadPin() diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinFragment.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinFragment.kt index 705f156..30103dc 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinFragment.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinFragment.kt @@ -33,7 +33,6 @@ class VerifyUploadPinFragment : PagerChildFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_verify_upload_pin, container, false) - override val navigationIcon: Int? = R.drawable.ic_up override var stepProgress: Int? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinPresenter.kt b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinPresenter.kt index 5a7a0e5..494bb1d 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinPresenter.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/upload/presentation/VerifyUploadPinPresenter.kt @@ -36,39 +36,39 @@ class VerifyUploadPinPresenter(private val fragment: VerifyUploadPinFragment) : } internal fun uploadData(otp: String) { - if (fragment.activity?.isInternetAvailable() == false) { - fragment.showCheckInternetError() - } else { - fragment.disableContinueButton() - fragment.showDialogLoading() - uploadData.invoke(otp, - onSuccess = { - if (!BuildConfig.DEBUG) { - GlobalScope.launch { recordStorage.nukeDbAsync() } - } - fragment.context?.let { context -> - Preference.setDataIsUploaded(context, true) - } - fragment.navigateToNextPage() - }, - onFailure = { - when (it) { - is UploadDataException.UploadDataIncorrectPinException -> { - fragment.showInvalidOtp() - } - is UploadDataException.UploadDataJwtExpiredException -> { - fragment.navigateToRegister() - } - else -> { - fragment.showGenericError() - } - } - fragment.enableContinueButton() - fragment.hideKeyboard() - fragment.hideLoading() + fragment.disableContinueButton() + fragment.showDialogLoading() + uploadData.invoke(otp, + onSuccess = { + if (!BuildConfig.DEBUG) { + GlobalScope.launch { recordStorage.nukeDbAsync() } } - ) - } + fragment.context?.let { context -> + Preference.setDataIsUploaded(context, true) + } + fragment.navigateToNextPage() + }, + onFailure = { + when { + it is UploadDataException.UploadDataIncorrectPinException -> { + fragment.showInvalidOtp() + } + it is UploadDataException.UploadDataJwtExpiredException -> { + fragment.navigateToRegister() + } + fragment.activity?.isInternetAvailable() == true -> { + fragment.showGenericError() + } + else -> { + fragment.showCheckInternetError() + } + } + + fragment.enableContinueButton() + fragment.hideKeyboard() + fragment.hideLoading() + } + ) } } diff --git a/app/src/main/java/au/gov/health/covidsafe/ui/view/PinInputView.kt b/app/src/main/java/au/gov/health/covidsafe/ui/view/PinInputView.kt index 59f9435..565ea4a 100644 --- a/app/src/main/java/au/gov/health/covidsafe/ui/view/PinInputView.kt +++ b/app/src/main/java/au/gov/health/covidsafe/ui/view/PinInputView.kt @@ -10,7 +10,11 @@ import androidx.core.widget.doAfterTextChanged import kotlinx.android.synthetic.main.view_pin.view.* import au.gov.health.covidsafe.R -class PinInputView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = -1) : ConstraintLayout(context, attrs, defStyle) { +class PinInputView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = -1) : + ConstraintLayout(context, attrs, defStyle) { private val pinOne: EditText? by lazy { pin_1 } private val pinTwo: EditText? by lazy { pin_2 } diff --git a/app/src/main/res/drawable/ic_help_outline_black.xml b/app/src/main/res/drawable/ic_help_outline_black.xml index ab6f7c8..50027b4 100644 --- a/app/src/main/res/drawable/ic_help_outline_black.xml +++ b/app/src/main/res/drawable/ic_help_outline_black.xml @@ -1,12 +1,9 @@ - - + - - - - - diff --git a/app/src/main/res/drawable/ic_up.xml b/app/src/main/res/drawable/ic_up.xml index c1704dc..f08e47c 100644 --- a/app/src/main/res/drawable/ic_up.xml +++ b/app/src/main/res/drawable/ic_up.xml @@ -1,9 +1,20 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M19,12H5" + android:strokeLineJoin="round" + android:strokeWidth="2" + android:fillColor="#00000000" + android:strokeColor="#131313" + android:strokeLineCap="round"/> + diff --git a/app/src/main/res/drawable/ic_up_rtl.xml b/app/src/main/res/drawable/ic_up_rtl.xml new file mode 100644 index 0000000..64357d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_up_rtl.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/layout/activity_country_code_selection.xml b/app/src/main/res/layout/activity_country_code_selection.xml index 4aa960b..305ce0a 100644 --- a/app/src/main/res/layout/activity_country_code_selection.xml +++ b/app/src/main/res/layout/activity_country_code_selection.xml @@ -13,35 +13,36 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:navigationIcon="@drawable/ic_up" - app:navigationContentDescription="@string/navigation_back_button_content_description"/> + app:navigationContentDescription="@string/navigation_back_button_content_description" + app:navigationIcon="@drawable/ic_up" /> + android:text="@string/search" + android:textAlignment="viewStart" /> - + android:paddingBottom="@dimen/keyline_0"> + + android:src="@drawable/ic_search" /> + android:layout_height="match_parent" + android:layout_marginTop="@dimen/keyline_4"> + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|end" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_self_isolation.xml b/app/src/main/res/layout/activity_self_isolation.xml index 4e16166..3bfdd05 100644 --- a/app/src/main/res/layout/activity_self_isolation.xml +++ b/app/src/main/res/layout/activity_self_isolation.xml @@ -29,8 +29,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/illustration_upload_finished" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/dialog_error_uploading.xml b/app/src/main/res/layout/dialog_error_uploading.xml index 4f177f9..f0e112c 100644 --- a/app/src/main/res/layout/dialog_error_uploading.xml +++ b/app/src/main/res/layout/dialog_error_uploading.xml @@ -11,8 +11,8 @@ android:src="@drawable/ic_upload_failed" app:layout_constraintHeight_percent="0.3" app:layout_constraintBottom_toTopOf="@+id/home_data_uploaded_error_message" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="spread" /> @@ -21,13 +21,13 @@ style="?textAppearanceBody1" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/keyline_7" - android:layout_marginRight="@dimen/keyline_7" + android:layout_marginStart="@dimen/keyline_7" + android:layout_marginEnd="@dimen/keyline_7" android:text="@string/dialog_error_uploading_message" android:gravity="center_horizontal" app:layout_constraintBottom_toTopOf="@+id/dialog_error_positive" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/data_uploaded_error_progress_bar" app:layout_constraintVertical_chainStyle="spread" /> @@ -41,8 +41,8 @@ android:layout_marginEnd="@dimen/keyline_4" android:text="@string/dialog_error_uploading_positive" app:layout_constraintBottom_toTopOf="@+id/dialog_error_negative" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/home_data_uploaded_error_message" app:layout_constraintVertical_chainStyle="packed" /> @@ -56,8 +56,8 @@ android:layout_marginEnd="@dimen/keyline_4" android:text="@string/dialog_error_uploading_negative" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintVertical_chainStyle="packed" app:layout_constraintTop_toBottomOf="@+id/dialog_error_positive" /> diff --git a/app/src/main/res/layout/dialog_uploading.xml b/app/src/main/res/layout/dialog_uploading.xml index 56d3c21..436bdd8 100644 --- a/app/src/main/res/layout/dialog_uploading.xml +++ b/app/src/main/res/layout/dialog_uploading.xml @@ -10,8 +10,8 @@ android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/home_data_uploading_message" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHeight_percent="0.5" app:layout_constraintVertical_chainStyle="spread" @@ -25,13 +25,13 @@ style="?textAppearanceBody1" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/keyline_7" - android:layout_marginRight="@dimen/keyline_7" + android:layout_marginStart="@dimen/keyline_7" + android:layout_marginEnd="@dimen/keyline_7" android:text="@string/dialog_uploading_message" android:gravity="center_horizontal" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/data_uploading_progress_bar" app:layout_constraintVertical_chainStyle="spread" /> diff --git a/app/src/main/res/layout/fragment_data_privacy.xml b/app/src/main/res/layout/fragment_data_privacy.xml index 7b78a75..f17006e 100644 --- a/app/src/main/res/layout/fragment_data_privacy.xml +++ b/app/src/main/res/layout/fragment_data_privacy.xml @@ -17,8 +17,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_privacy" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + android:src="@drawable/ic_right" + android:textAlignment="viewEnd" /> @@ -84,8 +88,10 @@ android:layout_marginStart="@dimen/keyline_5" android:layout_marginTop="@dimen/keyline_5" android:layout_marginEnd="@dimen/keyline_5" - android:gravity="center_vertical" + android:gravity="center_vertical|start" + android:importantForAccessibility="no" android:text="@string/enter_number_headline" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -100,6 +106,7 @@ android:layout_marginEnd="@dimen/keyline_5" android:autofillHints="phoneNational" android:background="@drawable/edittext_modified_states" + android:contentDescription="@string/enter_number_headline" android:digits="0123456789" android:inputType="number|phone" android:maxLength="20" @@ -107,6 +114,7 @@ android:paddingStart="@dimen/keyline_1" android:paddingEnd="@dimen/keyline_1" android:singleLine="true" + android:textAlignment="viewStart" android:textColor="@color/slack_black" android:textColorHighlight="@color/dark_cerulean_3" android:textCursorDrawable="@null" @@ -122,6 +130,7 @@ android:layout_marginTop="4dp" android:layout_marginEnd="@dimen/keyline_5" android:text="@string/invalid_phone_number" + android:textAlignment="viewStart" android:textColor="@color/error" android:textSize="16sp" android:visibility="gone" @@ -140,6 +149,7 @@ android:layout_marginTop="@dimen/keyline_4" android:layout_marginEnd="@dimen/keyline_5" android:text="@string/enter_number_content" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -179,6 +189,7 @@ android:layout_marginStart="@dimen/keyline_1" android:layout_marginEnd="@dimen/keyline_4" android:text="@string/enter_number_relative" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody2" android:textColor="@color/slack_black" app:layout_constraintEnd_toEndOf="@+id/enter_number_relativebackground" diff --git a/app/src/main/res/layout/fragment_enter_pin.xml b/app/src/main/res/layout/fragment_enter_pin.xml index 3c49c9b..aed9b76 100644 --- a/app/src/main/res/layout/fragment_enter_pin.xml +++ b/app/src/main/res/layout/fragment_enter_pin.xml @@ -1,12 +1,11 @@ + android:fillViewport="true"> + app:layout_constraintTop_toBottomOf="@+id/pin" + tools:text="@string/wrong_pin_number" + tools:visibility="visible" /> @@ -76,9 +79,11 @@ style="?textAppearanceBody2" android:layout_width="wrap_content" android:layout_height="wrap_content" - tools:text="1:59" + android:textAlignment="viewStart" + android:layout_marginStart="@dimen/keyline_0" app:layout_constraintStart_toEndOf="@+id/enter_pin_timer_label" - app:layout_constraintTop_toTopOf="@+id/enter_pin_timer_label" /> + app:layout_constraintTop_toTopOf="@+id/enter_pin_timer_label" + tools:text="1:59" /> @@ -105,10 +111,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" - android:gravity="center_vertical" + android:gravity="center_vertical|start" android:text="@string/pin_issue" - android:textColorLink="?attr/colorPrimary" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceSubtitle1" + android:textColorLink="?attr/colorPrimary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/enter_pin_resend_pin" /> diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 972c372..6a655ed 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -28,20 +28,22 @@ android:background="@color/lighter_green" app:layout_constraintTop_toBottomOf="@+id/header_barrier" /> - - @@ -48,9 +48,9 @@ style="?textAppearanceBody1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/keyline_4" + android:layout_marginStart="@dimen/keyline_4" android:layout_marginTop="@dimen/keyline_4" - android:layout_marginRight="@dimen/keyline_4" + android:layout_marginEnd="@dimen/keyline_4" android:layout_marginBottom="@dimen/keyline_4" android:includeFontPadding="false" android:text="@string/home_app_permission_status_subtitle" /> diff --git a/app/src/main/res/layout/fragment_how_it_works.xml b/app/src/main/res/layout/fragment_how_it_works.xml index ec25b5c..272356a 100644 --- a/app/src/main/res/layout/fragment_how_it_works.xml +++ b/app/src/main/res/layout/fragment_how_it_works.xml @@ -16,8 +16,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_how_it_works" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_permission_device_name.xml b/app/src/main/res/layout/fragment_permission_device_name.xml index 00c8d12..d1ff355 100644 --- a/app/src/main/res/layout/fragment_permission_device_name.xml +++ b/app/src/main/res/layout/fragment_permission_device_name.xml @@ -18,8 +18,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_permission" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_personal_details.xml b/app/src/main/res/layout/fragment_personal_details.xml index 8ba854c..530c7b6 100644 --- a/app/src/main/res/layout/fragment_personal_details.xml +++ b/app/src/main/res/layout/fragment_personal_details.xml @@ -19,8 +19,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_0" - android:text="@string/personal_details_headline" android:contentDescription="@string/personal_details_headline_content_description" + android:text="@string/personal_details_headline" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -31,9 +32,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" - android:text="@string/personal_details_name_title" - android:textAppearance="?textAppearanceBody1" android:importantForAccessibility="no" + android:text="@string/personal_details_name_title" + android:textAlignment="viewStart" + android:textAppearance="?textAppearanceBody1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_headline" /> @@ -44,16 +46,17 @@ android:layout_height="@dimen/text_field_height" android:layout_marginTop="@dimen/keyline_1" android:background="@drawable/edittext_modified_states" + android:contentDescription="@string/personal_details_name_content_description" android:inputType="textPersonName" android:maxLines="1" android:paddingStart="@dimen/keyline_1" android:paddingEnd="@dimen/keyline_1" android:singleLine="true" + android:textAlignment="viewStart" android:textColor="@color/slack_black" android:textColorHighlight="@color/dark_cerulean_3" android:textCursorDrawable="@null" android:textSize="@dimen/text_body_small" - android:contentDescription="@string/personal_details_name_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_name_title" @@ -64,7 +67,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_1" - android:text="@string/personal_details_name_error_prompt" + android:text="@string/personal_details_name_characters_prompt" + android:textAlignment="viewStart" android:textColor="@color/error" android:visibility="gone" app:layout_constraintStart_toEndOf="parent" @@ -84,9 +88,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" - android:text="@string/personal_details_age_title" - android:textAppearance="?textAppearanceBody1" android:importantForAccessibility="no" + android:text="@string/personal_details_age_title" + android:textAlignment="viewStart" + android:textAppearance="?textAppearanceBody1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_name_barrier" /> @@ -97,16 +102,17 @@ android:layout_height="@dimen/text_field_height" android:layout_marginTop="@dimen/keyline_1" android:background="@drawable/edit_text_black_background" - android:gravity="center_vertical" + android:contentDescription="@string/personal_details_age_content_description" + android:drawableRight="@drawable/ic_arrow_drop_down" + android:drawableTint="@color/black" + android:gravity="center_vertical|start" android:paddingStart="@dimen/keyline_1" android:paddingEnd="@dimen/keyline_1" + android:textAlignment="viewStart" android:textColor="@color/slack_black" android:textColorHighlight="@color/dark_cerulean_3" android:textCursorDrawable="@null" android:textSize="@dimen/text_body_small" - android:drawableRight="@drawable/ic_arrow_drop_down" - android:drawableTint="@color/black" - android:contentDescription="@string/personal_details_age_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_age_title" @@ -118,6 +124,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_1" android:text="@string/personal_details_age_error_prompt" + android:textAlignment="viewStart" android:textColor="@color/error" android:visibility="gone" app:layout_constraintStart_toEndOf="parent" @@ -137,9 +144,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" - android:text="@string/personal_details_post_code" - android:textAppearance="?textAppearanceBody1" android:importantForAccessibility="no" + android:text="@string/personal_details_post_code" + android:textAlignment="viewStart" + android:textAppearance="?textAppearanceBody1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_age_barrier" /> @@ -150,18 +158,20 @@ android:layout_height="@dimen/text_field_height" android:layout_marginTop="@dimen/keyline_1" android:background="@drawable/edittext_modified_states" + android:contentDescription="@string/personal_details_post_code_content_description" android:digits="0123456789" - android:gravity="center_vertical" + android:gravity="center_vertical|start" + android:imeOptions="actionDone" android:inputType="number" android:maxLength="4" android:paddingStart="@dimen/keyline_1" android:paddingEnd="@dimen/keyline_1" + android:textDirection="locale" + android:textAlignment="viewStart" android:textColor="@color/slack_black" android:textColorHighlight="@color/dark_cerulean_3" android:textCursorDrawable="@null" android:textSize="@dimen/text_body_small" - android:imeOptions="actionDone" - android:contentDescription="@string/personal_details_post_code_content_description" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/personal_details_post_code_title" diff --git a/app/src/main/res/layout/fragment_registration_consent.xml b/app/src/main/res/layout/fragment_registration_consent.xml index 058eb7a..21975de 100644 --- a/app/src/main/res/layout/fragment_registration_consent.xml +++ b/app/src/main/res/layout/fragment_registration_consent.xml @@ -29,6 +29,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" android:text="@string/registration_consent_content" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" @@ -52,6 +53,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" @@ -65,6 +67,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" android:text="@string/consent_call_for_action" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_under_sixteen.xml b/app/src/main/res/layout/fragment_under_sixteen.xml index 15e33ca..e75dc22 100644 --- a/app/src/main/res/layout/fragment_under_sixteen.xml +++ b/app/src/main/res/layout/fragment_under_sixteen.xml @@ -17,8 +17,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_6" - android:text="@string/under_sixteen_headline" android:contentDescription="@string/under_sixteen_headline_content_description" + android:text="@string/under_sixteen_headline" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceHeadline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -41,6 +42,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" @@ -53,6 +55,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" @@ -65,6 +68,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/keyline_4" android:text="@string/consent_call_for_action" + android:textAlignment="viewStart" android:textAppearance="?textAppearanceBody1" android:textColorLink="@color/hyperlink_enabled" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_upload_initial.xml b/app/src/main/res/layout/fragment_upload_initial.xml index d052f19..c96ecd0 100644 --- a/app/src/main/res/layout/fragment_upload_initial.xml +++ b/app/src/main/res/layout/fragment_upload_initial.xml @@ -16,8 +16,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_illustration_upload_inital_state" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + android:contentDescription="@string/upload_step_4_header_content_description" /> @@ -68,8 +68,8 @@ android:tint="@color/off_white" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@id/modelc" - app:layout_constraintRight_toLeftOf="@id/modelp" + app:layout_constraintStart_toEndOf="@id/modelc" + app:layout_constraintEnd_toStartOf="@id/modelp" /> @@ -79,8 +79,8 @@ android:layout_height="wrap_content" android:text="Peripheral" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintLeft_toLeftOf="@id/modelp" - app:layout_constraintRight_toRightOf="@id/modelp" + app:layout_constraintStart_toStartOf="@id/modelp" + app:layout_constraintEnd_toEndOf="@id/modelp" /> @@ -91,7 +91,7 @@ android:textSize="16sp" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintRight_toRightOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_peri" android:textColor="@color/off_white" /> @@ -150,8 +150,8 @@ android:layout_height="wrap_content" android:text="ModelC" android:textSize="16sp" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toLeftOf="@id/filter_by_modelp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/filter_by_modelp" app:layout_constraintTop_toTopOf="parent" />