/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.media; import android.content.ContentValues; import android.content.IContentProvider; import android.net.Uri; import android.os.RemoteException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * A MediaScanner helper class which enables us to do lazy insertion on the * given provider. This class manages buffers internally and flushes when they * are full. Note that you should call flushAll() after using this class. * {@hide} */ public class MediaInserter { private final HashMap> mRowMap = new HashMap>(); private final HashMap> mPriorityRowMap = new HashMap>(); private final IContentProvider mProvider; private final String mPackageName; private final int mBufferSizePerUri; public MediaInserter(IContentProvider provider, String packageName, int bufferSizePerUri) { mProvider = provider; mPackageName = packageName; mBufferSizePerUri = bufferSizePerUri; } public void insert(Uri tableUri, ContentValues values) throws RemoteException { insert(tableUri, values, false); } public void insertwithPriority(Uri tableUri, ContentValues values) throws RemoteException { insert(tableUri, values, true); } private void insert(Uri tableUri, ContentValues values, boolean priority) throws RemoteException { HashMap> rowmap = priority ? mPriorityRowMap : mRowMap; List list = rowmap.get(tableUri); if (list == null) { list = new ArrayList(); rowmap.put(tableUri, list); } list.add(new ContentValues(values)); if (list.size() >= mBufferSizePerUri) { flushAllPriority(); flush(tableUri, list); } } public void flushAll() throws RemoteException { flushAllPriority(); for (Uri tableUri : mRowMap.keySet()){ List list = mRowMap.get(tableUri); flush(tableUri, list); } mRowMap.clear(); } private void flushAllPriority() throws RemoteException { for (Uri tableUri : mPriorityRowMap.keySet()){ List list = mPriorityRowMap.get(tableUri); flush(tableUri, list); } mPriorityRowMap.clear(); } private void flush(Uri tableUri, List list) throws RemoteException { if (!list.isEmpty()) { ContentValues[] valuesArray = new ContentValues[list.size()]; valuesArray = list.toArray(valuesArray); mProvider.bulkInsert(mPackageName, tableUri, valuesArray); list.clear(); } } }