Skip to content

Commit

Permalink
feat: Update and delete Health Connect data (#3)
Browse files Browse the repository at this point in the history
* Update health connect data

* Delete Health Connect data

* Don't show editing options if can't be edited
  • Loading branch information
eevajonnapanula committed Jan 28, 2024
1 parent 8e34516 commit db3f267
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,39 @@ class HealthConnectManager(private val context: Context) {
Log.e("Error", "Message: ${e.message}")
}
}

suspend fun deleteMenstruationRecords(menstruationPeriodRecord: MenstruationPeriodRecord) {
val clientRecordIdList = if (menstruationPeriodRecord.metadata.clientRecordId != null) {
listOf(menstruationPeriodRecord.metadata.clientRecordId!!)
} else {
emptyList()
}
try {
healthConnectClient.deleteRecords(
MenstruationPeriodRecord::class,
recordIdsList = listOf(menstruationPeriodRecord.metadata.id),
clientRecordIdsList = clientRecordIdList,
)

Toast.makeText(context, "Successfully deleted records", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, e.message.toString(), Toast.LENGTH_SHORT).show()
Log.e("Error", "Message: ${e.message}")
}
}

suspend fun updateMenstruationRecords(menstruationPeriodRecord: MenstruationPeriodRecord) {
try {
healthConnectClient.updateRecords(
listOf(menstruationPeriodRecord),
)

Toast.makeText(context, "Successfully updated records", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, e.message.toString(), Toast.LENGTH_SHORT).show()
Log.e("Error", "Message: ${e.message}")
}
}
}
val PERMISSIONS =
setOf(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.eevajonna.period.data

import android.content.Context
import androidx.health.connect.client.records.MenstruationPeriodRecord
import com.eevajonna.period.ui.utils.TimeUtils
import java.time.LocalDate
Expand All @@ -9,3 +10,5 @@ fun MenstruationPeriodRecord.startDateToLocalDate(): LocalDate = TimeUtils.insta
fun MenstruationPeriodRecord.endDateToLocalDate(): LocalDate = TimeUtils.instantToLocalDate(this.endTime)

fun MenstruationPeriodRecord.isCurrent(): Boolean = this.startDateToLocalDate().isEqual(this.endDateToLocalDate())

fun MenstruationPeriodRecord.canEdit(context: Context): Boolean = this.metadata.dataOrigin.packageName == context.packageName
19 changes: 18 additions & 1 deletion app/src/main/java/com/eevajonna/period/ui/PeriodViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.records.MenstruationPeriodRecord
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
Expand Down Expand Up @@ -40,6 +39,24 @@ class PeriodViewModel(private val healthConnectManager: HealthConnectManager) :
}
}
}

fun deleteMenstruationRecord(menstruationPeriodRecord: MenstruationPeriodRecord) {
viewModelScope.launch {
tryWithPermissionsCheck {
healthConnectManager.deleteMenstruationRecords(menstruationPeriodRecord)
getPeriodRecords()
}
}
}

