1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
18package com.android.settings.search;
19
20import android.content.Context;
21import android.text.TextUtils;
22import android.util.Log;
23
24import com.android.settings.applications.PackageManagerWrapperImpl;
25import com.android.settings.dashboard.SiteMapManager;
26import com.android.settings.overlay.FeatureFactory;
27
28/**
29 * FeatureProvider for the refactored search code.
30 */
31public class SearchFeatureProviderImpl implements SearchFeatureProvider {
32
33    private static final String TAG = "SearchFeatureProvider";
34
35    private static final String METRICS_ACTION_SETTINGS_INDEX = "search_synchronous_indexing";
36
37    private DatabaseIndexingManager mDatabaseIndexingManager;
38    private SiteMapManager mSiteMapManager;
39
40    @Override
41    public boolean isEnabled(Context context) {
42        return true;
43    }
44
45    @Override
46    public DatabaseResultLoader getDatabaseSearchLoader(Context context, String query) {
47        return new DatabaseResultLoader(context, cleanQuery(query), getSiteMapManager());
48    }
49
50    @Override
51    public InstalledAppResultLoader getInstalledAppSearchLoader(Context context, String query) {
52        return new InstalledAppResultLoader(
53                context, new PackageManagerWrapperImpl(context.getPackageManager()),
54                cleanQuery(query), getSiteMapManager());
55    }
56
57    @Override
58    public AccessibilityServiceResultLoader getAccessibilityServiceResultLoader(Context context,
59            String query) {
60        return new AccessibilityServiceResultLoader(context, cleanQuery(query),
61                getSiteMapManager());
62    }
63
64    @Override
65    public InputDeviceResultLoader getInputDeviceResultLoader(Context context, String query) {
66        return new InputDeviceResultLoader(context, cleanQuery(query), getSiteMapManager());
67    }
68
69    @Override
70    public SavedQueryLoader getSavedQueryLoader(Context context) {
71        return new SavedQueryLoader(context);
72    }
73
74    @Override
75    public DatabaseIndexingManager getIndexingManager(Context context) {
76        if (mDatabaseIndexingManager == null) {
77            mDatabaseIndexingManager = new DatabaseIndexingManager(context.getApplicationContext(),
78                    context.getPackageName());
79        }
80        return mDatabaseIndexingManager;
81    }
82
83    @Override
84    public boolean isIndexingComplete(Context context) {
85        return getIndexingManager(context).isIndexingComplete();
86    }
87
88    public SiteMapManager getSiteMapManager() {
89        if (mSiteMapManager == null) {
90            mSiteMapManager = new SiteMapManager();
91        }
92        return mSiteMapManager;
93    }
94
95    @Override
96    public void updateIndexAsync(Context context, IndexingCallback callback) {
97        if (SettingsSearchIndexablesProvider.DEBUG) {
98            Log.d(TAG, "updating index async");
99        }
100        getIndexingManager(context).indexDatabase(callback);
101    }
102
103    @Override
104    public void updateIndex(Context context) {
105        long indexStartTime = System.currentTimeMillis();
106        getIndexingManager(context).performIndexing();
107        int indexingTime = (int) (System.currentTimeMillis() - indexStartTime);
108        FeatureFactory.getFactory(context).getMetricsFeatureProvider()
109                .histogram(context, METRICS_ACTION_SETTINGS_INDEX, indexingTime);
110    }
111
112    /**
113     * A generic method to make the query suitable for searching the database.
114     *
115     * @return the cleaned query string
116     */
117    private String cleanQuery(String query) {
118        if (TextUtils.isEmpty(query)) {
119            return null;
120        }
121        return query.trim();
122    }
123}
124