Skip to content

Commit

Permalink
Fix various crashes of v2.13.1, by @gsantner
Browse files Browse the repository at this point in the history
  • Loading branch information
gsantner committed Nov 23, 2024
1 parent d10b67d commit 14d0620
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ public void onPause() {
_appSettings.setDocumentPreviewState(_document.path, _isPreviewVisible);
_appSettings.setLastEditPosition(_document.path, TextViewUtils.getSelection(_hlEditor)[0]);

if(_document.path.equals(_appSettings.getTodoFile().getAbsolutePath())){
if (_document.path.equals(_appSettings.getTodoFile().getAbsolutePath())) {
TodoWidgetProvider.updateTodoWidgets();
}
super.onPause();
Expand Down Expand Up @@ -862,7 +862,12 @@ private boolean isDisplayedAtMainActivity() {
}

public void updateViewModeText() {
_format.getConverter().convertMarkupShowInWebView(_document, getTextString(), getActivity(), _webView, _nextConvertToPrintMode, _hlEditor.isLineNumbersEnabled());
// Don't let text to view mode crash app
try {
_format.getConverter().convertMarkupShowInWebView(_document, getTextString(), getActivity(), _webView, _nextConvertToPrintMode, _hlEditor.isLineNumbersEnabled());
} catch (OutOfMemoryError e) {
_format.getConverter().convertMarkupShowInWebView(_document, "updateViewModeText getTextString(): OutOfMemory " + e, getActivity(), _webView, _nextConvertToPrintMode, _hlEditor.isLineNumbersEnabled());
}
}

public void setViewModeVisibility(final boolean show) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.util.Patterns;
import android.util.TypedValue;
Expand Down Expand Up @@ -433,7 +434,9 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) {

@Override
public void onFsViewerSelected(final String request, final File sel, final Integer lineNumber) {
if (sel.isDirectory()) {
if (sel == null) {
Log.e(getClass().getName(), "onFsViewerSelected: selected file is null");
} else if (sel.isDirectory()) {
NewFileDialog.newInstance(sel, false, f -> {
if (f.isFile()) {
appendToExistingDocumentAndClose(f, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,11 @@ public void afterTextChanged(final Editable s) {
@Override
public boolean onPreDraw() {
_lineNumbersDrawer.setTextSize(getTextSize());
return super.onPreDraw();
try {
return super.onPreDraw();
} catch (OutOfMemoryError ignored) {
return false; // return false to cancel current drawing pass/round
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@
* Spans are further divided into two categories: dynamic and static.
* - Dynamic spans are updated as one scrolls, as described above
* - Static spans are applied once and never updated. These are typically used for
* spans which affect the text layout.
* - For example, a span which makes text bigger.
* - Updating these dynamically would make the text jump around as one scrolls
* spans which affect the text layout.
* - For example, a span which makes text bigger.
* - Updating these dynamically would make the text jump around as one scrolls
* <p>
* Fixup:
* - As the user types we shift all spans to accomodate the changed text.
Expand All @@ -75,19 +75,19 @@
* - Derived classes should override generateSpans() to generate all spans
* - New spans are added by calling addSpanGroup()
* - The HighlightingEditor will trigger the generation of spans when the text changes.
* - This is debounced so that changes are batched
* - Span generation is done on a background thread
* - This is debounced so that changes are batched
* - Span generation is done on a background thread
* <p>
* Other performance tips:
* - Performance is heavily dependent on the number of spans applied to the text.
* - Combine related spans into a single span if possible
* - HighlightSpan is a helper class which can be used to create a span with multiple attributes
* - For example, a span which makes text bold and italic
* - HighlightSpan is a helper class which can be used to create a span with multiple attributes
* - For example, a span which makes text bold and italic
* - Absolutely minimize the number of spans implementing `UpdateLayout`
* - These spans trigger a text layout update when changed in any way
* - Instead consider using a span implementing `StaticSpan`
* - If StaticSpans are present, the text is reflowed after applying them
* - This happens once, and not for each span, which is much more efficient
* - These spans trigger a text layout update when changed in any way
* - Instead consider using a span implementing `StaticSpan`
* - If StaticSpans are present, the text is reflowed after applying them
* - This happens once, and not for each span, which is much more efficient
*/
public abstract class SyntaxHighlighterBase {

Expand Down Expand Up @@ -230,7 +230,7 @@ public SyntaxHighlighterBase clearStatic() {
boolean hasStatic = false;
for (int i = _groups.size() - 1; i >= 0; i--) {
final SpanGroup group = _groups.get(i);
if (group.isStatic) {
if (group != null && group.isStatic) {
hasStatic = true;
_spannable.removeSpan(group.span);
}
Expand Down Expand Up @@ -348,7 +348,7 @@ public SyntaxHighlighterBase applyDynamic(final int[] range) {
for (int i = 0; i < _groups.size(); i++) {
final SpanGroup group = _groups.get(i);

if (group.isStatic) {
if (group == null || group.isStatic) {
continue;
}

Expand All @@ -368,7 +368,6 @@ public SyntaxHighlighterBase applyDynamic(final int[] range) {
}



public SyntaxHighlighterBase applyStatic() {
if (_spannable != null && !_staticApplied) {
applyFixup();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import java.util.Set;
import java.util.Stack;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -687,7 +688,10 @@ private void loadFolder(final File folder, final File show) {
final File toShow = show == null ? _fileToShowAfterNextLoad : show;
_fileToShowAfterNextLoad = null;

executorService.execute(() -> _loadFolder(toLoad, toShow));
try {
executorService.execute(() -> _loadFolder(toLoad, toShow));
} catch (RejectedExecutionException ignored) { // during exit
}
}

// This function is not called on the main thread, so post to the UI thread
Expand Down

0 comments on commit 14d0620

Please sign in to comment.