1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*
2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project
3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License.
6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at
7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software
11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and
14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License.
15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
17d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipackage android.drm;
18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.ArrayList;
20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.Iterator;
21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
230e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * An entity class that wraps the capability of each DRM plug-in (agent),
240e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * such as the MIME type and file suffix the DRM plug-in can handle.
250e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber *<p>
260e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Plug-in developers can expose the capability of their plug-in by passing an instance of this
270e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * class to an application.
28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmSupportInfo {
31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private final ArrayList<String> mFileSuffixList = new ArrayList<String>();
32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private final ArrayList<String> mMimeTypeList = new ArrayList<String>();
33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private String mDescription = "";
34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
360e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Adds the specified MIME type to the list of MIME types this DRM plug-in supports.
37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
380e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param mimeType MIME type that can be handles by this DRM plug-in.
3952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * Must not be null or an empty string.
40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void addMimeType(String mimeType) {
4252cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        if (mimeType == null) {
4352cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            throw new IllegalArgumentException("mimeType is null");
4452cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        }
4552cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        if (mimeType == "") {
4652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            throw new IllegalArgumentException("mimeType is an empty string");
4752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        }
4852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong
49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mMimeTypeList.add(mimeType);
50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
530e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Adds the specified file suffix to the list of file suffixes this DRM plug-in supports.
54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
550e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param fileSuffix File suffix that can be handled by this DRM plug-in.
5652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * it could be null but not an empty string. When it is null, it indicates
5752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * that some DRM content comes with no file suffix.
58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void addFileSuffix(String fileSuffix) {
6052cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        if (fileSuffix == "") {
6152cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            throw new IllegalArgumentException("fileSuffix is an empty string");
6252cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        }
6352cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong
64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mFileSuffixList.add(fileSuffix);
65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
680e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves an iterator object that you can use to iterate over the MIME types that
690e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * this DRM plug-in supports.
70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
710e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The iterator object
72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public Iterator<String> getMimeTypeIterator() {
74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mMimeTypeList.iterator();
75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
780e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves an iterator object that you can use to iterate over the file suffixes that
790e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * this DRM plug-in supports.
80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
810e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The iterator object.
82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public Iterator<String> getFileSuffixIterator() {
84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mFileSuffixList.iterator();
85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
880e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Sets a description for the DRM plug-in (agent).
89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
9052cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * @param description Unique description of plug-in. Must not be null
9152cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * or an empty string.
92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void setDescription(String description) {
9452cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        if (description == null) {
9552cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            throw new IllegalArgumentException("description is null");
9652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        }
9752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        if (description == "") {
9852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            throw new IllegalArgumentException("description is an empty string");
99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
10052cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong
10152cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        mDescription = description;
102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1050e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves the DRM plug-in (agent) description.
106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1070e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The plug-in description.
108c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong     * @deprecated The method name is mis-spelled, and it is replaced by
109c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong     * {@link #getDescription()}.
110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public String getDescriprition() {
112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mDescription;
113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
11652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * Retrieves the DRM plug-in (agent) description. Even if null or an empty
11752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * string is not allowed in {@link #setDescription(String)}, if
11852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * {@link #setDescription(String)} is not called, description returned
11952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * from this method is an empty string.
120c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong     *
121c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong     * @return The plug-in description.
122c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong     */
123c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong    public String getDescription() {
124c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong        return mDescription;
125c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong    }
126c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong
127c4a9976aa15929a73ab7c0979d8b2e1e9eeadcc7James Dong    /**
1280e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Overridden hash code implementation.
129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1300e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The hash code value.
131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int hashCode() {
133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mFileSuffixList.hashCode() + mMimeTypeList.hashCode() + mDescription.hashCode();
134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
13752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * Overridden <code>equals</code> implementation. Two DrmSupportInfo objects
13852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * are considered being equal if they support exactly the same set of mime
13952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * types, file suffixes, and has exactly the same description.
140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1410e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param object The object to be compared.
1420e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return True if equal; false if not equal.
143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public boolean equals(Object object) {
145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (object instanceof DrmSupportInfo) {
14652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            DrmSupportInfo info = (DrmSupportInfo) object;
14752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong            return mFileSuffixList.equals(info.mFileSuffixList) &&
14852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                   mMimeTypeList.equals(info.mMimeTypeList) &&
14952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                   mDescription.equals(info.mDescription);
150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
15152cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong        return false;
152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1550e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Determines whether a given MIME type is supported.
156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1570e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param mimeType MIME type.
1580e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return True if Mime type is supported; false if MIME type is not supported.
15952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong     * Null or empty string is not a supported mimeType.
160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /* package */ boolean isSupportedMimeType(String mimeType) {
162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null != mimeType && !mimeType.equals("")) {
163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            for (int i = 0; i < mMimeTypeList.size(); i++) {
164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                String completeMimeType = mMimeTypeList.get(i);
16552cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong
16652cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                // The reason that equals() is not used is that sometimes,
16752cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                // content distributor might just append something to
16852cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                // the basic MIME type. startsWith() is used to avoid
16952cb1e5988a8a97c668b935fb5d8d358cb3c635aJames Dong                // frequent update of DRM agent.
170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                if (completeMimeType.startsWith(mimeType)) {
171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    return true;
172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                }
173d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            }
174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return false;
176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1790e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Determines whether a given file suffix is supported.
180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1810e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param fileSuffix File suffix.
1820e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return True if file suffix is supported; false if file suffix is not supported.
183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /* package */ boolean isSupportedFileSuffix(String fileSuffix) {
185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mFileSuffixList.contains(fileSuffix);
186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}
188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
189