TKK_E32230270/Backup.txt

1036 lines
53 KiB
Plaintext

"Otomatis" -> {
Text(
text = "Pemantauan sensor",
fontSize = 15.sp,
fontFamily = Inria_Regular,
color = Color.Gray,
modifier = Modifier
.align(Alignment.Start)
.padding(horizontal = 28.dp)
)
Spacer(modifier = Modifier.height(15.dp))
Card(
modifier = Modifier
.padding(horizontal = 25.dp)
.size(width = 333.dp, height = 130.dp),
shape = RoundedCornerShape(24.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFFEDEDED)
)
) {
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
// ================== KELEMBABAN UDARA ==================
Column(
modifier = Modifier.padding(top = 15.dp, start = 19.dp),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(60.dp)
) {
CircularProgressIndicator(
progress = 1f,
color = Color.LightGray,
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
CircularProgressIndicator(
progress = progressKU,
color = Color(0xFF4FC3F7),
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
Text(
text = "$ku%",
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
Text("Kel. Udara", fontSize = 10.sp, fontWeight = FontWeight.Bold)
Text(
text = statusKelembaban(ku),
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
color = Color.Gray,
modifier = Modifier.offset(y = -8.dp, x = 10.dp)
)
}
// ================== SUHU UDARA ==================
Column(
modifier = Modifier.padding(top = 15.dp, start = 10.dp),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(60.dp)
) {
CircularProgressIndicator(
progress = 1f,
color = Color.LightGray,
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
CircularProgressIndicator(
progress = progressSU,
color = Color(0xFF4FC3F7),
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
Text(
text = "$su°C",
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
Text("Suhu Udara", fontSize = 10.sp, fontWeight = FontWeight.Bold)
Text(
text = statusSuhu(su),
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
color = Color.Gray,
modifier = Modifier.offset(y = -8.dp, x = 10.dp)
)
}
// ================== KELEMBABAN TANAH ==================
Column(
modifier = Modifier.padding(top = 15.dp, start = 10.dp),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(60.dp)
) {
CircularProgressIndicator(
progress = 1f,
color = Color.LightGray,
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
CircularProgressIndicator(
progress = progressKT,
color = Color(0xFF4FC3F7),
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
Text(
text = "$kt%",
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
Text("Kel. Tanah", fontSize = 10.sp, fontWeight = FontWeight.Bold)
Text(
text = statusKelembaban(kt),
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
color = Color.Gray,
modifier = Modifier.offset(y = -8.dp, x = 10.dp)
)
}
// ================== INTENSITAS HUJAN ==================
Column(
modifier = Modifier.padding(top = 15.dp, start = 10.dp),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(60.dp)
) {
CircularProgressIndicator(
progress = 1f,
color = Color.LightGray,
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
CircularProgressIndicator(
progress = progressIH,
color = Color(0xFF4FC3F7),
strokeWidth = 3.dp,
modifier = Modifier.fillMaxSize()
)
Text(
text = "$ih%",
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
Text("Int. Hujan", fontSize = 10.sp, fontWeight = FontWeight.Bold)
Text(
text = when {
ih < 40 -> "Ringan"
ih < 70 -> "Sedang"
else -> "Deras"
},
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
color = Color.Gray,
modifier = Modifier.offset(y = -8.dp)
)
}
}
}
Spacer(modifier = Modifier.height(15.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
){
Text(
text = "Atur jadwal",
fontSize = 15.sp,
color = Color.Gray,
fontFamily = Inria_Regular,
modifier = Modifier
.padding(horizontal = 28.dp)
)
Image(
painter = painterResource(id = R.drawable.calendar),
contentDescription = "gambar 1",
modifier = Modifier
.size(13.dp)
.offset(y = 2.dp, x = -20.dp),
colorFilter = ColorFilter.tint(Color(0xFF6B6666))
)
}
Spacer(modifier = Modifier.height(15.dp))
var jadwalList by remember {
mutableStateOf(listOf<String>())
}
Card(
modifier = Modifier
.padding(horizontal = 25.dp)
.fillMaxWidth()
.height(190.dp),
shape = RoundedCornerShape(24.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFFEDEDED)
),
elevation = CardDefaults.cardElevation(4.dp)
) {
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
.padding(vertical = 12.dp)
) {
// semua jadwal tampil
jadwalList.forEachIndexed { index, jadwal ->
Column(
modifier = Modifier.padding(horizontal = 20.dp)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
// kiri
Row(
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = painterResource(id = R.drawable.trash),
contentDescription = "Hapus jadwal",
modifier = Modifier
.size(14.dp)
.clickable {
jadwalList =
jadwalList.toMutableList().also {
it.removeAt(index)
}
}
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = "Jadwal ${index + 1}",
fontSize = 12.sp,
fontWeight = FontWeight.Bold
)
}
// kanan edit
Image(
painter = painterResource(id = R.drawable.edit_text),
contentDescription = "Edit jadwal",
modifier = Modifier
.size(14.dp)
.clickable {
val timePickerDialog = TimePickerDialog(
context,
{ _, hourOfDay, minute ->
val status =
getWaktuStatus(hourOfDay, minute)
val editedJadwal =
String.format(
"%02d:%02d %s",
hourOfDay,
minute,
status
)
jadwalList =
jadwalList.toMutableList().also {
it[index] = editedJadwal
}
},
0,
0,
true
)
timePickerDialog.show()
}
)
}
Spacer(modifier = Modifier.height(6.dp))
Text(
text = jadwal,
fontSize = 12.sp,
fontWeight = FontWeight.Bold
)
HorizontalDivider(
modifier = Modifier.padding(vertical = 10.dp),
thickness = 0.8.dp,
color = Color.Gray.copy(alpha = 0.3f)
)
}
}
// tombol tambah
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp)
.height(40.dp)
.clickable {
val timePickerDialog = TimePickerDialog(
context,
{ _, hourOfDay, minute ->
val status =
getWaktuStatus(hourOfDay, minute)
val newJadwal =
String.format(
"%02d:%02d %s",
hourOfDay,
minute,
status
)
jadwalList = jadwalList + newJadwal
},
0,
0,
true
)
timePickerDialog.show()
},
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "+",
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
color = Color(0xFF2F6F4E)
)
Spacer(modifier = Modifier.width(6.dp))
Text(
text = "Tambah Jadwal",
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
color = Color(0xFF2F6F4E)
)
}
}
}
// popup edit custom
if (showEditDialog) {
AlertDialog(
onDismissRequest = {
showEditDialog = false
},
title = {
Text(
text = "Edit Jadwal",
fontWeight = FontWeight.Bold
)
},
text = {
Column {
Text(
text = "Jadwal saat ini:",
fontSize = 12.sp
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = selectedTimeText,
fontSize = 14.sp,
fontWeight = FontWeight.Bold
)
}
},
confirmButton = {
TextButton(
onClick = {
showEditDialog = false
val timePickerDialog = TimePickerDialog(
context,
{ _, hourOfDay, minute ->
val status =
getWaktuStatus(hourOfDay, minute)
selectedTimeText =
String.format(
"%02d:%02d %s",
hourOfDay,
minute,
status
)
},
0,
0,
true
)
timePickerDialog.show()
}
) {
Text("Ubah")
}
},
dismissButton = {
TextButton(
onClick = {
showEditDialog = false
}
) {
Text("Batal")
}
}
)
}
Spacer(modifier = Modifier.height(15.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
Text(
text = "Atur jeda penyiraman",
fontSize = 15.sp,
fontFamily = Inria_Regular,
color = Color.Gray,
modifier = Modifier
.padding(horizontal = 28.dp)
)
Image(
painter = painterResource(id = R.drawable.clock),
contentDescription = "gambar 1",
modifier = Modifier.size(14.dp)
.offset(y = 1.dp, x = -20.dp),
colorFilter = ColorFilter.tint(Color(0xFF6B6666))
)
}
Spacer(modifier = Modifier.height(15.dp))
Card(
modifier = Modifier
.padding(horizontal = 25.dp)
.size(width = 333.dp, height = 110.dp),
shape = RoundedCornerShape(24.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFFEDEDED)
)
) {
Column(
modifier = Modifier
.padding(top = 15.dp) // 🔥 kasih jarak dari atas
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically // 🔥 center!
) {
BasicTextField(
value = jeda,
onValueChange = {
if (it.all { char -> char.isDigit() }) {
jeda = it.take(2)
}
},
singleLine = true,
textStyle = LocalTextStyle.current.copy(
fontSize = 28.sp, // 🔥 lebih besar
fontWeight = FontWeight.Bold,
fontFamily = Poppins_Black,
color = Color.Black.copy(alpha = 0.8f)
),
modifier = Modifier.width(60.dp)
.offset(x = 4.dp),
decorationBox = { innerTextField ->
if (jeda.isEmpty()) {
Text(
"00",
fontSize = 28.sp,
fontFamily = Poppins_Black,
fontWeight = FontWeight.Bold,
color = Color.Black.copy(alpha = 0.7f)
)
}
innerTextField()
}
)
Box(
modifier = Modifier.offset(x = -3.dp)
) {
Text(
text = selectedUnit,
fontSize = 14.sp, // 🔥 sedikit diperbesar
fontFamily = Poppins_Regular,
fontWeight = FontWeight.Bold,
color = Color.Black.copy(alpha = 0.7f),
modifier = Modifier
.clickable { expanded = true }
)
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
listOf("Detik", "Menit", "Jam").forEach { unit ->
DropdownMenuItem(
text = { Text(unit) },
onClick = {
selectedUnit = unit
expanded = false
}
)
}
}
}
}
Spacer(modifier = Modifier.height(13.dp)) // 🔥 jarak tombol
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 60.dp)
.offset(y = -10.dp)
.height(42.dp)
.scale(scale),
onClick = {
if (jeda.isEmpty()) {
Toast.makeText(context, "Masukkan jeda dulu", Toast.LENGTH_SHORT).show()
return@Card
}
val jedaInt = jeda.toInt()
val jedaDalamDetik = when (selectedUnit) {
"Detik" -> jedaInt
"Menit" -> jedaInt * 60
"Jam" -> jedaInt * 3600
else -> jedaInt
}
saveJeda(jedaDalamDetik.toString(), context)
},
interactionSource = interactionSource,
shape = RoundedCornerShape(24.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFF2F6F4E)
)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(
text = "Simpan",
fontSize = 15.sp,
color = Color.White,
fontFamily = Poppins_Regular,
fontWeight = FontWeight.Bold
)
}
}
}
}
Spacer(modifier = Modifier.height(15.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
Text(
text = "Atur ambang batas",
fontSize = 15.sp,
fontFamily = Inria_Regular,
color = Color.Gray,
modifier = Modifier
.padding(horizontal = 28.dp)
)
Image(
painter = painterResource(id = R.drawable.warning),
contentDescription = "gambar 1",
modifier = Modifier.size(14.dp)
.offset(y = 1.dp, x = -20.dp),
colorFilter = ColorFilter.tint(Color(0xFF6B6666))
)
}
Spacer(modifier = Modifier.height(15.dp))
Card(
modifier = Modifier
.padding(horizontal = 25.dp)
.size(width = 333.dp, height = 200.dp),
shape = RoundedCornerShape(24.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFFEDEDED)
)
) {
Column(modifier = Modifier.fillMaxSize()) {
// ================= TANAH =================
Column(modifier = Modifier.padding(top = 15.dp)) {
Row(
modifier = Modifier
.padding(horizontal = 15.dp)
.fillMaxWidth()
) {
Image(
painter = painterResource(id = R.drawable.decagon),
contentDescription = null,
modifier = Modifier.size(14.dp),
colorFilter = ColorFilter.tint(Color(0xFF6B6666))
)
Text(
text = "Kelembapan tanah",
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(start = 10.dp)
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(start = 39.dp, end = 15.dp, top = 2.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Row(verticalAlignment = Alignment.Bottom) {
Text(
text = if (tanah == 0 && !isSavedTanah) "-" else tanah.toString(),
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.width(5.dp))
Text("%")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = if (isSavedTanah) "Tersimpan" else "Belum diatur",
fontSize = 10.sp
)
Spacer(modifier = Modifier.width(5.dp))
if (isSavedTanah) {
Image(
painter = painterResource(id = R.drawable.checked),
contentDescription = null,
modifier = Modifier.size(13.dp)
)
}
Spacer(modifier = Modifier.width(5.dp))
Image(
painter = painterResource(id = R.drawable.edit_text),
contentDescription = "edit",
modifier = Modifier
.size(13.dp)
.clickable {
currentField = "tanah"
inputValue = tanah.toString()
showDialog = true
}
)
}
}
}
HorizontalDivider(modifier = Modifier.padding(top = 8.dp))
// ================= SUHU =================
Column(modifier = Modifier.padding(top = 8.dp)) {
Row(
modifier = Modifier
.padding(horizontal = 15.dp)
.fillMaxWidth()
) {
Image(
painter = painterResource(id = R.drawable.thermometer),
contentDescription = null,
modifier = Modifier.size(14.dp)
)
Text(
text = "Suhu udara",
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(start = 10.dp)
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(start = 39.dp, end = 15.dp, top = 2.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Row(verticalAlignment = Alignment.Bottom) {
Text(
text = if (suhu == 0 && !isSavedSuhu) "-" else suhu.toString(),
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.width(5.dp))
Text("%")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = if (isSavedSuhu) "Tersimpan" else "Belum diatur",
fontSize = 10.sp
)
Spacer(modifier = Modifier.width(5.dp))
if (isSavedSuhu) {
Image(
painter = painterResource(id = R.drawable.checked),
contentDescription = null,
modifier = Modifier.size(13.dp)
)
}
Spacer(modifier = Modifier.width(5.dp))
Image(
painter = painterResource(id = R.drawable.edit_text),
contentDescription = "edit",
modifier = Modifier
.size(13.dp)
.clickable {
currentField = "suhu"
inputValue = suhu.toString()
showDialog = true
}
)
}
}
}
HorizontalDivider(modifier = Modifier.padding(top = 8.dp))
// ================= UDARA =================
Column(modifier = Modifier.padding(top = 8.dp)) {
Row(
modifier = Modifier
.padding(horizontal = 15.dp)
.fillMaxWidth()
) {
Image(
painter = painterResource(id = R.drawable.drop),
contentDescription = null,
modifier = Modifier.size(14.dp)
)
Text(
text = "Kelembapan udara",
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(start = 10.dp)
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(start = 39.dp, end = 15.dp, top = 2.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Row(verticalAlignment = Alignment.Bottom) {
Text(
text = if (udara == 0 && !isSavedUdara) "-" else udara.toString(),
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.width(5.dp))
Text("%")
}
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = if (isSavedUdara) "Tersimpan" else "Belum diatur",
fontSize = 10.sp
)
Spacer(modifier = Modifier.width(5.dp))
if (isSavedUdara) {
Image(
painter = painterResource(id = R.drawable.checked),
contentDescription = null,
modifier = Modifier.size(13.dp)
)
}
Spacer(modifier = Modifier.width(5.dp))
Image(
painter = painterResource(id = R.drawable.edit_text),
contentDescription = "edit",
modifier = Modifier
.size(13.dp)
.clickable {
currentField = "udara"
inputValue = udara.toString()
showDialog = true
}
)
}
}
}
}
}
if (showDialog) {
AlertDialog(
onDismissRequest = {
showDialog = false
},
title = {
Text("Atur Nilai")
},
text = {
OutlinedTextField(
value = inputValue,
onValueChange = {
inputValue = it
},
label = {
Text("Masukkan angka")
}
)
},
confirmButton = {
TextButton(
onClick = {
val value = inputValue.toIntOrNull()
if (value == null) {
Toast.makeText(context, "Masukkan angka!", Toast.LENGTH_SHORT).show()
return@TextButton
}
val newValue = value.coerceIn(0, 100)
when (currentField) {
"tanah" -> {
tanah = newValue
isSavedTanah = newValue != 0
}
"suhu" -> {
suhu = newValue
isSavedSuhu = newValue != 0
}
"udara" -> {
udara = newValue
isSavedUdara = newValue != 0
}
}
scope.launch {
try {
RetrofitClient.api.saveSetting(1, tanah, suhu, udara)
Toast.makeText(context, "Berhasil disimpan", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, "Gagal menyimpan", Toast.LENGTH_SHORT).show()
}
}
showDialog = false
}
) {
Text("Simpan")
}
},
dismissButton = {
Row {
TextButton(
onClick = {
when (currentField) {
"tanah" -> {
tanah = 0
isSavedTanah = false
}
"suhu" -> {
suhu = 0
isSavedSuhu = false
}
"udara" -> {
udara = 0
isSavedUdara = false
}
}
scope.launch {
try {
RetrofitClient.api.saveSetting(1, tanah, suhu, udara)
Toast.makeText(context, "Berhasil dihapus", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, "Gagal menghapus", Toast.LENGTH_SHORT).show()
}
}
showDialog = false
}
) {
Text("Hapus", color = Color.Red)
}
Spacer(modifier = Modifier.width(8.dp))
TextButton(
onClick = { showDialog = false }
) {
Text("Batal")
}
}
}
)
}
Spacer(modifier = Modifier.height(25.dp))
Card(
modifier = Modifier
.padding(horizontal = 25.dp)
.padding(bottom = 15.dp)
.fillMaxWidth()
.height(50.dp)
.scale(scale), // ✅ animasi dari kode kamu
onClick = {
viewModel.setConfig(
jadwal = "08:00",
ambang = 60,
jeda = 10
)
},
interactionSource = interactionSource,
shape = RoundedCornerShape(30.dp),
colors = CardDefaults.cardColors(
containerColor = Color(0xFF2F6F4E)
),
elevation = CardDefaults.cardElevation(4.dp)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(
text = "Simpan",
fontSize = 15.sp,
color = Color.White,
fontFamily = Poppins_Bold,
fontWeight = FontWeight.Bold
)
}
}
}