1 /*
2  * Copyright (C) 2014 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 package android.provider;
18 
19 import android.annotation.NonNull;
20 import android.annotation.SystemApi;
21 import android.content.ContentResolver;
22 
23 /**
24  * Describe the contract for an Indexable data.
25  *
26  * @hide
27  */
28 @SystemApi
29 public class SearchIndexablesContract {
30 
31     /**
32      * Intent action used to identify {@link SearchIndexablesProvider}
33      * instances. This is used in the {@code <intent-filter>} of a {@code <provider>}.
34      */
35     public static final String PROVIDER_INTERFACE =
36             "android.content.action.SEARCH_INDEXABLES_PROVIDER";
37 
38     private static final String SETTINGS = "settings";
39 
40     /**
41      * Indexable reference names.
42      */
43     public static final String INDEXABLES_XML_RES = "indexables_xml_res";
44 
45     /**
46      * ContentProvider path for indexable xml resources.
47      */
48     public static final String INDEXABLES_XML_RES_PATH = SETTINGS + "/" + INDEXABLES_XML_RES;
49 
50     /**
51      * Indexable raw data names.
52      */
53     public static final String INDEXABLES_RAW = "indexables_raw";
54 
55     /**
56      * ContentProvider path for indexable raw data.
57      */
58     public static final String INDEXABLES_RAW_PATH = SETTINGS + "/" + INDEXABLES_RAW;
59 
60     /**
61      * Non indexable data keys.
62      */
63     public static final String NON_INDEXABLES_KEYS = "non_indexables_key";
64 
65     /**
66      * Site map pairs data key
67      *
68      * @hide
69      */
70     public static final String SITE_MAP_PAIRS_KEYS = "site_map_pairs";
71 
72     /**
73      * ContentProvider path for non indexable data keys.
74      */
75     public static final String NON_INDEXABLES_KEYS_PATH = SETTINGS + "/" + NON_INDEXABLES_KEYS;
76 
77     /**
78      * ContentProvider path for sitemap keys.
79      *
80      * @hide
81      */
82     public static final String SITE_MAP_PAIRS_PATH = SETTINGS + "/" + SITE_MAP_PAIRS_KEYS;
83 
84     /**
85      * Last path segment for Preference Key, Slice Uri pair.
86      * <p>
87      *     The (Key, Slice Uri) pairs are a mapping between the primary key of the search result and
88      *     a Uri for a Slice that represents the same data. Thus, an app can specify a list of Uris
89      *     for Slices that replace regular intent-based search results with inline content.
90      * </p>
91      */
92     public static final String SLICE_URI_PAIRS = "slice_uri_pairs";
93 
94     /**
95      * ContentProvider path for Slice Uri pairs.
96      */
97     public static final String SLICE_URI_PAIRS_PATH = SETTINGS + "/" + SLICE_URI_PAIRS;
98 
99     /**
100      * Indexable xml resources columns.
101      */
102     public static final String[] INDEXABLES_XML_RES_COLUMNS = new String[] {
103             XmlResource.COLUMN_RANK,                    // 0
104             XmlResource.COLUMN_XML_RESID,               // 1
105             XmlResource.COLUMN_CLASS_NAME,              // 2
106             XmlResource.COLUMN_ICON_RESID,              // 3
107             XmlResource.COLUMN_INTENT_ACTION,           // 4
108             XmlResource.COLUMN_INTENT_TARGET_PACKAGE,   // 5
109             XmlResource.COLUMN_INTENT_TARGET_CLASS      // 6
110     };
111 
112     /**
113      * Indexable xml resources columns indices.
114      */
115     public static final int COLUMN_INDEX_XML_RES_RANK = 0;
116     public static final int COLUMN_INDEX_XML_RES_RESID = 1;
117     public static final int COLUMN_INDEX_XML_RES_CLASS_NAME = 2;
118     public static final int COLUMN_INDEX_XML_RES_ICON_RESID = 3;
119     public static final int COLUMN_INDEX_XML_RES_INTENT_ACTION = 4;
120     public static final int COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE = 5;
121     public static final int COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS = 6;
122 
123     /**
124      * Indexable raw data columns.
125      */
126     public static final String[] INDEXABLES_RAW_COLUMNS = new String[] {
127             RawData.COLUMN_RANK,                    // 0
128             RawData.COLUMN_TITLE,                   // 1
129             RawData.COLUMN_SUMMARY_ON,              // 2
130             RawData.COLUMN_SUMMARY_OFF,             // 3
131             RawData.COLUMN_ENTRIES,                 // 4
132             RawData.COLUMN_KEYWORDS,                // 5
133             RawData.COLUMN_SCREEN_TITLE,            // 6
134             RawData.COLUMN_CLASS_NAME,              // 7
135             RawData.COLUMN_ICON_RESID,              // 8
136             RawData.COLUMN_INTENT_ACTION,           // 9
137             RawData.COLUMN_INTENT_TARGET_PACKAGE,   // 10
138             RawData.COLUMN_INTENT_TARGET_CLASS,     // 11
139             RawData.COLUMN_KEY,                     // 12
140             RawData.COLUMN_USER_ID,                 // 13
141             RawData.PAYLOAD_TYPE,                   // 14
142             RawData.PAYLOAD                         // 15
143     };
144 
145     /**
146      * Columns for site map queries.
147      *
148      * @hide
149      */
150     public static final String[] SITE_MAP_COLUMNS = new String[] {
151             SiteMapColumns.PARENT_CLASS,
152             SiteMapColumns.PARENT_TITLE,
153             SiteMapColumns.CHILD_CLASS,
154             SiteMapColumns.CHILD_TITLE,
155     };
156 
157     /**
158      * Indexable raw data columns indices.
159      */
160     public static final int COLUMN_INDEX_RAW_RANK = 0;
161     public static final int COLUMN_INDEX_RAW_TITLE = 1;
162     public static final int COLUMN_INDEX_RAW_SUMMARY_ON = 2;
163     public static final int COLUMN_INDEX_RAW_SUMMARY_OFF = 3;
164     public static final int COLUMN_INDEX_RAW_ENTRIES = 4;
165     public static final int COLUMN_INDEX_RAW_KEYWORDS = 5;
166     public static final int COLUMN_INDEX_RAW_SCREEN_TITLE = 6;
167     public static final int COLUMN_INDEX_RAW_CLASS_NAME = 7;
168     public static final int COLUMN_INDEX_RAW_ICON_RESID = 8;
169     public static final int COLUMN_INDEX_RAW_INTENT_ACTION = 9;
170     public static final int COLUMN_INDEX_RAW_INTENT_TARGET_PACKAGE = 10;
171     public static final int COLUMN_INDEX_RAW_INTENT_TARGET_CLASS = 11;
172     public static final int COLUMN_INDEX_RAW_KEY = 12;
173     public static final int COLUMN_INDEX_RAW_USER_ID = 13;
174     /**
175      * @hide
176      */
177     public static final int COLUMN_INDEX_RAW_PAYLOAD_TYPE = 14;
178     /**
179      * @hide
180      */
181     public static final int COLUMN_INDEX_RAW_PAYLOAD = 15;
182 
183     /**
184      * Indexable raw data columns.
185      */
186     public static final String[] NON_INDEXABLES_KEYS_COLUMNS = new String[] {
187             NonIndexableKey.COLUMN_KEY_VALUE      // 0
188     };
189 
190     /**
191      * Non indexable data keys columns indices.
192      */
193     public static final int COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE = 0;
194 
195     /**
196      * Columns for the SliceUri and Preference Key pairs.
197      */
198     public static final class SliceUriPairColumns {
SliceUriPairColumns()199         private SliceUriPairColumns() {}
200 
201         /**
202          * The preference key for the Setting.
203          */
204         public static final String KEY = "key";
205         /**
206          * The Slice Uri corresponding to the Setting key.
207          */
208         public static final String SLICE_URI = "slice_uri";
209     }
210 
211     /**
212      * Cursor schema for SliceUriPairs.
213      */
214     @NonNull
215     public static final String[] SLICE_URI_PAIRS_COLUMNS = new String[]{
216             SliceUriPairColumns.KEY,
217             SliceUriPairColumns.SLICE_URI
218     };
219 
220     /**
221      * Constants related to a {@link SearchIndexableResource}.
222      *
223      * This is a description of
224      */
225     public static final class XmlResource extends BaseColumns {
XmlResource()226         private XmlResource() {
227         }
228 
229         public static final String MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE +
230                 "/" + INDEXABLES_XML_RES;
231 
232         /**
233          * XML resource ID for the {@link android.preference.PreferenceScreen} to load and index.
234          */
235         public static final String COLUMN_XML_RESID = "xmlResId";
236     }
237 
238     /**
239      * @hide
240      */
241     public static final class SiteMapColumns {
242         public static final String PARENT_CLASS = "parent_class";
243         public static final String CHILD_CLASS = "child_class";
244         public static final String PARENT_TITLE = "parent_title";
245         public static final String CHILD_TITLE = "child_title";
246     }
247 
248     /**
249      * Constants related to a {@link SearchIndexableData}.
250      *
251      * This is the raw data that is stored into an Index. This is related to
252      * {@link android.preference.Preference} and its attributes like
253      * {@link android.preference.Preference#getTitle()},
254      * {@link android.preference.Preference#getSummary()}, etc.
255      */
256     public static final class RawData extends BaseColumns {
RawData()257         private RawData() {
258         }
259 
260         public static final String MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE +
261                 "/" + INDEXABLES_RAW;
262 
263         /**
264          * Title's raw data.
265          */
266         public static final String COLUMN_TITLE = "title";
267 
268         /**
269          * Summary's raw data when the data is "ON".
270          */
271         public static final String COLUMN_SUMMARY_ON = "summaryOn";
272 
273         /**
274          * Summary's raw data when the data is "OFF".
275          */
276         public static final String COLUMN_SUMMARY_OFF = "summaryOff";
277 
278         /**
279          * Entries associated with the raw data (when the data can have several values).
280          */
281         public static final String COLUMN_ENTRIES = "entries";
282 
283         /**
284          * Keywords' raw data.
285          */
286         public static final String COLUMN_KEYWORDS = "keywords";
287 
288         /**
289          * Fragment or Activity title associated with the raw data.
290          */
291         public static final String COLUMN_SCREEN_TITLE = "screenTitle";
292 
293         /**
294          * Key associated with the raw data. The key needs to be unique.
295          */
296         public static final String COLUMN_KEY = "key";
297 
298         /**
299          * UserId associated with the raw data.
300          */
301         public static final String COLUMN_USER_ID = "user_id";
302 
303         /**
304          * Identifier for the Payload object type.
305          *
306          * @hide
307          */
308         public static final String PAYLOAD_TYPE = "payload_type";
309 
310         /**
311          * Generic payload for improving Search result expressiveness.
312          *
313          * @hide
314          */
315         public static final String PAYLOAD = "payload";
316     }
317 
318     /**
319      * Constants related to a {@link SearchIndexableResource} and {@link SearchIndexableData}.
320      *
321      * This is a description of a data (thru its unique key) that cannot be indexed.
322      */
323     public static final class NonIndexableKey extends BaseColumns {
NonIndexableKey()324         private NonIndexableKey() {
325         }
326 
327         public static final String MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE +
328                 "/" + NON_INDEXABLES_KEYS;
329 
330         /**
331          * Key for the non indexable data.
332          */
333         public static final String COLUMN_KEY_VALUE = "key";
334     }
335 
336     /**
337      * The base columns.
338      */
339     public static class BaseColumns {
BaseColumns()340         private BaseColumns() {
341         }
342 
343         /**
344          * Rank of the data. This is an integer used for ranking the search results. This is
345          * application specific.
346          */
347         public static final String COLUMN_RANK = "rank";
348 
349         /**
350          * Class name associated with the data (usually a Fragment class name).
351          */
352         public static final String COLUMN_CLASS_NAME = "className";
353 
354         /**
355          * Icon resource ID for the data.
356          */
357         public static final String COLUMN_ICON_RESID = "iconResId";
358 
359         /**
360          * Intent action associated with the data.
361          */
362         public static final String COLUMN_INTENT_ACTION = "intentAction";
363 
364         /**
365          * Intent target package associated with the data.
366          */
367         public static final String COLUMN_INTENT_TARGET_PACKAGE = "intentTargetPackage";
368 
369         /**
370          * Intent target class associated with the data.
371          */
372         public static final String COLUMN_INTENT_TARGET_CLASS = "intentTargetClass";
373     }
374 }
375