Fix potential ANR in debug log viewer.

This commit is contained in:
lisa-signal
2025-08-08 16:23:10 -04:00
committed by Greyson Parrelli
parent 308f4c817f
commit 5e8d72e19e
2 changed files with 20 additions and 42 deletions

View File

@@ -27,6 +27,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.debuglogsviewer.DebugLogsViewer; import org.signal.debuglogsviewer.DebugLogsViewer;
import org.thoughtcrime.securesms.BaseActivity; import org.thoughtcrime.securesms.BaseActivity;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
@@ -357,27 +358,29 @@ public class SubmitDebugLogActivity extends BaseActivity {
hasPresentedLines = true; hasPresentedLines = true;
} }
int chunkSize = 1000; SignalExecutors.BOUNDED.execute(() -> {
int count = 0; int chunkSize = 1000;
int count = 0;
StringBuilder lineBuilder = new StringBuilder(); StringBuilder lineBuilder = new StringBuilder();
for (LogLine line : lines) { for (LogLine line : lines) {
if (line == null) continue; if (line == null) continue;
lineBuilder.append(String.format("%s\n", line.getText())); lineBuilder.append(String.format("%s\n", line.getText()));
count++; count++;
if (count >= chunkSize) { if (count >= chunkSize) {
DebugLogsViewer.presentLines(logWebView, lineBuilder.toString()); DebugLogsViewer.presentLines(logWebView, lineBuilder.toString());
lineBuilder.setLength(0); lineBuilder.setLength(0);
count = 0; count = 0;
}
} }
}
if (lineBuilder.length() > 0) { if (lineBuilder.length() > 0) {
DebugLogsViewer.presentLines(logWebView, lineBuilder.toString()); DebugLogsViewer.presentLines(logWebView, lineBuilder.toString());
} }
});
} }
private void presentMode(@NonNull SubmitDebugLogViewModel.Mode mode) { private void presentMode(@NonNull SubmitDebugLogViewModel.Mode mode) {

View File

@@ -5,8 +5,6 @@
package org.signal.debuglogsviewer package org.signal.debuglogsviewer
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.webkit.ValueCallback import android.webkit.ValueCallback
@@ -14,10 +12,9 @@ import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import kotlinx.coroutines.Runnable import kotlinx.coroutines.Runnable
import org.json.JSONObject import org.json.JSONObject
import org.signal.core.util.ThreadUtil
import java.util.function.Consumer import java.util.function.Consumer
var readOnly = true
object DebugLogsViewer { object DebugLogsViewer {
@JvmStatic @JvmStatic
fun initWebView(webview: WebView, context: Context, onFinished: Runnable) { fun initWebView(webview: WebView, context: Context, onFinished: Runnable) {
@@ -47,7 +44,7 @@ object DebugLogsViewer {
fun presentLines(webview: WebView, lines: String) { fun presentLines(webview: WebView, lines: String) {
// Set the debug log lines // Set the debug log lines
val escaped = JSONObject.quote(lines) val escaped = JSONObject.quote(lines)
webview.evaluateJavascript("editor.insert($escaped); logLines+=$escaped;", null) ThreadUtil.runOnMain { webview.evaluateJavascript("editor.insert($escaped); logLines+=$escaped;", null) }
} }
@JvmStatic @JvmStatic
@@ -110,26 +107,4 @@ object DebugLogsViewer {
fun onSearchClose(webview: WebView) { fun onSearchClose(webview: WebView) {
webview.evaluateJavascript("onSearchClose();", null) webview.evaluateJavascript("onSearchClose();", null)
} }
@JvmStatic
fun onEdit(webview: WebView) {
readOnly = !readOnly
webview.evaluateJavascript("editor.setReadOnly($readOnly);", null)
}
@JvmStatic
fun onCancelEdit(webview: WebView, lines: String) {
readOnly = !readOnly
webview.evaluateJavascript("editor.setReadOnly($readOnly);", null)
webview.evaluateJavascript("editor.setValue($lines, -1);", null)
}
@JvmStatic
fun onCopy(webview: WebView, context: Context, appName: String) {
webview.evaluateJavascript("editor.getValue();") { value ->
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(appName, value)
clipboard.setPrimaryClip(clip)
}
}
} }