commit
da5763b528
1 changed files with 125 additions and 0 deletions
@ -0,0 +1,125 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project |
|||
// SPDX-License-Identifier: GPL-3.0-or-later |
|||
|
|||
package org.yuzu.yuzu_emu.utils |
|||
|
|||
import android.content.Context |
|||
import android.net.Uri |
|||
import androidx.core.content.FileProvider |
|||
import androidx.documentfile.provider.DocumentFile |
|||
import java.io.BufferedReader |
|||
import java.io.File |
|||
import java.io.InputStreamReader |
|||
import java.io.OutputStreamWriter |
|||
import java.util.regex.Pattern |
|||
|
|||
object LogFilter { |
|||
|
|||
/** |
|||
* Filters log content to show only warnings, errors, and critical messages |
|||
* @param context Android context |
|||
* @param inputUri URI of the input log file |
|||
* @param outputFile File object for the output filtered log file |
|||
* @return true if filtering was successful, false otherwise |
|||
*/ |
|||
fun filterLogs(context: Context, inputUri: Uri, outputFile: File): Boolean { |
|||
return try { |
|||
val inputDocFile = DocumentFile.fromSingleUri(context, inputUri) |
|||
|
|||
if (inputDocFile == null || !inputDocFile.exists()) { |
|||
Log.error("[LogFilter] Input file does not exist: $inputUri") |
|||
return false |
|||
} |
|||
|
|||
Log.info("[LogFilter] Starting filtering from $inputUri to ${outputFile.absolutePath}") |
|||
|
|||
// Define the regex pattern for warnings, errors, and criticals |
|||
val pattern = Pattern.compile(".*<(?:Warning|Error|Critical)>.*", Pattern.CASE_INSENSITIVE) |
|||
|
|||
var filteredLines = 0 |
|||
var totalLines = 0 |
|||
|
|||
context.contentResolver.openInputStream(inputUri)?.use { inputStream -> |
|||
outputFile.outputStream().use { outputStream -> |
|||
val reader = BufferedReader(InputStreamReader(inputStream)) |
|||
val writer = OutputStreamWriter(outputStream) |
|||
|
|||
var line: String? |
|||
while (reader.readLine().also { line = it } != null) { |
|||
totalLines++ |
|||
if (pattern.matcher(line!!).matches()) { |
|||
writer.write(line) |
|||
writer.write("\n") |
|||
filteredLines++ |
|||
} |
|||
} |
|||
|
|||
writer.flush() |
|||
} |
|||
} |
|||
|
|||
Log.info("[LogFilter] Filtered $filteredLines lines out of $totalLines total lines") |
|||
Log.info("[LogFilter] Output file size: ${outputFile.length()} bytes") |
|||
true |
|||
} catch (e: Exception) { |
|||
Log.error("[LogFilter] Error filtering logs: ${e.message}") |
|||
e.printStackTrace() |
|||
false |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Creates a filtered log file in the app's cache directory |
|||
* @param context Android context |
|||
* @param originalUri Original log file URI |
|||
* @return Pair of File and URI, or null if failed |
|||
*/ |
|||
fun createFilteredLogFile(context: Context, originalUri: Uri): Pair<File, Uri>? { |
|||
return try { |
|||
val originalFile = DocumentFile.fromSingleUri(context, originalUri) |
|||
if (originalFile == null || !originalFile.exists()) { |
|||
Log.error("[LogFilter] Original file does not exist: $originalUri") |
|||
return null |
|||
} |
|||
|
|||
// Create filtered file name |
|||
val originalName = originalFile.name ?: "eden_log.txt" |
|||
val filteredName = if (originalName.endsWith(".txt")) { |
|||
originalName.replace(".txt", "_filtered.txt") |
|||
} else { |
|||
"${originalName}_filtered" |
|||
} |
|||
|
|||
// Create file in app's cache directory |
|||
val cacheDir = File(context.cacheDir, "logs") |
|||
if (!cacheDir.exists()) { |
|||
cacheDir.mkdirs() |
|||
} |
|||
|
|||
val filteredFile = File(cacheDir, filteredName) |
|||
|
|||
// Delete existing file if it exists |
|||
if (filteredFile.exists()) { |
|||
filteredFile.delete() |
|||
} |
|||
|
|||
// Create the file |
|||
filteredFile.createNewFile() |
|||
|
|||
Log.info("[LogFilter] Created filtered file: ${filteredFile.absolutePath}") |
|||
|
|||
// Use FileProvider to get a content URI for the file |
|||
val uri = FileProvider.getUriForFile( |
|||
context, |
|||
"${context.packageName}.provider", |
|||
filteredFile |
|||
) |
|||
|
|||
Pair(filteredFile, uri) |
|||
} catch (e: Exception) { |
|||
Log.error("[LogFilter] Error creating filtered file: ${e.message}") |
|||
e.printStackTrace() |
|||
null |
|||
} |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue