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

Commit 507cf37c authored by Alex Stetson's avatar Alex Stetson Committed by Automerger Merge Worker
Browse files

Car Search RecyclerView Framework am: 11cbea11

Change-Id: I7b23c4673d034fba00abb0b0e4badc55cdfd56f7
parents 084b6b03 11cbea11
Loading
Loading
Loading
Loading
+0 −90
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.intelligence.search;

import static com.android.car.ui.core.CarUi.requireInsets;
import static com.android.car.ui.core.CarUi.requireToolbar;

import android.os.Bundle;

import com.android.car.ui.preference.PreferenceFragment;
import com.android.car.ui.toolbar.ToolbarController;
import com.android.settings.intelligence.R;
import com.android.car.ui.toolbar.MenuItem;
import com.android.car.ui.toolbar.Toolbar;

import java.util.Collections;
import java.util.List;

/**
 * Search fragment for car settings
 */
public class CarSearchFragment extends PreferenceFragment {

    private MenuItem mClearHistoryButton;

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.car_search_fragment, rootKey);
    }

    protected ToolbarController getToolbar() {
        return requireToolbar(requireActivity());
    }

    protected List<MenuItem> getToolbarMenuItems() {
        return Collections.singletonList(mClearHistoryButton);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mClearHistoryButton = new MenuItem.Builder(getContext())
                .setTitle(R.string.search_clear_history)
                .setDisplayBehavior(MenuItem.DisplayBehavior.NEVER)
                .setOnClickListener(i -> onClearHistoryButtonClicked())
                .build();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ToolbarController toolbar = getToolbar();
        if (toolbar != null) {
            List<MenuItem> items = getToolbarMenuItems();
            toolbar.setTitle(getPreferenceScreen().getTitle());
            toolbar.setMenuItems(items);
            toolbar.setNavButtonMode(Toolbar.NavButtonMode.BACK);
            toolbar.setState(Toolbar.State.SUBPAGE);
            toolbar.setState(Toolbar.State.SEARCH);
            toolbar.setSearchHint(R.string.abc_search_hint);
            toolbar.registerOnSearchListener(this::onQueryTextChange);
            toolbar.setShowMenuItemsWhileSearching(true);
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        onCarUiInsetsChanged(requireInsets(requireActivity()));
    }

    private void onQueryTextChange(String query) {}

    private void onClearHistoryButtonClicked() {}
}
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.os.Bundle;
import android.view.WindowManager;

import com.android.settings.intelligence.R;
import com.android.settings.intelligence.search.car.CarSearchFragment;

public class SearchActivity extends FragmentActivity {

+57 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.intelligence.search;

/**
 * Shared constant variables and identifiers.
 */
public class SearchCommon {
    /**
     * Instance state key for the currently entered query.
     */
    public static final String STATE_QUERY = "state_query";
    /**
     * Instance state key for whether or not saved queries are being shown.
     */
    public static final String STATE_SHOWING_SAVED_QUERY = "state_showing_saved_query";
    /**
     * Instance state key for whether or not a query has been entered yet.
     */
    public static final String STATE_NEVER_ENTERED_QUERY = "state_never_entered_query";

    /**
     * Identifier constants for the search loaders.
     */
    public static final class SearchLoaderId {
        /**
         * Loader identifier to get search results.
         */
        public static final int SEARCH_RESULT = 1;
        /**
         * Loader identifier to save an entered query.
         */
        public static final int SAVE_QUERY_TASK = 2;
        /**
         * Loader identifier to remove an entered query.
         */
        public static final int REMOVE_QUERY_TASK = 3;
        /**
         * Loader identifier to get currently saved queries.
         */
        public static final int SAVED_QUERIES = 4;
    }
}
+11 −26
Original line number Diff line number Diff line
@@ -64,21 +64,6 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
        LoaderManager.LoaderCallbacks<List<? extends SearchResult>>, IndexingCallback {
    private static final String TAG = "SearchFragment";

    // State values
    private static final String STATE_QUERY = "state_query";
    private static final String STATE_SHOWING_SAVED_QUERY = "state_showing_saved_query";
    private static final String STATE_NEVER_ENTERED_QUERY = "state_never_entered_query";

    public static final class SearchLoaderId {
        // Search Query IDs
        public static final int SEARCH_RESULT = 1;

        // Saved Query IDs
        public static final int SAVE_QUERY_TASK = 2;
        public static final int REMOVE_QUERY_TASK = 3;
        public static final int SAVED_QUERIES = 4;
    }

    @VisibleForTesting
    String mQuery;

@@ -134,9 +119,9 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
        mSearchFeatureProvider.initFeedbackButton();

        if (savedInstanceState != null) {
            mQuery = savedInstanceState.getString(STATE_QUERY);
            mNeverEnteredQuery = savedInstanceState.getBoolean(STATE_NEVER_ENTERED_QUERY);
            mShowingSavedQuery = savedInstanceState.getBoolean(STATE_SHOWING_SAVED_QUERY);
            mQuery = savedInstanceState.getString(SearchCommon.STATE_QUERY);
            mNeverEnteredQuery = savedInstanceState.getBoolean(SearchCommon.STATE_NEVER_ENTERED_QUERY);
            mShowingSavedQuery = savedInstanceState.getBoolean(SearchCommon.STATE_SHOWING_SAVED_QUERY);
        } else {
            mShowingSavedQuery = true;
        }
@@ -208,9 +193,9 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(STATE_QUERY, mQuery);
        outState.putBoolean(STATE_NEVER_ENTERED_QUERY, mNeverEnteredQuery);
        outState.putBoolean(STATE_SHOWING_SAVED_QUERY, mShowingSavedQuery);
        outState.putString(SearchCommon.STATE_QUERY, mQuery);
        outState.putBoolean(SearchCommon.STATE_NEVER_ENTERED_QUERY, mNeverEnteredQuery);
        outState.putBoolean(SearchCommon.STATE_SHOWING_SAVED_QUERY, mShowingSavedQuery);
    }

