18e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang/* 28e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * Copyright (C) 2011 The Android Open Source Project 38e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * 48e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * Licensed under the Apache License, Version 2.0 (the "License"); 58e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * you may not use this file except in compliance with the License. 68e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * You may obtain a copy of the License at 78e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * 88e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * http://www.apache.org/licenses/LICENSE-2.0 98e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * 108e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * Unless required by applicable law or agreed to in writing, software 118e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * distributed under the License is distributed on an "AS IS" BASIS, 128e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * See the License for the specific language governing permissions and 148e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * limitations under the License. 158e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang */ 168e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 178e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangpackage android.media; 188e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 198e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport android.content.ContentValues; 208e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport android.content.IContentProvider; 218e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport android.net.Uri; 228e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport android.os.RemoteException; 238e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 248e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport java.util.ArrayList; 258e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport java.util.HashMap; 268e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangimport java.util.List; 278e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 288e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang/** 298e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * A MediaScanner helper class which enables us to do lazy insertion on the 308e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * given provider. This class manages buffers internally and flushes when they 318e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * are full. Note that you should call flushAll() after using this class. 328e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang * {@hide} 338e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang */ 348e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kangpublic class MediaInserter { 3530c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private final HashMap<Uri, List<ContentValues>> mRowMap = 368e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang new HashMap<Uri, List<ContentValues>>(); 37d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen private final HashMap<Uri, List<ContentValues>> mPriorityRowMap = 38d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen new HashMap<Uri, List<ContentValues>>(); 398e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 4035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final IContentProvider mProvider; 4135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final String mPackageName; 4235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mBufferSizePerUri; 438e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 4435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public MediaInserter(IContentProvider provider, String packageName, int bufferSizePerUri) { 458e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang mProvider = provider; 4635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = packageName; 478e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang mBufferSizePerUri = bufferSizePerUri; 488e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 498e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 508e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang public void insert(Uri tableUri, ContentValues values) throws RemoteException { 51d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen insert(tableUri, values, false); 52d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen } 53d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen 54d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen public void insertwithPriority(Uri tableUri, ContentValues values) throws RemoteException { 55d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen insert(tableUri, values, true); 56d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen } 57d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen 58d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen private void insert(Uri tableUri, ContentValues values, boolean priority) throws RemoteException { 59d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen HashMap<Uri, List<ContentValues>> rowmap = priority ? mPriorityRowMap : mRowMap; 60d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen List<ContentValues> list = rowmap.get(tableUri); 618e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang if (list == null) { 628e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang list = new ArrayList<ContentValues>(); 63d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen rowmap.put(tableUri, list); 648e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 658e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang list.add(new ContentValues(values)); 668e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang if (list.size() >= mBufferSizePerUri) { 67d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen flushAllPriority(); 68d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen flush(tableUri, list); 698e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 708e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 718e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 728e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang public void flushAll() throws RemoteException { 73d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen flushAllPriority(); 748e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang for (Uri tableUri : mRowMap.keySet()){ 75d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen List<ContentValues> list = mRowMap.get(tableUri); 76d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen flush(tableUri, list); 778e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 788e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang mRowMap.clear(); 798e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 808e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang 81d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen private void flushAllPriority() throws RemoteException { 82d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen for (Uri tableUri : mPriorityRowMap.keySet()){ 83d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen List<ContentValues> list = mPriorityRowMap.get(tableUri); 84d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen flush(tableUri, list); 85d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen } 86d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen mPriorityRowMap.clear(); 87d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen } 88d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen 89d121cfcbb45cb9ca734e702861f0bdd422999cf5Marco Nelissen private void flush(Uri tableUri, List<ContentValues> list) throws RemoteException { 908e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang if (!list.isEmpty()) { 918e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang ContentValues[] valuesArray = new ContentValues[list.size()]; 928e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang valuesArray = list.toArray(valuesArray); 9335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mProvider.bulkInsert(mPackageName, tableUri, valuesArray); 948e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang list.clear(); 958e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 968e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang } 978e2ed8d512ade2ea481b3a292556782b17a74674Dongwon Kang} 98