1/* 2 * Copyright (C) 2011 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 17package com.android.contacts.tests; 18 19import android.app.IntentService; 20import android.content.Intent; 21import android.database.Cursor; 22import android.net.Uri; 23import android.text.TextUtils; 24import android.util.Log; 25 26/** 27 * A service that executes a query specified by an intent and dump the result on logcat. Use the 28 * "am" command to launch it. 29 * 30 Usage: 31 adb shell am startservice -d URI \ 32 [-e p OPTIONAL PROJECTION] [-e s OPTIONAL SELECTION] [-e s OPTIONAL ORDER BY] \ 33 com.android.contacts.tests/.QueryService 34 35 Example: 36 37 adb shell am startservice -d content://com.android.contacts/directories \ 38 -e p accountName,accountType -e s 'accountName NOT NULL' -e o '_id' \ 39 com.android.contacts.tests/.QueryService 40 */ 41public class QueryService extends IntentService { 42 private static final String TAG = "contactsquery"; 43 44 private static final String EXTRA_PROJECTION = "p"; 45 private static final String EXTRA_SELECTION = "s"; 46 private static final String EXTRA_ORDER = "o"; 47 private static final String NULL_STRING = "*null*"; 48 private static final String SEPARATOR = "|"; 49 50 public QueryService() { 51 super("ContactsQueryService"); 52 } 53 54 @Override 55 protected void onHandleIntent(Intent intent) { 56 final Uri uri = intent.getData(); 57 // Unfortunately "am" doesn't support string arrays... 58 final String projection = intent.getStringExtra(EXTRA_PROJECTION); 59 final String selection = intent.getStringExtra(EXTRA_SELECTION); 60 final String order = intent.getStringExtra(EXTRA_ORDER); 61 62 Log.i(TAG, "URI: " + uri); 63 Log.i(TAG, "Projection: " + projection); 64 Log.i(TAG, "Selection: " + selection); 65 66 try { 67 Cursor c = getContentResolver().query(uri, parseProjection(projection), selection, null, 68 order); 69 if (c == null) { 70 Log.i(TAG, "(no results)"); 71 return; 72 } 73 StringBuilder sb = new StringBuilder(); 74 try { 75 Log.i(TAG, "Result count: " + c.getCount()); 76 77 final int columnCount = c.getColumnCount(); 78 79 sb.setLength(0); 80 for (int i = 0; i < columnCount; i++) { 81 add(sb, c.getColumnName(i)); 82 } 83 Log.i(TAG, sb.toString()); 84 85 c.moveToPosition(-1); 86 while (c.moveToNext()) { 87 sb.setLength(0); 88 for (int i = 0; i < columnCount; i++) { 89 add(sb, c.getString(i)); 90 } 91 Log.i(TAG, sb.toString()); 92 } 93 } finally { 94 c.close(); 95 } 96 } catch (Exception e) { 97 Log.e(TAG, "Exeption while executing query", e); 98 } 99 } 100 101 private StringBuilder add(StringBuilder sb, String s) { 102 if (sb.length() > 0) { 103 sb.append(SEPARATOR); 104 } 105 sb.append(s == null ? NULL_STRING : s); 106 return sb; 107 } 108 109 private static String[] parseProjection(String projectionString) { 110 if (TextUtils.isEmpty(projectionString)) { 111 return null; // all columns 112 } 113 final String[] columns = projectionString.split(","); 114 if (columns.length == 0) { 115 return null; // all columns 116 } 117 return columns; 118 } 119} 120