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