1623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki/* 2623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * Copyright (C) 2012 The Android Open Source Project 3623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * 4623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * you may not use this file except in compliance with the License. 6623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * You may obtain a copy of the License at 7623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * 8623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * 10623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * Unless required by applicable law or agreed to in writing, software 11623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * See the License for the specific language governing permissions and 14623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * limitations under the License. 15623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki */ 16623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 17623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukipackage com.android.providers.contacts.debug; 18623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 19623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.content.ContentProvider; 20623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.content.ContentValues; 21623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.database.Cursor; 22623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.database.MatrixCursor; 23623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.net.Uri; 24623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.os.ParcelFileDescriptor; 25623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport android.provider.OpenableColumns; 26623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 27623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport java.io.File; 28623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukiimport java.io.FileNotFoundException; 29623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 30623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki/** 31623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * Provider used to read dump files created by {@link DataExporter}. 32623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * 33623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * We send content: URI to sender apps (such as gmail). This provider implement the URI. 34623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki */ 35623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onukipublic class DumpFileProvider extends ContentProvider { 36623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public static final String AUTHORITY = "com.android.contacts.dumpfile"; 37623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); 38623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 39623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 40623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public boolean onCreate() { 41623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return true; 42623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 43623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 44623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 45623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public Uri insert(Uri uri, ContentValues values) { 46623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // Not needed. 47623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki throw new UnsupportedOperationException(); 48623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 49623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 50623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 51623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public int delete(Uri uri, String selection, String[] selectionArgs) { 52623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // Not needed. 53623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki throw new UnsupportedOperationException(); 54623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 55623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 56623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 57623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 58623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // Not needed. 59623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki throw new UnsupportedOperationException(); 60623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 61623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 62623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 63623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public String getType(Uri uri) { 64623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return DataExporter.ZIP_MIME_TYPE; 65623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 66623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 67623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki /** @return the path part of a URI, without the beginning "/". */ 68623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki private static String extractFileName(Uri uri) { 69623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki final String path = uri.getPath(); 70623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return path.startsWith("/") ? path.substring(1) : path; 71623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 72623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 73623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki /** @return file content */ 74623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 75623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 76623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki if (!"r".equals(mode)) { 77623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki throw new UnsupportedOperationException(); 78623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 79c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng 80c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng final String fileName = extractFileName(uri); 81c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng DataExporter.ensureValidFileName(fileName); 82c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng final File file = DataExporter.getOutputFile(getContext(), fileName); 83623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 84623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 85623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 86623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki /** 87623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * Used to provide {@link OpenableColumns#DISPLAY_NAME} and {@link OpenableColumns#SIZE} 88623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki * for a URI. 89623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki */ 90623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki @Override 91a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki public Cursor query(Uri uri, String[] inProjection, String selection, String[] selectionArgs, 92623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki String sortOrder) { 93c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng final String fileName = extractFileName(uri); 94c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng DataExporter.ensureValidFileName(fileName); 95c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng 96a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki final String[] projection = (inProjection != null) ? inProjection 97a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki : new String[] {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}; 98623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 99623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki final MatrixCursor c = new MatrixCursor(projection); 100623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 101623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // Result will always have one row. 102623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki final MatrixCursor.RowBuilder b = c.newRow(); 103623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 104623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki for (int i = 0; i < c.getColumnCount(); i++) { 105623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki final String column = projection[i]; 106623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki if (OpenableColumns.DISPLAY_NAME.equals(column)) { 107623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // Just return the requested path as the display name. We don't care if the file 108623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki // really exists. 109c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng b.add(fileName); 110623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } else if (OpenableColumns.SIZE.equals(column)) { 111c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng final File file = DataExporter.getOutputFile(getContext(), fileName); 112a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki 113a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki if (file.exists()) { 114a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki b.add(file.length()); 115a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki } else { 116a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki // File doesn't exist -- return null for "unknown". 117a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki b.add(null); 118a6ec38053a00fb399ca174931c149e3740c7420aMakoto Onuki } 119623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } else { 120623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki throw new IllegalArgumentException("Unknown column " + column); 121623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 122623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 123623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki 124623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki return c; 125623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki } 126c43a8d4c928b0d362339cd418486e2aa91769b70Chiao Cheng 127623659ebf4875e63bf4fef1e0b00096e09121853Makoto Onuki} 128