ContentResolver.java revision 23fdaf6fb62a9b5154b2508916a21c678462c5d0
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 19a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrickimport android.accounts.Account; 20a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrickimport android.app.ActivityThread; 2101e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackbornimport android.app.AppGlobals; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.ContentObserver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.CursorWrapper; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.IContentObserver; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 31231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackbornimport android.os.IBinder; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 34231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackbornimport android.os.ServiceManager; 35d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrickimport android.os.SystemClock; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 37231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackbornimport android.util.Config; 38a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrickimport android.util.EventLog; 39231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackbornimport android.util.Log; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 4703f0292744094ec107ffce71301c394503a31dedGilles Debunneimport java.util.ArrayList; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 49a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrickimport java.util.Random; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides applications access to the content model. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class ContentResolver { 56ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 57ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @deprecated instead use 58ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * {@link #requestSync(android.accounts.Account, String, android.os.Bundle)} 59ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 604a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana @Deprecated 61ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final String SYNC_EXTRAS_ACCOUNT = "account"; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SYNC_EXTRAS_EXPEDITED = "expedited"; 63ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 64ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @deprecated instead use 65ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * {@link #SYNC_EXTRAS_MANUAL} 66ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 674a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana @Deprecated 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SYNC_EXTRAS_FORCE = "force"; 6953bd2522ca7767f46646606123b6e2689b811850Fred Quintana 7053bd2522ca7767f46646606123b6e2689b811850Fred Quintana /** 7153bd2522ca7767f46646606123b6e2689b811850Fred Quintana * If this extra is set to true then the sync settings (like getSyncAutomatically()) 7253bd2522ca7767f46646606123b6e2689b811850Fred Quintana * are ignored by the sync scheduler. 7353bd2522ca7767f46646606123b6e2689b811850Fred Quintana */ 7453bd2522ca7767f46646606123b6e2689b811850Fred Quintana public static final String SYNC_EXTRAS_IGNORE_SETTINGS = "ignore_settings"; 7553bd2522ca7767f46646606123b6e2689b811850Fred Quintana 7653bd2522ca7767f46646606123b6e2689b811850Fred Quintana /** 7753bd2522ca7767f46646606123b6e2689b811850Fred Quintana * If this extra is set to true then any backoffs for the initial attempt (e.g. due to retries) 7853bd2522ca7767f46646606123b6e2689b811850Fred Quintana * are ignored by the sync scheduler. If this request fails and gets rescheduled then the 7953bd2522ca7767f46646606123b6e2689b811850Fred Quintana * retries will still honor the backoff. 8053bd2522ca7767f46646606123b6e2689b811850Fred Quintana */ 8153bd2522ca7767f46646606123b6e2689b811850Fred Quintana public static final String SYNC_EXTRAS_IGNORE_BACKOFF = "ignore_backoff"; 8253bd2522ca7767f46646606123b6e2689b811850Fred Quintana 8353bd2522ca7767f46646606123b6e2689b811850Fred Quintana /** 8453bd2522ca7767f46646606123b6e2689b811850Fred Quintana * If this extra is set to true then the request will not be retried if it fails. 8553bd2522ca7767f46646606123b6e2689b811850Fred Quintana */ 8653bd2522ca7767f46646606123b6e2689b811850Fred Quintana public static final String SYNC_EXTRAS_DO_NOT_RETRY = "do_not_retry"; 8753bd2522ca7767f46646606123b6e2689b811850Fred Quintana 8853bd2522ca7767f46646606123b6e2689b811850Fred Quintana /** 8953bd2522ca7767f46646606123b6e2689b811850Fred Quintana * Setting this extra is the equivalent of setting both {@link #SYNC_EXTRAS_IGNORE_SETTINGS} 9053bd2522ca7767f46646606123b6e2689b811850Fred Quintana * and {@link #SYNC_EXTRAS_IGNORE_BACKOFF} 9153bd2522ca7767f46646606123b6e2689b811850Fred Quintana */ 92ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final String SYNC_EXTRAS_MANUAL = "force"; 9353bd2522ca7767f46646606123b6e2689b811850Fred Quintana 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SYNC_EXTRAS_UPLOAD = "upload"; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS = "deletions_override"; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS = "discard_deletions"; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 984a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana /** 994a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * Set by the SyncManager to request that the SyncAdapter initialize itself for 1004a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * the given account/authority pair. One required initialization step is to 1014a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * ensure that {@link #setIsSyncable(android.accounts.Account, String, int)} has been 1024a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * called with a >= 0 value. When this flag is set the SyncAdapter does not need to 1034a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * do a full sync, though it is allowed to do so. 1044a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana */ 1054a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana public static final String SYNC_EXTRAS_INITIALIZE = "initialize"; 1064a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCHEME_CONTENT = "content"; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCHEME_ANDROID_RESOURCE = "android.resource"; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCHEME_FILE = "file"; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the Android platform's base MIME type for a content: URI 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing a Cursor of a single item. Applications should use this 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the base type along with their own sub-type of their content: URIs 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that represent a particular item. For example, hypothetical IMAP email 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * client may have a URI 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>content://com.company.provider.imap/inbox/1</code> for a particular 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message in the inbox, whose MIME type would be reported as 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>CURSOR_ITEM_BASE_TYPE + "/vnd.company.imap-msg"</code> 1200ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Compare with {@link #CURSOR_DIR_BASE_TYPE}. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CURSOR_ITEM_BASE_TYPE = "vnd.android.cursor.item"; 1240ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the Android platform's base MIME type for a content: URI 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing a Cursor of zero or more items. Applications should use this 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the base type along with their own sub-type of their content: URIs 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that represent a directory of items. For example, hypothetical IMAP email 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * client may have a URI 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>content://com.company.provider.imap/inbox</code> for all of the 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * messages in its inbox, whose MIME type would be reported as 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>CURSOR_DIR_BASE_TYPE + "/vnd.company.imap-msg"</code> 1340ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note how the base MIME type varies between this and 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #CURSOR_ITEM_BASE_TYPE} depending on whether there is 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one single item or multiple items in the data set, while the sub-type 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remains the same because in either case the data structure contained 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the cursor is the same. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CURSOR_DIR_BASE_TYPE = "vnd.android.cursor.dir"; 142ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 143ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 144ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS = 1; 145ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 146ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_AUTHENTICATION = 2; 147ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 148ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_IO = 3; 149ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 150ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_PARSE = 4; 151ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 152ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_CONFLICT = 5; 153ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 154ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_TOO_MANY_DELETIONS = 6; 155ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 156ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_TOO_MANY_RETRIES = 7; 157ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 158ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_ERROR_INTERNAL = 8; 159ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 160ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_OBSERVER_TYPE_SETTINGS = 1<<0; 161ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_OBSERVER_TYPE_PENDING = 1<<1; 162ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_OBSERVER_TYPE_ACTIVE = 1<<2; 163ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 164ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_OBSERVER_TYPE_STATUS = 1<<3; 165ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** @hide */ 166ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static final int SYNC_OBSERVER_TYPE_ALL = 0x7fffffff; 167ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 16825880968cbde25c9edb162c0d70d45dc75239456Brad Fitzpatrick // Always log queries which take 500ms+; shorter queries are 169a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // sampled accordingly. 17025880968cbde25c9edb162c0d70d45dc75239456Brad Fitzpatrick private static final int SLOW_THRESHOLD_MILLIS = 500; 171a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick private final Random mRandom = new Random(); // guarded by itself 172a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 173231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn public ContentResolver(Context context) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected abstract IContentProvider acquireProvider(Context c, String name); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract boolean releaseProvider(IContentProvider icp); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the MIME type of the given content URL. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url A Uri identifying content (either a list or specific type), 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the content:// scheme. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A MIME type for the content, or null if the URL is invalid or the type is unknown 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn public final String getType(Uri url) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(url); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return provider.getType(url); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.lang.Exception e) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * Query for the possible MIME types for the representations the given 20723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * content URL can be returned when opened as as stream with 20823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * {@link #openTypedAssetFileDescriptor}. Note that the types here are 20923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * not necessarily a superset of the type returned by {@link #getType} -- 21023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * many content providers can not return a raw stream for the structured 21123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data that they contain. 21223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * 21323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @param url A Uri identifying content (either a list or specific type), 21423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * using the content:// scheme. 21523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @param mimeTypeFilter The desired MIME type. This may be a pattern, 21623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * such as *\/*, to query for all available MIME types that match the 21723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * pattern. 21823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @return Returns an array of MIME type strings for all availablle 21923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data streams that match the given mimeTypeFilter. If there are none, 22023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * null is returned. 22123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn */ 22223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn public String[] getStreamTypes(Uri url, String mimeTypeFilter) { 22323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn IContentProvider provider = acquireProvider(url); 22423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (provider == null) { 22523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return null; 22623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 22723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn try { 22823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return provider.getStreamTypes(url, mimeTypeFilter); 22923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (RemoteException e) { 23023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return null; 23123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (java.lang.Exception e) { 23223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return null; 23323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } finally { 23423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn releaseProvider(provider); 23523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 23623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 23723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 23823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn /** 2390ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * <p> 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Query the given URI, returning a {@link Cursor} over the result set. 2410ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * </p> 2420ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * <p> 2430ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * For best performance, the caller should follow these guidelines: 2440ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * <ul> 2450ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * <li>Provide an explicit projection, to prevent 2460ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * reading data from storage that aren't going to be used.</li> 2470ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * <li>Use question mark parameter markers such as 'phone=?' instead of 2480ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * explicit values in the {@code selection} parameter, so that queries 2490ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * that differ only by those values will be recognized as the same 2500ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * for caching purposes.</li> 2510ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * </ul> 2520ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * </p> 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The URI, using the content:// scheme, for the content to 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieve. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param projection A list of which columns to return. Passing null will 2570ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * return all columns, which is inefficient. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selection A filter declaring which rows to return, formatted as an 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SQL WHERE clause (excluding the WHERE itself). Passing null will 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return all rows for the given URI. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectionArgs You may include ?s in selection, which will be 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaced by the values from selectionArgs, in the order that they 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appear in the selection. The values will be bound as Strings. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sortOrder How to order the rows, formatted as an SQL ORDER BY 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clause (excluding the ORDER BY itself). Passing null will use the 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default sort order, which may be unordered. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Cursor object, which is positioned before the first entry, or null 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Cursor 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Cursor query(Uri uri, String[] projection, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection, String[] selectionArgs, String sortOrder) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(uri); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 277d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder); 279a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (qCursor == null) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 283020e5345795a157d7829ebbe4d7864595dafc576Vasu Nori // force query execution 284020e5345795a157d7829ebbe4d7864595dafc576Vasu Nori qCursor.getCount(); 285d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long durationMillis = SystemClock.uptimeMillis() - startTime; 286a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick maybeLogQueryToEventLog(durationMillis, uri, projection, selection, sortOrder); 287a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // Wrap the cursor object into CursorWrapperInner object 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new CursorWrapperInner(qCursor, provider); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(RuntimeException e) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw e; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2988943737692169f564cd34a9c8d471f3a5d438712Fred Quintana /** 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a stream on to the content associated with a content URI. If there 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is no data associated with the URI, FileNotFoundException is thrown. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h5>Accepts the following URI schemes:</h5> 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>content ({@link #SCHEME_CONTENT})</li> 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>android.resource ({@link #SCHEME_ANDROID_RESOURCE})</li> 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>file ({@link #SCHEME_FILE})</li> 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3080ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on these schemes. 3110ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The desired URI. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return InputStream 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException if the provided URI could not be opened. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #openAssetFileDescriptor(Uri, String) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final InputStream openInputStream(Uri uri) 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String scheme = uri.getScheme(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SCHEME_ANDROID_RESOURCE.equals(scheme)) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: left here to avoid breaking compatibility. May be removed 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with sufficient testing. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OpenResourceIdResult r = getResourceId(uri); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream stream = r.r.openRawResource(r.id); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stream; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Resources.NotFoundException ex) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Resource does not exist: " + uri); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (SCHEME_FILE.equals(scheme)) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: left here to avoid breaking compatibility. May be removed 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with sufficient testing. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FileInputStream(uri.getPath()); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetFileDescriptor fd = openAssetFileDescriptor(uri, "r"); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd != null ? fd.createInputStream() : null; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Unable to create stream"); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Synonym for {@link #openOutputStream(Uri, String) 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * openOutputStream(uri, "w")}. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException if the provided URI could not be opened. 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final OutputStream openOutputStream(Uri uri) 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return openOutputStream(uri, "w"); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a stream on to the content associated with a content URI. If there 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is no data associated with the URI, FileNotFoundException is thrown. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h5>Accepts the following URI schemes:</h5> 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>content ({@link #SCHEME_CONTENT})</li> 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>file ({@link #SCHEME_FILE})</li> 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on these schemes. 3660ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The desired URI. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode May be "w", "wa", "rw", or "rwt". 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return OutputStream 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException if the provided URI could not be opened. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #openAssetFileDescriptor(Uri, String) 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final OutputStream openOutputStream(Uri uri, String mode) 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws FileNotFoundException { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetFileDescriptor fd = openAssetFileDescriptor(uri, mode); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd != null ? fd.createOutputStream() : null; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Unable to create stream"); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * Open a raw file descriptor to access data under a URI. This 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is like {@link #openAssetFileDescriptor(Uri, String)}, but uses the 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * underlying {@link ContentProvider#openFile} 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ContentProvider.openFile()} method, so will <em>not</em> work with 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providers that return sub-sections of files. If at all possible, 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you should use {@link #openAssetFileDescriptor(Uri, String)}. You 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will receive a FileNotFoundException exception if the provider returns a 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sub-section of a file. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h5>Accepts the following URI schemes:</h5> 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>content ({@link #SCHEME_CONTENT})</li> 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>file ({@link #SCHEME_FILE})</li> 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See {@link #openAssetFileDescriptor(Uri, String)} for more information 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on these schemes. 4010ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill * 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The desired URI to open. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode The file mode to use, as per {@link ContentProvider#openFile 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ContentProvider.openFile}. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new ParcelFileDescriptor pointing to the file. You 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * own this descriptor and are responsible for closing it when done. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException Throws FileNotFoundException of no 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file exists under the URI or the mode is invalid. 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #openAssetFileDescriptor(Uri, String) 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ParcelFileDescriptor openFileDescriptor(Uri uri, 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mode) throws FileNotFoundException { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetFileDescriptor afd = openAssetFileDescriptor(uri, mode); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (afd == null) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4170ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (afd.getDeclaredLength() < 0) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a full file! 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return afd.getParcelFileDescriptor(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4220ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client can't handle a sub-section of a file, so close what 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we got and bail with an exception. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project afd.close(); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4290ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Not a whole file"); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 43423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * Open a raw file descriptor to access data under a URI. This 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interacts with the underlying {@link ContentProvider#openAssetFile} 43603f0292744094ec107ffce71301c394503a31dedGilles Debunne * method of the provider associated with the given URI, to retrieve any file stored there. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h5>Accepts the following URI schemes:</h5> 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>content ({@link #SCHEME_CONTENT})</li> 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>android.resource ({@link #SCHEME_ANDROID_RESOURCE})</li> 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>file ({@link #SCHEME_FILE})</li> 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h5>The android.resource ({@link #SCHEME_ANDROID_RESOURCE}) Scheme</h5> 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Uri object can be used to reference a resource in an APK file. The 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uri should be one of the following formats: 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><code>android.resource://package_name/id_number</code><br/> 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>package_name</code> is your package name as listed in your AndroidManifest.xml. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example <code>com.example.myapp</code><br/> 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>id_number</code> is the int form of the ID.<br/> 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The easiest way to construct this form is 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>Uri uri = Uri.parse("android.resource://com.example.myapp/" + R.raw.my_resource");</pre> 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><code>android.resource://package_name/type/name</code><br/> 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>package_name</code> is your package name as listed in your AndroidManifest.xml. 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example <code>com.example.myapp</code><br/> 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>type</code> is the string form of the resource type. For example, <code>raw</code> 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>drawable</code>. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>name</code> is the string form of the resource name. That is, whatever the file 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * name was in your res directory, without the type extension. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The easiest way to construct this form is 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>Uri uri = Uri.parse("android.resource://com.example.myapp/raw/my_resource");</pre> 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </li> 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 46823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * <p>Note that if this function is called for read-only input (mode is "r") 46923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * on a content: URI, it will instead call {@link #openTypedAssetFileDescriptor} 47023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * for you with a MIME type of "*\/*". This allows such callers to benefit 47123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * from any built-in data conversion that a provider implements. 47223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The desired URI to open. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode The file mode to use, as per {@link ContentProvider#openAssetFile 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ContentProvider.openAssetFile}. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new ParcelFileDescriptor pointing to the file. You 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * own this descriptor and are responsible for closing it when done. 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException Throws FileNotFoundException of no 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file exists under the URI or the mode is invalid. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final AssetFileDescriptor openAssetFileDescriptor(Uri uri, 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mode) throws FileNotFoundException { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String scheme = uri.getScheme(); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SCHEME_ANDROID_RESOURCE.equals(scheme)) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!"r".equals(mode)) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Can't write resources: " + uri); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OpenResourceIdResult r = getResourceId(uri); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r.r.openRawResourceFd(r.id); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Resources.NotFoundException ex) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Resource does not exist: " + uri); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (SCHEME_FILE.equals(scheme)) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor pfd = ParcelFileDescriptor.open( 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new File(uri.getPath()), modeToMode(uri, mode)); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new AssetFileDescriptor(pfd, 0, -1); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 49923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if ("r".equals(mode)) { 50023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return openTypedAssetFileDescriptor(uri, "*/*", null); 50123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } else { 50223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn IContentProvider provider = acquireProvider(uri); 50323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (provider == null) { 50423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw new FileNotFoundException("No content provider: " + uri); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn try { 50723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn AssetFileDescriptor fd = provider.openAssetFile(uri, mode); 50823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if(fd == null) { 50923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn releaseProvider(provider); 51023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return null; 51123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 51223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn ParcelFileDescriptor pfd = new ParcelFileDescriptorInner( 51323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd.getParcelFileDescriptor(), provider); 51423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 51523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn // Success! Don't release the provider when exiting, let 51623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn // ParcelFileDescriptorInner do that when it is closed. 51723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn provider = null; 51823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 51923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return new AssetFileDescriptor(pfd, fd.getStartOffset(), 52023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd.getDeclaredLength()); 52123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (RemoteException e) { 52223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw new FileNotFoundException("Dead content provider: " + uri); 52323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (FileNotFoundException e) { 52423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw e; 52523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } finally { 52623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (provider != null) { 52723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn releaseProvider(provider); 52823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 52923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 53023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 53123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 53223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 53323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 53423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn /** 53523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * Open a raw file descriptor to access (potentially type transformed) 53623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data from a "content:" URI. This interacts with the underlying 53723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * {@link ContentProvider#openTypedAssetFile} method of the provider 53823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * associated with the given URI, to retrieve retrieve any appropriate 53923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data stream for the data stored there. 54023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * 54123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * <p>Unlike {@link #openAssetFileDescriptor}, this function only works 54223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * with "content:" URIs, because content providers are the only facility 54323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * with an associated MIME type to ensure that the returned data stream 54423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * is of the desired type. 54523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * 54623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * <p>All text/* streams are encoded in UTF-8. 54723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * 54823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @param uri The desired URI to open. 54923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @param mimeType The desired MIME type of the returned data. This can 55023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * be a pattern such as *\/*, which will allow the content provider to 55123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * select a type, though there is no way for you to determine what type 55223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * it is returning. 55323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @param opts Additional provider-dependent options. 55423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @return Returns a new ParcelFileDescriptor from which you can read the 55523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data stream from the provider. Note that this may be a pipe, meaning 55623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * you can't seek in it. The only seek you should do is if the 55723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * AssetFileDescriptor contains an offset, to move to that offset before 55823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * reading. You own this descriptor and are responsible for closing it when done. 55923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * @throws FileNotFoundException Throws FileNotFoundException of no 56023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn * data of the desired type exists under the URI. 56123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn */ 56223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn public final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri, 56323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn String mimeType, Bundle opts) throws FileNotFoundException { 56423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn IContentProvider provider = acquireProvider(uri); 56523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (provider == null) { 56623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw new FileNotFoundException("No content provider: " + uri); 56723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 56823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn try { 56923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn AssetFileDescriptor fd = provider.openTypedAssetFile(uri, mimeType, opts); 57023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (fd == null) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 57223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return null; 57323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } 57423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn ParcelFileDescriptor pfd = new ParcelFileDescriptorInner( 57523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd.getParcelFileDescriptor(), provider); 57623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 57723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn // Success! Don't release the provider when exiting, let 57823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn // ParcelFileDescriptorInner do that when it is closed. 57923fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn provider = null; 58023fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn 58123fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn return new AssetFileDescriptor(pfd, fd.getStartOffset(), 58223fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn fd.getDeclaredLength()); 58323fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (RemoteException e) { 58423fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw new FileNotFoundException("Dead content provider: " + uri); 58523fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } catch (FileNotFoundException e) { 58623fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn throw e; 58723fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn } finally { 58823fdaf6fb62a9b5154b2508916a21c678462c5d0Dianne Hackborn if (provider != null) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5944c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert /** 5954c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * A resource identified by the {@link Resources} that contains it, and a resource id. 5964c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * 5974c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * @hide 5984c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert */ 5994c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert public class OpenResourceIdResult { 6004c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert public Resources r; 6014c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert public int id; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6034c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert 6044c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert /** 6054c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * Resolves an android.resource URI to a {@link Resources} and a resource id. 6064c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * 6074c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert * @hide 6084c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert */ 6094c87a3f26a7c0c75fa371024a8726b59a108fd0fBjorn Bringert public OpenResourceIdResult getResourceId(Uri uri) throws FileNotFoundException { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String authority = uri.getAuthority(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TextUtils.isEmpty(authority)) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("No authority: " + uri); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mContext.getPackageManager().getResourcesForApplication(authority); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException ex) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("No package found for authority: " + uri); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<String> path = uri.getPathSegments(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == null) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("No path: " + uri); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = path.size(); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len == 1) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = Integer.parseInt(path.get(0)); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException e) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Single path segment is not a resource ID: " + uri); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (len == 2) { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = r.getIdentifier(path.get(1), path.get(0), authority); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("More than two path segments: " + uri); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == 0) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("No resource found for: " + uri); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OpenResourceIdResult res = new OpenResourceIdResult(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.r = r; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.id = id; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6460ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** @hide */ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public int modeToMode(Uri uri, String mode) throws FileNotFoundException { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int modeBits; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("r".equals(mode)) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeBits = ParcelFileDescriptor.MODE_READ_ONLY; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("w".equals(mode) || "wt".equals(mode)) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_CREATE 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_TRUNCATE; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("wa".equals(mode)) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeBits = ParcelFileDescriptor.MODE_WRITE_ONLY 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_CREATE 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_APPEND; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("rw".equals(mode)) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeBits = ParcelFileDescriptor.MODE_READ_WRITE 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_CREATE; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("rwt".equals(mode)) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project modeBits = ParcelFileDescriptor.MODE_READ_WRITE 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_CREATE 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ParcelFileDescriptor.MODE_TRUNCATE; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new FileNotFoundException("Bad mode for " + uri + ": " 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mode); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return modeBits; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6730ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts a row into a table at the given URL. 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the content provider supports transactions the insertion will be atomic. 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The URL of the table to insert into. 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param values The initial values for the newly inserted row. The key is the column name for 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the field. Passing an empty ContentValues will create an empty row. 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URL of the newly created row. 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Uri insert(Uri url, ContentValues values) 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(url); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Unknown URL " + url); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 691d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 692a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick Uri createdRow = provider.insert(url, values); 693d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long durationMillis = SystemClock.uptimeMillis() - startTime; 694a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick maybeLogUpdateToEventLog(durationMillis, url, "insert", null /* where */); 695a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return createdRow; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7038943737692169f564cd34a9c8d471f3a5d438712Fred Quintana /** 7048943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * Applies each of the {@link ContentProviderOperation} objects and returns an array 7058943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * of their results. Passes through OperationApplicationException, which may be thrown 7068943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * by the call to {@link ContentProviderOperation#apply}. 7078943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * If all the applications succeed then a {@link ContentProviderResult} array with the 7088943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * same number of elements as the operations will be returned. It is implementation-specific 7098943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * how many, if any, operations will have been successfully applied if a call to 7108943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * apply results in a {@link OperationApplicationException}. 7118943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * @param authority the authority of the ContentProvider to which this batch should be applied 7128943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * @param operations the operations to apply 7138943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * @return the results of the applications 7148943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * @throws OperationApplicationException thrown if an application fails. 7158943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * See {@link ContentProviderOperation#apply} for more information. 7168943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * @throws RemoteException thrown if a RemoteException is encountered while attempting 7178943737692169f564cd34a9c8d471f3a5d438712Fred Quintana * to communicate with a remote provider. 7188943737692169f564cd34a9c8d471f3a5d438712Fred Quintana */ 7198943737692169f564cd34a9c8d471f3a5d438712Fred Quintana public ContentProviderResult[] applyBatch(String authority, 72003d9490758c9318cee6d14d3cc5007556dce92d0Fred Quintana ArrayList<ContentProviderOperation> operations) 7218943737692169f564cd34a9c8d471f3a5d438712Fred Quintana throws RemoteException, OperationApplicationException { 7228943737692169f564cd34a9c8d471f3a5d438712Fred Quintana ContentProviderClient provider = acquireContentProviderClient(authority); 7236a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana if (provider == null) { 7248943737692169f564cd34a9c8d471f3a5d438712Fred Quintana throw new IllegalArgumentException("Unknown authority " + authority); 7256a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } 7266a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana try { 7278943737692169f564cd34a9c8d471f3a5d438712Fred Quintana return provider.applyBatch(operations); 7286a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } finally { 7296a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana provider.release(); 7306a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } 7316a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana } 7326a8d5332f00bdfade6674b312e7166940aa28348Fred Quintana 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts multiple rows into a table at the given URL. 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This function make no guarantees about the atomicity of the insertions. 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The URL of the table to insert into. 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param values The initial values for the newly inserted rows. The key is the column name for 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the field. Passing null will create an empty row. 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the number of newly created rows. 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int bulkInsert(Uri url, ContentValues[] values) 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(url); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Unknown URL " + url); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 750d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 751a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick int rowsCreated = provider.bulkInsert(url, values); 752d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long durationMillis = SystemClock.uptimeMillis() - startTime; 753a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick maybeLogUpdateToEventLog(durationMillis, url, "bulkinsert", null /* where */); 754a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return rowsCreated; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Deletes row(s) specified by a content URI. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the content provider supports transactions, the deletion will be atomic. 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The URL of the row to delete. 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param where A filter to apply to rows before deleting, formatted as an SQL WHERE clause 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (excluding the WHERE itself). 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The number of rows deleted. 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int delete(Uri url, String where, String[] selectionArgs) 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(url); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Unknown URL " + url); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 779d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 780a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick int rowsDeleted = provider.delete(url, where, selectionArgs); 781d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long durationMillis = SystemClock.uptimeMillis() - startTime; 782a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick maybeLogUpdateToEventLog(durationMillis, url, "delete", where); 783a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return rowsDeleted; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update row(s) in a content URI. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the content provider supports transactions the update will be atomic. 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The URI to modify. 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param values The new field values. The key is the column name for the field. 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project A null value will remove an existing field value. 799d2a2daaa89865d19e881ab9af133ce0f3902c820Omari Stephens * @param where A filter to apply to rows before updating, formatted as an SQL WHERE clause 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (excluding the WHERE itself). 801b0c6dbd53b26b172fe8eb7d117550e4edf7a0c9cJeff Hamilton * @return The number of rows updated. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NullPointerException if uri or values are null 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int update(Uri uri, ContentValues values, String where, 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] selectionArgs) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentProvider provider = acquireProvider(uri); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider == null) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Unknown URI " + uri); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 811d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long startTime = SystemClock.uptimeMillis(); 812a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick int rowsUpdated = provider.update(uri, values, where, selectionArgs); 813d72f718c9cc4bd5e4701f4c5cdab51b4d8cf6435Brad Fitzpatrick long durationMillis = SystemClock.uptimeMillis() - startTime; 814a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick maybeLogUpdateToEventLog(durationMillis, uri, "update", where); 815a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return rowsUpdated; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseProvider(provider); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the content provider for the given content URI.. 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The URI to a content provider 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The ContentProvider for the given URI, or null if no content provider is found. 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IContentProvider acquireProvider(Uri uri) 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!SCHEME_CONTENT.equals(uri.getScheme())) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String auth = uri.getAuthority(); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (auth != null) { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return acquireProvider(mContext, uri.getAuthority()); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IContentProvider acquireProvider(String name) { 8461877d0158b529663b8315482e7346a7bcaa96166Brad Fitzpatrick if (name == null) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return acquireProvider(mContext, name); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 853718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Returns a {@link ContentProviderClient} that is associated with the {@link ContentProvider} 854718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * that services the content at uri, starting the provider if necessary. Returns 855718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * null if there is no provider associated wih the uri. The caller must indicate that they are 856718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * done with the provider by calling {@link ContentProviderClient#release} which will allow 857718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * the system to release the provider it it determines that there is no other reason for 858718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * keeping it active. 859718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @param uri specifies which provider should be acquired 860718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @return a {@link ContentProviderClient} that is associated with the {@link ContentProvider} 861718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * that services the content at uri or null if there isn't one. 862718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */ 863718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana public final ContentProviderClient acquireContentProviderClient(Uri uri) { 864718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana IContentProvider provider = acquireProvider(uri); 865718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana if (provider != null) { 866718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana return new ContentProviderClient(this, provider); 867718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 868718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 869718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana return null; 870718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 871718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 872718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana /** 873718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Returns a {@link ContentProviderClient} that is associated with the {@link ContentProvider} 874718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * with the authority of name, starting the provider if necessary. Returns 875718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * null if there is no provider associated wih the uri. The caller must indicate that they are 876718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * done with the provider by calling {@link ContentProviderClient#release} which will allow 877718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * the system to release the provider it it determines that there is no other reason for 878718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * keeping it active. 879718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @param name specifies which provider should be acquired 880718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @return a {@link ContentProviderClient} that is associated with the {@link ContentProvider} 881718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * with the authority of name or null if there isn't one. 882718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */ 883718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana public final ContentProviderClient acquireContentProviderClient(String name) { 884718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana IContentProvider provider = acquireProvider(name); 885718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana if (provider != null) { 886718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana return new ContentProviderClient(this, provider); 887718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 888718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 889718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana return null; 890718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 891718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 892718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana /** 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register an observer class that gets callbacks when data identified by a 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given content URI changes. 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The URI to watch for changes. This can be a specific row URI, or a base URI 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a whole class of content. 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param notifyForDescendents If <code>true</code> changes to URIs beginning with <code>uri</code> 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will also cause notifications to be sent. If <code>false</code> only changes to the exact URI 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified by <em>uri</em> will cause notifications to be sent. If true, than any URI values 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at or below the specified URI will also trigger a match. 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param observer The object that receives callbacks when changes occur. 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #unregisterContentObserver 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void registerContentObserver(Uri uri, boolean notifyForDescendents, 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentObserver observer) 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 909231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn getContentService().registerContentObserver(uri, notifyForDescendents, 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project observer.getContentObserver()); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unregisters a change observer. 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param observer The previously registered observer that is no longer needed. 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #registerContentObserver 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void unregisterContentObserver(ContentObserver observer) { 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IContentObserver contentObserver = observer.releaseContentObserver(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentObserver != null) { 925231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn getContentService().unregisterContentObserver( 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project contentObserver); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notify registered observers that a row was updated. 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To register, call {@link #registerContentObserver(android.net.Uri , boolean, android.database.ContentObserver) registerContentObserver()}. 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default, CursorAdapter objects will get this notification. 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param observer The observer that originated the change, may be <code>null</null> 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyChange(Uri uri, ContentObserver observer) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyChange(uri, observer, true /* sync to network */); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notify registered observers that a row was updated. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To register, call {@link #registerContentObserver(android.net.Uri , boolean, android.database.ContentObserver) registerContentObserver()}. 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default, CursorAdapter objects will get this notification. 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param observer The observer that originated the change, may be <code>null</null> 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param syncToNetwork If true, attempt to sync the change to the network. 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 955231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn getContentService().notifyChange( 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uri, observer == null ? null : observer.getContentObserver(), 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project observer != null && observer.deliverSelfNotifications(), syncToNetwork); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start an asynchronous sync operation. If you want to monitor the progress 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the sync you may register a SyncObserver. Only values of the following 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * types may be used in the extras bundle: 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Integer</li> 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Long</li> 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Boolean</li> 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Float</li> 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Double</li> 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>String</li> 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri the uri of the provider to sync or null to sync all providers. 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras any extras to pass to the SyncAdapter. 977ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @deprecated instead use 978ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * {@link #requestSync(android.accounts.Account, String, android.os.Bundle)} 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9804a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startSync(Uri uri, Bundle extras) { 982ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana Account account = null; 983ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana if (extras != null) { 984ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana String accountName = extras.getString(SYNC_EXTRAS_ACCOUNT); 985ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana if (!TextUtils.isEmpty(accountName)) { 9863348f14b3d46b172a5b557f81aac526b7e8bf5fbCostin Manolache account = new Account(accountName, "com.google"); 987ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 988ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana extras.remove(SYNC_EXTRAS_ACCOUNT); 989ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 990ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana requestSync(account, uri != null ? uri.getAuthority() : null, extras); 991ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 992ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 993ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 994ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Start an asynchronous sync operation. If you want to monitor the progress 995ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * of the sync you may register a SyncObserver. Only values of the following 996ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * types may be used in the extras bundle: 997ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <ul> 998ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>Integer</li> 999ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>Long</li> 1000ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>Boolean</li> 1001ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>Float</li> 1002ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>Double</li> 1003ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * <li>String</li> 1004ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * </ul> 1005ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1006ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account which account should be synced 1007ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority which authority should be synced 1008ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param extras any extras to pass to the SyncAdapter. 1009ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1010ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static void requestSync(Account account, String authority, Bundle extras) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validateSyncExtrasBundle(extras); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1013ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().requestSync(account, authority, extras); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that only values of the following types are in the Bundle: 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Integer</li> 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Long</li> 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Boolean</li> 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Float</li> 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Double</li> 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>String</li> 1027d9d2f1140b52fd0c014e9deac59f6000564b7e84Fred Quintana * <li>Account</li> 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>null</li> 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras the Bundle to check 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void validateSyncExtrasBundle(Bundle extras) { 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : extras.keySet()) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = extras.get(key); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null) continue; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Long) continue; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Integer) continue; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Boolean) continue; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Float) continue; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof Double) continue; 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value instanceof String) continue; 1043d9d2f1140b52fd0c014e9deac59f6000564b7e84Fred Quintana if (value instanceof Account) continue; 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("unexpected value type: " 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + value.getClass().getName()); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw e; 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException exc) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("error unparceling Bundle", exc); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1054ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1055ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Cancel any active or pending syncs that match the Uri. If the uri is null then 1056ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * all syncs will be canceled. 1057ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1058ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param uri the uri of the provider to sync or null to sync all providers. 1059ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @deprecated instead use {@link #cancelSync(android.accounts.Account, String)} 1060ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 10614a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn @Deprecated 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void cancelSync(Uri uri) { 1063ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana cancelSync(null /* all accounts */, uri != null ? uri.getAuthority() : null); 1064ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1065ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1066ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1067ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Cancel any active or pending syncs that match account and authority. The account and 1068ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * authority can each independently be set to null, which means that syncs with any account 1069ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * or authority, respectively, will match. 1070ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1071ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account filters the syncs that match by this account 1072ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority filters the syncs that match by this authority 1073ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1074ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static void cancelSync(Account account, String authority) { 1075ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1076ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().cancelSync(account, authority); 1077ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1078ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1079ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1080ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1081ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1082ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Get information about the SyncAdapters that are known to the system. 1083ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return an array of SyncAdapters that have registered with the system 1084ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1085ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static SyncAdapterType[] getSyncAdapterTypes() { 1086ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1087ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().getSyncAdapterTypes(); 1088ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1089ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1090ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1091ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1092ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1093ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1094ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Check if the provider should be synced when a network tickle is received 1095ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1096ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account the account whose setting we are querying 1097ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority the provider whose setting we are querying 1098ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return true if the provider should be synced when a network tickle is received 1099ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1100ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static boolean getSyncAutomatically(Account account, String authority) { 1101ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1102ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().getSyncAutomatically(account, authority); 1103ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1104ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1105ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1106ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1107ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1108ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1109ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Set whether or not the provider is synced when it receives a network tickle. 1110ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1111ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account the account whose setting we are querying 1112ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority the provider whose behavior is being controlled 1113ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param sync true if the provider should be synced when tickles are received for it 1114ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1115ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static void setSyncAutomatically(Account account, String authority, boolean sync) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1117ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().setSyncAutomatically(account, authority, sync); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1119ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // exception ignored; if this is thrown then it means the runtime is in the midst of 11205e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana // being restarted 11215e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } 11225e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } 11235e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana 11245e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana /** 1125c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Specifies that a sync should be requested with the specified the account, authority, 1126c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * and extras at the given frequency. If there is already another periodic sync scheduled 1127c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * with the account, authority and extras then a new periodic sync won't be added, instead 1128c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * the frequency of the previous one will be updated. 1129c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * <p> 1130c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * These periodic syncs honor the "syncAutomatically" and "masterSyncAutomatically" settings. 1131c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Although these sync are scheduled at the specified frequency, it may take longer for it to 1132c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * actually be started if other syncs are ahead of it in the sync operation queue. This means 1133c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * that the actual start time may drift. 113453bd2522ca7767f46646606123b6e2689b811850Fred Quintana * <p> 113553bd2522ca7767f46646606123b6e2689b811850Fred Quintana * Periodic syncs are not allowed to have any of {@link #SYNC_EXTRAS_DO_NOT_RETRY}, 113653bd2522ca7767f46646606123b6e2689b811850Fred Quintana * {@link #SYNC_EXTRAS_IGNORE_BACKOFF}, {@link #SYNC_EXTRAS_IGNORE_SETTINGS}, 113753bd2522ca7767f46646606123b6e2689b811850Fred Quintana * {@link #SYNC_EXTRAS_INITIALIZE}, {@link #SYNC_EXTRAS_FORCE}, 113853bd2522ca7767f46646606123b6e2689b811850Fred Quintana * {@link #SYNC_EXTRAS_EXPEDITED}, {@link #SYNC_EXTRAS_MANUAL} set to true. 113953bd2522ca7767f46646606123b6e2689b811850Fred Quintana * If any are supplied then an {@link IllegalArgumentException} will be thrown. 1140c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 1141c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param account the account to specify in the sync 1142c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param authority the provider to specify in the sync request 1143c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param extras extra parameters to go along with the sync request 1144c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param pollFrequency how frequently the sync should be performed, in seconds. 114553bd2522ca7767f46646606123b6e2689b811850Fred Quintana * @throws IllegalArgumentException if an illegal extra was set or if any of the parameters 114653bd2522ca7767f46646606123b6e2689b811850Fred Quintana * are null. 1147c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */ 1148c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public static void addPeriodicSync(Account account, String authority, Bundle extras, 1149c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana long pollFrequency) { 1150c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana validateSyncExtrasBundle(extras); 115153bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (account == null) { 115253bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("account must not be null"); 115353bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 115453bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (authority == null) { 115553bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("authority must not be null"); 115653bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 115753bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (extras.getBoolean(SYNC_EXTRAS_MANUAL, false) 115853bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_DO_NOT_RETRY, false) 115953bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_IGNORE_BACKOFF, false) 116053bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_IGNORE_SETTINGS, false) 116153bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_INITIALIZE, false) 116253bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_FORCE, false) 116353bd2522ca7767f46646606123b6e2689b811850Fred Quintana || extras.getBoolean(SYNC_EXTRAS_EXPEDITED, false)) { 116453bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("illegal extras were set"); 116553bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 1166c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana try { 1167c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana getContentService().addPeriodicSync(account, authority, extras, pollFrequency); 1168c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } catch (RemoteException e) { 1169c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana // exception ignored; if this is thrown then it means the runtime is in the midst of 1170c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana // being restarted 1171c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1172c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1173c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 1174c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana /** 1175c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Remove a periodic sync. Has no affect if account, authority and extras don't match 1176c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * an existing periodic sync. 1177c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 1178c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param account the account of the periodic sync to remove 1179c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param authority the provider of the periodic sync to remove 1180c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param extras the extras of the periodic sync to remove 1181c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */ 1182c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public static void removePeriodicSync(Account account, String authority, Bundle extras) { 1183c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana validateSyncExtrasBundle(extras); 118453bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (account == null) { 118553bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("account must not be null"); 118653bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 118753bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (authority == null) { 118853bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("authority must not be null"); 118953bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 1190c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana try { 1191c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana getContentService().removePeriodicSync(account, authority, extras); 1192c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } catch (RemoteException e) { 1193c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1194c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1195c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1196c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 1197c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana /** 1198c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Get the list of information about the periodic syncs for the given account and authority. 1199c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 1200c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param account the account whose periodic syncs we are querying 1201c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @param authority the provider whose periodic syncs we are querying 1202c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * @return a list of PeriodicSync objects. This list may be empty but will never be null. 1203c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */ 1204c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public static List<PeriodicSync> getPeriodicSyncs(Account account, String authority) { 120553bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (account == null) { 120653bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("account must not be null"); 120753bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 120853bd2522ca7767f46646606123b6e2689b811850Fred Quintana if (authority == null) { 120953bd2522ca7767f46646606123b6e2689b811850Fred Quintana throw new IllegalArgumentException("authority must not be null"); 121053bd2522ca7767f46646606123b6e2689b811850Fred Quintana } 1211c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana try { 1212c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana return getContentService().getPeriodicSyncs(account, authority); 1213c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } catch (RemoteException e) { 1214c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1215c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1216c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 1217c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 1218c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana /** 12195e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana * Check if this account/provider is syncable. 12205e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana * @return >0 if it is syncable, 0 if not, and <0 if the state isn't known yet. 12215e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana */ 122220ea6ce0e8a758cc5c33eb2577495bf9f4dce16eJim Miller public static int getIsSyncable(Account account, String authority) { 12235e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana try { 12245e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana return getContentService().getIsSyncable(account, authority); 12255e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } catch (RemoteException e) { 12265e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 12275e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } 12285e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } 12295e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana 12305e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana /** 12315e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana * Set whether this account/provider is syncable. 1232718671b441c6318276e6d954a41a95db0d7e6c49Fred Quintana * @param syncable >0 denotes syncable, 0 means not syncable, <0 means unknown 12335e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana */ 123420ea6ce0e8a758cc5c33eb2577495bf9f4dce16eJim Miller public static void setIsSyncable(Account account, String authority, int syncable) { 12355e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana try { 12365e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana getContentService().setIsSyncable(account, authority, syncable); 12375e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana } catch (RemoteException e) { 12385e787c42f2a6b3afc8ec8320a08d51b2d44b8614Fred Quintana // exception ignored; if this is thrown then it means the runtime is in the midst of 1239ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // being restarted 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1243ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1244ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Gets the master auto-sync setting that applies to all the providers and accounts. 1245ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * If this is false then the per-provider auto-sync setting is ignored. 1246ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1247ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return the master auto-sync setting that applies to all the providers and accounts 1248ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1249ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static boolean getMasterSyncAutomatically() { 1250ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1251ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().getMasterSyncAutomatically(); 1252ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1253ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1254ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1255ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1256ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1257ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1258ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Sets the master auto-sync setting that applies to all the providers and accounts. 1259ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * If this is false then the per-provider auto-sync setting is ignored. 1260ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * 1261ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param sync the master auto-sync setting that applies to all the providers and accounts 1262ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1263ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static void setMasterSyncAutomatically(boolean sync) { 1264ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1265ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().setMasterSyncAutomatically(sync); 1266ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1267ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // exception ignored; if this is thrown then it means the runtime is in the midst of 1268ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // being restarted 1269ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1270ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1271ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1272ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1273ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Returns true if there is currently a sync operation for the given 1274ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * account or authority in the pending list, or actively being processed. 1275ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account the account whose setting we are querying 1276ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority the provider whose behavior is being queried 1277ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return true if a sync is active for the given account or authority. 1278ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1279ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static boolean isSyncActive(Account account, String authority) { 1280ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1281ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().isSyncActive(account, authority); 1282ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1283ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1284ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1285ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1286ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1287ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1288ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * If a sync is active returns the information about it, otherwise returns false. 1289d5e4fdc8a4743abc0d9fe3cb952a78f9ad078c6bFred Quintana * @return the SyncInfo for the currently active sync or null if one is not active. 1290ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1291d5e4fdc8a4743abc0d9fe3cb952a78f9ad078c6bFred Quintana public static SyncInfo getCurrentSync() { 1292ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1293d5e4fdc8a4743abc0d9fe3cb952a78f9ad078c6bFred Quintana return getContentService().getCurrentSync(); 1294ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1295ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1296ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1297ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1298ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1299ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 13004a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana * Returns the status that matches the authority. 1301ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account the account whose setting we are querying 1302ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority the provider whose behavior is being queried 1303ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return the SyncStatusInfo for the authority, or null if none exists 1304ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @hide 1305ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1306ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static SyncStatusInfo getSyncStatus(Account account, String authority) { 1307ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1308ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().getSyncStatus(account, authority); 1309ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1310ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1311ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1312ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1313ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1314ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana /** 1315ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * Return true if the pending status is true of any matching authorities. 1316ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param account the account whose setting we are querying 1317ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @param authority the provider whose behavior is being queried 1318ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana * @return true if there is a pending sync with the matching account and authority 1319ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana */ 1320ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static boolean isSyncPending(Account account, String authority) { 1321ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1322ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return getContentService().isSyncPending(account, authority); 1323ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1324ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1325ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1326ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1327ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 13281b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana /** 13291b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * Request notifications when the different aspects of the SyncManager change. The 13301b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * different items that can be requested are: 13311b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * <ul> 13321b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * <li> {@link #SYNC_OBSERVER_TYPE_PENDING} 13331b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * <li> {@link #SYNC_OBSERVER_TYPE_ACTIVE} 13341b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * <li> {@link #SYNC_OBSERVER_TYPE_SETTINGS} 13351b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * </ul> 13361b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * The caller can set one or more of the status types in the mask for any 13371b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * given listener registration. 13381b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * @param mask the status change types that will cause the callback to be invoked 13391b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * @param callback observer to be invoked when the status changes 13401b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * @return a handle that can be used to remove the listener at a later time 13411b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana */ 1342ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static Object addStatusChangeListener(int mask, final SyncStatusObserver callback) { 13431b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana if (callback == null) { 13441b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana throw new IllegalArgumentException("you passed in a null callback"); 13451b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana } 1346ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1347ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana ISyncStatusObserver.Stub observer = new ISyncStatusObserver.Stub() { 1348ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public void onStatusChanged(int which) throws RemoteException { 1349ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana callback.onStatusChanged(which); 1350ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1351ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana }; 1352ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().addStatusChangeListener(mask, observer); 1353ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana return observer; 1354ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1355ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana throw new RuntimeException("the ContentService should always be reachable", e); 1356ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1357ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1358ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 13591b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana /** 13601b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * Remove a previously registered status change listener. 13611b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana * @param handle the handle that was returned by {@link #addStatusChangeListener} 13621b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana */ 1363ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana public static void removeStatusChangeListener(Object handle) { 13641b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana if (handle == null) { 13651b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana throw new IllegalArgumentException("you passed in a null handle"); 13661b487ec44b6b5594914d52fa427bec4f29a60541Fred Quintana } 1367ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana try { 1368ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana getContentService().removeStatusChangeListener((ISyncStatusObserver.Stub) handle); 1369ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } catch (RemoteException e) { 1370ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // exception ignored; if this is thrown then it means the runtime is in the midst of 1371ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana // being restarted 1372ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1373ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana } 1374ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 1375a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick /** 1376a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick * Returns sampling percentage for a given duration. 1377a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick * 1378a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick * Always returns at least 1%. 1379a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick */ 1380a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick private int samplePercentForDuration(long durationMillis) { 1381a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (durationMillis >= SLOW_THRESHOLD_MILLIS) { 1382a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return 100; 1383a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1384a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return (int) (100 * durationMillis / SLOW_THRESHOLD_MILLIS) + 1; 1385a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1386a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 1387a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick private void maybeLogQueryToEventLog(long durationMillis, 1388a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick Uri uri, String[] projection, 1389a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick String selection, String sortOrder) { 1390a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick int samplePercent = samplePercentForDuration(durationMillis); 1391a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (samplePercent < 100) { 1392a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick synchronized (mRandom) { 1393a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (mRandom.nextInt(100) >= samplePercent) { 1394a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return; 1395a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1396a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1397a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1398a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 1399a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick StringBuilder projectionBuffer = new StringBuilder(100); 1400a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (projection != null) { 1401a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick for (int i = 0; i < projection.length; ++i) { 1402a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // Note: not using a comma delimiter here, as the 1403a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // multiple arguments to EventLog.writeEvent later 1404a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // stringify with a comma delimiter, which would make 1405a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // parsing uglier later. 1406a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (i != 0) projectionBuffer.append('/'); 1407a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick projectionBuffer.append(projection[i]); 1408a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1409a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1410a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 1411a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // ActivityThread.currentPackageName() only returns non-null if the 1412a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // current thread is an application main thread. This parameter tells 1413a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick // us whether an event loop is blocked, and if so, which app it is. 141401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn String blockingPackage = AppGlobals.getInitialPackage(); 1415a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 1416a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick EventLog.writeEvent( 1417a8fbedbf5e274581ba0cbb20da34ade286fc1cfcBrad Fitzpatrick EventLogTags.CONTENT_QUERY_SAMPLE, 1418a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick uri.toString(), 1419a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick projectionBuffer.toString(), 1420a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick selection != null ? selection : "", 1421a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick sortOrder != null ? sortOrder : "", 1422a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick durationMillis, 1423a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick blockingPackage != null ? blockingPackage : "", 1424a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick samplePercent); 1425a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1426a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick 1427a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick private void maybeLogUpdateToEventLog( 1428a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick long durationMillis, Uri uri, String operation, String selection) { 1429a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick int samplePercent = samplePercentForDuration(durationMillis); 1430a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (samplePercent < 100) { 1431a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick synchronized (mRandom) { 1432a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick if (mRandom.nextInt(100) >= samplePercent) { 1433a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick return; 1434a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1435a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1436a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 143701e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn String blockingPackage = AppGlobals.getInitialPackage(); 1438a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick EventLog.writeEvent( 1439a8fbedbf5e274581ba0cbb20da34ade286fc1cfcBrad Fitzpatrick EventLogTags.CONTENT_UPDATE_SAMPLE, 1440a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick uri.toString(), 1441a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick operation, 1442a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick selection != null ? selection : "", 1443a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick durationMillis, 1444a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick blockingPackage != null ? blockingPackage : "", 1445a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick samplePercent); 1446a63730d1f103f78589faef461d2af7351fc49f42Brad Fitzpatrick } 1447ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class CursorWrapperInner extends CursorWrapper { 144903f0292744094ec107ffce71301c394503a31dedGilles Debunne private final IContentProvider mContentProvider; 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TAG="CursorWrapperInner"; 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mCloseFlag = false; 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CursorWrapperInner(Cursor cursor, IContentProvider icp) { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(cursor); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentProvider = icp; 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() { 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.close(); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver.this.releaseProvider(mContentProvider); 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCloseFlag = true; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mCloseFlag) { 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver.this.releaseProvider(mContentProvider); 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class ParcelFileDescriptorInner extends ParcelFileDescriptor { 147803f0292744094ec107ffce71301c394503a31dedGilles Debunne private final IContentProvider mContentProvider; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TAG="ParcelFileDescriptorInner"; 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mReleaseProviderFlag = false; 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptorInner(ParcelFileDescriptor pfd, IContentProvider icp) { 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(pfd); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentProvider = icp; 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void close() throws IOException { 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!mReleaseProviderFlag) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.close(); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver.this.releaseProvider(mContentProvider); 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReleaseProviderFlag = true; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mReleaseProviderFlag) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(); 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1504231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn /** @hide */ 1505231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn public static final String CONTENT_SERVICE_NAME = "content"; 15060ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 1507231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn /** @hide */ 1508231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn public static IContentService getContentService() { 1509231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn if (sContentService != null) { 1510231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn return sContentService; 1511231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn } 1512231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn IBinder b = ServiceManager.getService(CONTENT_SERVICE_NAME); 1513231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn if (Config.LOGV) Log.v("ContentService", "default service binder = " + b); 1514231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn sContentService = IContentService.Stub.asInterface(b); 1515231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn if (Config.LOGV) Log.v("ContentService", "default service = " + sContentService); 1516231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn return sContentService; 1517231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn } 15180ba1cb06c6a0332b76c469bd54dcf6f98128ac82Tom O'Neill 1519231cc608d06ffc31c24bf8aa8c8275bdd2636581Dianne Hackborn private static IContentService sContentService; 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "ContentResolver"; 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1523