1145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey/*
2145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project
3145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey *
4145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * you may not use this file except in compliance with the License.
6145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * You may obtain a copy of the License at
7145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey *
8145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey *
10145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * See the License for the specific language governing permissions and
14145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * limitations under the License.
15145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey */
16145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
17145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeypackage android.support.v4.os;
18145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
19145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeyimport android.os.Build;
20145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeyimport android.os.Environment;
21145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeyimport android.util.Log;
22145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
23145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeyimport java.io.File;
24145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkeyimport java.io.IOException;
25145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
26145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey/**
27145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * Helper for accessing features in {@link Environment} introduced after API
28145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey * level 4 in a backwards compatible fashion.
29145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey */
30c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class EnvironmentCompat {
31145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    private static final String TAG = "EnvironmentCompat";
32145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
33145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    /**
34145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * Unknown storage state, such as when a path isn't backed by known storage
35145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * media.
36145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *
37145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * @see #getStorageState(File)
38145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     */
39145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    public static final String MEDIA_UNKNOWN = "unknown";
40145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
41145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    /**
42145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * Returns the current state of the storage device that provides the given
43145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * path.
44145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *
45145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     * @return one of {@link #MEDIA_UNKNOWN}, {@link Environment#MEDIA_REMOVED},
46145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_UNMOUNTED},
47145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_CHECKING},
48145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_NOFS},
49145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_MOUNTED},
50145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_MOUNTED_READ_ONLY},
51145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_SHARED},
52145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_BAD_REMOVAL}, or
53145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     *         {@link Environment#MEDIA_UNMOUNTABLE}.
54145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey     */
55145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    public static String getStorageState(File path) {
56145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        final int version = Build.VERSION.SDK_INT;
57145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        if (version >= 19) {
58145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            return EnvironmentCompatKitKat.getStorageState(path);
59145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        }
60145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
61145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        try {
62145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            final String canonicalPath = path.getCanonicalPath();
63145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            final String canonicalExternal = Environment.getExternalStorageDirectory()
64145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey                    .getCanonicalPath();
65145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
66145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            if (canonicalPath.startsWith(canonicalExternal)) {
67145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey                return Environment.getExternalStorageState();
68145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            }
69145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        } catch (IOException e) {
70145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey            Log.w(TAG, "Failed to resolve canonical path: " + e);
71145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        }
72145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey
73145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey        return MEDIA_UNKNOWN;
74145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey    }
75c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes
76c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes    private EnvironmentCompat() {}
77145d27f9dd22e953d05e01327c9c2dac68634ae8Jeff Sharkey}
78