/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.contacts.tests;
import android.app.IntentService;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
/**
* A service that executes a query specified by an intent and dump the result on logcat. Use the
* "am" command to launch it.
*
Usage:
adb shell am startservice -d URI \
[-e p OPTIONAL PROJECTION] [-e s OPTIONAL SELECTION] [-e s OPTIONAL ORDER BY] \
com.android.contacts.tests/.QueryService
Example:
adb shell am startservice -d content://com.android.contacts/directories \
-e p accountName,accountType -e s 'accountName NOT NULL' -e o '_id' \
com.android.contacts.tests/.QueryService
*/
public class QueryService extends IntentService {
private static final String TAG = "contactsquery";
private static final String EXTRA_PROJECTION = "p";
private static final String EXTRA_SELECTION = "s";
private static final String EXTRA_ORDER = "o";
private static final String NULL_STRING = "*null*";
private static final String SEPARATOR = "|";
public QueryService() {
super("ContactsQueryService");
}
@Override
protected void onHandleIntent(Intent intent) {
final Uri uri = intent.getData();
// Unfortunately "am" doesn't support string arrays...
final String projection = intent.getStringExtra(EXTRA_PROJECTION);
final String selection = intent.getStringExtra(EXTRA_SELECTION);
final String order = intent.getStringExtra(EXTRA_ORDER);
Log.i(TAG, "URI: " + uri);
Log.i(TAG, "Projection: " + projection);
Log.i(TAG, "Selection: " + selection);
try {
Cursor c = getContentResolver().query(uri, parseProjection(projection), selection, null,
order);
if (c == null) {
Log.i(TAG, "(no results)");
return;
}
StringBuilder sb = new StringBuilder();
try {
Log.i(TAG, "Result count: " + c.getCount());
final int columnCount = c.getColumnCount();
sb.setLength(0);
for (int i = 0; i < columnCount; i++) {
add(sb, c.getColumnName(i));
}
Log.i(TAG, sb.toString());
c.moveToPosition(-1);
while (c.moveToNext()) {
sb.setLength(0);
for (int i = 0; i < columnCount; i++) {
add(sb, c.getString(i));
}
Log.i(TAG, sb.toString());
}
} finally {
c.close();
}
} catch (Exception e) {
Log.e(TAG, "Exeption while executing query", e);
}
}
private StringBuilder add(StringBuilder sb, String s) {
if (sb.length() > 0) {
sb.append(SEPARATOR);
}
sb.append(s == null ? NULL_STRING : s);
return sb;
}
private static String[] parseProjection(String projectionString) {
if (TextUtils.isEmpty(projectionString)) {
return null; // all columns
}
final String[] columns = projectionString.split(",");
if (columns.length == 0) {
return null; // all columns
}
return columns;
}
}