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