/* * 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 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 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); } } } }