    @Override
@@ -238,7 +223,7 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi

        if (isEmptyQuery) {
            final LoaderManager loaderManager = getLoaderManager();
            loaderManager.destroyLoader(SearchLoaderId.SEARCH_RESULT);
            loaderManager.destroyLoader(SearchCommon.SearchLoaderId.SEARCH_RESULT);
            mShowingSavedQuery = true;
            mSavedQueryController.loadSavedQueries();
            mSearchFeatureProvider.hideFeedbackButton(getView());
@@ -263,7 +248,7 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
        final Activity activity = getActivity();

        switch (id) {
            case SearchLoaderId.SEARCH_RESULT:
            case SearchCommon.SearchLoaderId.SEARCH_RESULT:
                return mSearchFeatureProvider.getSearchResultLoader(activity, mQuery);
            default:
                return null;
@@ -292,7 +277,7 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
            mSavedQueryController.loadSavedQueries();
        } else {
            final LoaderManager loaderManager = getLoaderManager();
            loaderManager.initLoader(SearchLoaderId.SEARCH_RESULT, null /* args */,
            loaderManager.initLoader(SearchCommon.SearchLoaderId.SEARCH_RESULT, null /* args */,
                    this /* callback */);
        }

@@ -338,8 +323,8 @@ public class SearchFragment extends Fragment implements SearchView.OnQueryTextLi
    private void restartLoaders() {
        mShowingSavedQuery = false;
        final LoaderManager loaderManager = getLoaderManager();
        loaderManager.restartLoader(
                SearchLoaderId.SEARCH_RESULT, null /* args */, this /* callback */);
        loaderManager.restartLoader(SearchCommon.SearchLoaderId.SEARCH_RESULT,
                null /* args */, this /* callback */);
    }

    public String getQuery() {
+80 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.intelligence.search.car;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.util.Log;
import android.view.View;

import com.android.settings.intelligence.R;
import com.android.settings.intelligence.search.AppSearchResult;
import com.android.settings.intelligence.search.SearchResult;

import java.util.List;

/**
 * ViewHolder for intent based search results.
 */
public class CarIntentSearchViewHolder extends CarSearchViewHolder {
    private static final String TAG = "CarIntentSearchViewHolder";
    private static final int REQUEST_CODE_NO_OP = 0;

    public CarIntentSearchViewHolder(View view) {
        super(view);
    }

    @Override
    public void onBind(CarSearchFragment fragment, SearchResult result) {
        mTitle.setText(result.title);
        if (result instanceof AppSearchResult) {
            AppSearchResult appResult = (AppSearchResult) result;
            PackageManager pm = fragment.getActivity().getPackageManager();
            mIcon.setImageDrawable(appResult.info.loadIcon(pm));
        } else {
            mIcon.setImageDrawable(result.icon);
        }
        if (result.breadcrumbs != null && !result.breadcrumbs.isEmpty()) {
            String breadcrumb = result.breadcrumbs.get(0);
            int count = result.breadcrumbs.size();
            for (int i = 1; i < count; i++) {
                breadcrumb = mContext.getString(R.string.search_breadcrumb_connector,
                        breadcrumb, result.breadcrumbs.get(i));
            }
            mSummary.setText(breadcrumb);
        }

        itemView.setOnClickListener(v -> {
            fragment.onSearchResultClicked(/* resultViewHolder= */ this, result);
            Intent intent = result.payload.getIntent();
            if (result instanceof AppSearchResult) {
                AppSearchResult appResult = (AppSearchResult) result;
                fragment.getActivity().startActivity(intent);
            } else {
                PackageManager pm = fragment.getActivity().getPackageManager();
                List<ResolveInfo> info = pm.queryIntentActivities(intent, /* flags= */ 0);
                if (info != null && !info.isEmpty()) {
                    fragment.startActivityForResult(intent, REQUEST_CODE_NO_OP);
                } else {
                    Log.e(TAG, "Cannot launch search result, title: "
                            + result.title + ", " + intent);
                }
            }
        });
    }
}
Loading