1/*
2 * Copyright (C) 2007-2008 Esmertec AG.
3 * Copyright (C) 2007-2008 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.messaging.util;
19
20import android.webkit.MimeTypeMap;
21
22public final class ContentType {
23    public static String THREE_GPP_EXTENSION = "3gp";
24    public static String VIDEO_MP4_EXTENSION = "mp4";
25    // Default extension used when we don't know one.
26    public static String DEFAULT_EXTENSION = "dat";
27
28    public static final int TYPE_IMAGE = 0;
29    public static final int TYPE_VIDEO = 1;
30    public static final int TYPE_AUDIO = 2;
31    public static final int TYPE_VCARD = 3;
32    public static final int TYPE_OTHER = 4;
33
34    public static final String ANY_TYPE          = "*/*";
35    public static final String MMS_MESSAGE       = "application/vnd.wap.mms-message";
36    // The phony content type for generic PDUs (e.g. ReadOrig.ind,
37    // Notification.ind, Delivery.ind).
38    public static final String MMS_GENERIC       = "application/vnd.wap.mms-generic";
39    public static final String MMS_MULTIPART_MIXED   = "application/vnd.wap.multipart.mixed";
40    public static final String MMS_MULTIPART_RELATED = "application/vnd.wap.multipart.related";
41    public static final String MMS_MULTIPART_ALTERNATIVE =
42            "application/vnd.wap.multipart.alternative";
43
44    public static final String TEXT_PLAIN        = "text/plain";
45    public static final String TEXT_HTML         = "text/html";
46    public static final String TEXT_VCALENDAR    = "text/x-vCalendar";
47    public static final String TEXT_VCARD        = "text/x-vCard";
48
49    public static final String IMAGE_PREFIX      = "image/";
50    public static final String IMAGE_UNSPECIFIED = "image/*";
51    public static final String IMAGE_JPEG        = "image/jpeg";
52    public static final String IMAGE_JPG         = "image/jpg";
53    public static final String IMAGE_GIF         = "image/gif";
54    public static final String IMAGE_WBMP        = "image/vnd.wap.wbmp";
55    public static final String IMAGE_PNG         = "image/png";
56    public static final String IMAGE_X_MS_BMP    = "image/x-ms-bmp";
57
58    public static final String AUDIO_UNSPECIFIED = "audio/*";
59    public static final String AUDIO_AAC         = "audio/aac";
60    public static final String AUDIO_AMR         = "audio/amr";
61    public static final String AUDIO_IMELODY     = "audio/imelody";
62    public static final String AUDIO_MID         = "audio/mid";
63    public static final String AUDIO_MIDI        = "audio/midi";
64    public static final String AUDIO_MP3         = "audio/mp3";
65    public static final String AUDIO_MPEG3       = "audio/mpeg3";
66    public static final String AUDIO_MPEG        = "audio/mpeg";
67    public static final String AUDIO_MPG         = "audio/mpg";
68    public static final String AUDIO_MP4         = "audio/mp4";
69    public static final String AUDIO_MP4_LATM    = "audio/mp4-latm";
70    public static final String AUDIO_X_MID       = "audio/x-mid";
71    public static final String AUDIO_X_MIDI      = "audio/x-midi";
72    public static final String AUDIO_X_MP3       = "audio/x-mp3";
73    public static final String AUDIO_X_MPEG3     = "audio/x-mpeg3";
74    public static final String AUDIO_X_MPEG      = "audio/x-mpeg";
75    public static final String AUDIO_X_MPG       = "audio/x-mpg";
76    public static final String AUDIO_3GPP        = "audio/3gpp";
77    public static final String AUDIO_X_WAV       = "audio/x-wav";
78    public static final String AUDIO_OGG         = "application/ogg";
79
80    public static final String MULTIPART_MIXED = "multipart/mixed";
81
82    public static final String VIDEO_UNSPECIFIED = "video/*";
83    public static final String VIDEO_3GP         = "video/3gp";
84    public static final String VIDEO_3GPP        = "video/3gpp";
85    public static final String VIDEO_3G2         = "video/3gpp2";
86    public static final String VIDEO_H263        = "video/h263";
87    public static final String VIDEO_M4V         = "video/m4v";
88    public static final String VIDEO_MP4         = "video/mp4";
89    public static final String VIDEO_MPEG        = "video/mpeg";
90    public static final String VIDEO_MPEG4       = "video/mpeg4";
91    public static final String VIDEO_WEBM        = "video/webm";
92
93    public static final String APP_SMIL          = "application/smil";
94    public static final String APP_WAP_XHTML     = "application/vnd.wap.xhtml+xml";
95    public static final String APP_XHTML         = "application/xhtml+xml";
96
97    public static final String APP_DRM_CONTENT   = "application/vnd.oma.drm.content";
98    public static final String APP_DRM_MESSAGE   = "application/vnd.oma.drm.message";
99
100    // This class should never be instantiated.
101    private ContentType() {
102    }
103
104    public static boolean isTextType(final String contentType) {
105        return TEXT_PLAIN.equals(contentType)
106                || TEXT_HTML.equals(contentType)
107                || APP_WAP_XHTML.equals(contentType);
108    }
109
110    public static boolean isMediaType(final String contentType) {
111        return isImageType(contentType)
112                || isVideoType(contentType)
113                || isAudioType(contentType)
114                || isVCardType(contentType);
115    }
116
117    public static boolean isImageType(final String contentType) {
118        return (null != contentType) && contentType.startsWith(IMAGE_PREFIX);
119    }
120
121    public static boolean isAudioType(final String contentType) {
122        return (null != contentType) &&
123                (contentType.startsWith("audio/") || contentType.equalsIgnoreCase(AUDIO_OGG));
124    }
125
126    public static boolean isVideoType(final String contentType) {
127        return (null != contentType) && contentType.startsWith("video/");
128    }
129
130    public static boolean isVCardType(final String contentType) {
131        return (null != contentType) && contentType.equalsIgnoreCase(TEXT_VCARD);
132    }
133
134    public static boolean isDrmType(final String contentType) {
135        return (null != contentType)
136                && (contentType.equals(APP_DRM_CONTENT)
137                        || contentType.equals(APP_DRM_MESSAGE));
138    }
139
140    public static boolean isUnspecified(final String contentType) {
141        return (null != contentType) && contentType.endsWith("*");
142    }
143
144    /**
145     * If the content type is a type which can be displayed in the conversation list as a preview.
146     */
147    public static boolean isConversationListPreviewableType(final String contentType) {
148        return ContentType.isAudioType(contentType) || ContentType.isVideoType(contentType) ||
149                ContentType.isImageType(contentType) || ContentType.isVCardType(contentType);
150    }
151
152    /**
153     * Given a filename, look at the extension and try and determine the mime type.
154     *
155     * @param fileName a filename to determine the type from, such as img1231.jpg
156     * @param contentTypeDefault type to use when the content type can't be determined from the file
157     *      extension. It can be null or a type such as ContentType.IMAGE_UNSPECIFIED
158     * @return Content type of the extension.
159     */
160    public static String getContentTypeFromExtension(final String fileName,
161            final String contentTypeDefault) {
162        final MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
163        final String extension = MimeTypeMap.getFileExtensionFromUrl(fileName);
164        String contentType = mimeTypeMap.getMimeTypeFromExtension(extension);
165        if (contentType == null) {
166            contentType = contentTypeDefault;
167        }
168        return contentType;
169    }
170
171    /**
172     * Get the common file extension for a given content type
173     * @param contentType The content type
174     * @return The extension without the .
175     */
176    public static String getExtension(final String contentType) {
177        if (VIDEO_MP4.equals(contentType)) {
178            return VIDEO_MP4_EXTENSION;
179        } else if (VIDEO_3GPP.equals(contentType)) {
180            return THREE_GPP_EXTENSION;
181        } else {
182            return DEFAULT_EXTENSION;
183        }
184    }
185}
186