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