Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.f0x1d.logfox.feature.datetime.api.DateTimeFormatter
import com.f0x1d.logfox.feature.preferences.api.domain.crashes.GetUseSeparateNotificationsChannelsForCrashesFlowUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.crashes.GetWrapCrashLogLinesFlowUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.crashes.SetWrapCrashLogLinesUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.combine
import javax.inject.Inject
Expand All @@ -26,7 +26,7 @@ internal class CrashDetailsEffectHandler @Inject constructor(
private val getWrapCrashLogLinesFlowUseCase: GetWrapCrashLogLinesFlowUseCase,
private val setWrapCrashLogLinesUseCase: SetWrapCrashLogLinesUseCase,
private val getUseSeparateNotificationsChannelsForCrashesFlowUseCase: GetUseSeparateNotificationsChannelsForCrashesFlowUseCase,
private val getExportLogsAsTxtUseCase: GetExportLogsAsTxtUseCase,
private val getLogFileExtensionUseCase: GetLogFileExtensionUseCase,
private val dateTimeFormatter: DateTimeFormatter,
) : EffectHandler<CrashDetailsSideEffect, CrashDetailsCommand> {
@OptIn(ExperimentalCoroutinesApi::class)
Expand Down Expand Up @@ -62,8 +62,7 @@ internal class CrashDetailsEffectHandler @Inject constructor(
}

is CrashDetailsSideEffect.PrepareFileExport -> {
val extension = if (getExportLogsAsTxtUseCase()) "txt" else "log"
val filename = exportFilename(effect.packageName, effect.dateAndTime, extension)
val filename = exportFilename(effect.packageName, effect.dateAndTime, getLogFileExtensionUseCase())
onCommand(CrashDetailsCommand.FileExportPickerReady(filename))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ internal sealed interface LogsCommand {

data class ExportPickerReady(val filename: String) : LogsCommand

data object SaveCurrentLogsClicked : LogsCommand

data class SaveCurrentPickerReady(val filename: String) : LogsCommand

data class SaveCurrentLogsTo(val uri: Uri) : LogsCommand

data object SwitchState : LogsCommand

data object Pause : LogsCommand
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.f0x1d.logfox.feature.logging.api.presentation.LoggingServiceDelegate
import com.f0x1d.logfox.feature.preferences.api.domain.logs.GetLogsExpandedFlowUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.logs.GetLogsTextSizeFlowUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.logs.GetResumeLoggingWithBottomTouchFlowUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import com.f0x1d.logfox.feature.recordings.api.domain.CreateRecordingFromLinesUseCase
import kotlinx.coroutines.flow.combine
import javax.inject.Inject
Expand All @@ -33,7 +33,7 @@ internal class LogsEffectHandler @Inject constructor(
private val formatLogLineUseCase: FormatLogLineUseCase,
private val exportLogsToUriUseCase: ExportLogsToUriUseCase,
private val loggingServiceDelegate: LoggingServiceDelegate,
private val getExportLogsAsTxtUseCase: GetExportLogsAsTxtUseCase,
private val getLogFileExtensionUseCase: GetLogFileExtensionUseCase,
private val dateTimeFormatter: DateTimeFormatter,
) : EffectHandler<LogsSideEffect, LogsCommand> {

Expand Down Expand Up @@ -88,11 +88,15 @@ internal class LogsEffectHandler @Inject constructor(
}

is LogsSideEffect.PrepareExport -> {
val extension = if (getExportLogsAsTxtUseCase()) "txt" else "log"
val filename = "${dateTimeFormatter.formatForExport(System.currentTimeMillis())}.$extension"
val filename = "${dateTimeFormatter.formatForExport(System.currentTimeMillis())}.${getLogFileExtensionUseCase()}"
onCommand(LogsCommand.ExportPickerReady(filename))
}

is LogsSideEffect.PrepareSaveCurrentLogs -> {
val filename = "${dateTimeFormatter.formatForExport(System.currentTimeMillis())}.${getLogFileExtensionUseCase()}"
onCommand(LogsCommand.SaveCurrentPickerReady(filename))
}

is LogsSideEffect.FormatAndCopyLog -> {
val formattedText = formatLogLineUseCase(
logLine = effect.logLine,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,25 @@ internal class LogsReducer @Inject constructor() : Reducer<LogsState, LogsComman
)
}

is LogsCommand.SaveCurrentLogsClicked -> {
state.withSideEffects(LogsSideEffect.PrepareSaveCurrentLogs)
}

is LogsCommand.SaveCurrentPickerReady -> {
state.withSideEffects(
LogsSideEffect.LaunchSaveCurrentPicker(filename = command.filename),
)
}

is LogsCommand.SaveCurrentLogsTo -> {
state.withSideEffects(
LogsSideEffect.ExportLogsTo(
uri = command.uri,
lines = state.logs,
),
)
}

is LogsCommand.SwitchState -> {
state.copy(
paused = !state.paused,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal sealed interface LogsSideEffect {

data object PrepareExport : LogsSideEffect

data object PrepareSaveCurrentLogs : LogsSideEffect

// UI side effects - handled by Fragment
data object NavigateToRecordings : LogsSideEffect

Expand All @@ -47,6 +49,8 @@ internal sealed interface LogsSideEffect {

data class LaunchExportPicker(val filename: String) : LogsSideEffect

data class LaunchSaveCurrentPicker(val filename: String) : LogsSideEffect

data object ClearLogs : LogsSideEffect

data object RestartLogging : LogsSideEffect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ internal class LogsFragment :
it?.let { uri -> send(LogsCommand.ExportSelectedTo(uri)) }
}

private val saveCurrentLogsLauncher = registerForActivityResult(
ActivityResultContracts.CreateDocument("text/*"),
) {
it?.let { uri -> send(LogsCommand.SaveCurrentLogsTo(uri)) }
}

override fun inflateBinding(inflater: LayoutInflater, container: ViewGroup?) = FragmentLogsBinding.inflate(inflater, container, false)

override fun FragmentLogsBinding.onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -119,6 +125,9 @@ internal class LogsFragment :
setClickListenerOn(R.id.export_selected_item) {
send(LogsCommand.ExportSelectedClicked)
}
setClickListenerOn(R.id.save_current_log_item) {
send(LogsCommand.SaveCurrentLogsClicked)
}
setClickListenerOn(R.id.clear_item) {
send(LogsCommand.ClearLogs)
}
Expand Down Expand Up @@ -233,6 +242,10 @@ internal class LogsFragment :
exportLogsLauncher.launch(sideEffect.filename)
}

is LogsSideEffect.LaunchSaveCurrentPicker -> {
saveCurrentLogsLauncher.launch(sideEffect.filename)
}

else -> Unit
}
}
Expand Down Expand Up @@ -311,6 +324,7 @@ internal class LogsFragment :
invisibleDuringSelection(R.id.search_item)
invisibleDuringSelection(R.id.filters_item)
visibleDuringSelection(R.id.selected_item)
visibleOnlyInDefault(R.id.save_current_log_item)
visibleOnlyInDefault(R.id.clear_item)
visibleOnlyInDefault(R.id.restart_logging_item)
visibleOnlyInDefault(R.id.exit_item)
Expand Down
6 changes: 6 additions & 0 deletions feature/logging/presentation/src/main/res/menu/logs_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@
</menu>
</item>

<item
android:id="@+id/save_current_log_item"
android:icon="@drawable/ic_save"
android:title="@string/save_all_logs"
app:showAsAction="never" />

<item
android:id="@+id/clear_item"
android:title="@string/clear"
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.f0x1d.logfox.feature.preferences.api.domain.service

interface GetLogFileExtensionUseCase {
operator fun invoke(): String
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ import com.f0x1d.logfox.feature.preferences.api.domain.logs.SetShowLogTimeUseCas
import com.f0x1d.logfox.feature.preferences.api.domain.logs.SetShowLogUidUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.notifications.GetAskedNotificationsPermissionUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.notifications.SetAskedNotificationsPermissionUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetIncludeAppInfoInExportsUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetIncludeDeviceInfoInArchivesUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetStartOnBootUseCase
Expand Down Expand Up @@ -150,7 +150,7 @@ import com.f0x1d.logfox.feature.preferences.impl.domain.logs.SetShowLogTimeUseCa
import com.f0x1d.logfox.feature.preferences.impl.domain.logs.SetShowLogUidUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.notifications.GetAskedNotificationsPermissionUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.notifications.SetAskedNotificationsPermissionUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.service.GetExportLogsAsTxtUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.service.GetLogFileExtensionUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.service.GetIncludeAppInfoInExportsUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.service.GetIncludeDeviceInfoInArchivesUseCaseImpl
import com.f0x1d.logfox.feature.preferences.impl.domain.service.GetStartOnBootUseCaseImpl
Expand Down Expand Up @@ -594,7 +594,7 @@ internal interface PreferencesModule {
): GetStopLoggingOnBackExitUseCase

@Binds
fun bindGetExportLogsAsTxtUseCase(
impl: GetExportLogsAsTxtUseCaseImpl,
): GetExportLogsAsTxtUseCase
fun bindGetLogFileExtensionUseCase(
impl: GetLogFileExtensionUseCaseImpl,
): GetLogFileExtensionUseCase
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.f0x1d.logfox.feature.preferences.impl.domain.service

import com.f0x1d.logfox.feature.preferences.api.data.ServiceSettingsRepository
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import javax.inject.Inject

internal class GetExportLogsAsTxtUseCaseImpl @Inject constructor(
internal class GetLogFileExtensionUseCaseImpl @Inject constructor(
private val serviceSettingsRepository: ServiceSettingsRepository,
) : GetExportLogsAsTxtUseCase {
) : GetLogFileExtensionUseCase {

override fun invoke(): Boolean = serviceSettingsRepository.exportLogsAsTxt().value
override fun invoke(): String =
if (serviceSettingsRepository.exportLogsAsTxt().value) "txt" else "log"
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import com.f0x1d.logfox.core.context.deviceData
import com.f0x1d.logfox.core.io.putZipEntry
import com.f0x1d.logfox.feature.datetime.api.DateTimeFormatter
import com.f0x1d.logfox.feature.export.api.data.ExportRepository
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetIncludeDeviceInfoInArchivesUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import com.f0x1d.logfox.feature.recordings.api.data.RecordingsRepository
import com.f0x1d.logfox.feature.recordings.api.domain.ExportRecordingZipUseCase
import javax.inject.Inject
Expand All @@ -15,14 +15,14 @@ internal class ExportRecordingZipUseCaseImpl @Inject constructor(
private val recordingsRepository: RecordingsRepository,
private val exportRepository: ExportRepository,
private val getIncludeDeviceInfoInArchivesUseCase: GetIncludeDeviceInfoInArchivesUseCase,
private val getExportLogsAsTxtUseCase: GetExportLogsAsTxtUseCase,
private val getLogFileExtensionUseCase: GetLogFileExtensionUseCase,
private val dateTimeFormatter: DateTimeFormatter,
) : ExportRecordingZipUseCase {

override suspend fun invoke(recordingId: Long, uri: Uri) = runCatching {
val recording = recordingsRepository.getById(recordingId) ?: return@runCatching
val includeDeviceInfo = getIncludeDeviceInfoInArchivesUseCase()
val logExtension = if (getExportLogsAsTxtUseCase()) "txt" else "log"
val logExtension = getLogFileExtensionUseCase()
val suffix = dateTimeFormatter.formatForExport(recording.dateAndTime)

exportRepository.writeZipToUri(uri) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.f0x1d.logfox.feature.recordings.presentation.details

import com.f0x1d.logfox.core.tea.EffectHandler
import com.f0x1d.logfox.feature.datetime.api.DateTimeFormatter
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetExportLogsAsTxtUseCase
import com.f0x1d.logfox.feature.preferences.api.domain.service.GetLogFileExtensionUseCase
import com.f0x1d.logfox.feature.recordings.api.domain.ExportRecordingFileUseCase
import com.f0x1d.logfox.feature.recordings.api.domain.ExportRecordingZipUseCase
import com.f0x1d.logfox.feature.recordings.api.domain.GetRecordingByIdFlowUseCase
Expand All @@ -22,7 +22,7 @@ internal class RecordingDetailsEffectHandler @Inject constructor(
private val exportRecordingFileUseCase: ExportRecordingFileUseCase,
private val exportRecordingZipUseCase: ExportRecordingZipUseCase,
private val dateTimeFormatter: DateTimeFormatter,
private val getExportLogsAsTxtUseCase: GetExportLogsAsTxtUseCase,
private val getLogFileExtensionUseCase: GetLogFileExtensionUseCase,
) : EffectHandler<RecordingDetailsSideEffect, RecordingDetailsCommand> {
private val titleUpdateMutex = Mutex()

Expand All @@ -43,8 +43,7 @@ internal class RecordingDetailsEffectHandler @Inject constructor(
is RecordingDetailsSideEffect.PrepareFileExport -> {
val recording = getRecordingByIdFlowUseCase(recordingId).firstOrNull()
?: return
val extension = if (getExportLogsAsTxtUseCase()) "txt" else "log"
val filename = "${dateTimeFormatter.formatForExport(recording.dateAndTime)}.$extension"
val filename = "${dateTimeFormatter.formatForExport(recording.dateAndTime)}.${getLogFileExtensionUseCase()}"
onCommand(RecordingDetailsCommand.FileExportPickerReady(filename))
}

Expand Down
Loading