#550 In-note-search doesn't jump to occurrence of searchstring

- Refactoring
This commit is contained in:
stefan-niedermann 2020-01-23 11:53:18 +01:00 committed by Niedermann IT-Dienstleistungen
parent 705e1ea15d
commit 51ca3f0595
5 changed files with 49 additions and 34 deletions

View file

@ -127,11 +127,9 @@ public class EditNoteActivity extends AppCompatActivity implements BaseNoteFragm
if (fragment != null) { if (fragment != null) {
savedState = getSupportFragmentManager().saveFragmentInstanceState(fragment); savedState = getSupportFragmentManager().saveFragmentInstanceState(fragment);
} }
if (edit) { fragment = edit
fragment = NoteEditFragment.newInstance(accountId, noteId); ? NoteEditFragment.newInstance(accountId, noteId)
} else { : NotePreviewFragment.newInstance(accountId, noteId);
fragment = NotePreviewFragment.newInstance(accountId, noteId);
}
if (savedState != null) { if (savedState != null) {
fragment.setInitialSavedState(savedState); fragment.setInitialSavedState(savedState);

View file

@ -9,12 +9,10 @@ import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Layout;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.ScrollView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -23,7 +21,6 @@ import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;
import com.nextcloud.android.sso.helper.SingleAccountHelper; import com.nextcloud.android.sso.helper.SingleAccountHelper;
@ -159,14 +156,6 @@ public abstract class BaseNoteFragment extends Fragment implements CategoryDialo
menu.findItem(R.id.menu_delete).setVisible(!isNew); menu.findItem(R.id.menu_delete).setVisible(!isNew);
} }
protected abstract ScrollView getScrollView();
protected abstract Layout getLayout();
protected abstract FloatingActionButton getSearchNextButton();
protected abstract FloatingActionButton getSearchPrevButton();
private void prepareFavoriteOption(MenuItem item) { private void prepareFavoriteOption(MenuItem item) {
item.setIcon(note.isFavorite() ? R.drawable.ic_star_white_24dp : R.drawable.ic_star_border_white_24dp); item.setIcon(note.isFavorite() ? R.drawable.ic_star_white_24dp : R.drawable.ic_star_border_white_24dp);
item.setChecked(note.isFavorite()); item.setChecked(note.isFavorite());

View file

@ -9,6 +9,7 @@ import android.os.Looper;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.Editable; import android.text.Editable;
import android.text.Layout; import android.text.Layout;
import android.text.SpannableString;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.util.TypedValue; import android.util.TypedValue;
@ -19,9 +20,11 @@ import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.yydcdut.markdown.MarkdownEditText; import com.yydcdut.markdown.MarkdownEditText;
@ -34,6 +37,7 @@ import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.model.CloudNote; import it.niedermann.owncloud.notes.model.CloudNote;
import it.niedermann.owncloud.notes.util.DisplayUtils;
import it.niedermann.owncloud.notes.util.ICallback; import it.niedermann.owncloud.notes.util.ICallback;
import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.MarkDownUtil;
import it.niedermann.owncloud.notes.util.NotesTextWatcher; import it.niedermann.owncloud.notes.util.NotesTextWatcher;
@ -147,8 +151,6 @@ public class NoteEditFragment extends SearchableBaseNoteFragment {
}; };
if (note != null) { if (note != null) {
setActiveTextView(editContent);
if (note.getContent().isEmpty()) { if (note.getContent().isEmpty()) {
editContent.requestFocus(); editContent.requestFocus();
@ -241,4 +243,13 @@ public class NoteEditFragment extends SearchableBaseNoteFragment {
} }
}); });
} }
@Override
protected void colorWithText(String newText) {
if (editContent != null && ViewCompat.isAttachedToWindow(editContent)) {
editContent.setText(DisplayUtils.searchAndColor(getContent(), new SpannableString
(getContent()), newText, getResources().getColor(R.color.primary)),
TextView.BufferType.SPANNABLE);
}
}
} }

View file

