diff --git a/app/src/main/java/com/eipsaferoad/owl/MainActivity.kt b/app/src/main/java/com/eipsaferoad/owl/MainActivity.kt index 94a154c..941781c 100644 --- a/app/src/main/java/com/eipsaferoad/owl/MainActivity.kt +++ b/app/src/main/java/com/eipsaferoad/owl/MainActivity.kt @@ -109,7 +109,8 @@ class MainActivity : ComponentActivity(), } val vibration = LocalStorage.getData(this, EnvEnum.VIBRATION_ALARM.value) if (!vibration.isNullOrEmpty()) { - alarms.value.vibration.isActivate = vibration == "1"; + alarms.value.vibration.isActivate = vibration[0] == '1'; + alarms.value.vibration.actual = vibration.substring(1).toFloat() } val sound = LocalStorage.getData(this, EnvEnum.SOUND_ALARM.value) if (!sound.isNullOrEmpty()) { @@ -250,6 +251,8 @@ fun WearApp(context: Context, currentHeartRate: MutableState, alarms: Mu alarms.value.sound.isActivate = dataArray.getString("isSoundActivate").equals("true") alarms.value.iconId = dataArray.getString("iconId").toInt() alarms.value.music = dataArray.getString("music") + alarms.value.vibration.actual = dataArray.getString("vibrationLevel").toFloat() + alarms.value.sound.actual = dataArray.getString("soundLevel").toFloat() } } } diff --git a/app/src/main/java/com/eipsaferoad/owl/core/Authentication.kt b/app/src/main/java/com/eipsaferoad/owl/core/Authentication.kt index 41611ee..6896cbb 100644 --- a/app/src/main/java/com/eipsaferoad/owl/core/Authentication.kt +++ b/app/src/main/java/com/eipsaferoad/owl/core/Authentication.kt @@ -41,7 +41,9 @@ class Authentication { LocalStorage.setData(context, EnvEnum.EMAIL.value, email) LocalStorage.setData(context, EnvEnum.PASSWORD.value, password) } - navController.navigate(PagesEnum.HOME.value) + if (navController.currentBackStackEntry?.destination?.route == PagesEnum.LOGIN.value) { + navController.navigate(PagesEnum.HOME.value) + } } } } diff --git a/app/src/main/java/com/eipsaferoad/owl/models/VibrationAlarm.kt b/app/src/main/java/com/eipsaferoad/owl/models/VibrationAlarm.kt index aae9b2b..6e30ce1 100644 --- a/app/src/main/java/com/eipsaferoad/owl/models/VibrationAlarm.kt +++ b/app/src/main/java/com/eipsaferoad/owl/models/VibrationAlarm.kt @@ -1,19 +1,14 @@ package com.eipsaferoad.owl.models import android.os.VibrationEffect +import com.eipsaferoad.owl.utils.getVibrationEffects class VibrationAlarm( - max: Int = 3, + max: Int = 2, min: Int = 0, actual: Float = 0f, isActivate: Boolean = false, ) : AlarmType(max, min, actual, isActivate) { - private val vibrationLevels: Array = arrayOf( - VibrationEffect.DEFAULT_AMPLITUDE, - VibrationEffect.DEFAULT_AMPLITUDE, - VibrationEffect.DEFAULT_AMPLITUDE, - VibrationEffect.DEFAULT_AMPLITUDE - ) override fun updateAlarm(bigger: Boolean): Int { if (bigger && actual < max) { @@ -21,6 +16,6 @@ class VibrationAlarm( } else if (!bigger && actual > min) { actual -= 1 } - return vibrationLevels[actual.toInt()] + return actual.toInt() } } \ No newline at end of file diff --git a/app/src/main/java/com/eipsaferoad/owl/presentation/home/Home.kt b/app/src/main/java/com/eipsaferoad/owl/presentation/home/Home.kt index f4b97e9..9e5a825 100644 --- a/app/src/main/java/com/eipsaferoad/owl/presentation/home/Home.kt +++ b/app/src/main/java/com/eipsaferoad/owl/presentation/home/Home.kt @@ -60,6 +60,7 @@ import com.eipsaferoad.owl.presentation.PagesEnum import com.eipsaferoad.owl.presentation.theme.OwlTheme import com.eipsaferoad.owl.utils.EnvEnum import com.eipsaferoad.owl.utils.LocalStorage +import com.eipsaferoad.owl.utils.getVibrationEffects import com.eipsaferoad.owl.utils.soundPlayer import kotlinx.coroutines.delay @@ -203,15 +204,12 @@ fun borderBrushMultiColor(colors: List): Brush { @Composable fun Alarm(context: Context, currentHeartRate: MutableState, alarms: MutableState, mVibrator: Vibrator) { - var vibrationEffectSingle by remember { - mutableStateOf(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)) - } LaunchedEffect(Unit) { while(true) { if (alarms.value.isAlarmActivate && alarms.value.vibration.isActivate) { Log.d("PADOU", "vibration are called here") - mVibrator.vibrate(vibrationEffectSingle) + mVibrator.vibrate(getVibrationEffects()[alarms.value.vibration.actual.toInt()]) } delay(2000) } diff --git a/app/src/main/java/com/eipsaferoad/owl/presentation/settings/Settings.kt b/app/src/main/java/com/eipsaferoad/owl/presentation/settings/Settings.kt index 88cb0b5..3407cad 100644 --- a/app/src/main/java/com/eipsaferoad/owl/presentation/settings/Settings.kt +++ b/app/src/main/java/com/eipsaferoad/owl/presentation/settings/Settings.kt @@ -51,6 +51,7 @@ import com.eipsaferoad.owl.models.AlarmType import com.eipsaferoad.owl.presentation.theme.OwlTheme import com.eipsaferoad.owl.utils.EnvEnum import com.eipsaferoad.owl.utils.LocalStorage +import com.eipsaferoad.owl.utils.getVibrationEffects import com.eipsaferoad.owl.utils.soundPlayer import okhttp3.FormBody import okhttp3.Headers @@ -83,7 +84,7 @@ fun saveOnServer(apiUrl: String, accessToken: String?, alarms: Alarm) { put("isVibrationActivate", alarms.vibration.isActivate) put("vibrationLevel", alarms.vibration.actual.toInt()) put("isSoundActivate", alarms.sound.isActivate) - put("soundLevel", alarms.sound.actual.toInt()) + put("soundLevel", alarms.sound.actual) put("music", alarms.music) put("iconId", alarms.iconId) }.toString() @@ -144,13 +145,13 @@ fun AlarmButton(context: Context, alarms: MutableState, apiUrl: String, a fun VibrationButton(context: Context, alarms: MutableState, mVibrator: Vibrator, apiUrl: String, accessToken: String?) { var isVibrationSelected by remember { mutableStateOf(false) } var isVibrationActivate by remember { mutableStateOf(alarms.value.vibration.isActivate) } - var vibrationEffectSingle by remember { - mutableStateOf(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)) - } + var vibrationVal by remember { mutableStateOf(alarms.value.vibration.actual) } - DisposableEffect(isVibrationActivate) { + DisposableEffect(isVibrationActivate, vibrationVal) { onDispose { - LocalStorage.setData(context, EnvEnum.VIBRATION_ALARM.value, if (isVibrationActivate) "1" else "0") + var data = if (isVibrationActivate) "1" else "0" + data += vibrationVal.toString() + LocalStorage.setData(context, EnvEnum.VIBRATION_ALARM.value, data) } } @@ -160,7 +161,9 @@ fun VibrationButton(context: Context, alarms: MutableState, mVibrator: Vi .height(if (isVibrationSelected) 80.dp else 40.dp), shape = RoundedCornerShape(10), colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colorScheme.primary), - onClick = {} + onClick = { + isVibrationSelected = !isVibrationSelected + } ) { Column( modifier = Modifier @@ -178,6 +181,7 @@ fun VibrationButton(context: Context, alarms: MutableState, mVibrator: Vi Text( text = "Vibration", ) + if (isVibrationSelected) { Switch( colors = SwitchDefaults.colors( checkedThumbColor = Color(0xFF00275B), @@ -187,13 +191,57 @@ fun VibrationButton(context: Context, alarms: MutableState, mVibrator: Vi ), checked = isVibrationActivate, onCheckedChange = { + saveOnServer(apiUrl, accessToken, alarms.value) alarms.value.vibration.isActivate = it; isVibrationActivate = it + } + ) + } + } + if (isVibrationSelected) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 10.dp, end = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "-", + modifier = Modifier.clickable { + alarms.value.vibration.updateAlarm(false) saveOnServer(apiUrl, accessToken, alarms.value) - if (it) { - mVibrator.vibrate(vibrationEffectSingle) + if (vibrationVal > alarms.value.vibration.min) { + vibrationVal -= 1f + mVibrator.vibrate(getVibrationEffects()[alarms.value.vibration.actual.toInt()]) } } ) + Box( + modifier = Modifier + .width(150.dp) + .height(5.dp) + .clip(RoundedCornerShape(8.dp)) + ) { + LinearProgressIndicator( + progress = vibrationVal / (alarms.value.vibration.max - alarms.value.vibration.min), + modifier = Modifier + .height(5.dp), + color = MaterialTheme.colorScheme.secondary + ) + } + Text( + text = "+", + modifier = Modifier + .clickable { + alarms.value.vibration.updateAlarm() + saveOnServer(apiUrl, accessToken, alarms.value) + if (vibrationVal < alarms.value.vibration.max.toFloat()) { + vibrationVal += 1f + mVibrator.vibrate(getVibrationEffects()[alarms.value.vibration.actual.toInt()]) + } + } + ) + } } } } diff --git a/app/src/main/java/com/eipsaferoad/owl/utils/vibrationEffets.kt b/app/src/main/java/com/eipsaferoad/owl/utils/vibrationEffets.kt new file mode 100644 index 0000000..f4b8fc4 --- /dev/null +++ b/app/src/main/java/com/eipsaferoad/owl/utils/vibrationEffets.kt @@ -0,0 +1,19 @@ +package com.eipsaferoad.owl.utils + +import android.os.VibrationEffect + +fun getVibrationEffects(): Array { + val customVibrationPatternOne = longArrayOf(0, 200, 200, 200) + val amplitudesOne = intArrayOf(0, 255, 255, 255) + val customVibrationEffectOne = VibrationEffect.createWaveform(customVibrationPatternOne, amplitudesOne, -1) + + val customVibrationPatternTwo = longArrayOf(0, 200, 100, 300) + val amplitudesTwo = intArrayOf(0, 255, 0, 255) + val customVibrationEffectTwo = VibrationEffect.createWaveform(customVibrationPatternTwo, amplitudesTwo, -1) + + val customVibrationPatternThree = longArrayOf(0, 200, 100, 300, 200, 400) + val amplitudesThree = intArrayOf(0, 255, 0, 255, 0, 255) + val customVibrationEffectThree = VibrationEffect.createWaveform(customVibrationPatternThree, amplitudesThree, -1) + + return arrayOf(customVibrationEffectOne, customVibrationEffectTwo, customVibrationEffectThree, customVibrationEffectThree) +} \ No newline at end of file diff --git a/app/src/test/java/com/eipsaferoad/owl/OwlTest.kt b/app/src/test/java/com/eipsaferoad/owl/OwlTest.kt index 22af23c..812da1d 100644 --- a/app/src/test/java/com/eipsaferoad/owl/OwlTest.kt +++ b/app/src/test/java/com/eipsaferoad/owl/OwlTest.kt @@ -26,11 +26,9 @@ class OwlTest { assertEquals(alarm.max, 3) assertEquals(alarm.min, 0) assertEquals(alarm.actual, 0.0f) - var res = alarm.updateAlarm() - assertEquals(res, VibrationEffect.DEFAULT_AMPLITUDE) + alarm.updateAlarm(); assertEquals(alarm.actual, 1.0f) - res = alarm.updateAlarm(false) - assertEquals(res, VibrationEffect.DEFAULT_AMPLITUDE) + alarm.updateAlarm(false); assertEquals(alarm.actual, 0.0f) alarm.updateAlarm() alarm.updateAlarm() @@ -55,8 +53,6 @@ class OwlTest { alarm.updateAlarm() alarm.updateAlarm() alarm.updateAlarm() - res = alarm.updateAlarm() - assertEquals(res, VibrationEffect.DEFAULT_AMPLITUDE) } }