1b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn/*
2b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Copyright (C) 2015 The Android Open Source Project
3b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *
4b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * you may not use this file except in compliance with the License.
6b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * You may obtain a copy of the License at
7b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *
8b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *
10b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * See the License for the specific language governing permissions and
14b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn * limitations under the License.
15b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn */
16b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
17b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornpackage com.android.server.am;
18b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
19b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.content.ContentProvider;
20b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.content.ContentValues;
21b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.database.Cursor;
22b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.net.Uri;
23b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.Environment;
24b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.ParcelFileDescriptor;
25b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
26b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport java.io.File;
27b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport java.io.FileNotFoundException;
28b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
29b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornpublic class DumpHeapProvider extends ContentProvider {
30b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    static final Object sLock = new Object();
31b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    static File sHeapDumpJavaFile;
32b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
33b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    static public File getJavaFile() {
34b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        synchronized (sLock) {
35b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            return sHeapDumpJavaFile;
36b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        }
37b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
38b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
39b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
40b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public boolean onCreate() {
41b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        synchronized (sLock) {
42b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            File dataDir = Environment.getDataDirectory();
43b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            File systemDir = new File(dataDir, "system");
44b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            File heapdumpDir = new File(systemDir, "heapdump");
45b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            heapdumpDir.mkdir();
46b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            sHeapDumpJavaFile = new File(heapdumpDir, "javaheap.bin");
47b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        }
48b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return true;
49b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
50b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
51b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
52b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
53b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return null;
54b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
55b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
56b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
57b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public String getType(Uri uri) {
58b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return "application/octet-stream";
59b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
60b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
61b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
62b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public Uri insert(Uri uri, ContentValues values) {
63b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return null;
64b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
65b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
66b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
67b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public int delete(Uri uri, String selection, String[] selectionArgs) {
68b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return 0;
69b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
70b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
71b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
72b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
73b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        return 0;
74b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
75b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
76b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    @Override
77b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
78b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        synchronized (sLock) {
79b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            String path = uri.getEncodedPath();
80b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            final String tag = Uri.decode(path);
81b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            if (tag.equals("/java")) {
82b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                return ParcelFileDescriptor.open(sHeapDumpJavaFile,
83b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                        ParcelFileDescriptor.MODE_READ_ONLY);
84b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            } else {
85b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn                throw new FileNotFoundException("Invalid path for " + uri);
86b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn            }
87b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        }
88b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn    }
89b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn}
90