fun updateMenstruationRecord(menstruationPeriodRecord: MenstruationPeriodRecord) {
viewModelScope.launch {
tryWithPermissionsCheck {
healthConnectManager.updateMenstruationRecords(menstruationPeriodRecord)
getPeriodRecords()
}
}
}
private fun checkPermissions() {
viewModelScope.launch {
permissionsGranted = healthConnectManager.hasAllPermissions()
Expand Down
59 changes: 55 additions & 4 deletions app/src/main/java/com/eevajonna/period/ui/components/PeriodRow.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,46 @@ package com.eevajonna.period.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
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.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.health.connect.client.records.MenstruationPeriodRecord
import com.eevajonna.period.R
import com.eevajonna.period.data.canEdit
import com.eevajonna.period.data.endDateToLocalDate
import com.eevajonna.period.data.startDateToLocalDate

@Composable
fun PeriodRow(period: MenstruationPeriodRecord, onEditIconClick: () -> Unit) {
fun PeriodRow(
period: MenstruationPeriodRecord,
onDeleteIconClick: () -> Unit,
onEditIconClick: () -> Unit,
) {
var menuOpen by remember { mutableStateOf(false) }

Row(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -34,9 +52,42 @@ fun PeriodRow(period: MenstruationPeriodRecord, onEditIconClick: () -> Unit) {
horizontalArrangement = Arrangement.spacedBy(PeriodRow.horizontalPadding),
verticalAlignment = Alignment.CenterVertically,
) {
val context = LocalContext.current
PeriodCanvas(startDate = period.startDateToLocalDate(), endDate = period.endDateToLocalDate(), modifier = Modifier.weight(6f))
IconButton(onClick = { onEditIconClick() }, modifier = Modifier.weight(1f)) {
Icon(Icons.Default.Edit, stringResource(R.string.button_edit))
Column(modifier = Modifier.weight(1f)) {
if (period.canEdit(context)) {
IconButton(onClick = { menuOpen = true }) {
Icon(Icons.Default.MoreVert, stringResource(R.string.button_edit))
}
DropdownMenu(expanded = menuOpen, onDismissRequest = { menuOpen = false }) {
DropdownMenuItem(
text = { Text("Edit") },
onClick = {
menuOpen = false
onEditIconClick()
},
leadingIcon = {
Icon(
Icons.Outlined.Edit,
contentDescription = null,
)
},
)
DropdownMenuItem(
text = { Text("Delete") },
onClick = {
menuOpen = false
onDeleteIconClick()
},
leadingIcon = {
Icon(
Icons.Outlined.Delete,
contentDescription = null,
)
},
)
}
}
}
}
}
Expand Down
31 changes: 27 additions & 4 deletions app/src/main/java/com/eevajonna/period/ui/screens/MainScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ import com.eevajonna.period.ui.PeriodViewModel
import com.eevajonna.period.ui.PeriodViewModelFactory
import com.eevajonna.period.ui.components.DateRangePickerDialog
import com.eevajonna.period.ui.components.PeriodRow
import java.time.LocalDate
import android.health.connect.HealthConnectManager as HCM
import java.time.Instant
import android.health.connect.HealthConnectManager as HCM

@OptIn(ExperimentalMaterial3Api::class)
@Composable
Expand All @@ -66,11 +65,22 @@ fun MainScreen(healthConnectManager: HealthConnectManager) {
var selectedPeriod by remember {
mutableStateOf(MainScreen.emptyRecord)
}
var datePickerAction by remember {
mutableStateOf(DatePickerAction.INSERT)
}

fun saveMenstruationPeriod(menstruationPeriodRecord: MenstruationPeriodRecord) {
viewModel.writeMenstruationRecord(menstruationPeriodRecord)
}

fun updateMenstruationPeriod(menstruationPeriodRecord: MenstruationPeriodRecord) {
viewModel.updateMenstruationRecord(menstruationPeriodRecord)
}

fun deleteMenstruationPeriod(menstruationPeriodRecord: MenstruationPeriodRecord) {
viewModel.deleteMenstruationRecord(menstruationPeriodRecord)
}

LaunchedEffect(Unit) {
if (viewModel.permissionsGranted) {
viewModel.getInitialRecords()
Expand All @@ -87,6 +97,7 @@ fun MainScreen(healthConnectManager: HealthConnectManager) {
FloatingActionButton(onClick = {
selectedPeriod = MainScreen.emptyRecord
showDatePickerDialog = true
datePickerAction = DatePickerAction.INSERT
}) {
Icon(Icons.Default.Add, stringResource(R.string.button_add_new_period))
}
Expand Down Expand Up @@ -134,10 +145,15 @@ fun MainScreen(healthConnectManager: HealthConnectManager) {
),
) {
PeriodRow(
period = it
period = it,
onDeleteIconClick = {
deleteMenstruationPeriod(it)
showDatePickerDialog = false
},
) {
selectedPeriod = it
showDatePickerDialog = true
datePickerAction = DatePickerAction.UPDATE
}
}
}
Expand All @@ -149,7 +165,10 @@ fun MainScreen(healthConnectManager: HealthConnectManager) {
) { updatedSelectedPeriod ->
showDatePickerDialog = false
selectedPeriod = updatedSelectedPeriod
saveMenstruationPeriod(updatedSelectedPeriod)
when (datePickerAction) {
DatePickerAction.INSERT -> saveMenstruationPeriod(updatedSelectedPeriod)
DatePickerAction.UPDATE -> updateMenstruationPeriod(updatedSelectedPeriod)
}
}
}
}
Expand All @@ -164,3 +183,7 @@ object MainScreen {
endZoneOffset = null,
)
}

enum class DatePickerAction {
UPDATE, INSERT
}

0 comments on commit db3f267

Please sign in to comment.