feat: Add basic Tasker AudioRecorder state

This commit is contained in:
Myzel394 2023-08-28 19:29:30 +02:00
parent 4688766c14
commit 41a5428927
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
10 changed files with 272 additions and 6 deletions

View File

@ -128,5 +128,5 @@ dependencies {
implementation 'com.maxkeppeler.sheets-compose-dialogs:list:1.2.0'
implementation 'com.maxkeppeler.sheets-compose-dialogs:input:1.2.0'
implementation 'com.joaomgcd:taskerpluginlibrary:0.4.4'
implementation 'com.joaomgcd:taskerpluginlibrary:0.4.7'
}

View File

@ -30,6 +30,16 @@
</intent-filter>
</activity>
<activity
android:name=".tasker.AudioRecorder.AudioRecorderActivity"
android:exported="true"
android:label="@string/ui_audioRecorder_recordingState_label"
>
<intent-filter>
<action android:name="com.twofortyfouram.locale.intent.action.EDIT_CONDITION" />
</intent-filter>
</activity>
<activity
android:name=".StartRecordingActivity"
android:exported="true"

View File

@ -1,3 +1,3 @@
package app.myzel394.alibi
val SUPPORTED_LOCALES = arrayOf("en-US", "zh-CN", "de-DE")
val SUPPORTED_LOCALES = arrayOf("en-US", "zh-CN", "de-DE")

View File

@ -2,10 +2,8 @@ package app.myzel394.alibi
import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.WindowCompat
import androidx.datastore.dataStore
import app.myzel394.alibi.db.AppSettingsSerializer

View File

@ -1,7 +1,15 @@
package app.myzel394.alibi.enums
import app.myzel394.alibi.R
enum class RecorderState {
IDLE,
RECORDING,
PAUSED,
}
}
val ENUM_LABEL_MAP = mapOf(
RecorderState.IDLE to R.string.ui_audioRecorder_recordingState_value_idle,
RecorderState.RECORDING to R.string.ui_audioRecorder_recordingState_value_recording,
RecorderState.PAUSED to R.string.ui_audioRecorder_recordingState_value_paused,
)

View File

@ -0,0 +1,185 @@
package app.myzel394.alibi.tasker.AudioRecorder
import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.os.PersistableBundle
import androidx.activity.ComponentActivity
import app.myzel394.alibi.enums.RecorderState
import app.myzel394.alibi.ui.theme.AlibiTheme
import com.joaomgcd.taskerpluginlibrary.config.TaskerPluginConfig
import com.joaomgcd.taskerpluginlibrary.input.TaskerInput
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.surfaceColorAtElevation
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.shadow
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat
import app.myzel394.alibi.R
import app.myzel394.alibi.enums.ENUM_LABEL_MAP
import app.myzel394.alibi.ui.BIG_PRIMARY_BUTTON_SIZE
import com.joaomgcd.taskerpluginlibrary.output.TaskerOutputForConfig
import com.joaomgcd.taskerpluginlibrary.output.TaskerOutputsForConfig
class AudioRecorderActivity : AppCompatActivity(), TaskerPluginConfig<AudioRecorderInput> {
override val inputForTasker: TaskerInput<AudioRecorderInput>
get() = TaskerInput(AudioRecorderInput(RecorderState.IDLE.name))
override val context: Context
get() = applicationContext
override fun assignFromInput(input: TaskerInput<AudioRecorderInput>) {
println("assign")
}
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
println("create")
}
override fun onStart() {
super.onStart()
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
var selectedState by remember { mutableStateOf(RecorderState.IDLE) }
AlibiTheme {
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
.padding(horizontal = 16.dp, vertical = 32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceBetween,
) {
Box {}
Text(
"Configure Audio Recorder State",
style = MaterialTheme.typography.headlineLarge,
color = MaterialTheme.colorScheme.onBackground,
textAlign = TextAlign.Center,
)
Box {}
var opened by remember { mutableStateOf(false) }
Column {
Text(
getString(R.string.ui_audioRecorder_recorderState_taskerConfiguration_description),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onBackground,
)
Spacer(modifier = Modifier.height(16.dp))
Text(
getString(R.string.ui_audioRecorder_recorderState_taskerConfiguration_state_label),
style = MaterialTheme.typography.labelSmall,
color = MaterialTheme.colorScheme.secondary,
)
Spacer(modifier = Modifier.height(4.dp))
Box {
Button(
onClick = {
opened = true
},
colors = ButtonDefaults.filledTonalButtonColors(
containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(
4.dp
),
),
shape = MaterialTheme.shapes.small,
) {
Text(
getString(ENUM_LABEL_MAP[selectedState]!!)
)
}
DropdownMenu(
expanded = opened,
onDismissRequest = { opened = false },
) {
RecorderState.values().forEach { state ->
DropdownMenuItem(
onClick = {
opened = false
selectedState = state
},
text = {
val resourceId = ENUM_LABEL_MAP[state]!!
val text = getString(resourceId)
Text(text)
}
)
}
}
}
}
Button(
modifier = Modifier
.fillMaxWidth()
.height(BIG_PRIMARY_BUTTON_SIZE),
onClick = {
val helper = AudioRecorderHelper(this@AudioRecorderActivity)
helper.addOutputs(
TaskerInput(
AudioRecorderInput()
),
TaskerOutputsForConfig().apply {
add(
TaskerOutputForConfig(AudioRecorderOutput.VAR_STATE, selectedState.name)
)
}
)
},
) {
Icon(
Icons.Default.Check,
contentDescription = null,
modifier = Modifier.size(ButtonDefaults.IconSize),
)
Spacer(modifier = Modifier.width(ButtonDefaults.IconSpacing))
Text(
stringResource(id = R.string.dialog_close_neutral_label)
)
}
}
}
}
}
}

