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