diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8f67b7c..515a6ad 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -56,6 +56,17 @@
android:name="autoStoreLocales"
android:value="true" />
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt
index e871138..cd4f760 100644
--- a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt
+++ b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderService.kt
@@ -1,7 +1,9 @@
package app.myzel394.alibi.services
-import android.annotation.SuppressLint
+import android.content.ComponentName
import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
import android.media.AudioDeviceCallback
import android.media.AudioDeviceInfo
import android.media.AudioManager
@@ -9,12 +11,11 @@ import android.media.MediaRecorder
import android.media.MediaRecorder.OnErrorListener
import android.os.Build
import android.os.Handler
+import android.os.IBinder
import android.os.Looper
-import androidx.core.content.ContextCompat.getSystemService
import app.myzel394.alibi.enums.RecorderState
import app.myzel394.alibi.ui.utils.MicrophoneInfo
import java.lang.IllegalStateException
-import java.util.concurrent.Executor
class AudioRecorderService : IntervalRecorderService() {
var amplitudesAmount = 1000
diff --git a/app/src/main/java/app/myzel394/alibi/services/AudioRecorderTileService.kt b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderTileService.kt
new file mode 100644
index 0000000..e2408d5
--- /dev/null
+++ b/app/src/main/java/app/myzel394/alibi/services/AudioRecorderTileService.kt
@@ -0,0 +1,168 @@
+package app.myzel394.alibi.services
+
+import android.app.ActivityManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.IBinder
+import android.service.quicksettings.Tile
+import android.service.quicksettings.TileService
+import androidx.core.content.ContextCompat
+import app.myzel394.alibi.R
+import app.myzel394.alibi.dataStore
+import app.myzel394.alibi.enums.RecorderState
+import app.myzel394.alibi.helpers.AudioRecorderExporter
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.launch
+import kotlinx.serialization.json.Json
+
+class AudioRecorderTileService : TileService() {
+ private var job = SupervisorJob()
+ private var scope = CoroutineScope(Dispatchers.IO + job)
+
+ private var connection: ServiceConnection? = null
+
+ override fun onStartListening() {
+ super.onStartListening()
+
+ println("Before start")
+ scope.launch {
+ println("Getting recorder...")
+ val state = getRecorderState()
+ println("All right updating")
+ updateTile(state)
+ }
+ }
+
+ override fun onStopListening() {
+ runCatching {
+ connection?.let { unbindService(it) }
+ connection = null
+ }
+
+ super.onStopListening()
+ }
+
+ private fun startRecording() {
+ scope.launch {
+ dataStore.data.collectLatest { appSettings ->
+ val notificationDetails = appSettings.notificationSettings?.let {
+ RecorderNotificationHelper.NotificationDetails.fromNotificationSettings(
+ this@AudioRecorderTileService,
+ it,
+ )
+ }
+
+ val intent =
+ Intent(this@AudioRecorderTileService, AudioRecorderService::class.java).apply {
+ action = "init"
+
+ if (notificationDetails != null) {
+ putExtra(
+ "notificationDetails",
+ Json.encodeToString(
+ RecorderNotificationHelper.NotificationDetails.serializer(),
+ notificationDetails,
+ ),
+ )
+ }
+ }
+ ContextCompat.startForegroundService(this@AudioRecorderTileService, intent)
+ }
+ }
+ }
+
+ override fun onClick() {
+ super.onClick()
+ scope.launch {
+ val state = getRecorderState()
+
+ when (state) {
+ RecorderState.IDLE -> {
+ AudioRecorderExporter.clearAllRecordings(this@AudioRecorderTileService)
+ startRecording()
+ }
+
+ RecorderState.RECORDING -> {
+ }
+
+ RecorderState.PAUSED -> {
+ }
+ }
+ }
+ }
+
+ private fun isAudioRecorderRunning(): Boolean {
+ val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+
+ for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
+ if (AudioRecorderService::class.java.name == service.service.className) {
+ return true
+ }
+ }
+
+ return false
+ }
+
+ private suspend fun getRecorder(): AudioRecorderService? {
+ if (!isAudioRecorderRunning()) {
+ return null
+ }
+
+ val completer = CompletableDeferred()
+
+ connection = object : ServiceConnection {
+ override fun onServiceConnected(p0: ComponentName?, binder: IBinder?) {
+ completer.complete((binder as RecorderService.RecorderBinder).getService() as AudioRecorderService)
+ }
+
+ override fun onServiceDisconnected(p0: ComponentName?) {
+ unbindService(this)
+ connection = null
+ }
+
+ override fun onNullBinding(name: ComponentName?) {
+ unbindService(this)
+ connection = null
+ completer.complete(null)
+ }
+ }
+
+ bindService(
+ Intent(this, AudioRecorderService::class.java),
+ connection!!,
+ 0,
+ )
+
+ return completer.await()
+ }
+
+ private suspend fun getRecorderState(): RecorderState {
+ return getRecorder()?.state ?: RecorderState.IDLE
+ }
+
+ fun updateTile(state: RecorderState) {
+ when (state) {
+ RecorderState.RECORDING -> {
+ qsTile.label = getString(R.string.ui_audioRecorder_action_save_label)
+ qsTile.state = Tile.STATE_ACTIVE
+ }
+
+ RecorderState.IDLE -> {
+ qsTile.label = getString(R.string.ui_audioRecorder_action_start_label)
+ qsTile.state = Tile.STATE_INACTIVE
+ }
+
+ RecorderState.PAUSED -> {
+
+ }
+ }
+ println("Applying upäit naow")
+ qsTile.updateTile()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tile_icon.xml b/app/src/main/res/drawable/tile_icon.xml
new file mode 100644
index 0000000..a0a828c
--- /dev/null
+++ b/app/src/main/res/drawable/tile_icon.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a1328ef..05348a2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -109,4 +109,5 @@
Become a GitHub Sponsor
Delete Recordings Immediately
If enabled, Alibi will immediately delete recordings after you have saved the file.
+ Start Alibi Recording
\ No newline at end of file