View File

@ -0,0 +1,10 @@
package app.myzel394.alibi.tasker.AudioRecorder
import com.joaomgcd.taskerpluginlibrary.config.TaskerPluginConfig
import com.joaomgcd.taskerpluginlibrary.config.TaskerPluginConfigHelper
class AudioRecorderHelper(config: TaskerPluginConfig<AudioRecorderInput>) : TaskerPluginConfigHelper<AudioRecorderInput, AudioRecorderOutput, AudioRecorderRunner>(config) {
override val runnerClass = AudioRecorderRunner::class.java
override val inputClass = AudioRecorderInput::class.java
override val outputClass = AudioRecorderOutput::class.java
}

View File

@ -0,0 +1,22 @@
package app.myzel394.alibi.tasker.AudioRecorder
import app.myzel394.alibi.R
import app.myzel394.alibi.enums.RecorderState
import com.joaomgcd.taskerpluginlibrary.input.TaskerInputField
import com.joaomgcd.taskerpluginlibrary.input.TaskerInputRoot
import com.joaomgcd.taskerpluginlibrary.output.TaskerOutputObject
import com.joaomgcd.taskerpluginlibrary.output.TaskerOutputVariable
@TaskerInputRoot
class AudioRecorderInput(
@field:TaskerInputField("state", labelResIdName = "ui_audioRecorder_recordingState_label") val state: String? = null
)
@TaskerOutputObject
class AudioRecorderOutput {
@get:TaskerOutputVariable(VAR_STATE, labelResIdName = "ui_audioRecorder_recordingState_label") var state: String = RecorderState.IDLE.name
companion object {
const val VAR_STATE = "state"
}
}

View File

@ -0,0 +1,26 @@
package app.myzel394.alibi.tasker.AudioRecorder
import android.content.Context
import app.myzel394.alibi.enums.RecorderState
import com.joaomgcd.taskerpluginlibrary.condition.TaskerPluginRunnerConditionState
import com.joaomgcd.taskerpluginlibrary.extensions.requestQuery
import com.joaomgcd.taskerpluginlibrary.input.TaskerInput
import com.joaomgcd.taskerpluginlibrary.runner.TaskerPluginResultCondition
import com.joaomgcd.taskerpluginlibrary.runner.TaskerPluginResultConditionSatisfied
import com.joaomgcd.taskerpluginlibrary.runner.TaskerPluginResultConditionUnsatisfied
class AudioRecorderRunner : TaskerPluginRunnerConditionState<AudioRecorderInput, AudioRecorderOutput>() {
override fun getSatisfiedCondition(context: Context, input: TaskerInput<AudioRecorderInput>, update: Unit?): TaskerPluginResultCondition<AudioRecorderOutput> {
return if (state.name == input.regular.state)
TaskerPluginResultConditionSatisfied(context)
else TaskerPluginResultConditionUnsatisfied()
}
companion object {
var state: RecorderState = RecorderState.IDLE
fun change(context: Context, newState: RecorderState) {
state = newState
AudioRecorderActivity::class.java.requestQuery(context)
}
}
}

View File

@ -60,8 +60,15 @@
<string name="ui_settings_value_auto_label">Auto</string>
<string name="ui_audioRecorder_state_paused_title">Recording paused</string>
<string name="ui_audioRecorder_state_paused_description">Audio Recording has been paused</string>
<string name="ui_audioRecorder_error_recording_title">An error occured</string>
<string name="ui_audioRecorder_error_recording_title">An error occurred</string>
<string name="ui_audioRecorder_error_recording_description">Alibi encountered an error during recording. Would you like to try saving the recording?</string>
<string name="ui_settings_language_title">Language</string>
<string name="ui_settings_language_update_label">Change</string>
<string name="ui_audioRecorder_recordingState_label">Audio Recorder State</string>
<string name="ui_audioRecorder_recordingState_value_idle">Idle</string>
<string name="ui_audioRecorder_recordingState_value_recording">Recording</string>
<string name="ui_audioRecorder_recordingState_value_paused">Paused</string>
<string name="ui_audioRecorder_recorderState_taskerConfiguration_description">Configure what state you want to check for</string>
<string name="ui_audioRecorder_recorderState_taskerConfiguration_state_label">Continue when Audio Recorder is...</string>
</resources>