diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java index f41aa1c6f6..c8bb64582f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogActivity.java @@ -11,6 +11,8 @@ import android.text.util.Linkify; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.webkit.WebView; +import android.webkit.WebViewClient; import android.widget.TextView; import android.widget.Toast; @@ -19,13 +21,13 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.SearchView; import androidx.core.app.ShareCompat; +import androidx.core.content.ContextCompat; import androidx.core.text.util.LinkifyCompat; import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.json.JSONObject; import org.thoughtcrime.securesms.BaseActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ProgressCard; @@ -38,13 +40,13 @@ import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton; import java.util.List; -public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugLogAdapter.Listener { +public class SubmitDebugLogActivity extends BaseActivity { private static final int CODE_SAVE = 24601; - private RecyclerView lineList; - private SubmitDebugLogAdapter adapter; + private WebView logWebView; private SubmitDebugLogViewModel viewModel; + private boolean isPageLoaded; private View warningBanner; private View editBanner; @@ -165,13 +167,81 @@ public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugL } } - @Override - public void onLogDeleted(@NonNull LogLine logLine) { - viewModel.onLogDeleted(logLine); + // TODO [lisa][debug-log-delete] +// public void onLogDeleted(@NonNull LogLine logLine) { +// viewModel.onLogDeleted(logLine); +// } + + private void initWebView() { + StringBuilder body = new StringBuilder(); + + int backgroundColor = ContextCompat.getColor(this, R.color.signal_colorBackground); + int noneColor = ContextCompat.getColor(this, R.color.debuglog_color_none); + int verboseColor = ContextCompat.getColor(this, R.color.debuglog_color_verbose); + int debugColor = ContextCompat.getColor(this, R.color.debuglog_color_debug); + int infoColor = ContextCompat.getColor(this, R.color.debuglog_color_info); + int warningColor = ContextCompat.getColor(this, R.color.debuglog_color_warn); + int errorColor = ContextCompat.getColor(this, R.color.debuglog_color_error); + + String css = String.format(""" + + """, + intToCssHex(backgroundColor), + intToCssHex(noneColor), + intToCssHex(verboseColor), + intToCssHex(debugColor), + intToCssHex(infoColor), + intToCssHex(warningColor), + intToCssHex(errorColor) + ); + + String js = """ + + """; + + body.append(String.format("
%s%s", css, js)); + + String htmlContent = body.toString(); + + logWebView.loadDataWithBaseURL(null, htmlContent, "text/html", "UTF-8", null); + + logWebView.getSettings().setBuiltInZoomControls(true); + logWebView.getSettings().setDisplayZoomControls(false); + logWebView.getSettings().setUseWideViewPort(true); + logWebView.getSettings().setJavaScriptEnabled(true); + logWebView.setHorizontalScrollBarEnabled(true); + + logWebView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + isPageLoaded = true; + } + }); + } + + private String intToCssHex(int color) { + return String.format("#%06X", 0xFFFFFF & color); } private void initView() { - this.lineList = findViewById(R.id.debug_log_lines); + this.logWebView = findViewById(R.id.debug_log_lines); this.warningBanner = findViewById(R.id.debug_log_warning_banner); this.editBanner = findViewById(R.id.debug_log_edit_banner); this.submitButton = findViewById(R.id.debug_log_submit_button); @@ -179,35 +249,27 @@ public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugL this.scrollToTopButton = findViewById(R.id.debug_log_scroll_to_top); this.progressCard = findViewById(R.id.debug_log_progress_card); - this.adapter = new SubmitDebugLogAdapter(this, viewModel.getPagingController()); - - this.lineList.setLayoutManager(new LinearLayoutManager(this)); - this.lineList.setAdapter(adapter); - this.lineList.setItemAnimator(null); + initWebView(); submitButton.setOnClickListener(v -> onSubmitClicked()); - scrollToBottomButton.setOnClickListener(v -> lineList.scrollToPosition(adapter.getItemCount() - 1)); - scrollToTopButton.setOnClickListener(v -> lineList.scrollToPosition(0)); + scrollToBottomButton.setOnClickListener(v -> logWebView.pageDown(true)); + scrollToTopButton.setOnClickListener(v -> logWebView.pageUp(true)); - lineList.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - if (((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition() < adapter.getItemCount() - 10) { - scrollToBottomButton.setVisibility(View.VISIBLE); - } else { - scrollToBottomButton.setVisibility(View.GONE); - } + logWebView.getViewTreeObserver().addOnScrollChangedListener(() -> { + if (logWebView.getScrollY() + logWebView.getHeight() < logWebView.getContentHeight() * logWebView.getScale() - 10) { + scrollToBottomButton.setVisibility(View.VISIBLE); + } else { + scrollToBottomButton.setVisibility(View.GONE); + } - if (((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition() > 10) { - scrollToTopButton.setVisibility(View.VISIBLE); - } else { - scrollToTopButton.setVisibility(View.GONE); - } + if (logWebView.getScrollY() > 10) { + scrollToTopButton.setVisibility(View.VISIBLE); + } else { + scrollToTopButton.setVisibility(View.GONE); } }); this.progressCard.setVisibility(View.VISIBLE); - } private void initViewModel() { @@ -224,14 +286,44 @@ public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugL submitButton.setVisibility(View.VISIBLE); } - adapter.submitList(lines); + if (!isPageLoaded) { + initWebView(); + } + + StringBuilder appendScript = new StringBuilder(); + + for (LogLine line : lines) { + if (line == null) continue; + + String newLine = line.getText(); + String lineClass = switch (line.getStyle()) { + case VERBOSE -> "verbose"; + case DEBUG -> "debug"; + case INFO -> "info"; + case WARNING -> "warning"; + case ERROR -> "error"; + default -> "none"; + }; + + String script = String.format( + "appendLine(%s, %s);\n", + JSONObject.quote(newLine), + JSONObject.quote(lineClass) + ); + + appendScript.append(script); + } + + String scriptContent = appendScript.toString(); + logWebView.evaluateJavascript(scriptContent, null); } private void presentMode(@NonNull SubmitDebugLogViewModel.Mode mode) { switch (mode) { case NORMAL: editBanner.setVisibility(View.GONE); - adapter.setEditing(false); + // TODO [lisa][debug-log-editing] +// setEditing(false); saveMenuItem.setVisible(true); // TODO [greyson][log] Not yet implemented // editMenuItem.setVisible(true); @@ -240,7 +332,7 @@ public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugL break; case SUBMITTING: editBanner.setVisibility(View.GONE); - adapter.setEditing(false); +// setEditing(false); editMenuItem.setVisible(false); doneMenuItem.setVisible(false); searchMenuItem.setVisible(false); @@ -248,7 +340,7 @@ public class SubmitDebugLogActivity extends BaseActivity implements SubmitDebugL break; case EDIT: editBanner.setVisibility(View.VISIBLE); - adapter.setEditing(true); +// setEditing(true); editMenuItem.setVisible(false); doneMenuItem.setVisible(true); searchMenuItem.setVisible(true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogAdapter.java deleted file mode 100644 index 880a154e43..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogAdapter.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.thoughtcrime.securesms.logsubmit; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import org.signal.paging.PagingController; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.ListenableHorizontalScrollView; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -public class SubmitDebugLogAdapter extends RecyclerView.Adapter