/* * Copyright (C) 2014 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.support.v4.provider; import android.net.Uri; import android.util.Log; import android.webkit.MimeTypeMap; import java.io.File; import java.io.IOException; import java.util.ArrayList; class RawDocumentFile extends DocumentFile { private File mFile; RawDocumentFile(DocumentFile parent, File file) { super(parent); mFile = file; } @Override public DocumentFile createFile(String mimeType, String displayName) { // Tack on extension when valid MIME type provided final String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); if (extension != null) { displayName += "." + extension; } final File target = new File(mFile, displayName); try { target.createNewFile(); return new RawDocumentFile(this, target); } catch (IOException e) { Log.w(TAG, "Failed to createFile: " + e); return null; } } @Override public DocumentFile createDirectory(String displayName) { final File target = new File(mFile, displayName); if (target.isDirectory() || target.mkdir()) { return new RawDocumentFile(this, target); } else { return null; } } @Override public Uri getUri() { return Uri.fromFile(mFile); } @Override public String getName() { return mFile.getName(); } @Override public String getType() { if (mFile.isDirectory()) { return null; } else { return getTypeForName(mFile.getName()); } } @Override public boolean isDirectory() { return mFile.isDirectory(); } @Override public boolean isFile() { return mFile.isFile(); } @Override public long lastModified() { return mFile.lastModified(); } @Override public long length() { return mFile.length(); } @Override public boolean canRead() { return mFile.canRead(); } @Override public boolean canWrite() { return mFile.canWrite(); } @Override public boolean delete() { deleteContents(mFile); return mFile.delete(); } @Override public boolean exists() { return mFile.exists(); } @Override public DocumentFile[] listFiles() { final ArrayList results = new ArrayList(); final File[] files = mFile.listFiles(); if (files != null) { for (File file : files) { results.add(new RawDocumentFile(this, file)); } } return results.toArray(new DocumentFile[results.size()]); } @Override public boolean renameTo(String displayName) { final File target = new File(mFile.getParentFile(), displayName); if (mFile.renameTo(target)) { mFile = target; return true; } else { return false; } } private static String getTypeForName(String name) { final int lastDot = name.lastIndexOf('.'); if (lastDot >= 0) { final String extension = name.substring(lastDot + 1).toLowerCase(); final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); if (mime != null) { return mime; } } return "application/octet-stream"; } private static boolean deleteContents(File dir) { File[] files = dir.listFiles(); boolean success = true; if (files != null) { for (File file : files) { if (file.isDirectory()) { success &= deleteContents(file); } if (!file.delete()) { Log.w(TAG, "Failed to delete " + file); success = false; } } } return success; } }