1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 09:49:19 +02:00

fixed possible NPEs in selection operations

This commit is contained in:
Nikolay Pultsin 2015-09-11 23:02:07 +03:00
parent 4112c4f1b9
commit c788564d22
7 changed files with 58 additions and 16 deletions

View file

@ -48,6 +48,9 @@ public class SelectionBookmarkAction extends FBAndroidAction {
} else { } else {
bookmark = Reader.addSelectionBookmark(); bookmark = Reader.addSelectionBookmark();
} }
if (bookmark == null) {
return;
}
final SuperActivityToast toast = final SuperActivityToast toast =
new SuperActivityToast(BaseActivity, SuperToast.Type.BUTTON); new SuperActivityToast(BaseActivity, SuperToast.Type.BUTTON);

View file

@ -25,6 +25,8 @@ import android.text.ClipboardManager;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.fbreader.fbreader.FBReaderApp; import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.fbreader.fbreader.FBView;
import org.geometerplus.fbreader.util.TextSnippet;
import org.geometerplus.android.util.UIMessageUtil; import org.geometerplus.android.util.UIMessageUtil;
@ -35,8 +37,14 @@ public class SelectionCopyAction extends FBAndroidAction {
@Override @Override
protected void run(Object ... params) { protected void run(Object ... params) {
final String text = Reader.getTextView().getSelectedSnippet().getText(); final FBView fbview = Reader.getTextView();
Reader.getTextView().clearSelection(); final TextSnippet snippet = fbview.getSelectedSnippet();
if (snippet == null) {
return;
}
final String text = snippet.getText();
fbview.clearSelection();
final ClipboardManager clipboard = final ClipboardManager clipboard =
(ClipboardManager)BaseActivity.getApplication().getSystemService(Application.CLIPBOARD_SERVICE); (ClipboardManager)BaseActivity.getApplication().getSystemService(Application.CLIPBOARD_SERVICE);

View file

@ -24,6 +24,8 @@ import android.content.Intent;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.fbreader.fbreader.FBReaderApp; import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.fbreader.fbreader.FBView;
import org.geometerplus.fbreader.util.TextSnippet;
public class SelectionShareAction extends FBAndroidAction { public class SelectionShareAction extends FBAndroidAction {
SelectionShareAction(FBReader baseActivity, FBReaderApp fbreader) { SelectionShareAction(FBReader baseActivity, FBReaderApp fbreader) {
@ -32,9 +34,15 @@ public class SelectionShareAction extends FBAndroidAction {
@Override @Override
protected void run(Object ... params) { protected void run(Object ... params) {
final String text = Reader.getTextView().getSelectedSnippet().getText(); final FBView fbview = Reader.getTextView();
final TextSnippet snippet = fbview.getSelectedSnippet();
if (snippet == null) {
return;
}
final String text = snippet.getText();
final String title = Reader.getCurrentBook().getTitle(); final String title = Reader.getCurrentBook().getTitle();
Reader.getTextView().clearSelection(); fbview.clearSelection();
final Intent intent = new Intent(android.content.Intent.ACTION_SEND); final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain"); intent.setType("text/plain");

View file

@ -20,6 +20,8 @@
package org.geometerplus.android.fbreader; package org.geometerplus.android.fbreader;
import org.geometerplus.fbreader.fbreader.*; import org.geometerplus.fbreader.fbreader.*;
import org.geometerplus.fbreader.util.TextSnippet;
import org.geometerplus.android.fbreader.dict.DictionaryUtil; import org.geometerplus.android.fbreader.dict.DictionaryUtil;
public class SelectionTranslateAction extends FBAndroidAction { public class SelectionTranslateAction extends FBAndroidAction {
@ -30,10 +32,16 @@ public class SelectionTranslateAction extends FBAndroidAction {
@Override @Override
protected void run(Object ... params) { protected void run(Object ... params) {
final FBView fbview = Reader.getTextView(); final FBView fbview = Reader.getTextView();
final DictionaryHighlighting dictionaryHilite = new DictionaryHighlighting(fbview); final DictionaryHighlighting dictionaryHilite = DictionaryHighlighting.get(fbview);
final TextSnippet snippet = fbview.getSelectedSnippet();
if (dictionaryHilite == null || snippet == null) {
return;
}
DictionaryUtil.openTextInDictionary( DictionaryUtil.openTextInDictionary(
BaseActivity, BaseActivity,
fbview.getSelectedSnippet().getText(), snippet.getText(),
fbview.getCountOfSelectedWords() == 1, fbview.getCountOfSelectedWords() == 1,
fbview.getSelectionStartY(), fbview.getSelectionStartY(),
fbview.getSelectionEndY(), fbview.getSelectionEndY(),

View file

@ -23,12 +23,23 @@ import org.geometerplus.zlibrary.core.util.ZLColor;
import org.geometerplus.zlibrary.text.view.*; import org.geometerplus.zlibrary.text.view.*;
public final class DictionaryHighlighting extends ZLTextSimpleHighlighting { public final class DictionaryHighlighting extends ZLTextSimpleHighlighting {
public DictionaryHighlighting(ZLTextView view) { public static DictionaryHighlighting get(ZLTextView view) {
this(view, view.getSelectionHighlighting()); final ZLTextHighlighting hilite = view.getSelectionHighlighting();
if (hilite == null) {
return null;
} }
private DictionaryHighlighting(ZLTextView view, ZLTextHighlighting selection) { final ZLTextPosition start = hilite.getStartPosition();
super(view, selection.getStartPosition(), selection.getEndPosition()); final ZLTextPosition end = hilite.getEndPosition();
if (start == null || end == null) {
return null;
}
return new DictionaryHighlighting(view, start, end);
}
private DictionaryHighlighting(ZLTextView view, ZLTextPosition start, ZLTextPosition end) {
super(view, start, end);
} }
@Override @Override

View file

@ -35,8 +35,7 @@ import org.geometerplus.fbreader.bookmodel.*;
import org.geometerplus.fbreader.fbreader.options.*; import org.geometerplus.fbreader.fbreader.options.*;
import org.geometerplus.fbreader.formats.*; import org.geometerplus.fbreader.formats.*;
import org.geometerplus.fbreader.network.sync.SyncData; import org.geometerplus.fbreader.network.sync.SyncData;
import org.geometerplus.fbreader.util.AutoTextSnippet; import org.geometerplus.fbreader.util.*;
import org.geometerplus.fbreader.util.EmptyTextSnippet;
public final class FBReaderApp extends ZLApplication { public final class FBReaderApp extends ZLApplication {
public interface ExternalFileOpener { public interface ExternalFileOpener {
@ -269,12 +268,16 @@ public final class FBReaderApp extends ZLApplication {
public Bookmark addSelectionBookmark() { public Bookmark addSelectionBookmark() {
final FBView fbView = getTextView(); final FBView fbView = getTextView();
final TextSnippet snippet = fbView.getSelectedSnippet();
if (snippet == null) {
return null;
}
final Bookmark bookmark = new Bookmark( final Bookmark bookmark = new Bookmark(
Collection, Collection,
Model.Book, Model.Book,
fbView.getModel().getId(), fbView.getModel().getId(),
fbView.getSelectedSnippet(), snippet,
true true
); );
Collection.saveBookmark(bookmark); Collection.saveBookmark(bookmark);

View file

@ -763,10 +763,11 @@ public final class FBView extends ZLTextView {
public TextSnippet getSelectedSnippet() { public TextSnippet getSelectedSnippet() {
final ZLTextPosition start = getSelectionStartPosition(); final ZLTextPosition start = getSelectionStartPosition();
final ZLTextPosition end = getSelectionEndPosition(); final ZLTextPosition end = getSelectionEndPosition();
final TextBuildTraverser traverser = new TextBuildTraverser(this); if (start == null || end == null) {
if (!isSelectionEmpty()) { return null;
traverser.traverse(start, end);
} }
final TextBuildTraverser traverser = new TextBuildTraverser(this);
traverser.traverse(start, end);
return new FixedTextSnippet(start, end, traverser.getText()); return new FixedTextSnippet(start, end, traverser.getText());
} }