summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/contacts/debug/DumpFileProvider.java
blob: 1fbe43cc7b2334b156e47051c7cf634c5a0cd011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * Copyright (C) 2012 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.providers.contacts.debug;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.provider.OpenableColumns;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * Provider used to read dump files created by {@link DataExporter}.
 *
 * We send content: URI to sender apps (such as gmail).  This provider implement the URI.
 */
public class DumpFileProvider extends ContentProvider {
    public static final String AUTHORITY = "com.android.contacts.dumpfile";
    public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // Not needed.
        throw new UnsupportedOperationException();
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // Not needed.
        throw new UnsupportedOperationException();
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        // Not needed.
        throw new UnsupportedOperationException();
    }

    @Override
    public String getType(Uri uri) {
        return DataExporter.ZIP_MIME_TYPE;
    }

    /** @return the path part of a URI, without the beginning "/". */
    private static String extractFileName(Uri uri) {
        final String path = uri.getPath();
        return path.startsWith("/") ? path.substring(1) : path;
    }

    /** @return file content */
    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
        if (!"r".equals(mode)) {
            throw new UnsupportedOperationException();
        }
        final File file = DataExporter.getOutputFile(getContext(), extractFileName(uri));
        return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    }

    /**
     * Used to provide {@link OpenableColumns#DISPLAY_NAME} and {@link OpenableColumns#SIZE}
     * for a URI.
     */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        if (projection == null) throw new IllegalArgumentException("Projection must not be null");

        final MatrixCursor c = new MatrixCursor(projection);

        // Result will always have one row.
        final MatrixCursor.RowBuilder b = c.newRow();

        for (int i = 0; i < c.getColumnCount(); i++) {
            final String column = projection[i];
            if (OpenableColumns.DISPLAY_NAME.equals(column)) {
                // Just return the requested path as the display name.  We don't care if the file
                // really exists.
                b.add(extractFileName(uri));
            } else if (OpenableColumns.SIZE.equals(column)) {
                // Always return "unkown" for file size.
                b.add(null);
            } else {
                throw new IllegalArgumentException("Unknown column " + column);
            }
        }

        return c;
    }
}