177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert/*
277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * Copyright (C) 2010 The Android Open Source Project
377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert *
477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * you may not use this file except in compliance with the License.
677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * You may obtain a copy of the License at
777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert *
877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert *
1077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * Unless required by applicable law or agreed to in writing, software
1177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
1277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * See the License for the specific language governing permissions and
1477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * limitations under the License.
1577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert */
1677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertpackage com.android.quicksearchbox.ui;
1777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
1877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport com.android.quicksearchbox.Suggestion;
1977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport com.android.quicksearchbox.SuggestionCursor;
2077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
2177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport android.content.Context;
2277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport android.view.View;
2377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport android.view.ViewGroup;
2477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
2577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport java.util.Collection;
2677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport java.util.HashSet;
2777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertimport java.util.LinkedList;
2877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
2977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert/**
3077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert * Suggestion view factory for Google suggestions.
3177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert */
3277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringertpublic class DefaultSuggestionViewFactory implements SuggestionViewFactory {
3377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
3477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    private final LinkedList<SuggestionViewFactory> mFactories
3577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            = new LinkedList<SuggestionViewFactory>();
3677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    private final SuggestionViewFactory mDefaultFactory;
3777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    private HashSet<String> mViewTypes;
3877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
3977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    public DefaultSuggestionViewFactory(Context context) {
4077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        mDefaultFactory = new DefaultSuggestionView.Factory(context);
4177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        addFactory(new WebSearchSuggestionView.Factory(context));
4277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        addFactory(new ContactSuggestionView.Factory(context));
4377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
4477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
4577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    /**
4677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert     * Must only be called from the constructor
4777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert     */
4877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    protected final void addFactory(SuggestionViewFactory factory) {
4977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        mFactories.addFirst(factory);
5077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
5177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
5277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    public Collection<String> getSuggestionViewTypes() {
5377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        if (mViewTypes == null) {
5477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            mViewTypes = new HashSet<String>();
5577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            mViewTypes.addAll(mDefaultFactory.getSuggestionViewTypes());
5677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            for (SuggestionViewFactory factory : mFactories) {
5777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert                mViewTypes.addAll(factory.getSuggestionViewTypes());
5877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            }
5977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        }
6077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        return mViewTypes;
6177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
6277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
6377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    public View getView(SuggestionCursor suggestion, String userQuery,
6477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            View convertView, ViewGroup parent) {
6577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        for (SuggestionViewFactory factory : mFactories) {
6677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            if (factory.canCreateView(suggestion)) {
6777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert                return factory.getView(suggestion, userQuery, convertView, parent);
6877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            }
6977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        }
7077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        return mDefaultFactory.getView(suggestion, userQuery, convertView, parent);
7177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
7277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
7377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    public String getViewType(Suggestion suggestion) {
7477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        for (SuggestionViewFactory factory : mFactories) {
7577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            if (factory.canCreateView(suggestion)) {
7677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert                return factory.getViewType(suggestion);
7777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert            }
7877909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        }
7977909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        return mDefaultFactory.getViewType(suggestion);
8077909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
8177909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
8277909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    @Override
8377909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    public boolean canCreateView(Suggestion suggestion) {
8477909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert        return true;
8577909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert    }
8677909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert
8777909685887bd6db7454b73cf274afc3aca2f58dBjorn Bringert}
88