QsbApplication.java revision 816804b67619af133860a1e28e92f58bc642260d
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
19816804b67619af133860a1e28e92f58bc642260dBjorn Bringertimport com.android.quicksearchbox.ui.DelayingSuggestionsAdapter;
20185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport com.android.quicksearchbox.ui.SuggestionViewFactory;
21185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringertimport com.android.quicksearchbox.ui.SuggestionViewInflater;
22816804b67619af133860a1e28e92f58bc642260dBjorn Bringertimport com.android.quicksearchbox.ui.SuggestionsAdapter;
23185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.app.Application;
253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.os.Handler;
263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.os.Looper;
273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport java.util.concurrent.ThreadFactory;
293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpublic class QsbApplication extends Application {
313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
320484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    private Handler mUiThreadHandler;
333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private Config mConfig;
343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private Sources mSources;
353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private ShortcutRepository mShortcutRepository;
363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private SourceTaskExecutor mSourceTaskExecutor;
370484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    private SuggestionsProvider mGlobalSuggestionsProvider;
38185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    private SuggestionViewFactory mSuggestionViewFactory;
393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    @Override
413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public void onTerminate() {
423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        close();
433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        super.onTerminate();
443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    protected void close() {
473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSources != null) {
483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSources.close();
493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSources = null;
503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mShortcutRepository != null) {
523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mShortcutRepository.close();
533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mShortcutRepository = null;
543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSourceTaskExecutor != null) {
563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSourceTaskExecutor.close();
573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSourceTaskExecutor = null;
583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
590484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        if (mGlobalSuggestionsProvider != null) {
600484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert            mGlobalSuggestionsProvider.close();
610484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert            mGlobalSuggestionsProvider = null;
623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
650484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    public Handler getUiThreadHandler() {
660484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        if (mUiThreadHandler == null) {
670484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert            mUiThreadHandler = createUiThreadHandler();
680484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        }
690484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        return mUiThreadHandler;
700484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    }
710484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert
720484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    protected Handler createUiThreadHandler() {
730484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        return new Handler(Looper.myLooper());
740484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    }
750484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert
763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Config getConfig() {
773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mConfig == null) {
783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mConfig = createConfig();
793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mConfig;
813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    protected Config createConfig() {
843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return new Config(this);
853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SourceLookup getSources() {
883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSources == null) {
893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSources = createSources();
903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSources;
923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    protected Sources createSources() {
953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Sources sources = new Sources(this, getConfig());
963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        sources.load();
973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return sources;
983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public ShortcutRepository getShortcutRepository() {
1013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mShortcutRepository == null) {
1023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mShortcutRepository = createShortcutRepository();
1033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mShortcutRepository;
1053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    protected ShortcutRepository createShortcutRepository() {
1083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return ShortcutRepositoryImplLog.create(this, getConfig(), getSources());
1093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SourceTaskExecutor getSourceTaskExecutor() {
1123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSourceTaskExecutor == null) {
1133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSourceTaskExecutor = createSourceTaskExecutor();
1143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSourceTaskExecutor;
1163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    protected SourceTaskExecutor createSourceTaskExecutor() {
1193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Config config = getConfig();
1203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        ThreadFactory queryThreadFactory =
1213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            new QueryThreadFactory(config.getQueryThreadPriority());
1223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return new DelayingSourceTaskExecutor(config, queryThreadFactory);
1233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1250484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert
1260484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    public SuggestionsProvider getSuggestionsProvider(Source source) {
1270484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        if (source == null) {
1280484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert            return getGlobalSuggestionsProvider();
1290484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        }
1300484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        // TODO: Cache this to avoid creating a new one for each key press
1310484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        return createSuggestionsProvider(source);
1320484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    }
1330484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert
1340484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    protected SuggestionsProvider createSuggestionsProvider(Source source) {
1350484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        // TODO: We could use simpler promoter here
1360484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        Promoter promoter =  new ShortcutPromoter(new RoundRobinPromoter());
1370484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        SingleSourceSuggestionsProvider provider = new SingleSourceSuggestionsProvider(getConfig(),
1380484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert                source,
1390484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert                getSourceTaskExecutor(),
1400484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert                getUiThreadHandler(),
1410484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert                promoter,
1420484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert                getShortcutRepository());
1430484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        return provider;
1440484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    }
1450484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert
1460484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    public SuggestionsProvider getGlobalSuggestionsProvider() {
1470484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        if (mGlobalSuggestionsProvider == null) {
1480484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert            mGlobalSuggestionsProvider = createGlobalSuggestionsProvider();
1493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1500484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert        return mGlobalSuggestionsProvider;
1513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1530484fb4d652bfa9d5c7fb238a7cec1a6f2244e44Bjorn Bringert    protected SuggestionsProvider createGlobalSuggestionsProvider() {
1543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Handler uiThread = new Handler(Looper.myLooper());
1553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Promoter promoter =  new ShortcutPromoter(new RoundRobinPromoter());
1563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        GlobalSuggestionsProvider provider = new GlobalSuggestionsProvider(getConfig(),
1573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                getSources(),
1583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                getSourceTaskExecutor(),
1593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                uiThread,
1603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                promoter,
1613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                getShortcutRepository());
1623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return provider;
1633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
164185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
165185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    public SuggestionViewFactory getSuggestionViewFactory() {
166185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        if (mSuggestionViewFactory == null) {
167185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert            mSuggestionViewFactory = createSuggestionViewFactory();
168185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        }
169185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return mSuggestionViewFactory;
170185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
171185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
172185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    protected SuggestionViewFactory createSuggestionViewFactory() {
173185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert        return new SuggestionViewInflater(this);
174185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert    }
175185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert
176816804b67619af133860a1e28e92f58bc642260dBjorn Bringert    public SuggestionsAdapter createSuggestionsAdapter() {
177816804b67619af133860a1e28e92f58bc642260dBjorn Bringert        Config config = getConfig();
178816804b67619af133860a1e28e92f58bc642260dBjorn Bringert        SuggestionViewFactory viewFactory = getSuggestionViewFactory();
179816804b67619af133860a1e28e92f58bc642260dBjorn Bringert        DelayingSuggestionsAdapter adapter = new DelayingSuggestionsAdapter(viewFactory);
180816804b67619af133860a1e28e92f58bc642260dBjorn Bringert        return adapter;
181816804b67619af133860a1e28e92f58bc642260dBjorn Bringert    }
1823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert}
183