mirror of
https://github.com/nextcloud/notes-android.git
synced 2024-10-25 22:26:00 +03:00
#550 In-note-search doesn't jump to occurrence of searchstring
- Refactoring
This commit is contained in:
parent
705e1ea15d
commit
51ca3f0595
5 changed files with 49 additions and 34 deletions
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue