1d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
2d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
3d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport android.webkit.MimeTypeMap;
4d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport com.xtremelabs.robolectric.Robolectric;
5d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport com.xtremelabs.robolectric.internal.Implementation;
6d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport com.xtremelabs.robolectric.internal.Implements;
7d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
8d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport java.util.HashMap;
9d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport java.util.Map;
10d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
11d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
12d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
13d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz/**
14d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz * Shadow for {@code MimeTypeMap} that allows custom extension <-> mimetype mapping to be set up by tests.
15d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz */
16d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz@Implements(MimeTypeMap.class)
17d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultzpublic class ShadowMimeTypeMap {
18d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
19d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    Map<String, String> extensionToMimeTypeMap = new HashMap<String, String>();
20d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    Map<String, String> mimeTypeToExtensionMap = new HashMap<String, String>();
21d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
22d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    static MimeTypeMap sSingleton = null;
23d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    static Object sSingletonLock = new Object();
24d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
25d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    @Implementation
26d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public static MimeTypeMap getSingleton() {
27d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        if (sSingleton == null) {
28d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz            synchronized (sSingletonLock) {
29d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz                if (sSingleton == null) {
30d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz                    sSingleton = Robolectric.newInstanceOf(MimeTypeMap.class);
31d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz                }
32d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz            }
33d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        }
34d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
35d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        return sSingleton;
36d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
37d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
38d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public static void reset() {
39d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        shadowOf(getSingleton()).clearMappings();
40d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
41d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
42d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    @Implementation
43d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public String getMimeTypeFromExtension(String extension) {
44d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        if (extensionToMimeTypeMap.containsKey(extension))
45d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz            return extensionToMimeTypeMap.get(extension);
46d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
47d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        return null;
48d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
49d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
50d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    @Implementation
51d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public String getExtensionFromMimeType(String mimeType) {
52d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        if (mimeTypeToExtensionMap.containsKey(mimeType))
53d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz            return mimeTypeToExtensionMap.get(mimeType);
54d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
55d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        return null;
56d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
57d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
58d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public void addExtensionMimeTypMapping(String extension, String mimeType) {
59d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        extensionToMimeTypeMap.put(extension, mimeType);
60d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        mimeTypeToExtensionMap.put(mimeType, extension);
61d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
62d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
63d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public void clearMappings() {
64d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        extensionToMimeTypeMap.clear();
65d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        mimeTypeToExtensionMap.clear();
66d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
67d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
68d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    @Implementation
69d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public boolean hasExtension(String extension) {
70d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        return extensionToMimeTypeMap.containsKey(extension);
71d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
72d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz
73d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    @Implementation
74d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    public boolean hasMimeType(String mimeType) {
75d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz        return mimeTypeToExtensionMap.containsKey(mimeType);
76d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz    }
77d59c8fe95798cb5caea853467c9e595b1d8ebd20Tyler Schultz}
78