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