/*
|
* Copyright (C) 2013 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.camera.data;
|
|
import android.content.Context;
|
import android.view.View;
|
|
import com.android.camera.Storage;
|
import com.android.camera.debug.Log;
|
import com.android.camera.util.Size;
|
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.load.Key;
|
import com.bumptech.glide.signature.MediaStoreSignature;
|
import com.google.common.base.Optional;
|
|
import java.io.File;
|
import java.text.DateFormat;
|
|
import javax.annotation.Nonnull;
|
|
/**
|
* A base class for all the local media files. The bitmap is loaded in
|
* background thread. Subclasses should implement their own background loading
|
* thread by sub-classing BitmapLoadTask and overriding doInBackground() to
|
* return a bitmap.
|
*/
|
public abstract class FilmstripItemBase<T extends FilmstripItemData> implements FilmstripItem {
|
/** The minimum id to use to query for all media at a given media store uri */
|
public static final int QUERY_ALL_MEDIA_ID = -1;
|
|
protected final Context mContext;
|
protected final GlideFilmstripManager mGlideManager;
|
protected final T mData;
|
protected final Metadata mMetaData;
|
protected final FilmstripItemAttributes mAttributes;
|
protected final DateFormat mDateFormatter = DateFormat.getDateTimeInstance();
|
|
protected Size mSuggestedSize;
|
|
public FilmstripItemBase(Context context, GlideFilmstripManager glideManager, T data,
|
FilmstripItemAttributes attributes) {
|
mContext = context;
|
mGlideManager = glideManager;
|
mData = data;
|
mAttributes = attributes;
|
|
mMetaData = new Metadata();
|
|
mSuggestedSize = GlideFilmstripManager.TINY_THUMB_SIZE;
|
}
|
|
@Override
|
public FilmstripItemData getData() {
|
return mData;
|
}
|
|
@Override
|
public boolean delete() {
|
File fileToDelete = new File(mData.getFilePath());
|
boolean deletionSucceeded = fileToDelete.delete();
|
deleteIfEmptyCameraSubDir(fileToDelete.getParentFile());
|
return deletionSucceeded;
|
}
|
|
@Override
|
public void setSuggestedSize(int widthPx, int heightPx) {
|
if (widthPx > 0 && heightPx > 0) {
|
mSuggestedSize = new Size(widthPx, heightPx);
|
} else {
|
Log.w(TAG, "Suggested size was set to a zero area value!");
|
}
|
}
|
|
@Override
|
public void recycle(@Nonnull View view) {
|
Glide.clear(view);
|
}
|
|
@Override
|
public Optional<MediaDetails> getMediaDetails() {
|
MediaDetails mediaDetails = new MediaDetails();
|
mediaDetails.addDetail(MediaDetails.INDEX_TITLE, mData.getTitle());
|
mediaDetails.addDetail(MediaDetails.INDEX_WIDTH, getDimensions().getWidth());
|
mediaDetails.addDetail(MediaDetails.INDEX_HEIGHT, getDimensions().getHeight());
|
mediaDetails.addDetail(MediaDetails.INDEX_PATH, mData.getFilePath());
|
mediaDetails.addDetail(MediaDetails.INDEX_DATETIME,
|
mDateFormatter.format(mData.getLastModifiedDate()));
|
long mSizeInBytes = mData.getSizeInBytes();
|
if (mSizeInBytes > 0) {
|
mediaDetails.addDetail(MediaDetails.INDEX_SIZE, mSizeInBytes);
|
}
|
|
Location location = mData.getLocation();
|
if (location != Location.UNKNOWN) {
|
mediaDetails.addDetail(MediaDetails.INDEX_LOCATION, location.getLocationString());
|
}
|
return Optional.of(mediaDetails);
|
}
|
|
@Override
|
public FilmstripItemAttributes getAttributes() {
|
return mAttributes;
|
}
|
|
@Override
|
public Metadata getMetadata() {
|
return mMetaData;
|
}
|
|
@Override
|
public Size getDimensions() {
|
return mData.getDimensions();
|
}
|
|
@Override
|
public int getOrientation() {
|
return mData.getOrientation();
|
}
|
|
protected final Key generateSignature(FilmstripItemData data) {
|
// Per Glide docs, make default mime type be the empty String
|
String mimeType = (data.getMimeType() == null) ? "" : data.getMimeType();
|
long modTimeSeconds = (data.getLastModifiedDate() == null) ? 0 :
|
data.getLastModifiedDate().getTime() / 1000;
|
return new MediaStoreSignature(mimeType, modTimeSeconds, data.getOrientation());
|
}
|
|
private void deleteIfEmptyCameraSubDir(File directory) {
|
// Make sure 'directory' refers to a valid existing empty directory.
|
if (!directory.exists() || !directory.isDirectory() || directory.list().length != 0) {
|
return;
|
}
|
|
// Check if this is a 'Camera' sub-directory.
|
String cameraPathStr = Storage.DIRECTORY_FILE.getAbsolutePath();
|
String fileParentPathStr = directory.getParentFile().getAbsolutePath();
|
Log.d(TAG, "CameraPathStr: " + cameraPathStr + " fileParentPathStr: " + fileParentPathStr);
|
|
// Delete the directory if it's an empty sub-directory of the Camera
|
// directory.
|
if (fileParentPathStr.equals(cameraPathStr)) {
|
if(!directory.delete()) {
|
Log.d(TAG, "Failed to delete: " + directory);
|
}
|
}
|
}
|
}
|