summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/MiniThumbFile.java334
1 files changed, 0 insertions, 334 deletions
diff --git a/media/java/android/media/MiniThumbFile.java b/media/java/android/media/MiniThumbFile.java
deleted file mode 100644
index f704acde7cf7..000000000000
--- a/media/java/android/media/MiniThumbFile.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2009 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.annotation.UnsupportedAppUsage;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Environment;
-import android.util.Log;
-
-import dalvik.system.VMRuntime;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.util.Hashtable;
-
-/**
- * This class handles the mini-thumb file. A mini-thumb file consists
- * of blocks, indexed by id. Each block has BYTES_PER_MINTHUMB bytes in the
- * following format:
- *
- * 1 byte status (0 = empty, 1 = mini-thumb available)
- * 8 bytes magic (a magic number to match what's in the database)
- * 4 bytes data length (LEN)
- * LEN bytes jpeg data
- * (the remaining bytes are unused)
- *
- * @hide This file is shared between MediaStore and MediaProvider and should remained internal use
- * only.
- * @deprecated thumbnails are now maintained in separate files, and this file
- * format is no longer used.
- */
-@Deprecated
-public class MiniThumbFile {
- private static final String TAG = "MiniThumbFile";
- private static final int MINI_THUMB_DATA_FILE_VERSION = 4;
- public static final int BYTES_PER_MINTHUMB = 10000;
- private static final int HEADER_SIZE = 1 + 8 + 4;
- private Uri mUri;
- private RandomAccessFile mMiniThumbFile;
- private FileChannel mChannel;
- private ByteBuffer mBuffer;
- private ByteBuffer mEmptyBuffer;
- private static final Hashtable<String, MiniThumbFile> sThumbFiles =
- new Hashtable<String, MiniThumbFile>();
-
- /**
- * We store different types of thumbnails in different files. To remain backward compatibility,
- * we should hashcode of content://media/external/images/media remains the same.
- */
- @UnsupportedAppUsage
- public static synchronized void reset() {
- for (MiniThumbFile file : sThumbFiles.values()) {
- file.deactivate();
- }
- sThumbFiles.clear();
- }
-
- public static synchronized MiniThumbFile instance(Uri uri) {
- if (VMRuntime.getRuntime().getTargetSdkVersion() >= Build.VERSION_CODES.Q) {
- throw new UnsupportedOperationException();
- }
- String type = uri.getPathSegments().get(1);
- MiniThumbFile file = sThumbFiles.get(type);
- // Log.v(TAG, "get minithumbfile for type: "+type);
- if (file == null) {
- file = new MiniThumbFile(
- Uri.parse("content://media/external/" + type + "/media"));
- sThumbFiles.put(type, file);
- }
-
- return file;
- }
-
- private String randomAccessFilePath(int version) {
- String directoryName =
- Environment.getExternalStorageDirectory().toString()
- + "/DCIM/.thumbnails";
- return directoryName + "/.thumbdata" + version + "-" + mUri.hashCode();
- }
-
- private void removeOldFile() {
- String oldPath = randomAccessFilePath(MINI_THUMB_DATA_FILE_VERSION - 1);
- File oldFile = new File(oldPath);
- if (oldFile.exists()) {
- try {
- oldFile.delete();
- } catch (SecurityException ex) {
- // ignore
- }
- }
- }
-
- private RandomAccessFile miniThumbDataFile() {
- if (mMiniThumbFile == null) {
- removeOldFile();
- String path = randomAccessFilePath(MINI_THUMB_DATA_FILE_VERSION);
- File directory = new File(path).getParentFile();
- if (!directory.isDirectory()) {
- if (!directory.mkdirs()) {
- Log.e(TAG, "Unable to create .thumbnails directory "
- + directory.toString());
- }
- }
- File f = new File(path);
- try {
- mMiniThumbFile = new RandomAccessFile(f, "rw");
- } catch (IOException ex) {
- // Open as read-only so we can at least read the existing
- // thumbnails.
- try {
- mMiniThumbFile = new RandomAccessFile(f, "r");
- } catch (IOException ex2) {
- // ignore exception
- }
- }
- if (mMiniThumbFile != null) {
- mChannel = mMiniThumbFile.getChannel();
- }
- }
- return mMiniThumbFile;
- }
-
- private MiniThumbFile(Uri uri) {
- mUri = uri;
- mBuffer = ByteBuffer.allocateDirect(BYTES_PER_MINTHUMB);
- mEmptyBuffer = ByteBuffer.allocateDirect(BYTES_PER_MINTHUMB);
- }
-
- public synchronized void deactivate() {
- if (mMiniThumbFile != null) {
- try {
- mMiniThumbFile.close();
- mMiniThumbFile = null;
- } catch (IOException ex) {
- // ignore exception
- }
- }
- }
-
- // Get the magic number for the specified id in the mini-thumb file.
- // Returns 0 if the magic is not available.
- public synchronized long getMagic(long id) {
- // check the mini thumb file for the right data. Right is
- // defined as having the right magic number at the offset
- // reserved for this "id".
- RandomAccessFile r = miniThumbDataFile();
- if (r != null) {
- long pos = id * BYTES_PER_MINTHUMB;
- FileLock lock = null;
- try {
- mBuffer.clear();
- mBuffer.limit(1 + 8);
-
- lock = mChannel.lock(pos, 1 + 8, true);
- // check that we can read the following 9 bytes
- // (1 for the "status" and 8 for the long)
- if (mChannel.read(mBuffer, pos) == 9) {
- mBuffer.position(0);
- if (mBuffer.get() == 1) {
- return mBuffer.getLong();
- }
- }
- } catch (IOException ex) {
- Log.v(TAG, "Got exception checking file magic: ", ex);
- } catch (RuntimeException ex) {
- // Other NIO related exception like disk full, read only channel..etc
- Log.e(TAG, "Got exception when reading magic, id = " + id +
- ", disk full or mount read-only? " + ex.getClass());
- } finally {
- try {
- if (lock != null) lock.release();
- }
- catch (IOException ex) {
- // ignore it.
- }
- }
- }
- return 0;
- }
-
- public synchronized void eraseMiniThumb(long id) {
- RandomAccessFile r = miniThumbDataFile();
- if (r != null) {
- long pos = id * BYTES_PER_MINTHUMB;
- FileLock lock = null;
- try {
- mBuffer.clear();
- mBuffer.limit(1 + 8);
-
- lock = mChannel.lock(pos, BYTES_PER_MINTHUMB, false);
- // check that we can read the following 9 bytes
- // (1 for the "status" and 8 for the long)
- if (mChannel.read(mBuffer, pos) == 9) {
- mBuffer.position(0);
- if (mBuffer.get() == 1) {
- long currentMagic = mBuffer.getLong();
- if (currentMagic == 0) {
- // there is no thumbnail stored here
- Log.i(TAG, "no thumbnail for id " + id);
- return;
- }
- // zero out the thumbnail slot
- // Log.v(TAG, "clearing slot " + id + ", magic " + currentMagic
- // + " at offset " + pos);
- mChannel.write(mEmptyBuffer, pos);
- }
- } else {
- // Log.v(TAG, "No slot");
- }
- } catch (IOException ex) {
- Log.v(TAG, "Got exception checking file magic: ", ex);
- } catch (RuntimeException ex) {
- // Other NIO related exception like disk full, read only channel..etc
- Log.e(TAG, "Got exception when reading magic, id = " + id +
- ", disk full or mount read-only? " + ex.getClass());
- } finally {
- try {
- if (lock != null) lock.release();
- }
- catch (IOException ex) {
- // ignore it.
- }
- }
- } else {
- // Log.v(TAG, "No data file");
- }
- }
-
- public synchronized void saveMiniThumbToFile(byte[] data, long id, long magic)
- throws IOException {
- RandomAccessFile r = miniThumbDataFile();
- if (r == null) return;
-
- long pos = id * BYTES_PER_MINTHUMB;
- FileLock lock = null;
- try {
- if (data != null) {
- if (data.length > BYTES_PER_MINTHUMB - HEADER_SIZE) {
- // not enough space to store it.
- return;
- }
- mBuffer.clear();
- mBuffer.put((byte) 1);
- mBuffer.putLong(magic);
- mBuffer.putInt(data.length);
- mBuffer.put(data);
- mBuffer.flip();
-
- lock = mChannel.lock(pos, BYTES_PER_MINTHUMB, false);
- mChannel.write(mBuffer, pos);
- }
- } catch (IOException ex) {
- Log.e(TAG, "couldn't save mini thumbnail data for "
- + id + "; ", ex);
- throw ex;
- } catch (RuntimeException ex) {
- // Other NIO related exception like disk full, read only channel..etc
- Log.e(TAG, "couldn't save mini thumbnail data for "
- + id + "; disk full or mount read-only? " + ex.getClass());
- } finally {
- try {
- if (lock != null) lock.release();
- }
- catch (IOException ex) {
- // ignore it.
- }
- }
- }
-
- /**
- * Gallery app can use this method to retrieve mini-thumbnail. Full size
- * images share the same IDs with their corresponding thumbnails.
- *
- * @param id the ID of the image (same of full size image).
- * @param data the buffer to store mini-thumbnail.
- */
- public synchronized byte [] getMiniThumbFromFile(long id, byte [] data) {
- RandomAccessFile r = miniThumbDataFile();
- if (r == null) return null;
-
- long pos = id * BYTES_PER_MINTHUMB;
- FileLock lock = null;
- try {
- mBuffer.clear();
- lock = mChannel.lock(pos, BYTES_PER_MINTHUMB, true);
- int size = mChannel.read(mBuffer, pos);
- if (size > 1 + 8 + 4) { // flag, magic, length
- mBuffer.position(0);
- byte flag = mBuffer.get();
- long magic = mBuffer.getLong();
- int length = mBuffer.getInt();
-
- if (size >= 1 + 8 + 4 + length && length != 0 && magic != 0 && flag == 1 &&
- data.length >= length) {
- mBuffer.get(data, 0, length);
- return data;
- }
- }
- } catch (IOException ex) {
- Log.w(TAG, "got exception when reading thumbnail id=" + id + ", exception: " + ex);
- } catch (RuntimeException ex) {
- // Other NIO related exception like disk full, read only channel..etc
- Log.e(TAG, "Got exception when reading thumbnail, id = " + id +
- ", disk full or mount read-only? " + ex.getClass());
- } finally {
- try {
- if (lock != null) lock.release();
- }
- catch (IOException ex) {
- // ignore it.
- }
- }
- return null;
- }
-}