Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
TEHIK
hoia
dp3t-app-android
Commits
b087f1c8
Commit
b087f1c8
authored
Jun 21, 2021
by
Harri Kirik
Browse files
Merge branch 'feature/COVAPP-462-cross-country-strings' into 'develop'
Update cross-country strings See merge request hoia/dp3t-app-android!135
parents
a39d9b47
b7b235f6
Changes
23
Hide whitespace changes
Inline
Side-by-side
app/src/debug/java/org/dpppt/android/app/debug/debugmenu/DebugMenuFragment.kt
View file @
b087f1c8
...
...
@@ -175,6 +175,7 @@ class DebugMenuFragment : MvvmFragment(), ViewBindingHolder<FragmentDebugBinding
buttonDebugStateContactNotification
.
setOnClickListener
{
notifier
.
createNewContactNotification
(
requireActivity
(),
-
1
)
}
buttonDebugStatePreShareScreen
.
setOnClickListener
{
setupAndNavigateToPreShareScreen
()
}
buttonDebugStateShareScreenError
.
setOnClickListener
{
showShareDeniedErrorDialog
()
}
buttonDebugStateShareScreenSuccess
.
setOnClickListener
{
showShareSuccessScreen
()
}
buttonDebugStateOpenSettingsAndScrollToCrossCountry
.
setOnClickListener
{
openSettingsAndScrollToCrossCountry
()
}
buttonDebugStateCrossCountryPopUp
.
setOnClickListener
{
openCrossCountryPopUp
()
}
}
...
...
@@ -282,6 +283,11 @@ class DebugMenuFragment : MvvmFragment(), ViewBindingHolder<FragmentDebugBinding
findNavController
().
navigate
(
DebugMenuFragmentDirections
.
crossCountryPopUp
())
}
private
fun
showShareSuccessScreen
()
{
// Navigate
findNavController
().
navigate
(
DebugMenuFragmentDirections
.
confirmInfectionResult
(
PatientPortalResult
.
DebugJustDone
))
}
companion
object
{
private
const
val
TAG_DIALOG_ERROR
=
"DebugFragment.TAG_DIALOG_ERROR"
private
const
val
TAG_DIALOG_SHARE_ERROR
=
"DebugFragment.TAG_DIALOG_SHARE_ERROR"
...
...
app/src/icefire/java/org/dpppt/android/app/IcefireEnvironment.kt
View file @
b087f1c8
...
...
@@ -30,14 +30,14 @@ object IcefireEnvironment : Environment {
ru
=
"https://www.hoia.me/ru?source=app"
)
override
val
contactInfoPageUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://www.hoia.me/contact?source=app"
,
en
=
"https://www.hoia.me/en/contact?source=app"
,
ru
=
"https://www.hoia.me/ru/contact?source=app"
et
=
"https://www.hoia.me/
close-
contact?source=app"
,
en
=
"https://www.hoia.me/en/
close-
contact?source=app"
,
ru
=
"https://www.hoia.me/ru/
close-
contact?source=app"
)
override
val
privacyPolicyUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://hoia.me/privacy?source=app"
,
en
=
"https://hoia.me/en/privacy?source=app"
,
ru
=
"https://hoia.me/ru/privacy?source=app"
et
=
"https://
www.
hoia.me/privacy?source=app"
,
en
=
"https://
www.
hoia.me/en/privacy?source=app"
,
ru
=
"https://
www.
hoia.me/ru/privacy?source=app"
)
override
val
covidInstructionsUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://www.terviseamet.ee/et/patsiendi-koduse-ravi-juhend-covid-19-korral"
,
...
...
@@ -45,9 +45,14 @@ object IcefireEnvironment : Environment {
ru
=
"https://www.terviseamet.ee/ru/instrukciya-po-lecheniyu-na-domu-pacienta-s-covid-19"
)
override
val
healthBoardRecommendationsUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis"
,
en
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis#ENG"
,
ru
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis#RUS"
et
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis#est"
,
en
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis#eng"
,
ru
=
"https://www.terviseamet.ee/et/lahikontaktse-juhis#rus"
)
override
val
gotSickAbroadUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://www.hoia.me/hoia-euroopas?source=app"
,
en
=
"https://www.hoia.me/en/hoia-in-europe?source=app"
,
ru
=
"https://hoia.me/ru/hoia-v-yevrope?source=app"
)
override
val
appLogEnabled
:
Boolean
=
BuildConfig
.
DEBUG
override
val
crashAppOnUndeliverableException
:
Boolean
=
BuildConfig
.
DEBUG
...
...
@@ -55,9 +60,4 @@ object IcefireEnvironment : Environment {
override
val
allowInfectionConfirmationStartWithoutGAEN
:
Boolean
=
BuildConfig
.
DEBUG
override
val
federationGatewayUsageForDP3TBackend
:
FederationGatewayUsageForDP3TBackend
=
FederationGatewayUsageForDP3TBackend
.
Enabled
override
val
federationGatewayUsageForPatientPortal
:
FederationGatewayUsageForPatientPortal
=
FederationGatewayUsageForPatientPortal
.
Enabled
override
val
gotSickAbroadUrl
:
LocalizedUrl
=
LocalizedUrl
(
et
=
"https://www.hoia.me/got-sick-abroad?source=app"
,
en
=
"https://www.hoia.me/got-sick-abroad/en?source=app"
,
ru
=
"https://www.hoia.me/got-sick-abroad/ru?source=app"
)
}
app/src/main/java/org/dpppt/android/app/Environment.kt
View file @
b087f1c8
...
...
@@ -27,6 +27,10 @@ interface Environment {
val
covidInstructionsUrl
:
LocalizedUrl
val
healthBoardRecommendationsUrl
:
LocalizedUrl
val
privacyPolicyUrl
:
LocalizedUrl
/**
* URL to Hoia.me page's got sick abroad information.
*/
val
gotSickAbroadUrl
:
LocalizedUrl
// Is app logging enabled?
val
appLogEnabled
:
Boolean
// Should we display the long version string with backend and SDK info?
...
...
@@ -45,8 +49,4 @@ interface Environment {
* Flag to use when doing PP side infection confirmation. See [FederationGatewayUsageForPatientPortal] for more.
*/
val
federationGatewayUsageForPatientPortal
:
FederationGatewayUsageForPatientPortal
/**
* URL to Hoia.me page's got sick abroad information.
*/
val
gotSickAbroadUrl
:
LocalizedUrl
}
app/src/main/java/org/dpppt/android/app/common/util/Extensions.kt
View file @
b087f1c8
...
...
@@ -69,6 +69,16 @@ fun TextView.addUrlSpans() {
fun
TextView
.
setTextWithClickableSpan
(
source
:
String
,
clickablePart
:
String
,
clickListener
:
()
->
Unit
)
{
val
spannable
=
SpannableString
(
source
)
addClickableSpan
(
spannable
,
clickablePart
,
clickListener
)
this
.
text
=
spannable
movementMethod
=
LinkMovementMethod
.
getInstance
()
}
private
fun
TextView
.
addClickableSpan
(
spannable
:
SpannableString
,
clickablePart
:
String
,
clickListener
:
()
->
Unit
)
{
spannable
.
addSpan
(
clickablePart
,
object
:
ClickableSpan
()
{
...
...
@@ -82,8 +92,6 @@ fun TextView.setTextWithClickableSpan(source: String, clickablePart: String, cli
}
}
)
this
.
text
=
spannable
movementMethod
=
LinkMovementMethod
.
getInstance
()
}
private
fun
updateDrawStateWithPaint
(
paint
:
TextPaint
,
context
:
Context
)
{
...
...
app/src/main/java/org/dpppt/android/app/contacts/ContactsFragment.kt
View file @
b087f1c8
...
...
@@ -17,6 +17,7 @@ import org.dpppt.android.app.common.util.ViewBindingHolder
import
org.dpppt.android.app.common.util.ViewModelFactory
import
org.dpppt.android.app.common.util.addUrlSpans
import
org.dpppt.android.app.common.util.exhaustive
import
org.dpppt.android.app.common.util.setTextWithBoldSpans
import
org.dpppt.android.app.common.util.setTextWithClickableSpan
import
org.dpppt.android.app.databinding.FragmentContactsBinding
import
org.dpppt.android.app.di.Injector
...
...
@@ -64,8 +65,8 @@ class ContactsFragment : MvvmFragment(R.layout.fragment_contacts), ViewBindingHo
private
fun
handleAction
(
action
:
ContactsViewModel
.
Action
)
{
when
(
action
)
{
is
ContactsViewModel
.
Action
.
NavigateHome
->
findNavController
().
navigate
(
ContactsFragmentDirections
.
home
()
)
is
ContactsViewModel
.
Action
.
OpenContactsInfoUrl
->
startActivity
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
action
.
url
)))
is
ContactsViewModel
.
Action
.
NavigateHome
->
returnHomeWithoutRestart
()
is
ContactsViewModel
.
Action
.
OpenContactsInfoUrl
->
startActivity
Safely
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
action
.
url
)))
is
ContactsViewModel
.
Action
.
OpenHealthBoardRecommendationsUrl
->
startActivitySafely
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
action
.
url
)
...
...
@@ -74,26 +75,33 @@ class ContactsFragment : MvvmFragment(R.layout.fragment_contacts), ViewBindingHo
}.
exhaustive
}
private
fun
returnHomeWithoutRestart
()
{
findNavController
().
popBackStack
()
}
private
fun
showContacts
(
contacts
:
InfectedStatus
)
{
if
(
contacts
!
is
InfectedStatus
.
HasContacts
)
{
return
}
requireBinding
{
titleView
.
text
=
resources
.
getQuantityString
(
R
.
plurals
.
contacts_detected_title
,
contacts
.
num
,
contacts
.
num
)
descriptionStayHomeView
.
text
=
getString
(
R
.
string
.
contacts_detected_text_stay_home
,
DateUtils
.
getFormattedLocalDate
(
contacts
.
stayHomeUntilDate
))
setupStayHomeText
(
contacts
)
}
}
private
fun
FragmentContactsBinding
.
setupStayHomeText
(
contacts
:
InfectedStatus
.
HasContacts
)
{
val
dateString
=
DateUtils
.
getFormattedLocalDate
(
contacts
.
stayHomeUntilDate
)
val
message
=
getString
(
R
.
string
.
contacts_detected_text_stay_home
,
dateString
)
descriptionStayHomeView
.
setTextWithBoldSpans
(
message
,
dateString
)
}
private
fun
initClickableText
()
{
requireBinding
{
descriptionCallView
.
addUrlSpans
()
healthBoardRecommendationsView
.
setTextWithClickableSpan
(
getString
(
R
.
string
.
contacts_health_board_recommendations_link
),
getString
(
R
.
string
.
contacts_health_board_recommendations_link_clickable_part
)
)
{
viewModel
.
healthBoardRecommendationsClicked
()
}
getString
(
R
.
string
.
contacts_health_board_recommendations
),
getString
(
R
.
string
.
contacts_health_board_recommendations_clickable_part
),
)
{
viewModel
.
healthBoardRecommendationsClicked
()
}
}
}
}
app/src/main/java/org/dpppt/android/app/domain/entity/enums/PatientPortalResult.kt
View file @
b087f1c8
...
...
@@ -32,4 +32,14 @@ sealed class PatientPortalResult : Parcelable {
return
"PatientPortalResult.Error(exception=$exception)"
}
}
/**
* A debug option that allows to navigate directly to specific steps in the infection confirmation process.
*/
@Parcelize
object
DebugJustDone
:
PatientPortalResult
()
{
override
fun
toString
():
String
{
return
"PatientPortalResult.DebugJustDone()"
}
}
}
app/src/main/java/org/dpppt/android/app/home/HomeFragment.kt
View file @
b087f1c8
...
...
@@ -17,11 +17,11 @@ import androidx.navigation.fragment.findNavController
import
mobi.lab.mvvm.MvvmFragment
import
org.dpppt.android.app.BuildConfig
import
org.dpppt.android.app.R
import
org.dpppt.android.app.common.util.
ViewBindingHolder
import
org.dpppt.android.app.common.util.
DateUtils
import
org.dpppt.android.app.common.util.FragmentBindingHolder
import
org.dpppt.android.app.common.util.ViewBindingHolder
import
org.dpppt.android.app.common.util.ViewModelFactory
import
org.dpppt.android.app.common.util.exhaustive
import
org.dpppt.android.app.common.util.DateUtils
import
org.dpppt.android.app.common.util.setTextWithBoldSpans
import
org.dpppt.android.app.databinding.FragmentHomeBinding
import
org.dpppt.android.app.di.Injector
...
...
app/src/main/java/org/dpppt/android/app/infection/patientportal/ConfirmInfectionPatientPortalViewModel.kt
View file @
b087f1c8
...
...
@@ -15,6 +15,7 @@ import org.dpppt.android.app.domain.usecase.infection.patientportal.PreparePatie
import
org.dpppt.android.app.domain.usecase.infection.request.DeleteConfirmInfectionRequestUseCase
import
org.dpppt.android.app.util.dispose
import
timber.log.Timber
import
java.lang.IllegalArgumentException
import
javax.inject.Inject
class
ConfirmInfectionPatientPortalViewModel
@Inject
constructor
(
...
...
@@ -74,6 +75,10 @@ class ConfirmInfectionPatientPortalViewModel @Inject constructor(
cleanupAndContinueWithTheResult
(
portalResult
)
true
}
is
PatientPortalResult
.
DebugJustDone
->
{
// Not supported here
throw
IllegalArgumentException
(
"The PatientPortalResult.DebugJustDone is not supported for this screen!"
)
}
}.
exhaustive
}
...
...
app/src/main/java/org/dpppt/android/app/infection/result/ConfirmInfectionResultViewModel.kt
View file @
b087f1c8
...
...
@@ -46,6 +46,7 @@ class ConfirmInfectionResultViewModel @Inject constructor(
PatientPortalResult
.
InProgress
->
{
// No-op, will not happen here
}
is
PatientPortalResult
.
DebugJustDone
->
onSendInfectedStatusSuccess
()
}.
exhaustive
}
...
...
app/src/main/java/org/dpppt/android/app/mydata/MyDataFragment.kt
View file @
b087f1c8
...
...
@@ -78,7 +78,8 @@ class MyDataFragment : MvvmFragment(R.layout.fragment_my_data), ViewBindingHolde
when
(
action
)
{
is
MyDataViewModel
.
Action
.
ShowDeleteSuccess
->
showDeleteSuccess
()
is
MyDataViewModel
.
Action
.
ShowDeleteError
->
showDeleteError
(
action
.
error
)
is
MyDataViewModel
.
Action
.
NavigateToHomeRestart
->
findNavController
().
navigate
(
MyDataFragmentDirections
.
homeRestart
())
is
MyDataViewModel
.
Action
.
NavigateToHomeRestart
->
returnHomeWithRestart
()
is
MyDataViewModel
.
Action
.
NavigateToHomeWithoutRestart
->
returnHomeWithoutRestart
()
is
MyDataViewModel
.
Action
.
OpenPrivacyPolicyUrl
->
startActivitySafely
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
...
...
@@ -90,6 +91,14 @@ class MyDataFragment : MvvmFragment(R.layout.fragment_my_data), ViewBindingHolde
}.
exhaustive
}
private
fun
returnHomeWithRestart
()
{
findNavController
().
navigate
(
MyDataFragmentDirections
.
homeRestart
())
}
private
fun
returnHomeWithoutRestart
()
{
findNavController
().
popBackStack
()
}
private
fun
showDeleteSuccess
()
{
showToast
(
R
.
string
.
my_data_delete_success
)
}
...
...
app/src/main/java/org/dpppt/android/app/mydata/MyDataViewModel.kt
View file @
b087f1c8
...
...
@@ -28,7 +28,7 @@ class MyDataViewModel @Inject constructor(
}
fun
onReturnHomeClicked
()
{
re
start
ToHome
()
re
turn
ToHome
()
}
fun
onPrivacyPolicyClicked
()
{
...
...
@@ -54,6 +54,10 @@ class MyDataViewModel @Inject constructor(
_action
.
value
=
Event
(
Action
.
NavigateToHomeRestart
)
}
private
fun
returnToHome
()
{
_action
.
value
=
Event
(
Action
.
NavigateToHomeWithoutRestart
)
}
private
fun
onDeleteSuccess
()
{
_action
.
value
=
Event
(
Action
.
ShowDeleteSuccess
)
restartToHome
()
...
...
@@ -68,5 +72,6 @@ class MyDataViewModel @Inject constructor(
data class
ShowDeleteError
(
val
error
:
DomainException
)
:
Action
()
data class
OpenPrivacyPolicyUrl
(
val
url
:
String
)
:
Action
()
object
NavigateToHomeRestart
:
Action
()
object
NavigateToHomeWithoutRestart
:
Action
()
}
}
app/src/main/java/org/dpppt/android/app/settings/SettingsFragment.kt
View file @
b087f1c8
package
org.dpppt.android.app.settings
import
android.bluetooth.BluetoothAdapter
import
android.content.Context
import
android.content.Intent
import
android.net.Uri
import
android.os.Bundle
...
...
@@ -26,6 +27,7 @@ import org.dpppt.android.app.common.util.ViewBindingHolder
import
org.dpppt.android.app.common.util.ViewModelFactory
import
org.dpppt.android.app.common.util.exhaustive
import
org.dpppt.android.app.common.util.getAppVersionString
import
org.dpppt.android.app.common.util.getTextWithBlueSpans
import
org.dpppt.android.app.databinding.FragmentSettingsBinding
import
org.dpppt.android.app.di.Injector
import
org.dpppt.android.app.storage.SecureStorage
...
...
@@ -65,6 +67,10 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
initViewModel
()
viewModel
.
start
(
tracingViewModel
.
appStatusLiveData
,
args
.
scrollDestination
,
savedInstanceState
==
null
)
setOnBackPressed
()
setupViews
(
view
)
}
private
fun
setupViews
(
view
:
View
)
{
requireBinding
{
batteryButton
.
setOnClickListener
{
viewModel
.
batteryButtonClicked
()
...
...
@@ -74,13 +80,25 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
viewModel
.
activateBluetooth
()
}
buttonBack
.
setOnClickListener
{
navigateBack
()
}
versionText
.
text
=
getAppVersionString
(
view
.
context
,
env
.
showLongVersionInfo
)
versionText
.
setOnClickListener
{
viewModel
.
onVersionClicked
()
}
setupVersionView
(
view
.
context
)
languageLayout
.
setOnClickListener
{
showLanguageSelectionDialog
()
}
setupCrossCountryView
(
view
.
context
)
}
}
private
fun
FragmentSettingsBinding
.
setupVersionView
(
context
:
Context
)
{
versionText
.
text
=
getAppVersionString
(
context
,
env
.
showLongVersionInfo
)
versionText
.
setOnClickListener
{
viewModel
.
onVersionClicked
()
}
}
private
fun
FragmentSettingsBinding
.
setupCrossCountryView
(
context
:
Context
)
{
crossCountryDescription
.
text
=
context
.
getTextWithBlueSpans
(
getString
(
R
.
string
.
settings_cross_country_description
),
getString
(
R
.
string
.
settings_cross_country_description_blue_part
),
)
crossCountryDescription
.
setOnClickListener
{
viewModel
.
crossCountryInfoLinkClicked
()
}
}
override
fun
onResume
()
{
super
.
onResume
()
viewModel
.
start
(
tracingViewModel
.
appStatusLiveData
,
args
.
scrollDestination
,
false
)
...
...
@@ -103,9 +121,12 @@ class SettingsFragment : MvvmFragment(), ViewBindingHolder<FragmentSettingsBindi
}
is
SettingsViewModel
.
Action
.
OpenPlayStoreUrl
->
startActivitySafely
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
URL_PLAY_STORE
)))
SettingsViewModel
.
Action
.
ScrollToCrossCountryItem
->
{
is
SettingsViewModel
.
Action
.
ScrollToCrossCountryItem
->
{
scrollToCrossCountryItem
()
}
is
SettingsViewModel
.
Action
.
OpenCrossCountryInfoUrl
->
{
startActivitySafely
(
Intent
(
Intent
.
ACTION_VIEW
).
setData
(
Uri
.
parse
(
action
.
url
)))
}
}.
exhaustive
}
...
...
app/src/main/java/org/dpppt/android/app/settings/SettingsViewModel.kt
View file @
b087f1c8
...
...
@@ -23,6 +23,7 @@ import org.dpppt.android.app.domain.usecase.dp3t.GaenStartUseCase
import
org.dpppt.android.app.domain.usecase.dp3t.GaenStopUseCase
import
org.dpppt.android.app.domain.usecase.dp3t.GaenSyncUseCase
import
org.dpppt.android.app.domain.usecase.dp3t.IsGaenWorkingUseCase
import
org.dpppt.android.app.domain.usecase.infopage.CreateGotSickAbroadPageUrlUseCase
import
org.dpppt.android.app.domain.usecase.permissions.CheckBatteryOptimizationUseCase
import
org.dpppt.android.app.main.model.TracingStatusInterface
import
org.dpppt.android.app.util.dispose
...
...
@@ -36,7 +37,8 @@ class SettingsViewModel @Inject constructor(
private
val
gaenStartUseCase
:
GaenStartUseCase
,
private
val
gaenStopUseCase
:
GaenStopUseCase
,
private
val
activityService
:
ActivityService
,
private
val
syncUseCase
:
GaenSyncUseCase
private
val
syncUseCase
:
GaenSyncUseCase
,
private
val
createGotSickAbroadPageUrlUseCase
:
CreateGotSickAbroadPageUrlUseCase
)
:
ViewModel
()
{
private
val
_action
=
MutableLiveData
<
Event
<
Action
>>()
...
...
@@ -53,6 +55,9 @@ class SettingsViewModel @Inject constructor(
private
var
disposables
:
List
<
Disposable
>
=
listOf
()
// Let's use a different disposable for links as these are one-shot things
private
var
linkDisposable
:
Disposable
?
=
null
private
val
tracingStatusObserver
=
Observer
(
::
tracingStatusChanged
)
fun
start
(
status
:
LiveData
<
TracingStatusInterface
>,
settingsScrollDestination
:
SettingsScrollDestination
,
isFirstStart
:
Boolean
)
{
...
...
@@ -191,6 +196,20 @@ class SettingsViewModel @Inject constructor(
{
error
->
Timber
.
e
(
error
,
"Sync error"
)
}
)
fun
crossCountryInfoLinkClicked
()
{
dispose
(
linkDisposable
)
// For now this will be the same URL as on the Home screen
linkDisposable
=
createGotSickAbroadPageUrlUseCase
.
execute
()
.
backgroundToMain
()
.
subscribe
(
{
url
->
_action
.
value
=
Event
(
Action
.
OpenCrossCountryInfoUrl
(
url
))
},
{
error
->
Timber
.
e
(
error
,
"crossCountryInfoLinkClicked"
)
// NO-OP: This should not happen atm. But for the future we still want to consume this
}
)
}
sealed
class
Action
{
data class
GaenError
(
val
e
:
Throwable
)
:
Action
()
object
BluetoothError
:
Action
()
...
...
@@ -198,5 +217,6 @@ class SettingsViewModel @Inject constructor(
data class
ShowPlayServicesUpdateDialog
(
val
isUpdateRequired
:
Boolean
)
:
Action
()
object
OpenPlayStoreUrl
:
Action
()
object
ScrollToCrossCountryItem
:
Action
()
data class
OpenCrossCountryInfoUrl
(
val
url
:
String
)
:
Action
()
}
}
app/src/main/java/org/dpppt/android/app/util/DeviceFeatureHelper.java
View file @
b087f1c8
...
...
@@ -10,7 +10,6 @@
package
org.dpppt.android.app.util
;
import
android.bluetooth.BluetoothAdapter
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.net.Uri
;
...
...
@@ -19,18 +18,12 @@ import androidx.annotation.NonNull;
public
class
DeviceFeatureHelper
{
public
static
boolean
isBluetoothEnabled
()
{
BluetoothAdapter
bluetoothAdapter
=
BluetoothAdapter
.
getDefaultAdapter
();
return
bluetoothAdapter
!=
null
&&
bluetoothAdapter
.
isEnabled
();
}
public
static
void
openPlayServicesInPlayStore
(
@NonNull
Context
context
)
{
final
String
playServicesPackageName
=
"com.google.android.gms"
;
try
{
context
.
startActivity
(
new
Intent
(
Intent
.
ACTION_VIEW
,
Uri
.
parse
(
"market://details?id="
+
playServicesPackageName
)));
}
catch
(
android
.
content
.
ActivityNotFoundException
e
)
{
context
.
startActivity
(
new
Intent
(
Intent
.
ACTION_VIEW
,
Uri
.
parse
(
"https://play.google.com/store/apps/details?id="
+
playServicesPackageName
)));
AndroidUtilKt
.
startActivitySafely
(
context
,
new
Intent
(
Intent
.
ACTION_VIEW
,
Uri
.
parse
(
"https://play.google.com/store/apps/details?id="
+
playServicesPackageName
)));
}
}
...
...
app/src/main/res/layout/fragment_contacts.xml
View file @
b087f1c8
...
...
@@ -34,6 +34,7 @@
<com.google.android.material.card.MaterialCardView
style=
"@style/AppTheme.CardView"
android:id=
"@+id/cardContactInfo"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"@dimen/size_16"
...
...
@@ -53,7 +54,7 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintGuide_end=
"@dimen/size_
16
"
/>
app:layout_constraintGuide_end=
"@dimen/size_
32
"
/>
<androidx.constraintlayout.widget.Guideline
android:id=
"@+id/startGuideline"
...
...
@@ -148,20 +149,23 @@
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_6"
app:layout_constraintStart_toStartOf=
"@+id/startGuideline"
app:layout_constraintTop_toTopOf=
"@+id/
descriptionMonitorHealth
View"
app:layout_constraintTop_toTopOf=
"@+id/
healthBoardRecommendations
View"
app:srcCompat=
"@drawable/ic_point"
android:importantForAccessibility=
"no"
/>
<TextView
android:id=
"@+id/
descriptionMonitorHealth
View"
android:id=
"@+id/
healthBoardRecommendations
View"
style=
"@style/AppTheme.Paragraph.Black"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_16"
android:text=
"@string/contacts_detected_text_monitor_health"
android:layout_marginEnd=
"@dimen/size_4"
android:text=
"@string/contacts_health_board_recommendations"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf=
"@+id/descriptionStayHomeView"
/>
app:layout_constraintTop_toBottomOf=
"@+id/descriptionStayHomeView"
app:layout_constraintBottom_toTopOf=
"@+id/descriptionMonitorHealthView"
/>
<ImageView
android:id=
"@+id/bulletView3"
...
...
@@ -169,20 +173,20 @@
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_6"
app:layout_constraintStart_toStartOf=
"@+id/startGuideline"
app:layout_constraintTop_toTopOf=
"@+id/
healthBoardRecommendations
View"
app:layout_constraintTop_toTopOf=
"@+id/
descriptionMonitorHealth
View"
app:srcCompat=
"@drawable/ic_point"
android:importantForAccessibility=
"no"
/>
<TextView
android:id=
"@+id/
healthBoardRecommendations
View"
android:id=
"@+id/
descriptionMonitorHealth
View"
style=
"@style/AppTheme.Paragraph.Black"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_16"
android:text=
"@string/contacts_
health_board_recommendations_link
"
android:text=
"@string/contacts_
detected_text_monitor_health
"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf=
"@+id/
descriptionMonitorHealth
View"
/>
app:layout_constraintTop_toBottomOf=
"@+id/
healthBoardRecommendations
View"
/>
<ImageView
android:id=
"@+id/bulletView4"
...
...
@@ -195,15 +199,27 @@
android:importantForAccessibility=
"no"
/>
<TextView
android:id=
"@+id/descriptionCallView"
style=
"@style/AppTheme.Paragraph.Black"
android:id=
"@+id/descriptionCallView"
style=
"@style/AppTheme.Paragraph.Black"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_16"
android:text=
"@string/contacts_detected_text_call"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf=
"@+id/descriptionMonitorHealthView"
/>
<TextView
android:id=
"@+id/descriptionHealthBoardThanksYou"
style=
"@style/AppTheme.Paragraph.Black.Bold"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_16"
android:text=
"@string/contacts_detected_text_call"
android:layout_marginTop=
"@dimen/size_24"
android:gravity=
"center_horizontal"
android:text=
"@string/contacts_detected_text_health_board_thanks_you"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/listStartGuidline"
app:layout_constraintTop_toBottomOf=
"@+id/
healthBoardRecommendations
View"
/>
app:layout_constraintTop_toBottomOf=
"@+id/
descriptionCall
View"
/>
<com.google.android.material.button.MaterialButton
android:id=
"@+id/buttonBackHome"
...
...
@@ -211,26 +227,29 @@
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_16"
android:layout_marginBottom=
"@dimen/text_size_32"
android:text=
"@string/nav_back_home"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/startGuideline"
app:layout_constraintTop_toBottomOf=
"@+id/descriptionCallView"
/>
<TextView
android:id=
"@+id/learnMoreView"
style=
"@style/AppTheme.LinkButtonText"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_8"
app:layout_constraintEnd_toStartOf=
"@+id/endGuideline"
app:layout_constraintStart_toStartOf=
"@+id/startGuideline"
app:layout_constraintTop_toBottomOf=
"@+id/buttonBackHome"
app:layout_constraintBottom_toTopOf=
"@+id/bottomGuideline"
android:gravity=
"center"
android:text=
"@string/contacts_info_page_link"
/>
app:layout_constraintTop_toBottomOf=
"@+id/descriptionHealthBoardThanksYou"
app:layout_constraintBottom_toBottomOf=
"parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<TextView
android:id=
"@+id/learnMoreView"
style=
"@style/AppTheme.LinkButtonText"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/size_8"
android:layout_marginBottom=
"@dimen/size_8"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/cardContactInfo"
app:layout_constraintBottom_toBottomOf=
"parent"
android:gravity=
"center_horizontal"
android:text=
"@string/contacts_info_page_link"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</LinearLayout>
app/src/main/res/layout/fragment_debug.xml
View file @
b087f1c8
...
...
@@ -415,11 +415,25 @@
android:layout_gravity=
"center_horizontal"
android:layout_marginBottom=
"@dimen/size_24"
android:text=
"@string/debug_state_show_share_screen_error"
app:layout_constraintBottom_toTopOf=
"@id/buttonDebugState
OpenSettingsAndScrollToCrossCountry
"