SuggestionsAdapter.java revision 185bb2e3881452c084fde44d9bee657f65881b0e
1185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert/*
2185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * Copyright (C) 2009 The Android Open Source Project
3185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert *
4185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
5185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * you may not use this file except in compliance with the License.
6185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * You may obtain a copy of the License at
7185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert *
8185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
9185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert *
10185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * Unless required by applicable law or agreed to in writing, software
11185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
12185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * See the License for the specific language governing permissions and
14185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * limitations under the License.
15185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert */
16185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
17185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertpackage com.android.quicksearchbox.ui;
18185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
19185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport com.android.quicksearchbox.Source;
20185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport com.android.quicksearchbox.SuggestionCursor;
21185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport com.android.quicksearchbox.Suggestions;
22185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
23185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.database.DataSetObservable;
24185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.database.DataSetObserver;
25185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.graphics.drawable.Drawable;
26185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.util.Log;
27185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.view.View;
28185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport android.view.ViewGroup;
29185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
30185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport java.util.ArrayList;
31185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
32185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert/**
33185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert * Uses a {@link Suggestions} object to back a {@link TabView}.
34185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert */
35185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertpublic class SuggestionsAdapter implements TabAdapter {
36185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
37185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private static final boolean DBG = true;
38185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private static final String TAG = "QSB.SuggestionsAdapter";
39185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
40185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private long mSourceResultPublishDelayMillis;
41185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private long mInitialSourceResultWaitMillis;
42185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
43185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private final DataSetObservable mDataSetObservable = new DataSetObservable();
44185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
45185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private final SuggestionViewFactory mViewFactory;
46185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
47185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private DataSetObserver mDataSetObserver;
48185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
49185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    /**
50185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert     * The tabs, in their display order.
51185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert     */
52185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private final ArrayList<Tab> mTabs = new ArrayList<Tab>();
53185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
54185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private Suggestions mSuggestions;
55185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
56185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private boolean mClosed = false;
57185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
58185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public SuggestionsAdapter(SuggestionViewFactory viewFactory) {
59185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mViewFactory = viewFactory;
60185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
61185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
62185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void setSourceResultPublishDelayMillis(long millis) {
63185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mSourceResultPublishDelayMillis = millis;
64185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
65185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
66185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void setInitialSourceResultWaitMillis(long millis) {
67185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mInitialSourceResultWaitMillis = millis;
68185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
69185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
70185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public int getTabCount() {
71185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return mTabs.size();
72185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
73185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
74185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void setSources(ArrayList<Source> sources) {
75185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        setSuggestions(null);
76185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mTabs.clear();
77185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        SuggestionCursorAdapter promoted = new SuggestionCursorAdapter(mViewFactory);
78185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mTabs.add(new PromotedTab(promoted));
79185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        int count = sources.size();
80185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        for (int i = 0; i < count; i++) {
81185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            Source source = sources.get(i);
82185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            // TODO: Each source should specify its own view factory
83185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            SuggestionCursorAdapter adapter = new SuggestionCursorAdapter(mViewFactory);
84185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mTabs.add(new SourceTab(source, adapter));
85185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
86185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        notifyDataSetChanged();
87185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
88185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
89185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void close() {
90185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        setSuggestions(null);
91185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mTabs.clear();
92185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mClosed = true;
93185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
94185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
95185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void setSuggestions(Suggestions suggestions) {
96185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mSuggestions == suggestions) {
97185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return;
98185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
99185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mClosed) {
100185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            if (suggestions != null) {
101185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert                suggestions.close();
102185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            }
103185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return;
104185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
105185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mDataSetObserver == null) {
106185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mDataSetObserver = new MySuggestionsObserver();
107185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
108185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        // TODO: delay the change if there are no suggestions for the currently visible tab.
109185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mSuggestions != null) {
110185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mSuggestions.unregisterDataSetObserver(mDataSetObserver);
111185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mSuggestions.close();
112185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
113185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mSuggestions = suggestions;
114185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mSuggestions != null) {
115185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mSuggestions.registerDataSetObserver(mDataSetObserver);
116185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
117185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        onSuggestionsChanged();
118185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
119185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
120185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public View getTabContentView(int position, ViewGroup parent) {
121185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (DBG) Log.d(TAG, "getTabContent(" + position + ")");
122185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return getTab(position).getListView(parent);
123185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
124185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
125185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public View getTabHandleView(int position, ViewGroup parent) {
126185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return getTab(position).getTabHandleView(parent);
127185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
128185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
129185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private Tab getTab(int position) {
130185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mClosed) {
131185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            throw new IllegalStateException("SuggestionsAdapter is closed.");
132185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
133185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return mTabs.get(position);
134185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
135185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
136185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public String getTag(int position) {
137185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return String.valueOf(position);
138185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
139185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
140185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public int getTabPosition(String tag) {
141185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return Integer.parseInt(tag);
142185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
143185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
144185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void registerDataSetObserver(DataSetObserver observer) {
145185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mDataSetObservable.registerObserver(observer);
146185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
147185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
148185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public void unregisterDataSetObserver(DataSetObserver observer) {
149185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mDataSetObservable.unregisterObserver(observer);
150185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
151185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
152185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    protected void notifyDataSetChanged() {
153185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mDataSetObservable.notifyChanged();
154185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
155185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
156185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    protected void notifyDataSetInvalidated() {
157185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        mDataSetObservable.notifyInvalidated();
158185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
159185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
160185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    protected void onSuggestionsChanged() {
161185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (DBG) Log.d(TAG, "onSuggestionsChanged(), mSuggestions=" + mSuggestions);
162185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        // TODO: It's inefficient to change all cursors every time a
163185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        // new one is added to Suggestions, we should get a set of
164185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        // changed ones in the call.
165185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        for (Tab tab : mTabs) {
166185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            tab.update();
167185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
168185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
169185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
170185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private class MySuggestionsObserver extends DataSetObserver {
171185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        @Override
172185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public void onChanged() {
173185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            onSuggestionsChanged();
174185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
175185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
176185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
177185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private abstract class Tab {
178185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        private final SuggestionCursorAdapter mAdapter;
179185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
180185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public Tab(SuggestionCursorAdapter adapter) {
181185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mAdapter = adapter;
182185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
183185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
184185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public SuggestionCursorAdapter getAdapter() {
185185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return mAdapter;
186185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
187185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
188185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public void update() {
189185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            if (mSuggestions == null) {
190185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert                mAdapter.changeCursor(null);
191185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            } else {
192185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert                mAdapter.changeCursor(getCursor(mSuggestions));
193185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            }
194185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
195185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
196185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected abstract SuggestionCursor getCursor(Suggestions suggestions);
197185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
198185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected abstract Drawable getIcon();
199185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
200185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public View getTabHandleView(ViewGroup parent) {
201185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            TabHandleView view = mViewFactory.createSuggestionTabView(parent);
202185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            view.setIcon(getIcon());
203185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return view;
204185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
205185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
206185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public View getListView(ViewGroup parent) {
207185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            if (DBG) Log.d(TAG, "getListView()");
208185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            SuggestionListView view = mViewFactory.createSuggestionListView(parent);
209185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            view.setAdapter(mAdapter);
210185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return view;
211185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
212185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
213185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
214185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private class PromotedTab extends Tab {
215185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
216185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public PromotedTab(SuggestionCursorAdapter adapter) {
217185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            super(adapter);
218185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
219185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
220185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        @Override
221185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected SuggestionCursor getCursor(Suggestions suggestions) {
222185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return suggestions.getPromoted();
223185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
224185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
225185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        @Override
226185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected Drawable getIcon() {
227185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return mViewFactory.getPromotedIcon();
228185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
229185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
230185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
231185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private class SourceTab extends Tab {
232185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        private final Source mSource;
233185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
234185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        public SourceTab(Source source, SuggestionCursorAdapter adapter) {
235185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            super(adapter);
236185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mSource = source;
237185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
238185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
239185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        @Override
240185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected SuggestionCursor getCursor(Suggestions suggestions) {
241185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return suggestions.getSourceResult(mSource.getComponentName());
242185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
243185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
244185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        @Override
245185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        protected Drawable getIcon() {
246185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            return mSource.getSourceIcon();
247185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
248185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
249185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
250185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert}
251