SuggestionData.java revision 3e44ff1f2a204db3f479698cf0b3eab3d451dec2
13e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert/*
23e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project
33e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
43e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
53e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * you may not use this file except in compliance with the License.
63e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * You may obtain a copy of the License at
73e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
83e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
93e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * See the License for the specific language governing permissions and
143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * limitations under the License.
153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */
163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpackage com.android.quicksearchbox;
183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.app.SearchManager;
203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.Intent;
213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert/**
233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Holds data for each suggest item including the display data and how to launch the result.
243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Used for passing from the provider to the suggest cursor.
253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Use {@link Builder} to create new instances.
263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */
283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpublic class SuggestionData {
293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final Source mSource;
313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mFormat;
323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mText1;
333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mText2;
343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mIcon1;
353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mIcon2;
363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final Intent mIntent;
373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final Intent mSecondaryIntent;
383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mDisplayQuery;
393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final String mShortcutId;
403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SuggestionData(
423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Source source,
433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String format,
443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String text1,
453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String text2,
463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String icon1,
473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String icon2,
483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Intent intent,
493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Intent secondaryIntent,
503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String displayQuery,
513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            String shortcutId) {
523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mSource = source;
533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mFormat = format;
543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mText1 = text1;
553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mText2 = text2;
563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mIcon1 = icon1;
573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mIcon2 = icon2;
583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mIntent = intent == null ? null : new Intent(intent);
593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mSecondaryIntent = secondaryIntent == null ? null : new Intent(intent);
603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mDisplayQuery = displayQuery;
613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mShortcutId = shortcutId;
623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Gets the suggestion source that created this suggestion.
663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Source getSource() {
683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSource;
693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Gets the format of the text in the title and description.
733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getFormat() {
753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mFormat;
763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Gets the display title (typically shown as the first line).
803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getText1() {
823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mText1;
833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Gets the display description (typically shown as the second line).
873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getText2() {
893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mText2;
903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Resource ID or URI for the first icon (typically shown on the left).
943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getIcon1() {
963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIcon1;
973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Resource ID or URI for the second icon (typically shown on the right).
1013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getIcon2() {
1033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIcon2;
1043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * The intent to launch.
1083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Intent getIntent() {
1103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIntent == null ? null : new Intent(mIntent);
1113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * The secondary intent for the suggestion.
1153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Intent getSecondaryIntent() {
1173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSecondaryIntent == null ? null : new Intent(mSecondaryIntent);
1183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * The query to display when this suggestion is selected.
1223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getDisplayQuery() {
1243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mDisplayQuery;
1253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * The shortcut id.
1293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getShortcutId() {
1313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mShortcutId;
1323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean hasSecondaryIntent() {
1353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSecondaryIntent != null;
1363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private String makeKeyComponent(String str) {
1393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return str == null ? "" : str;
1403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getSuggestionKey() {
1433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String action = "";
1443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String data = "";
1453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String query = "";
1463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mIntent != null) {
1473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            action = makeKeyComponent(mIntent.getAction());
1483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            data = makeKeyComponent(mIntent.getDataString());
1493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            query = makeKeyComponent(mIntent.getStringExtra(SearchManager.QUERY));
1503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // calculating accurate size of string builder avoids an allocation vs starting with
1523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // the default size and having to expand.
1533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        int size = action.length() + 2 + data.length() + query.length();
1543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return new StringBuilder(size)
1553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append(action)
1563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append('#')
1573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append(data)
1583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append('#')
1593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append(query)
1603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .toString();
1613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Gets a builder initialized with the values from this suggestion.
1653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Builder buildUpon() {
1673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return new Builder(getSource())
1683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .format(getFormat())
1693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .text1(getText1())
1703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .text2(getText2())
1713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .icon1(getIcon1())
1723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .icon2(getIcon2())
1733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .intent(getIntent())
1743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .secondaryIntent(getSecondaryIntent())
1753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .shortcutId(getShortcutId());
1763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private String getIntentString() {
1793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mIntent == null) {
1803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return null;
1813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIntent.toUri(Intent.URI_INTENT_SCHEME);
1833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private String getSecondaryIntentString() {
1863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSecondaryIntent == null) {
1873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return null;
1883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSecondaryIntent.toUri(Intent.URI_INTENT_SCHEME);
1903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    @Override
1933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean equals(Object o) {
1943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (this == o) {
1953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return true;
1963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (o == null || getClass() != o.getClass()) {
1983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return false;
1993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        SuggestionData that = (SuggestionData) o;
2023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mSource, that.mSource)) return false;
2043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mFormat, that.mFormat)) return false;
2053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mText1, that.mText1)) return false;
2063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mText2, that.mText2)) return false;
2073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mIcon1, that.mIcon1)) return false;
2083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mIcon2, that.mIcon2)) return false;
2093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(getIntentString(), that.getIntentString())) return false;
2103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(getSecondaryIntentString(), that.getSecondaryIntentString())) return false;
2113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (notEqual(mShortcutId, that.mShortcutId)) return false;
2123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return true;
2133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private static boolean notEqual(Object x, Object y) {
2163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (x == null) {
2173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return y != null;
2183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (x == y) {
2203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return false;
2213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return !x.equals(y);
2233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    @Override
2263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public int hashCode() {
2273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        int result = mSource.hashCode();
2283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mFormat);
2293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mText1);
2303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mText2);
2313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mIcon1);
2323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mIcon2);
2333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, getIntentString());
2343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, getSecondaryIntentString());
2353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        result = addHashCode(result, mShortcutId);
2363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return result;
2373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private static int addHashCode(int old, String str) {
2403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return 31 * old + (str != null ? str.hashCode() : 0);
2413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
2443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Returns a string representation of the contents of this SuggestionData,
2453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * for debugging purposes.
2463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
2473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    @Override
2483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String toString() {
2493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        StringBuilder builder = new StringBuilder("SuggestionData(");
2503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        builder.append("source=").append(mSource.getComponentName().toShortString())
2513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .append(", title=").append(mText1);
2523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mIntent != null) {
2533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            builder.append(", intent=").append(getIntentString());
2543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSecondaryIntent != null) {
2563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            builder.append(", secondaryIntent=").append(getSecondaryIntentString());
2573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mShortcutId != null) {
2593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            builder.append(", shortcutid=").append(mShortcutId);
2603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        builder.append(")");
2633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return builder.toString();
2643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
2673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * Builder for {@link SuggestionData}.
2683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
2693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public static class Builder {
2703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private Source mSource;
2713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mFormat;
2723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mText1;
2733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mText2;
2743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mIcon1;
2753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mIcon2;
2763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private Intent mIntent;
2773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private Intent mSecondaryIntent;
2783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mDisplayQuery;
2793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        private String mShortcutId;
2803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
2823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Creates a new suggestion builder.
2833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         *
2843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * @param source The suggestion source that this suggestion comes from.
2853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
2863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder(Source source) {
2873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSource = source;
2883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
2893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
2913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Builds a suggestion using the values set in the builder.
2923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
2933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public SuggestionData build() {
2943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return new SuggestionData(
2953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mSource,
2963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mFormat,
2973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mText1,
2983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mText2,
2993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mIcon1,
3003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mIcon2,
3013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mIntent,
3023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mSecondaryIntent,
3033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mDisplayQuery,
3043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mShortcutId);
3053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the format of the text in the title and description.
3093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder format(String format) {
3113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mFormat = format;
3123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the first text line.
3173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder text1(String text1) {
3193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mText1 = text1;
3203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the second text line.
3253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder text2(String text2) {
3273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mText2 = text2;
3283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the resource ID or URI for the first icon (typically shown on the left).
3333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder icon1(String icon1) {
3353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mIcon1 = icon1;
3363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the resource ID for the first icon (typically shown on the left).
3413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder icon1(int icon1) {
3433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return icon1(String.valueOf(icon1));
3443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the resource ID or URI for the second icon (typically shown on the right).
3483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder icon2(String icon2) {
3503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mIcon2 = icon2;
3513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the resource ID for the second icon (typically shown on the right).
3563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder icon2(int icon2) {
3583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return icon2(String.valueOf(icon2));
3593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the intent to launch.
3633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder intent(Intent intent) {
3653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mIntent = intent;
3663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the secondary intent .
3713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder secondaryIntent(Intent intent) {
3733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSecondaryIntent = intent;
3743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the query that will be displayed when this suggestion is selected.
3793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder displayQuery(String displayQuery) {
3813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mDisplayQuery = displayQuery;
3823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
3853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        /**
3863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         * Sets the shortcut id.
3873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert         */
3883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        public Builder shortcutId(String shortcutId) {
3893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mShortcutId = shortcutId;
3903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return this;
3913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
3923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
3933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert}
394