Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
252 changes: 136 additions & 116 deletions app/src/main/java/org/simple/clinic/summary/compose/StatinNudgeView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import androidx.compose.animation.shrinkVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
Expand All @@ -23,13 +22,19 @@ import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
Expand All @@ -41,6 +46,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.unit.toSize
import org.simple.clinic.R
import org.simple.clinic.common.ui.components.FilledButton
import org.simple.clinic.common.ui.theme.SimpleInverseTheme
Expand Down Expand Up @@ -72,55 +78,61 @@ fun StatinNudge(
Card(
modifier = modifier
) {
BoxWithConstraints(
modifier = Modifier.padding(16.dp)
var startOffset by remember { mutableFloatStateOf(0f) }
var endOffset by remember { mutableFloatStateOf(0f) }
var columnWidth by remember { mutableIntStateOf(0) }

Column(
modifier = Modifier
.padding(16.dp)
.onSizeChanged { intSize ->
val size = intSize.toSize()
val (start, end) = getOffsets(statinInfo.cvdRisk, size)
startOffset = start
endOffset = end
columnWidth = intSize.width
}
) {
val constraints = constraints
val size = Size(constraints.maxWidth.toFloat(), constraints.maxHeight.toFloat())
val (startOffset, endOffset) = getOffsets(statinInfo.cvdRisk, size)

Column {
RiskText(
startOffset = startOffset,
endOffset = endOffset,
RiskText(
startOffset = startOffset,
endOffset = endOffset,
statinInfo = statinInfo,
parentWidth = columnWidth,
)
Spacer(modifier = Modifier.height(12.dp))
RiskProgressBar(
startOffset = startOffset,
endOffset = endOffset
)
Spacer(modifier = Modifier.height(16.dp))
DescriptionText(
isLabBasedStatinNudgeEnabled = isLabBasedStatinNudgeEnabled,
isNonLabBasedStatinNudgeEnabled = isNonLabBasedStatinNudgeEnabled,
statinInfo = statinInfo,
useVeryHighRiskAsThreshold = useVeryHighRiskAsThreshold
)

val shouldShowButtonsForNonLabNudge = isNonLabBasedStatinNudgeEnabled && !statinInfo.hasDiabetes
val shouldShowButtonsForLabNudge = isLabBasedStatinNudgeEnabled &&
statinInfo.cvdRisk?.canPrescribeStatin == true

val shouldShowAddButtons = !statinInfo.hasCVD &&
(shouldShowButtonsForNonLabNudge || shouldShowButtonsForLabNudge)

if (shouldShowAddButtons) {
StainNudgeAddButtons(
statinInfo = statinInfo,
parentWidth = constraints.maxWidth,
)
Spacer(modifier = Modifier.height(12.dp))
RiskProgressBar(
startOffset = startOffset,
endOffset = endOffset
)
Spacer(modifier = Modifier.height(16.dp))
DescriptionText(
isLabBasedStatinNudgeEnabled = isLabBasedStatinNudgeEnabled,
isNonLabBasedStatinNudgeEnabled = isNonLabBasedStatinNudgeEnabled,
statinInfo = statinInfo,
useVeryHighRiskAsThreshold = useVeryHighRiskAsThreshold
isLabBasedStatinNudgeEnabled = isLabBasedStatinNudgeEnabled,
addTobaccoUseClicked = addTobaccoUseClicked,
addBMIClick = addBMIClick,
addCholesterol = addCholesterol,
)

val shouldShowButtonsForNonLabNudge = isNonLabBasedStatinNudgeEnabled && !statinInfo.hasDiabetes
val shouldShowButtonsForLabNudge = isLabBasedStatinNudgeEnabled &&
statinInfo.cvdRisk?.canPrescribeStatin == true

val shouldShowAddButtons = !statinInfo.hasCVD &&
(shouldShowButtonsForNonLabNudge || shouldShowButtonsForLabNudge)

if (shouldShowAddButtons) {
StainNudgeAddButtons(
modifier = Modifier.padding(top = 16.dp),
statinInfo = statinInfo,
isNonLabBasedStatinNudgeEnabled = isNonLabBasedStatinNudgeEnabled,
isLabBasedStatinNudgeEnabled = isLabBasedStatinNudgeEnabled,
addTobaccoUseClicked = addTobaccoUseClicked,
addBMIClick = addBMIClick,
addCholesterol = addCholesterol,
)
}
}
}
}
}
// }
}

@Composable
Expand Down Expand Up @@ -171,15 +183,15 @@ fun RiskText(

Text(
modifier = Modifier
.testTag("STATIN_NUDGE_RISK_TEXT")
.offset {
IntOffset(
x = clampedOffsetX.toInt(),
y = 0
)
}
.background(riskColor, shape = RoundedCornerShape(50))
.padding(horizontal = 8.dp, vertical = 4.dp),
.testTag("STATIN_NUDGE_RISK_TEXT")
.offset {
IntOffset(
x = clampedOffsetX.toInt(),
y = 0
)
}
.background(riskColor, shape = RoundedCornerShape(50))
.padding(horizontal = 8.dp, vertical = 4.dp),
style = SimpleTheme.typography.material.button,
color = SimpleTheme.colors.onToolbarPrimary,
text = riskText
Expand All @@ -200,64 +212,70 @@ fun RiskProgressBar(
)

val indicatorColor = Color(0xFF2F363D)
var progressBarWidth by remember { mutableFloatStateOf(0f) }

BoxWithConstraints(
Box(
modifier = Modifier
.fillMaxWidth()
.height(14.dp)
.drawWithContent {
drawContent()

drawLine(
color = indicatorColor,
start = Offset(startOffset, 0f),
end = Offset(startOffset, size.height),
strokeWidth = 2.dp.toPx()
)
drawLine(
color = indicatorColor,
start = Offset(endOffset, 0f),
end = Offset(endOffset, size.height),
strokeWidth = 2.dp.toPx()
)
},
.fillMaxWidth()
.height(14.dp)
.onSizeChanged { intSize ->
progressBarWidth = intSize.width.toFloat()
}
.drawWithContent {
drawContent()

drawLine(
color = indicatorColor,
start = Offset(startOffset, 0f),
end = Offset(startOffset, size.height),
strokeWidth = 2.dp.toPx()
)
drawLine(
color = indicatorColor,
start = Offset(endOffset, 0f),
end = Offset(endOffset, size.height),
strokeWidth = 2.dp.toPx()
)
},
contentAlignment = Alignment.Center,
) {
val totalSegments = riskColors.size
val segmentWidthPx = constraints.maxWidth.toFloat() / totalSegments

Row(
modifier = Modifier
.fillMaxWidth()
.height(4.dp)
.clip(RoundedCornerShape(50))
) {
riskColors.forEachIndexed { index, color ->
val segmentStartPx = index * segmentWidthPx
val segmentEndPx = (index + 1) * segmentWidthPx

Box(
modifier = Modifier
.weight(1f)
.fillMaxHeight()
.drawWithContent {
drawRect(color.copy(alpha = 0.5f))

val visibleStart = maxOf(segmentStartPx, startOffset)
val visibleEnd = minOf(segmentEndPx, endOffset)

if (visibleStart < visibleEnd) {
drawRect(
color = color.copy(alpha = 1.0f),
topLeft = Offset(x = visibleStart - segmentStartPx, y = 0f),
size = Size(
width = visibleEnd - visibleStart,
height = size.height
)
)
}
}
)
if (progressBarWidth > 0f) {
val totalSegments = riskColors.size
val segmentWidthPx = progressBarWidth / totalSegments

Row(
modifier = Modifier
.fillMaxWidth()
.height(4.dp)
.clip(RoundedCornerShape(50))
) {
riskColors.forEachIndexed { index, color ->
val segmentStartPx = index * segmentWidthPx
val segmentEndPx = (index + 1) * segmentWidthPx

Box(
modifier = Modifier
.weight(1f)
.fillMaxHeight()
.drawWithContent {
drawRect(color.copy(alpha = 0.5f))

val visibleStart = maxOf(segmentStartPx, startOffset)
val visibleEnd = minOf(segmentEndPx, endOffset)

if (visibleStart < visibleEnd) {
drawRect(
color = color.copy(alpha = 1.0f),
topLeft = Offset(x = visibleStart - segmentStartPx, y = 0f),
size = Size(
width = visibleEnd - visibleStart,
height = size.height
)
)
}
}
)
}
}
}
}
Expand Down Expand Up @@ -293,7 +311,6 @@ fun DescriptionText(

@Composable
fun StainNudgeAddButtons(
modifier: Modifier = Modifier,
statinInfo: StatinInfo,
isNonLabBasedStatinNudgeEnabled: Boolean,
isLabBasedStatinNudgeEnabled: Boolean,
Expand All @@ -303,15 +320,16 @@ fun StainNudgeAddButtons(
) {
SimpleInverseTheme {
Row(
modifier = modifier.fillMaxWidth(),
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
if (statinInfo.isSmoker == Answer.Unanswered) {
StainNudgeAddButton(
text = stringResource(R.string.statin_alert_add_tobacco_use),
modifier = Modifier
.testTag("STATIN_NUDGE_ADD_TOBACCO_USE")
.weight(1f),
.padding(top = 16.dp)
.testTag("STATIN_NUDGE_ADD_TOBACCO_USE")
.weight(1f),
onClick = addTobaccoUseClicked
)
}
Expand All @@ -320,8 +338,9 @@ fun StainNudgeAddButtons(
StainNudgeAddButton(
text = stringResource(R.string.statin_alert_add_bmi),
modifier = Modifier
.testTag("STATIN_NUDGE_ADD_BMI")
.weight(1f),
.padding(top = 16.dp)
.testTag("STATIN_NUDGE_ADD_BMI")
.weight(1f),
onClick = addBMIClick
)
}
Expand All @@ -330,8 +349,9 @@ fun StainNudgeAddButtons(
StainNudgeAddButton(
text = stringResource(R.string.statin_alert_add_cholesterol),
modifier = Modifier
.testTag("STATIN_NUDGE_ADD_CHOLESTEROL")
.weight(1f),
.padding(top = 16.dp)
.testTag("STATIN_NUDGE_ADD_CHOLESTEROL")
.weight(1f),
onClick = addCholesterol
)
}
Expand All @@ -347,9 +367,9 @@ fun StainNudgeAddButton(
) {
FilledButton(
modifier = modifier
.height(36.dp)
.fillMaxWidth()
.clip(RoundedCornerShape(50)),
.height(36.dp)
.fillMaxWidth()
.clip(RoundedCornerShape(50)),
onClick = onClick
) {
BasicText(
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-am-rET/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,9 @@
<string name="newmedicalhistory_history">ታሪክ</string>
<string name="medicalhistory_question_is_on_hypertension_treatment">ባለፈው ወር ውስጥ ህመምተኞው በማንኛውም ጊዜ የBP መድሃኒት ወስዷል? (አስፈላጊ)</string>
<string name="medicalhistory_question_is_on_diabetes_treatment">በሽተኛው ባለፈው ወር ውስጥ የስኳር በሽታ መድኃኒቶችን ወስዶ ነበር? (ያስፈልጋል)</string>
<string name="medicalhistory_question_is_smoking">ማጨስ</string>
<string name="medicalhistory_question_is_using_smokeless_tobacco">ጭስ አልባ ቶባኮ</string>

<!--Prescribed Drug with Dosages Sheet-->
<string name="prescribed_drugs_dosage_none">ምንም</string>
<string name="prescribed_drugs_dosage_remove">ያስወግዱ</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-bn-rBD/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,8 @@
<string name="newmedicalhistory_history">ইতিহাস</string>
<string name="medicalhistory_question_is_on_hypertension_treatment">গত মাসে রোগী কি কোনও সময় বিপি-র ওষুধ খেয়েছিলেন? (আবশ্যিক)</string>
<string name="medicalhistory_question_is_on_diabetes_treatment">গত মাসে রোগী কি কোনও সময় ডায়াবেটিসের ওষুধ খেয়েছিলেন? (আবশ্যিক)</string>
<string name="medicalhistory_question_is_smoking">ধূমপান</string>
<string name="medicalhistory_question_is_using_smokeless_tobacco"> ধোঁয়াবিহীন তামাক</string>

<!--Prescribed Drug with Dosages Sheet-->
<string name="prescribed_drugs_dosage_none">কোনটিই নয়</string>
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-om-rET/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,9 @@
<string name="newmedicalhistory_history">Seenaa</string>
<string name="medicalhistory_question_is_on_hypertension_treatment">Dhukubsataan ji\'a darbe yeroo ta\'e keessa dawaa BP fudhateeraa? (Barbaadamaa)</string>
<string name="medicalhistory_question_is_on_diabetes_treatment">Ji\'a darbe keessa dhukkubsatichi dawaawwan sukkaaraa fudhatee jiraa? (Barbaadama)</string>
<string name="medicalhistory_question_is_smoking">Aara</string>
<string name="medicalhistory_question_is_using_smokeless_tobacco">Tamboo aara hin qabne</string>

<!--Prescribed Drug with Dosages Sheet-->
<string name="prescribed_drugs_dosage_none">Hin jiru</string>
<string name="prescribed_drugs_dosage_remove">Balleessi</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-si-rLK/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,8 @@
<string name="newmedicalhistory_history">ඉතිහාසය</string>
<string name="medicalhistory_question_is_on_hypertension_treatment">රෝගියා පසුගිය මාසය තුල කිසියම් දිනකදී රුධිර පීඩනය පාලනය කිරීම සඳහා ඖෂධයක් ලබා ගත්තේද? (අවශ්‍යයි)</string>
<string name="medicalhistory_question_is_on_diabetes_treatment">රෝගියා පසුගිය මාසය තුල කිසියම් දිනකදී දියවැඩියාව පාලනය කිරීම සඳහා ඖෂධයක් ලබා ගත්තේද? (අවශ්‍යයි)</string>
<string name="medicalhistory_question_is_smoking">දුම් පානය කරයි</string>
<string name="medicalhistory_question_is_using_smokeless_tobacco"> දුම රහිත දුම්කොළ ආශ්‍රිත නිෂ්පාදන</string>

<!--Prescribed Drug with Dosages Sheet-->
<string name="prescribed_drugs_dosage_none">කිසිවක් නැත</string>
Expand Down
Loading
Loading