diff --git a/app/src/main/java/com/geekymusketeers/uncrack/presentation/account/PasswordGeneratorViewModel.kt b/app/src/main/java/com/geekymusketeers/uncrack/presentation/account/PasswordGeneratorViewModel.kt new file mode 100644 index 00000000..61da80af --- /dev/null +++ b/app/src/main/java/com/geekymusketeers/uncrack/presentation/account/PasswordGeneratorViewModel.kt @@ -0,0 +1,85 @@ +package com.geekymusketeers.uncrack.presentation.account + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel + +@HiltViewModel +class PasswordGeneratorViewModel : ViewModel() { + + private val _password = MutableLiveData() + val password: LiveData = _password + + private val _passwordLength = MutableLiveData() + val passwordLength: LiveData = _passwordLength + + private val _includeUppercase = MutableLiveData() + val includeUppercase: LiveData = _includeUppercase + + private val _includeLowercase = MutableLiveData() + val includeLowercase: LiveData = _includeLowercase + + private val _includeNumbers = MutableLiveData() + val includeNumbers: LiveData = _includeNumbers + + private val _includeSpecialChars = MutableLiveData() + val includeSpecialChars: LiveData = _includeSpecialChars + + fun generatePassword() { + _password.value = generatePassword( + _passwordLength.value, + _includeUppercase.value, + _includeLowercase.value, + _includeNumbers.value, + _includeSpecialChars.value + ) + } + + fun updatePasswordLength(newLength: Int) { + _passwordLength.value = newLength + } + + fun updateIncludeUppercase(include: Boolean) { + _includeUppercase.value = include + } + + fun updateIncludeLowercase(include: Boolean) { + _includeLowercase.value = include + } + + fun updateIncludeNumbers(include: Boolean) { + _includeNumbers.value = include + } + + fun updateIncludeSpecialChars(include: Boolean) { + _includeSpecialChars.value = include + } + + private fun generatePassword( + length: Int?, + includeUppercase: Boolean?, + includeLowercase: Boolean?, + includeNumbers: Boolean?, + includeSpecialChars: Boolean? + ): String { + val charPool = buildString { + if (includeUppercase == true) { + append("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + } + if (includeLowercase == true) { + append("abcdefghijklmnopqrstuvwxyz") + } + if (includeNumbers == true) { + append("0123456789") + } + if (includeSpecialChars == true) { + append("!@#$%^&*()_+") + } + } + + return (1..length!!) + .map { charPool.random() } + .joinToString("") + } +} \ No newline at end of file