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