| Index: chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java
|
| deleted file mode 100644
|
| index 61176f35aed545f8f42e7bd453dea3659f500b5e..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java
|
| +++ /dev/null
|
| @@ -1,409 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.chrome.browser.bookmarks;
|
| -
|
| -import android.content.Context;
|
| -import android.os.Parcelable;
|
| -import android.support.v7.widget.Toolbar;
|
| -import android.text.Editable;
|
| -import android.text.TextUtils;
|
| -import android.text.TextWatcher;
|
| -import android.util.AttributeSet;
|
| -import android.util.SparseArray;
|
| -import android.view.KeyEvent;
|
| -import android.view.LayoutInflater;
|
| -import android.view.View;
|
| -import android.view.ViewGroup;
|
| -import android.view.inputmethod.EditorInfo;
|
| -import android.widget.AdapterView;
|
| -import android.widget.AdapterView.OnItemClickListener;
|
| -import android.widget.ArrayAdapter;
|
| -import android.widget.BaseAdapter;
|
| -import android.widget.EditText;
|
| -import android.widget.LinearLayout;
|
| -import android.widget.ListView;
|
| -import android.widget.TextView;
|
| -import android.widget.TextView.OnEditorActionListener;
|
| -import android.widget.ViewSwitcher;
|
| -
|
| -import org.json.JSONArray;
|
| -import org.json.JSONException;
|
| -
|
| -import org.chromium.base.ApiCompatibilityUtils;
|
| -import org.chromium.base.ContextUtils;
|
| -import org.chromium.chrome.R;
|
| -import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
|
| -import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
|
| -import org.chromium.chrome.browser.bookmarks.BookmarkSearchRow.SearchHistoryDelegate;
|
| -import org.chromium.components.bookmarks.BookmarkId;
|
| -import org.chromium.ui.UiUtils;
|
| -
|
| -import java.util.ArrayList;
|
| -import java.util.List;
|
| -
|
| -/**
|
| - * Activity for searching bookmarks. Search results will be updated when user is typing. Before
|
| - * typing, a list of search history is shown.
|
| - */
|
| -public class BookmarkSearchView extends LinearLayout implements OnItemClickListener,
|
| - OnEditorActionListener, BookmarkUIObserver, SearchHistoryDelegate {
|
| - /**
|
| - * A custom {@link ViewSwitcher} that wraps another {@link ViewSwitcher} inside.
|
| - */
|
| - public static class HistoryResultSwitcher extends ViewSwitcher {
|
| - ViewSwitcher mResultEmptySwitcher;
|
| -
|
| - /**
|
| - * Constructor for xml inflation.
|
| - */
|
| - public HistoryResultSwitcher(Context context, AttributeSet attrs) {
|
| - super(context, attrs);
|
| - }
|
| -
|
| - @Override
|
| - protected void onFinishInflate() {
|
| - super.onFinishInflate();
|
| - mResultEmptySwitcher = (ViewSwitcher) findViewById(R.id.result_empty_switcher);
|
| - }
|
| -
|
| - void showHistory() {
|
| - if (getCurrentView().getId() == R.id.bookmark_history_list) return;
|
| - showNext();
|
| - }
|
| -
|
| - void showResult() {
|
| - if (getCurrentView().getId() == R.id.bookmark_history_list) showNext();
|
| - if (mResultEmptySwitcher.getCurrentView().getId() == R.id.bookmark_search_empty_view) {
|
| - mResultEmptySwitcher.showNext();
|
| - }
|
| - }
|
| -
|
| - void showEmpty() {
|
| - if (getCurrentView().getId() == R.id.bookmark_history_list) showNext();
|
| - if (mResultEmptySwitcher.getCurrentView().getId() == R.id.bookmark_result_list) {
|
| - mResultEmptySwitcher.showNext();
|
| - }
|
| - }
|
| - }
|
| -
|
| - private static enum UIState {HISTORY, RESULT, EMPTY}
|
| -
|
| - private static final String PREF_SEARCH_HISTORY = "bookmark_search_history";
|
| - private static final int SEARCH_HISTORY_MAX_ENTRIES = 10;
|
| - private static final int HISTORY_ITEM_PADDING_START_DP = 72;
|
| - private static final int MAXIMUM_NUMBER_OF_RESULTS = 500;
|
| -
|
| - private BookmarkModel mBookmarkModel;
|
| - private BookmarkDelegate mDelegate;
|
| - private EditText mSearchText;
|
| - private ListView mResultList;
|
| - private ListView mHistoryList;
|
| - private HistoryResultSwitcher mHistoryResultSwitcher;
|
| - private UIState mCurrentUIState;
|
| -
|
| - private BookmarkModelObserver mModelObserver = new BookmarkModelObserver() {
|
| - @Override
|
| - public void bookmarkModelChanged() {
|
| - if (mCurrentUIState == UIState.RESULT || mCurrentUIState == UIState.EMPTY) {
|
| - sendSearchQuery();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node,
|
| - boolean isDoingExtensiveChanges) {
|
| - // If isDoingExtensiveChanges is false, it will fall back to bookmarkModelChange()
|
| - if (isDoingExtensiveChanges && mCurrentUIState == UIState.RESULT) {
|
| - sendSearchQuery();
|
| - }
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * Constructor for inflating from XML.
|
| - */
|
| - public BookmarkSearchView(Context context, AttributeSet attrs) {
|
| - super(context, attrs);
|
| - }
|
| -
|
| - @Override
|
| - protected void onFinishInflate() {
|
| - super.onFinishInflate();
|
| - mSearchText = (EditText) findViewById(R.id.bookmark_search_text);
|
| - mResultList = (ListView) findViewById(R.id.bookmark_result_list);
|
| - mHistoryList = (ListView) findViewById(R.id.bookmark_history_list);
|
| - mHistoryResultSwitcher = (HistoryResultSwitcher) findViewById(R.id.history_result_switcher);
|
| -
|
| - Toolbar searchBar = (Toolbar) findViewById(R.id.search_bar);
|
| - searchBar.setNavigationIcon(R.drawable.back_normal);
|
| - searchBar.setNavigationContentDescription(R.string.accessibility_toolbar_btn_back);
|
| - searchBar.setNavigationOnClickListener(new OnClickListener() {
|
| - @Override
|
| - public void onClick(View v) {
|
| - onBackPressed();
|
| - }
|
| - });
|
| -
|
| - mHistoryList.setOnItemClickListener(this);
|
| - mSearchText.setOnEditorActionListener(this);
|
| - mSearchText.addTextChangedListener(new TextWatcher() {
|
| - @Override
|
| - public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
| - }
|
| -
|
| - @Override
|
| - public void onTextChanged(CharSequence s, int start, int before, int count) {
|
| - }
|
| -
|
| - @Override
|
| - public void afterTextChanged(Editable s) {
|
| - if (TextUtils.isEmpty(s.toString().trim())) {
|
| - resetUI();
|
| - } else {
|
| - sendSearchQuery();
|
| - }
|
| - }
|
| - });
|
| - mCurrentUIState = UIState.HISTORY;
|
| - }
|
| -
|
| - private void updateHistoryList() {
|
| - mHistoryList.setAdapter(new ArrayAdapter<String>(getContext(),
|
| - android.R.layout.simple_list_item_1, android.R.id.text1,
|
| - readHistoryList()) {
|
| - @Override
|
| - public View getView(int position, View convertView, ViewGroup parent) {
|
| - View textView = super.getView(position, convertView, parent);
|
| - // Set padding start to specific size.
|
| - int paddingStart = (int) (HISTORY_ITEM_PADDING_START_DP
|
| - * getResources().getDisplayMetrics().density);
|
| - ApiCompatibilityUtils.setPaddingRelative(textView, paddingStart,
|
| - textView.getPaddingTop(), textView.getPaddingRight(),
|
| - textView.getPaddingBottom());
|
| - return textView;
|
| - }
|
| - });
|
| - }
|
| -
|
| - private void resetUI() {
|
| - setUIState(UIState.HISTORY);
|
| - mResultList.setAdapter(null);
|
| - if (!TextUtils.isEmpty(mSearchText.getText())) mSearchText.setText("");
|
| - }
|
| -
|
| - private void sendSearchQuery() {
|
| - String currentText = mSearchText.getText().toString().trim();
|
| - if (TextUtils.isEmpty(currentText)) return;
|
| -
|
| - List<BookmarkMatch> results = mBookmarkModel.searchBookmarks(currentText,
|
| - MAXIMUM_NUMBER_OF_RESULTS);
|
| - populateResultListView(results);
|
| - }
|
| -
|
| - @Override
|
| - public boolean dispatchKeyEvent(KeyEvent event) {
|
| - // To intercept hardware key, a view must have focus.
|
| - if (mDelegate == null) return super.dispatchKeyEvent(event);
|
| -
|
| - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
| - KeyEvent.DispatcherState state = getKeyDispatcherState();
|
| - if (state != null) {
|
| - if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
|
| - state.startTracking(event, this);
|
| - return true;
|
| - } else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled()
|
| - && state.isTracking(event)) {
|
| - onBackPressed();
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return super.dispatchKeyEvent(event);
|
| - }
|
| -
|
| - @Override
|
| - protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
|
| - // No-op because state saving/restoring is intentionally omitted in this View. This is
|
| - // to fix a crash in Android M that TextView's old text is sometimes restored even if
|
| - // setText("") is called in onVisibilityChange(). crbug.com/596783
|
| - }
|
| -
|
| - /**
|
| - * Make result list visible and popuplate the list with given list of bookmarks.
|
| - */
|
| - private void populateResultListView(List<BookmarkMatch> ids) {
|
| - if (ids.isEmpty()) {
|
| - setUIState(UIState.EMPTY);
|
| - } else {
|
| - setUIState(UIState.RESULT);
|
| - mResultList.setAdapter(new ResultListAdapter(ids, mDelegate));
|
| - }
|
| - }
|
| -
|
| - private void setUIState(UIState state) {
|
| - if (mCurrentUIState == state) return;
|
| - mCurrentUIState = state;
|
| - if (state == UIState.HISTORY) {
|
| - mHistoryResultSwitcher.showHistory();
|
| - updateHistoryList();
|
| - } else if (state == UIState.RESULT) {
|
| - mHistoryResultSwitcher.showResult();
|
| - } else if (state == UIState.EMPTY) {
|
| - mHistoryResultSwitcher.showEmpty();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - protected void onVisibilityChanged(View changedView, int visibility) {
|
| - super.onVisibilityChanged(changedView, visibility);
|
| - // This method might be called very early. Null check on bookmark model here.
|
| - if (mBookmarkModel == null) return;
|
| -
|
| - if (visibility == View.VISIBLE) {
|
| - mBookmarkModel.addObserver(mModelObserver);
|
| - updateHistoryList();
|
| - mSearchText.requestFocus();
|
| - UiUtils.showKeyboard(mSearchText);
|
| - } else {
|
| - UiUtils.hideKeyboard(mSearchText);
|
| - mBookmarkModel.removeObserver(mModelObserver);
|
| - resetUI();
|
| - clearFocus();
|
| - }
|
| - }
|
| -
|
| - private void onBackPressed() {
|
| - if (mCurrentUIState == UIState.HISTORY) {
|
| - mDelegate.closeSearchUI();
|
| - } else {
|
| - resetUI();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
| - assert parent == mHistoryList : "Only history list should have onItemClickListener.";
|
| - mSearchText.setText((String) parent.getAdapter().getItem(position));
|
| - }
|
| -
|
| - @Override
|
| - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
| - if (actionId == EditorInfo.IME_ACTION_SEARCH) {
|
| - UiUtils.hideKeyboard(v);
|
| -
|
| - // History is saved either when the user clicks search button or a search result is
|
| - // clicked.
|
| - saveSearchHistory();
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - private void saveHistoryList(List<String> history) {
|
| - JSONArray jsonArray = new JSONArray(history);
|
| - ContextUtils.getAppSharedPreferences().edit()
|
| - .putString(PREF_SEARCH_HISTORY, jsonArray.toString()).apply();
|
| - }
|
| -
|
| - private List<String> readHistoryList() {
|
| - try {
|
| - String unformatted = ContextUtils.getAppSharedPreferences()
|
| - .getString(PREF_SEARCH_HISTORY, "[]");
|
| - JSONArray jsonArray = new JSONArray(unformatted);
|
| - ArrayList<String> result = new ArrayList<String>();
|
| - for (int i = 0; i < jsonArray.length(); i++) {
|
| - result.add(jsonArray.getString(i));
|
| - }
|
| - return result;
|
| - } catch (JSONException e) {
|
| - return new ArrayList<String>();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Adds the current search text as top entry of the list.
|
| - */
|
| - private List<String> addCurrentTextToHistoryList(List<String> history) {
|
| - String text = mSearchText.getText().toString().trim();
|
| - if (TextUtils.isEmpty(text)) return history;
|
| -
|
| - history.remove(text);
|
| - history.add(0, text);
|
| - if (history.size() > SEARCH_HISTORY_MAX_ENTRIES) {
|
| - history.remove(history.size() - 1);
|
| - }
|
| - return history;
|
| - }
|
| -
|
| - // SearchHistoryDelegate implementation
|
| -
|
| - @Override
|
| - public void saveSearchHistory() {
|
| - saveHistoryList((addCurrentTextToHistoryList(readHistoryList())));
|
| - }
|
| -
|
| - // BookmarkUIObserver implementation
|
| -
|
| - @Override
|
| - public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) {
|
| - mDelegate = delegate;
|
| - mDelegate.addUIObserver(this);
|
| - mBookmarkModel = mDelegate.getModel();
|
| - }
|
| -
|
| - @Override
|
| - public void onDestroy() {
|
| - mBookmarkModel.removeObserver(mModelObserver);
|
| - mDelegate.removeUIObserver(this);
|
| - }
|
| -
|
| - @Override
|
| - public void onFolderStateSet(BookmarkId folder) {
|
| - }
|
| -
|
| - @Override
|
| - public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {
|
| - }
|
| -
|
| - private class ResultListAdapter extends BaseAdapter {
|
| - private BookmarkDelegate mDelegate;
|
| - private List<BookmarkMatch> mBookmarktList;
|
| -
|
| - public ResultListAdapter(List<BookmarkMatch> bookmarkMatches,
|
| - BookmarkDelegate delegate) {
|
| - mDelegate = delegate;
|
| - mBookmarktList = bookmarkMatches;
|
| - }
|
| -
|
| - @Override
|
| - public int getCount() {
|
| - return mBookmarktList.size();
|
| - }
|
| -
|
| - @Override
|
| - public BookmarkMatch getItem(int position) {
|
| - return mBookmarktList.get(position);
|
| - }
|
| -
|
| - @Override
|
| - public long getItemId(int position) {
|
| - return position;
|
| - }
|
| -
|
| - @Override
|
| - public View getView(int position, View convertView, ViewGroup parent) {
|
| - final BookmarkMatch bookmarkMatch = getItem(position);
|
| - if (convertView == null) {
|
| - convertView = LayoutInflater.from(parent.getContext()).inflate(
|
| - R.layout.bookmark_search_row, parent, false);
|
| - }
|
| - final BookmarkSearchRow row = (BookmarkSearchRow) convertView;
|
| - row.onBookmarkDelegateInitialized(mDelegate);
|
| - row.setBookmarkId(bookmarkMatch.getBookmarkId());
|
| - row.setSearchHistoryDelegate(BookmarkSearchView.this);
|
| - return convertView;
|
| - }
|
| - }
|
| -}
|
|
|