blob: caeff2a872c1568d33b2bd83e00b498fe0300ac7 [file] [log] [blame]
/*
* 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 com.android.gallery3d.gadget;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Binder;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.data.ContentListener;
import com.android.gallery3d.data.MediaItem;
import com.android.gallery3d.data.MediaObject;
import com.android.gallery3d.data.MediaSet;
import java.util.ArrayList;
import java.util.Arrays;
public class MediaSetSource implements WidgetSource, ContentListener {
private static final int CACHE_SIZE = 32;
@SuppressWarnings("unused")
private static final String TAG = "MediaSetSource";
private MediaSet mSource;
private MediaItem mCache[] = new MediaItem[CACHE_SIZE];
private int mCacheStart;
private int mCacheEnd;
private long mSourceVersion = MediaObject.INVALID_DATA_VERSION;
private ContentListener mContentListener;
public MediaSetSource(MediaSet source) {
mSource = Utils.checkNotNull(source);
mSource.addContentListener(this);
}
@Override
public void close() {
mSource.removeContentListener(this);
}
private void ensureCacheRange(int index) {
if (index >= mCacheStart && index < mCacheEnd) return;
long token = Binder.clearCallingIdentity();
try {
mCacheStart = index;
ArrayList<MediaItem> items = mSource.getMediaItem(mCacheStart, CACHE_SIZE);
mCacheEnd = mCacheStart + items.size();
items.toArray(mCache);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
public synchronized Uri getContentUri(int index) {
ensureCacheRange(index);
if (index < mCacheStart || index >= mCacheEnd) return null;
return mCache[index - mCacheStart].getContentUri();
}
@Override
public synchronized Bitmap getImage(int index) {
ensureCacheRange(index);
if (index < mCacheStart || index >= mCacheEnd) return null;
return WidgetUtils.createWidgetBitmap(mCache[index - mCacheStart]);
}
@Override
public void reload() {
long version = mSource.reload();
if (mSourceVersion != version) {
mSourceVersion = version;
mCacheStart = 0;
mCacheEnd = 0;
Arrays.fill(mCache, null);
}
}
@Override
public void setContentListener(ContentListener listener) {
mContentListener = listener;
}
@Override
public int size() {
long token = Binder.clearCallingIdentity();
try {
return mSource.getMediaItemCount();
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
public void onContentDirty() {
if (mContentListener != null) mContentListener.onContentDirty();
}
}