Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8465bd3a authored by Matthew Fritze's avatar Matthew Fritze Committed by android-build-merger
Browse files

Merge "Prevent search crashes from uninstalled apps" into oc-dev

am: 6d537b67

Change-Id: I21b6bbf8a2c22fe98e0a2f03fc3f95cb9edc225e
parents 563d2d5a 6d537b67
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -515,7 +515,7 @@ public class DatabaseIndexingManager {
            if (count > 0) {
                while (cursor.moveToNext()) {
                    final int providerRank = cursor.getInt(COLUMN_INDEX_XML_RES_RANK);

                    // TODO remove provider rank
                    final int xmlResId = cursor.getInt(COLUMN_INDEX_XML_RES_RESID);

                    final String className = cursor.getString(COLUMN_INDEX_XML_RES_CLASS_NAME);
@@ -560,7 +560,7 @@ public class DatabaseIndexingManager {
            if (count > 0) {
                while (cursor.moveToNext()) {
                    final int providerRank = cursor.getInt(COLUMN_INDEX_RAW_RANK);

                    // TODO Remove rank
                    final String title = cursor.getString(COLUMN_INDEX_RAW_TITLE);
                    final String summaryOn = cursor.getString(COLUMN_INDEX_RAW_SUMMARY_ON);
                    final String summaryOff = cursor.getString(COLUMN_INDEX_RAW_SUMMARY_OFF);
+18 −2
Original line number Diff line number Diff line
@@ -167,6 +167,17 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (TextUtils.isEmpty(mQuery)) {
            return;
        }
        final String query = mQuery;
        mQuery = "";
        onQueryTextChange(query);
    }

    @Override
    public void onStop() {
        super.onStop();
@@ -206,7 +217,6 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
        mResultClickCount = 0;
        mNeverEnteredQuery = false;
        mQuery = query;
        mSearchAdapter.clearResults();

        if (isEmptyQuery) {
            final LoaderManager loaderManager = getLoaderManager();
@@ -252,7 +262,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
            return;
        }
        final int resultCount = mSearchAdapter.displaySearchResults();
        mNoResultsView.setVisibility(resultCount == 0 ? View.VISIBLE : View.GONE);

        if (resultCount == 0) {
            mNoResultsView.setVisibility(View.VISIBLE);
        } else {
            mNoResultsView.setVisibility(View.GONE);
            mResultsRecyclerView.scrollToPosition(0);
        }
        mSearchFeatureProvider.showFeedbackButton(this, getView());
    }

+20 −4
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ public class SearchResult implements Comparable<SearchResult> {
        icon = builder.mIcon;
        payload = builder.mResultPayload;
        viewType = payload.getType();
        stableId = Objects.hash(title, summary, breadcrumbs, rank, icon, payload, viewType);
        stableId = Objects.hash(title, summary, breadcrumbs, rank, viewType);
    }

    @Override
@@ -104,6 +104,22 @@ public class SearchResult implements Comparable<SearchResult> {
        return this.rank - searchResult.rank;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof SearchResult)) {
            return false;
        }
        return this.stableId == ((SearchResult) obj).stableId;
    }

    @Override
    public int hashCode() {
        return (int) stableId;
    }

    public static class Builder {
        protected CharSequence mTitle;
        protected CharSequence mSummary;
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.android.settings.search2;

import android.support.v7.util.DiffUtil;

import java.util.List;

/**
 * Callback for DiffUtil to elegantly update search data when the query changes.
 */
public class SearchResultDiffCallback extends DiffUtil.Callback {

    private List<SearchResult> mOldList;
    private List<SearchResult> mNewList;

    public SearchResultDiffCallback(List<SearchResult> oldList, List<SearchResult> newList) {
        mOldList = oldList;
        mNewList = newList;
    }

    @Override
    public int getOldListSize() {
        return mOldList.size();
    }

    @Override
    public int getNewListSize() {
        return mNewList.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
    }
}
+12 −8
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.search2;
import android.content.Context;
import android.support.annotation.MainThread;
import android.support.annotation.VisibleForTesting;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.util.ArrayMap;
import android.view.LayoutInflater;
@@ -37,8 +38,9 @@ import static com.android.settings.search2.SearchResult.TOP_RANK;

public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder> {

    private final List<SearchResult> mSearchResults;
    private final SearchFragment mFragment;

    private List<SearchResult> mSearchResults;
    private Map<String, List<? extends SearchResult>> mResultsMap;

    public SearchResultsAdapter(SearchFragment fragment) {
@@ -128,7 +130,7 @@ public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder>
                .get(InstalledAppResultLoader.class.getName());
        final int dbSize = (databaseResults != null) ? databaseResults.size() : 0;
        final int appSize = (installedAppResults != null) ? installedAppResults.size() : 0;
        final List<SearchResult> results = new ArrayList<>(dbSize + appSize);
        final List<SearchResult> newResults = new ArrayList<>(dbSize + appSize);

        int dbIndex = 0;
        int appIndex = 0;
@@ -136,23 +138,25 @@ public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder>

        while (rank <= BOTTOM_RANK) {
            while ((dbIndex < dbSize) && (databaseResults.get(dbIndex).rank == rank)) {
                results.add(databaseResults.get(dbIndex++));
                newResults.add(databaseResults.get(dbIndex++));
            }
            while ((appIndex < appSize) && (installedAppResults.get(appIndex).rank == rank)) {
                results.add(installedAppResults.get(appIndex++));
                newResults.add(installedAppResults.get(appIndex++));
            }
            rank++;
        }

        while (dbIndex < dbSize) {
            results.add(databaseResults.get(dbIndex++));
            newResults.add(databaseResults.get(dbIndex++));
        }
        while (appIndex < appSize) {
            results.add(installedAppResults.get(appIndex++));
            newResults.add(installedAppResults.get(appIndex++));
        }

        mSearchResults.addAll(results);
        notifyDataSetChanged();
        final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
                new SearchResultDiffCallback(mSearchResults, newResults), false /* detectMoves */);
        mSearchResults = newResults;
        diffResult.dispatchUpdatesTo(this);

        return mSearchResults.size();
    }
Loading