19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor; 20fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brownimport android.database.BulkCursorDescriptor; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.BulkCursorNative; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.BulkCursorToCursorAdaptor; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 24d2183654e03d589b120467f4e98da1b178ceeadbJeff Brownimport android.database.CursorToBulkCursorAdaptor; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.IBulkCursor; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.IContentObserver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 301877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrickimport android.os.Bundle; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 33a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.ICancellationSignal; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 3903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintanaimport java.util.ArrayList; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectabstract public class ContentProviderNative extends Binder implements IContentProvider { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentProviderNative() 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attachInterface(this, descriptor); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cast a Binder object into a content resolver interface, generating 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a proxy if needed. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public IContentProvider asInterface(IBinder obj) 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider in = 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (IContentProvider)obj.queryLocalInterface(descriptor); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in != null) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return in; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ContentProviderProxy(obj); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown /** 69d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown * Gets the name of the content provider. 70d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown * Should probably be part of the {@link IContentProvider} interface. 71d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown * @return The content provider name. 72d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown */ 73d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown public abstract String getProviderName(); 74d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case QUERY_TRANSACTION: 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 839ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 859ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 869ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick // String[] projection 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int num = data.readInt(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] projection = null; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num > 0) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project projection = new String[num]; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num; i++) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project projection[i] = data.readString(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 969ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick // String selection, String[] selectionArgs... 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = data.readString(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project num = data.readInt(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs = null; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num > 0) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectionArgs = new String[num]; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < num; i++) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectionArgs[i] = data.readString(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sortOrder = data.readString(); 108d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown IContentObserver observer = IContentObserver.Stub.asInterface( 109d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown data.readStrongBinder()); 1104c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown ICancellationSignal cancellationSignal = ICancellationSignal.Stub.asInterface( 11175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown data.readStrongBinder()); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown Cursor cursor = query(url, projection, selection, selectionArgs, sortOrder, 1144c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown cancellationSignal); 115d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown if (cursor != null) { 116d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown CursorToBulkCursorAdaptor adaptor = new CursorToBulkCursorAdaptor( 1170cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown cursor, observer, getProviderName()); 118fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown BulkCursorDescriptor d = adaptor.getBulkCursorDescriptor(); 119d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown 120d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown reply.writeNoException(); 121fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown reply.writeInt(1); 122fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown d.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 124eca53640a863b40ea9f96f280a90ce8aa538f9d1Fabrice Di Meglio reply.writeNoException(); 125fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown reply.writeInt(0); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_TYPE_TRANSACTION: 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = getType(url); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeString(type); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INSERT_TRANSACTION: 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = ContentValues.CREATOR.createFromParcel(data); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri out = insert(url, values); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.writeToParcel(reply, out); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BULK_INSERT_TRANSACTION: 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues[] values = data.createTypedArray(ContentValues.CREATOR); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = bulkInsert(url, values); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(count); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1668943737692169f564cd34a9c8d471f3a5d438712Fred Quintana case APPLY_BATCH_TRANSACTION: 1678943737692169f564cd34a9c8d471f3a5d438712Fred Quintana { 1688943737692169f564cd34a9c8d471f3a5d438712Fred Quintana data.enforceInterface(IContentProvider.descriptor); 16903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana final int numOperations = data.readInt(); 17003d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana final ArrayList<ContentProviderOperation> operations = 17103d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana new ArrayList<ContentProviderOperation>(numOperations); 17203d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana for (int i = 0; i < numOperations; i++) { 17303d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana operations.add(i, ContentProviderOperation.CREATOR.createFromParcel(data)); 17403d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana } 1758943737692169f564cd34a9c8d471f3a5d438712Fred Quintana final ContentProviderResult[] results = applyBatch(operations); 1766a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana reply.writeNoException(); 1778943737692169f564cd34a9c8d471f3a5d438712Fred Quintana reply.writeTypedArray(results, 0); 1786a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana return true; 1796a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } 1806a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DELETE_TRANSACTION: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = data.readString(); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs = data.readStringArray(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = delete(url, selection, selectionArgs); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(count); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UPDATE_TRANSACTION: 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = ContentValues.CREATOR.createFromParcel(data); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = data.readString(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs = data.readStringArray(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = update(url, values, selection, selectionArgs); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(count); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_FILE_TRANSACTION: 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mode = data.readString(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor fd; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = openFile(url, mode); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd != null) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(1); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd.writeToParcel(reply, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(0); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_ASSET_FILE_TRANSACTION: 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.enforceInterface(IContentProvider.descriptor); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = Uri.CREATOR.createFromParcel(data); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mode = data.readString(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetFileDescriptor fd; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd = openAssetFile(url, mode); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeNoException(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd != null) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(1); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd.writeToParcel(reply, 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeInt(0); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2471877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 2481877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick case CALL_TRANSACTION: 2491877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick { 2501877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick data.enforceInterface(IContentProvider.descriptor); 2511877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 2521877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick String method = data.readString(); 2531877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick String stringArg = data.readString(); 2541877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick Bundle args = data.readBundle(); 2551877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 2561877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick Bundle responseBundle = call(method, stringArg, args); 2571877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 2581877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick reply.writeNoException(); 2591877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick reply.writeBundle(responseBundle); 2601877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick return true; 2611877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick } 26223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 26323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn case GET_STREAM_TYPES_TRANSACTION: 26423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn { 26523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn data.enforceInterface(IContentProvider.descriptor); 26623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Uri url = Uri.CREATOR.createFromParcel(data); 26723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn String mimeTypeFilter = data.readString(); 26823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn String[] types = getStreamTypes(url, mimeTypeFilter); 26923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn reply.writeNoException(); 27023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn reply.writeStringArray(types); 27123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 27223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return true; 27323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 27423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 27523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn case OPEN_TYPED_ASSET_FILE_TRANSACTION: 27623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn { 27723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn data.enforceInterface(IContentProvider.descriptor); 27823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Uri url = Uri.CREATOR.createFromParcel(data); 27923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn String mimeType = data.readString(); 28023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Bundle opts = data.readBundle(); 28123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 28223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn AssetFileDescriptor fd; 28323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd = openTypedAssetFile(url, mimeType, opts); 28423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn reply.writeNoException(); 28523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (fd != null) { 28623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn reply.writeInt(1); 28723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd.writeToParcel(reply, 28823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 28923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } else { 29023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn reply.writeInt(0); 29123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 29223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return true; 29323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 29475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 29575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown case CREATE_CANCELATION_SIGNAL_TRANSACTION: 29675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown { 29775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown data.enforceInterface(IContentProvider.descriptor); 29875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 2994c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown ICancellationSignal cancellationSignal = createCancellationSignal(); 30075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown reply.writeNoException(); 3014c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown reply.writeStrongBinder(cancellationSignal.asBinder()); 30275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown return true; 30375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DatabaseUtils.writeExceptionToParcel(reply, e); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTransact(code, data, reply, flags); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder asBinder() 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class ContentProviderProxy implements IContentProvider 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentProviderProxy(IBinder remote) 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRemote = remote; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder asBinder() 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRemote; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 332d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown public Cursor query(Uri url, String[] projection, String selection, 3334c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown String[] selectionArgs, String sortOrder, ICancellationSignal cancellationSignal) 33475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown throws RemoteException { 3350cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown BulkCursorToCursorAdaptor adaptor = new BulkCursorToCursorAdaptor(); 3360cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown Parcel data = Parcel.obtain(); 3370cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown Parcel reply = Parcel.obtain(); 338df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 3390cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 3400cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown 3410cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown url.writeToParcel(data, 0); 3420cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown int length = 0; 3430cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown if (projection != null) { 3440cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown length = projection.length; 3450cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } 3460cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeInt(length); 3470cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown for (int i = 0; i < length; i++) { 3480cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeString(projection[i]); 3490cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } 3500cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeString(selection); 3510cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown if (selectionArgs != null) { 3520cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown length = selectionArgs.length; 3530cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } else { 3540cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown length = 0; 3550cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } 3560cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeInt(length); 3570cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown for (int i = 0; i < length; i++) { 3580cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeString(selectionArgs[i]); 3590cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } 3600cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeString(sortOrder); 3610cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.writeStrongBinder(adaptor.getObserver().asBinder()); 3624c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown data.writeStrongBinder(cancellationSignal != null ? cancellationSignal.asBinder() : null); 3630cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown 3640cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown mRemote.transact(IContentProvider.QUERY_TRANSACTION, data, reply, 0); 3650cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown 3660cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 3670cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown 368fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown if (reply.readInt() != 0) { 369fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown BulkCursorDescriptor d = BulkCursorDescriptor.CREATOR.createFromParcel(reply); 370fb5a4964b8d402b39754f406dd2255035ff2148dJeff Brown adaptor.initialize(d); 3710cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } else { 372d2183654e03d589b120467f4e98da1b178ceeadbJeff Brown adaptor.close(); 3730cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown adaptor = null; 3749ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick } 3750cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown return adaptor; 3760cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } catch (RemoteException ex) { 3770cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown adaptor.close(); 3780cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown throw ex; 3790cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown } catch (RuntimeException ex) { 3800cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown adaptor.close(); 3810cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown throw ex; 382df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 3830cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown data.recycle(); 3840cde89f5f025b7826be009ebb9673b970e180e32Jeff Brown reply.recycle(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getType(Uri url) throws RemoteException 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 392df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 393df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 395df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 397df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.GET_TYPE_TRANSACTION, data, reply, 0); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 400df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown String out = reply.readString(); 401df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return out; 402df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 403df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 404df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 405df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uri insert(Uri url, ContentValues values) throws RemoteException 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 412df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 413df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 415df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 416df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown values.writeToParcel(data, 0); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 418df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.INSERT_TRANSACTION, data, reply, 0); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 420df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 421df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown Uri out = Uri.CREATOR.createFromParcel(reply); 422df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return out; 423df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 424df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 425df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 426df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int bulkInsert(Uri url, ContentValues[] values) throws RemoteException { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 432df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 433df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 435df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 436df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeTypedArray(values, 0); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 438df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.BULK_INSERT_TRANSACTION, data, reply, 0); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 440df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 441df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int count = reply.readInt(); 442df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return count; 443df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 444df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 445df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 446df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44903d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) 4508943737692169f564cd34a9c8d471f3a5d438712Fred Quintana throws RemoteException, OperationApplicationException { 4516a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana Parcel data = Parcel.obtain(); 4526a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana Parcel reply = Parcel.obtain(); 453df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 454df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 455df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInt(operations.size()); 456df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown for (ContentProviderOperation operation : operations) { 457df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown operation.writeToParcel(data, 0); 458df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 459df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.APPLY_BATCH_TRANSACTION, data, reply, 0); 460df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown 461df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(reply); 462df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown final ContentProviderResult[] results = 463df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.createTypedArray(ContentProviderResult.CREATOR); 464df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return results; 465df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 466df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 467df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 46803d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana } 4696a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } 4706a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int delete(Uri url, String selection, String[] selectionArgs) 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 475df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 476df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 478df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 479df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(selection); 480df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeStringArray(selectionArgs); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 482df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.DELETE_TRANSACTION, data, reply, 0); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 484df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 485df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int count = reply.readInt(); 486df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return count; 487df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 488df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 489df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 490df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int update(Uri url, ContentValues values, String selection, 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs) throws RemoteException { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 497df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 498df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 500df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 501df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown values.writeToParcel(data, 0); 502df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(selection); 503df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeStringArray(selectionArgs); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 505df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.UPDATE_TRANSACTION, data, reply, 0); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 507df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 508df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int count = reply.readInt(); 509df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return count; 510df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 511df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 512df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 513df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ParcelFileDescriptor openFile(Uri url, String mode) 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException, FileNotFoundException { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 520df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 521df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 523df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 524df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(mode); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 526df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.OPEN_FILE_TRANSACTION, data, reply, 0); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 528df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply); 529df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int has = reply.readInt(); 530df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown ParcelFileDescriptor fd = has != 0 ? reply.readFileDescriptor() : null; 531df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return fd; 532df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 533df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 534df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 535df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AssetFileDescriptor openAssetFile(Uri url, String mode) 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException, FileNotFoundException { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(); 542df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 543df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 545df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 546df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(mode); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 548df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.OPEN_ASSET_FILE_TRANSACTION, data, reply, 0); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 550df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply); 551df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int has = reply.readInt(); 552df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown AssetFileDescriptor fd = has != 0 553df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown ? AssetFileDescriptor.CREATOR.createFromParcel(reply) : null; 554df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return fd; 555df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 556df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 557df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 558df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5611877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick public Bundle call(String method, String request, Bundle args) 5621877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick throws RemoteException { 5631877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick Parcel data = Parcel.obtain(); 5641877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick Parcel reply = Parcel.obtain(); 565df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 566df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 5671877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 568df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(method); 569df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(request); 570df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeBundle(args); 571dfb437e17c6ba3b29f9e636d064125668d706249Brad Fitzpatrick 572df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.CALL_TRANSACTION, data, reply, 0); 573dfb437e17c6ba3b29f9e636d064125668d706249Brad Fitzpatrick 574df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 575df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown Bundle bundle = reply.readBundle(); 576df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return bundle; 577df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 578df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 579df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 580df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 5811877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick } 5821877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick 58323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException 58423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn { 58523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Parcel data = Parcel.obtain(); 58623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Parcel reply = Parcel.obtain(); 587df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 588df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 58923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 590df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 591df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(mimeTypeFilter); 59223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 593df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.GET_STREAM_TYPES_TRANSACTION, data, reply, 0); 59423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 595df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionFromParcel(reply); 596df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown String[] out = reply.createStringArray(); 597df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return out; 598df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 599df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 600df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 601df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 60223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 60323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 60423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn public AssetFileDescriptor openTypedAssetFile(Uri url, String mimeType, Bundle opts) 60523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throws RemoteException, FileNotFoundException { 60623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Parcel data = Parcel.obtain(); 60723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn Parcel reply = Parcel.obtain(); 608df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown try { 609df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 610df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown 611df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown url.writeToParcel(data, 0); 612df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeString(mimeType); 613df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.writeBundle(opts); 614df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown 615df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown mRemote.transact(IContentProvider.OPEN_TYPED_ASSET_FILE_TRANSACTION, data, reply, 0); 616df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown 617df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(reply); 618df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown int has = reply.readInt(); 619df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown AssetFileDescriptor fd = has != 0 620df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown ? AssetFileDescriptor.CREATOR.createFromParcel(reply) : null; 621df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown return fd; 622df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } finally { 623df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown data.recycle(); 624df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown reply.recycle(); 625df6611d8c0cd69c3dcb93462eb138e0bbf137b88Jeff Brown } 62623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 62723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 6284c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown public ICancellationSignal createCancellationSignal() throws RemoteException { 62975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown Parcel data = Parcel.obtain(); 63075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown Parcel reply = Parcel.obtain(); 63175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown try { 63275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown data.writeInterfaceToken(IContentProvider.descriptor); 63375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 63475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown mRemote.transact(IContentProvider.CREATE_CANCELATION_SIGNAL_TRANSACTION, 63575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown data, reply, 0); 63675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 63775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown DatabaseUtils.readExceptionFromParcel(reply); 6384c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown ICancellationSignal cancellationSignal = ICancellationSignal.Stub.asInterface( 63975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown reply.readStrongBinder()); 6404c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown return cancellationSignal; 64175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } finally { 64275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown data.recycle(); 64375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown reply.recycle(); 64475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 64575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 64675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IBinder mRemote; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 649