@ -7,6 +7,7 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.Layout; import android.text.Layout;
import android.text.SpannableString;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.util.TypedValue; import android.util.TypedValue;
@ -15,10 +16,12 @@ import android.view.Menu;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.floatingactionbutton.FloatingActionButton;
@ -34,6 +37,7 @@ import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.android.activity.EditNoteActivity; import it.niedermann.owncloud.notes.android.activity.EditNoteActivity;
import it.niedermann.owncloud.notes.model.LoginStatus; import it.niedermann.owncloud.notes.model.LoginStatus;
import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper;
import it.niedermann.owncloud.notes.util.DisplayUtils;
import it.niedermann.owncloud.notes.util.ICallback; import it.niedermann.owncloud.notes.util.ICallback;
import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.MarkDownUtil;
import it.niedermann.owncloud.notes.util.NoteLinksUtils; import it.niedermann.owncloud.notes.util.NoteLinksUtils;
@ -163,7 +167,6 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment {
} }
}) })
.build()); .build());
setActiveTextView(noteContent);
try { try {
noteContent.setText(markdownProcessor.parse(NoteLinksUtils.replaceNoteLinksWithDummyUrls(note.getContent(), db.getRemoteIds(note.getAccountId())))); noteContent.setText(markdownProcessor.parse(NoteLinksUtils.replaceNoteLinksWithDummyUrls(note.getContent(), db.getRemoteIds(note.getAccountId()))));
onResume(); onResume();
@ -207,6 +210,15 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment {
} }
} }
@Override
protected void colorWithText(String newText) {
if (noteContent != null && ViewCompat.isAttachedToWindow(noteContent)) {
noteContent.setText(markdownProcessor.parse(DisplayUtils.searchAndColor(getContent(), new SpannableString
(getContent()), newText, getResources().getColor(R.color.primary))),
TextView.BufferType.SPANNABLE);
}
}
@Override @Override
protected String getContent() { protected String getContent() {
return changedText; return changedText;

View file

@ -1,28 +1,25 @@
package it.niedermann.owncloud.notes.android.fragment; package it.niedermann.owncloud.notes.android.fragment;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.text.Layout;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.ScrollView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.core.view.ViewCompat;
import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.floatingactionbutton.FloatingActionButton;
import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.util.DisplayUtils;
public abstract class SearchableBaseNoteFragment extends BaseNoteFragment { public abstract class SearchableBaseNoteFragment extends BaseNoteFragment {
private TextView activeTextView;
private int currentOccurrence = 1; private int currentOccurrence = 1;
private int occurrenceCount = 0; private int occurrenceCount = 0;
@ -36,6 +33,12 @@ public abstract class SearchableBaseNoteFragment extends BaseNoteFragment {
if (savedInstanceState != null) { if (savedInstanceState != null) {
searchQuery = savedInstanceState.getString("searchQuery", ""); searchQuery = savedInstanceState.getString("searchQuery", "");
currentOccurrence = savedInstanceState.getInt("currentOccurrence", 1);
// TODO if search is open
if (searchView != null && !TextUtils.isEmpty(searchView.getQuery().toString())) {
colorWithText(searchQuery);
jumpToOccurrence();
}
} }
} }
@ -128,20 +131,19 @@ public abstract class SearchableBaseNoteFragment extends BaseNoteFragment {
if (searchView != null && !TextUtils.isEmpty(searchView.getQuery().toString())) { if (searchView != null && !TextUtils.isEmpty(searchView.getQuery().toString())) {
outState.putString("searchQuery", searchView.getQuery().toString()); outState.putString("searchQuery", searchView.getQuery().toString());
outState.putInt("currentOccurrence", currentOccurrence);
} }
} }
void setActiveTextView(TextView textView) { protected abstract void colorWithText(String newText);
activeTextView = textView;
}
private void colorWithText(String newText) { protected abstract ScrollView getScrollView();
if (activeTextView != null && ViewCompat.isAttachedToWindow(activeTextView)) {
activeTextView.setText(DisplayUtils.searchAndColor(activeTextView.getText().toString(), new SpannableString protected abstract Layout getLayout();
(activeTextView.getText()), newText, getResources().getColor(R.color.primary)),
TextView.BufferType.SPANNABLE); protected abstract FloatingActionButton getSearchNextButton();
}
} protected abstract FloatingActionButton getSearchPrevButton();
private void showSearchFabs() { private void showSearchFabs() {
FloatingActionButton next = getSearchNextButton(); FloatingActionButton next = getSearchNextButton();
@ -166,6 +168,9 @@ public abstract class SearchableBaseNoteFragment extends BaseNoteFragment {
} }
private void jumpToOccurrence() { private void jumpToOccurrence() {
if (getContent() == null || getContent().isEmpty()) {
return;
}
if (searchQuery == null || searchQuery.isEmpty()) { if (searchQuery == null || searchQuery.isEmpty()) {
// No search term // No search term
return; return;