DrmManagerClient.java revision 365ce1db339db53cd5afb118ff867fe940644e45
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 19c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimiimport android.content.ContentResolver; 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.content.ContentValues; 21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.content.Context; 22dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.database.Cursor; 23c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimiimport android.database.sqlite.SQLiteException; 24dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.net.Uri; 25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Handler; 26dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.os.HandlerThread; 27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Looper; 28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Message; 29dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.provider.MediaStore; 30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.util.Log; 31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.io.IOException; 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.lang.ref.WeakReference; 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.ArrayList; 35dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport java.util.HashMap; 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 380e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * The main programming interface for the DRM framework. An application must instantiate this class 390e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * to access DRM agents through the DRM framework. 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmManagerClient { 43dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 440e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Indicates that a request was successful or that no error occurred. 45dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 46dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static final int ERROR_NONE = 0; 47dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 480e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Indicates that an error occurred and the reason is not known. 49dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 50dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static final int ERROR_UNKNOWN = -2000; 51dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 52dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final String TAG = "DrmManagerClient"; 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static { 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // Load the respective library 56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi System.loadLibrary("drmframework_jni"); 57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 600e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Interface definition for a callback that receives status messages and warnings 610e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * during registration and rights acquisition. 62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public interface OnInfoListener { 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 650e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Called when the DRM framework sends status or warning information during registration 660e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * and rights acquisition. 67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 680e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param client The <code>DrmManagerClient</code> instance. 690e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param event The {@link DrmInfoEvent} instance that wraps the status information or 700e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * warnings. 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void onInfo(DrmManagerClient client, DrmInfoEvent event); 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 75dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 760e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Interface definition for a callback that receives information 770e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * about DRM processing events. 78dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 79dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public interface OnEventListener { 80dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 810e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Called when the DRM framework sends information about a DRM processing request. 82dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 830e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param client The <code>DrmManagerClient</code> instance. 840e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param event The {@link DrmEvent} instance that wraps the information being 850e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * conveyed, such as the information type and message. 86dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 87f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang public void onEvent(DrmManagerClient client, DrmEvent event); 88dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 89dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 90dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 910e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Interface definition for a callback that receives information about DRM framework errors. 92dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 93dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public interface OnErrorListener { 94dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 950e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Called when the DRM framework sends error information. 96dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 970e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param client The <code>DrmManagerClient</code> instance. 980e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param event The {@link DrmErrorEvent} instance that wraps the error type and message. 99dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 100dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public void onError(DrmManagerClient client, DrmErrorEvent event); 101dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 102dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 103c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi private static final int ACTION_REMOVE_ALL_RIGHTS = 1001; 104dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi private static final int ACTION_PROCESS_DRM_INFO = 1002; 105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int mUniqueId; 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int mNativeContext; 108dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private Context mContext; 109dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private InfoHandler mInfoHandler; 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private EventHandler mEventHandler; 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private OnInfoListener mOnInfoListener; 112dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private OnEventListener mOnEventListener; 113dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private OnErrorListener mOnErrorListener; 114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 115dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private class EventHandler extends Handler { 116dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 117dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public EventHandler(Looper looper) { 118dc549d60f98d809f626c99de614960409a847054Takeshi Aimi super(looper); 119dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 120dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 121dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public void handleMessage(Message msg) { 122dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmEvent event = null; 123dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent error = null; 124dc549d60f98d809f626c99de614960409a847054Takeshi Aimi HashMap<String, Object> attributes = new HashMap<String, Object>(); 125dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 126dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch(msg.what) { 127dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_PROCESS_DRM_INFO: { 128dc549d60f98d809f626c99de614960409a847054Takeshi Aimi final DrmInfo drmInfo = (DrmInfo) msg.obj; 129dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmInfoStatus status = _processDrmInfo(mUniqueId, drmInfo); 130f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang 131f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang attributes.put(DrmEvent.DRM_INFO_STATUS_OBJECT, status); 132f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang attributes.put(DrmEvent.DRM_INFO_OBJECT, drmInfo); 133f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang 134dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != status && DrmInfoStatus.STATUS_OK == status.statusCode) { 135f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang event = new DrmEvent(mUniqueId, 136f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang getEventType(status.infoType), null, attributes); 137dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 138c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi int infoType = (null != status) ? status.infoType : drmInfo.getInfoType(); 139f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang error = new DrmErrorEvent(mUniqueId, 140f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang getErrorType(infoType), null, attributes); 141dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 142dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 143dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 144dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_REMOVE_ALL_RIGHTS: { 145dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (ERROR_NONE == _removeAllRights(mUniqueId)) { 146dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, DrmEvent.TYPE_ALL_RIGHTS_REMOVED, null); 147dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 148dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 149dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent.TYPE_REMOVE_ALL_RIGHTS_FAILED, null); 150dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 151dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 152dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 153dc549d60f98d809f626c99de614960409a847054Takeshi Aimi default: 154dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Log.e(TAG, "Unknown message type " + msg.what); 155dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return; 156dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 157dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnEventListener && null != event) { 158f8bf3c46f524b1252bf466a351daaef61afdcecbGloria Wang mOnEventListener.onEvent(DrmManagerClient.this, event); 159dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 160dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnErrorListener && null != error) { 161dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener.onError(DrmManagerClient.this, error); 162dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 163dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 164dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 165dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * {@hide} 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 169dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static void notify( 170dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Object thisReference, int uniqueId, int infoType, String message) { 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get(); 172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 173dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != instance && null != instance.mInfoHandler) { 174dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message m = instance.mInfoHandler.obtainMessage( 175dc549d60f98d809f626c99de614960409a847054Takeshi Aimi InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message); 176dc549d60f98d809f626c99de614960409a847054Takeshi Aimi instance.mInfoHandler.sendMessage(m); 177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 180dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private class InfoHandler extends Handler { 181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public static final int INFO_EVENT_TYPE = 1; 182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 183dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public InfoHandler(Looper looper) { 184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi super(looper); 185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void handleMessage(Message msg) { 18827b277779c89251f2aafcc7a56db95d264900c9dGloria Wang DrmInfoEvent info = null; 189dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent error = null; 190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi switch (msg.what) { 192dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case InfoHandler.INFO_EVENT_TYPE: 193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId = msg.arg1; 194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int infoType = msg.arg2; 195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String message = msg.obj.toString(); 196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 197dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 198dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoEvent.TYPE_REMOVE_RIGHTS: { 199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi try { 200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmUtils.removeFile(message); 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } catch (IOException e) { 202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi e.printStackTrace(); 203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 20427b277779c89251f2aafcc7a56db95d264900c9dGloria Wang info = new DrmInfoEvent(uniqueId, infoType, message); 205dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 206dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 20727b277779c89251f2aafcc7a56db95d264900c9dGloria Wang case DrmInfoEvent.TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT: 20827b277779c89251f2aafcc7a56db95d264900c9dGloria Wang case DrmInfoEvent.TYPE_RIGHTS_INSTALLED: 20927b277779c89251f2aafcc7a56db95d264900c9dGloria Wang case DrmInfoEvent.TYPE_WAIT_FOR_RIGHTS: 21027b277779c89251f2aafcc7a56db95d264900c9dGloria Wang case DrmInfoEvent.TYPE_ACCOUNT_ALREADY_REGISTERED: 21127b277779c89251f2aafcc7a56db95d264900c9dGloria Wang case DrmInfoEvent.TYPE_RIGHTS_REMOVED: { 21227b277779c89251f2aafcc7a56db95d264900c9dGloria Wang info = new DrmInfoEvent(uniqueId, infoType, message); 213dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 214dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 215dc549d60f98d809f626c99de614960409a847054Takeshi Aimi default: 216dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(uniqueId, infoType, message); 217dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 22027b277779c89251f2aafcc7a56db95d264900c9dGloria Wang if (null != mOnInfoListener && null != info) { 22127b277779c89251f2aafcc7a56db95d264900c9dGloria Wang mOnInfoListener.onInfo(DrmManagerClient.this, info); 222d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 223dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnErrorListener && null != error) { 224dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener.onError(DrmManagerClient.this, error); 225dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi default: 228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Log.e(TAG, "Unknown message type " + msg.what); 229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 2350e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Creates a <code>DrmManagerClient</code>. 236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 2370e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param context Context of the caller. 238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 239d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmManagerClient(Context context) { 240dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mContext = context; 241d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 242dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi HandlerThread infoThread = new HandlerThread("DrmManagerClient.InfoHandler"); 243dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi infoThread.start(); 244dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi mInfoHandler = new InfoHandler(infoThread.getLooper()); 245d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 246dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi HandlerThread eventThread = new HandlerThread("DrmManagerClient.EventHandler"); 247dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi eventThread.start(); 248dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi mEventHandler = new EventHandler(eventThread.getLooper()); 249dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // save the unique id 251a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang mUniqueId = _initialize(new WeakReference<DrmManagerClient>(this)); 252c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 253c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 254c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi protected void finalize() { 255c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi _finalize(mUniqueId); 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 2590e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Registers an {@link DrmManagerClient.OnInfoListener} callback, which is invoked when the 2600e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * DRM framework sends status or warning information during registration or rights acquisition. 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 2620e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param infoListener Interface definition for the callback. 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 264dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnInfoListener(OnInfoListener infoListener) { 265dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != infoListener) { 266dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnInfoListener = infoListener; 267dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 268dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 269dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 270dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 2710e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Registers an {@link DrmManagerClient.OnEventListener} callback, which is invoked when the 2720e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * DRM framework sends information about DRM processing. 273dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 2740e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param eventListener Interface definition for the callback. 275dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 276dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnEventListener(OnEventListener eventListener) { 277dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != eventListener) { 278dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnEventListener = eventListener; 279dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 280dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 281dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 282dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 2830e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Registers an {@link DrmManagerClient.OnErrorListener} callback, which is invoked when 2840e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * the DRM framework sends error information. 285dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 2860e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param errorListener Interface definition for the callback. 287dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 288dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnErrorListener(OnErrorListener errorListener) { 289dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != errorListener) { 290dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener = errorListener; 291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 294d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 2950e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves information about all the DRM plug-ins (agents) that are registered with 2960e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * the DRM framework. 297d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 2980e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A <code>String</code> array of DRM plug-in descriptions. 299d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 300d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public String[] getAvailableDrmEngines() { 301d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo[] supportInfos = _getAllSupportInfo(mUniqueId); 302d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ArrayList<String> descriptions = new ArrayList<String>(); 303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 304d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < supportInfos.length; i++) { 305d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi descriptions.add(supportInfos[i].getDescriprition()); 306d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 307d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String[] drmEngines = new String[descriptions.size()]; 309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return descriptions.toArray(drmEngines); 310d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 311d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 312d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 3130e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves constraint information for rights-protected content. 314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 3150e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the content from which you are retrieving DRM constraints. 3160e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param action Action defined in {@link DrmStore.Action}. 3170e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3180e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link android.content.ContentValues} instance that contains 3190e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * key-value pairs representing the constraints. Null in case of failure. 320365ce1db339db53cd5afb118ff867fe940644e45James Dong * The keys are defined in {@link DrmStore.ConstraintsColumns}. 321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public ContentValues getConstraints(String path, int action) { 323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { 324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given usage or path is invalid/null"); 325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getConstraints(mUniqueId, path, action); 327d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 329dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi /** 3300e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves metadata information for rights-protected content. 3310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3320e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the content from which you are retrieving metadata information. 333dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi * 3340e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link android.content.ContentValues} instance that contains 3350e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * key-value pairs representing the metadata. Null in case of failure. 336dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi */ 337dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi public ContentValues getMetadata(String path) { 338dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (null == path || path.equals("")) { 339dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi throw new IllegalArgumentException("Given path is invalid/null"); 340dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 341dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return _getMetadata(mUniqueId, path); 342dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 343dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 3450e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves constraint information for rights-protected content. 3460e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3470e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the content from which you are retrieving DRM constraints. 3480e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param action Action defined in {@link DrmStore.Action}. 349dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 3500e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link android.content.ContentValues} instance that contains 3510e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * key-value pairs representing the constraints. Null in case of failure. 352dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 353dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public ContentValues getConstraints(Uri uri, int action) { 354c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 355c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi throw new IllegalArgumentException("Uri should be non null"); 356c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 357dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getConstraints(convertUriToPath(uri), action); 358dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 359dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 360dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi /** 3610e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves metadata information for rights-protected content. 362dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi * 3630e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the content from which you are retrieving metadata information. 3640e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3650e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link android.content.ContentValues} instance that contains 3660e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * key-value pairs representing the constraints. Null in case of failure. 367dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi */ 368dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi public ContentValues getMetadata(Uri uri) { 369dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (null == uri || Uri.EMPTY == uri) { 370dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi throw new IllegalArgumentException("Uri should be non null"); 371dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 372dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return getMetadata(convertUriToPath(uri)); 373dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 374dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 375dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 3760e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Saves rights to a specified path and associates that path with the content path. 3770e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3780e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * <p class="note"><strong>Note:</strong> For OMA or WM-DRM, <code>rightsPath</code> and 3790e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * <code>contentPath</code> can be null.</p> 3800e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 3810e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param drmRights The {@link DrmRights} to be saved. 3820e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param rightsPath File path where rights will be saved. 3830e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param contentPath File path where content is saved. 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 3850e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 386b01e10c5bc0a29d1b0da96783b6d1582baeb2af2Joe Onorato * 3870e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @throws IOException If the call failed to save rights information at the given 3880e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * <code>rightsPath</code>. 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 390dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int saveRights( 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmRights drmRights, String rightsPath, String contentPath) throws IOException { 392dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == drmRights || !drmRights.isValid()) { 393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmRights or contentPath is not valid"); 394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null != rightsPath && !rightsPath.equals("")) { 396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmUtils.writeToFile(rightsPath, drmRights.getData()); 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 398dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return _saveRights(mUniqueId, drmRights, rightsPath, contentPath); 399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 4020e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Installs a new DRM plug-in (agent) at runtime. 4030e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 4040e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param engineFilePath File path to the plug-in file to be installed. 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * {@hide} 407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 408d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void installDrmEngine(String engineFilePath) { 409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == engineFilePath || engineFilePath.equals("")) { 410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException( 411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "Given engineFilePath: "+ engineFilePath + "is not valid"); 412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 413d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi _installDrmEngine(mUniqueId, engineFilePath); 414d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 4170e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Checks whether the given MIME type or path can be handled. 4180e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 4190e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path of the content to be handled. 4200e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType MIME type of the object to be handled. 421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4220e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return True if the given MIME type or path can be handled; false if they cannot be handled. 423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public boolean canHandle(String path, String mimeType) { 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { 426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimetype should be non null"); 427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _canHandle(mUniqueId, path, mimeType); 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 431d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 4320e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Checks whether the given MIME type or URI can be handled. 4330e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 4340e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the content to be handled. 4350e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType MIME type of the object to be handled 436dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 4370e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return True if the given MIME type or URI can be handled; false if they cannot be handled. 438dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 439dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public boolean canHandle(Uri uri, String mimeType) { 440dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) { 441dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Uri or the mimetype should be non null"); 442dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 443dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return canHandle(convertUriToPath(uri), mimeType); 444dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 445dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 446dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 4470e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Processes the given DRM information based on the information type. 448d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4490e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param drmInfo The {@link DrmInfo} to be processed. 4500e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 451d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 452dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int processDrmInfo(DrmInfo drmInfo) { 453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == drmInfo || !drmInfo.isValid()) { 454d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmInfo is invalid/null"); 455d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 456dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 457dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 458dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_PROCESS_DRM_INFO, drmInfo); 459dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 460dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 461dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 462d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 464d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 4650e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves information for registering, unregistering, or acquiring rights. 466d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4670e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param drmInfoRequest The {@link DrmInfoRequest} that specifies the type of DRM 4680e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * information being retrieved. 4690e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 4700e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link DrmInfo} instance. 471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 472dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi public DrmInfo acquireDrmInfo(DrmInfoRequest drmInfoRequest) { 473d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == drmInfoRequest || !drmInfoRequest.isValid()) { 474d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmInfoRequest is invalid/null"); 475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 476dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return _acquireDrmInfo(mUniqueId, drmInfoRequest); 477dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 478dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 479dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi /** 4800e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Processes a given {@link DrmInfoRequest} and returns the rights information asynchronously. 4810e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber *<p> 4820e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * This is a utility method that consists of an 4830e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link #acquireDrmInfo(DrmInfoRequest) acquireDrmInfo()} and a 4840e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link #processDrmInfo(DrmInfo) processDrmInfo()} method call. This utility method can be 4850e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * used only if the selected DRM plug-in (agent) supports this sequence of calls. Some DRM 4860e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * agents, such as OMA, do not support this utility method, in which case an application must 4870e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * invoke {@link #acquireDrmInfo(DrmInfoRequest) acquireDrmInfo()} and 4880e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link #processDrmInfo(DrmInfo) processDrmInfo()} separately. 489dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi * 4900e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param drmInfoRequest The {@link DrmInfoRequest} used to acquire the rights. 4910e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 492dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi */ 493dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi public int acquireRights(DrmInfoRequest drmInfoRequest) { 494dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi DrmInfo drmInfo = acquireDrmInfo(drmInfoRequest); 4954ef690a38b1dfdff3ae34e260435edcec37e520fGloria Wang if (null == drmInfo) { 4964ef690a38b1dfdff3ae34e260435edcec37e520fGloria Wang return ERROR_UNKNOWN; 4974ef690a38b1dfdff3ae34e260435edcec37e520fGloria Wang } 498dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return processDrmInfo(drmInfo); 499d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 500d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 501d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 5020e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the type of rights-protected object (for example, content object, rights 5030e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * object, and so on) using the specified path or MIME type. At least one parameter must 5040e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * be specified to retrieve the DRM object type. 505d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 5060e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the content or null. 5070e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType MIME type of the content or null. 5080e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5090e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> that corresponds to a {@link DrmStore.DrmObjectType}. 510d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 511d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int getDrmObjectType(String path, String mimeType) { 512d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { 513d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimetype should be non null"); 514d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 515d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getDrmObjectType(mUniqueId, path, mimeType); 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 517d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 518d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 5190e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the type of rights-protected object (for example, content object, rights 5200e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * object, and so on) using the specified URI or MIME type. At least one parameter must 5210e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * be specified to retrieve the DRM object type. 522dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 5230e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the content or null. 5240e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType MIME type of the content or null. 5250e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5260e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> that corresponds to a {@link DrmStore.DrmObjectType}. 527dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 528dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int getDrmObjectType(Uri uri, String mimeType) { 529dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) { 530dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Uri or the mimetype should be non null"); 531dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 532dc549d60f98d809f626c99de614960409a847054Takeshi Aimi String path = ""; 533dc549d60f98d809f626c99de614960409a847054Takeshi Aimi try { 534dc549d60f98d809f626c99de614960409a847054Takeshi Aimi path = convertUriToPath(uri); 535dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } catch (Exception e) { 536dc549d60f98d809f626c99de614960409a847054Takeshi Aimi // Even uri is invalid the mimetype shall be valid, so allow to proceed further. 537dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Log.w(TAG, "Given Uri could not be found in media store"); 538dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 539dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmObjectType(path, mimeType); 540dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 541dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 542dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 5430e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the MIME type embedded in the original content. 5440e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5450e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the rights-protected content. 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 5470e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return The MIME type of the original content, such as <code>video/mpeg</code>. 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public String getOriginalMimeType(String path) { 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("")) { 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path should be non null"); 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 553d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getOriginalMimeType(mUniqueId, path); 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 5570e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Retrieves the MIME type embedded in the original content. 558dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 5590e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI of the rights-protected content. 5600e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5610e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return MIME type of the original content, such as <code>video/mpeg</code>. 562dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 563dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public String getOriginalMimeType(Uri uri) { 564dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 565dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 566dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 567dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getOriginalMimeType(convertUriToPath(uri)); 568dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 569dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 570dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 5710e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Checks whether the given content has valid rights. 5720e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5730e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the rights-protected content. 574d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 5750e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> representing the {@link DrmStore.RightsStatus} of the content. 576d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 577d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int checkRightsStatus(String path) { 578d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return checkRightsStatus(path, DrmStore.Action.DEFAULT); 579d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 580d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 581d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 5820e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Check whether the given content has valid rights. 5830e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 5840e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI of the rights-protected content. 585dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 5860e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> representing the {@link DrmStore.RightsStatus} of the content. 587dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 588dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int checkRightsStatus(Uri uri) { 589dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 590dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 591dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 592dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return checkRightsStatus(convertUriToPath(uri)); 593dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 594dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 595dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 5960e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Checks whether the given rights-protected content has valid rights for the specified 5970e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link DrmStore.Action}. 598d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 5990e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the rights-protected content. 6000e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param action The {@link DrmStore.Action} to perform. 6010e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6020e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> representing the {@link DrmStore.RightsStatus} of the content. 603d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 604d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int checkRightsStatus(String path, int action) { 605d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { 606d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path or action is not valid"); 607d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 608d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _checkRightsStatus(mUniqueId, path, action); 609d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 610d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 611d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 6120e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Checks whether the given rights-protected content has valid rights for the specified 6130e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link DrmStore.Action}. 6140e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6150e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the rights-protected content. 6160e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param action The {@link DrmStore.Action} to perform. 617dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 6180e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return An <code>int</code> representing the {@link DrmStore.RightsStatus} of the content. 619dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 620dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int checkRightsStatus(Uri uri, int action) { 621dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 622dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 623dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 624dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return checkRightsStatus(convertUriToPath(uri), action); 625dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 626dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 627dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 6280e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Removes the rights associated with the given rights-protected content. 629d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 6300e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param path Path to the rights-protected content. 6310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6320e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 633d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 634dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeRights(String path) { 635d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("")) { 636d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path should be non null"); 637d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 638dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return _removeRights(mUniqueId, path); 639dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 640dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 641dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 6420e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Removes the rights associated with the given rights-protected content. 6430e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6440e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param uri URI for the rights-protected content. 645dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 6460e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 647dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 648dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeRights(Uri uri) { 649dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 650dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 651dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 652dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return removeRights(convertUriToPath(uri)); 653d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 654d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 655d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 6560e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Removes all the rights information of every DRM plug-in (agent) associated with 6570e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * the DRM framework. Will be used during a master reset. 658dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 6590e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return ERROR_NONE for success; ERROR_UNKNOWN for failure. 660d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 661dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeAllRights() { 662dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 663dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 664dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_REMOVE_ALL_RIGHTS); 665dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 666dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 667dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 668d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 669d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 670d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 6710e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Initiates a new conversion session. An application must initiate a conversion session 6720e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * with this method each time it downloads a rights-protected file that needs to be converted. 6730e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber *<p> 6740e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * This method applies only to forward-locking (copy protection) DRM schemes. 6750e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6760e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param mimeType MIME type of the input data packet. 677d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 6780e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A convert ID that is used used to maintain the conversion session. 679d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 680d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int openConvertSession(String mimeType) { 681d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == mimeType || mimeType.equals("")) { 682d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimeType should be non null"); 683d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 684d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _openConvertSession(mUniqueId, mimeType); 685d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 686d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 687d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 6880e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Converts the input data (content) that is part of a rights-protected file. The converted 6890e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * data and status is returned in a {@link DrmConvertedStatus} object. This method should be 6900e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * called each time there is a new block of data received by the application. 691d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 6920e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param convertId Handle for the conversion session. 6930e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param inputData Input data that needs to be converted. 6940e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 6950e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link DrmConvertedStatus} object that contains the status of the data conversion, 6960e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * the converted data, and offset for the header and body signature. An application can 6970e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * ignore the offset because it is only relevant to the 6980e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * {@link #closeConvertSession closeConvertSession()} method. 699d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 700d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmConvertedStatus convertData(int convertId, byte[] inputData) { 701d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == inputData || 0 >= inputData.length) { 702d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given inputData should be non null"); 703d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 704d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _convertData(mUniqueId, convertId, inputData); 705d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 706d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 707d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 7080e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * Informs the DRM plug-in (agent) that there is no more data to convert or that an error 7090e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * has occurred. Upon successful conversion of the data, the DRM agent will provide an offset 7100e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * value indicating where the header and body signature should be added. Appending the 7110e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * signature is necessary to protect the integrity of the converted file. 7120e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * 7130e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @param convertId Handle for the conversion session. 714d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 7150e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * @return A {@link DrmConvertedStatus} object that contains the status of the data conversion, 7160e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * the converted data, and the offset for the header and body signature. 717d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 718d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmConvertedStatus closeConvertSession(int convertId) { 719d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _closeConvertSession(mUniqueId, convertId); 720d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 721d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 722dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private int getEventType(int infoType) { 723dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int eventType = -1; 724dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 725dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 726dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_REGISTRATION_INFO: 727dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: 728dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: 729c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi eventType = DrmEvent.TYPE_DRM_INFO_PROCESSED; 730dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 731dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 732dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return eventType; 733dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 734dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 735dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private int getErrorType(int infoType) { 736dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int error = -1; 737dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 738dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 739dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_REGISTRATION_INFO: 740dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: 741dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: 742c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi error = DrmErrorEvent.TYPE_PROCESS_DRM_INFO_FAILED; 743dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 744dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 745dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return error; 746dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 747dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 748dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 749dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * This method expects uri in the following format 750dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * content://media/<table_name>/<row_index> (or) 751dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * file://sdcard/test.mp4 752b8b6a9a8d405d2a3f1d593ebaf7f07574dd586b9Gloria Wang * http://test.com/test.mp4 753dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 754dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Here <table_name> shall be "video" or "audio" or "images" 755dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * <row_index> the index of the content in given table 756dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 757dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private String convertUriToPath(Uri uri) { 758c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi String path = null; 759f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (null != uri) { 760f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi String scheme = uri.getScheme(); 761f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (null == scheme || scheme.equals("") || 762f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi scheme.equals(ContentResolver.SCHEME_FILE)) { 763f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi path = uri.getPath(); 764b8b6a9a8d405d2a3f1d593ebaf7f07574dd586b9Gloria Wang 765b8b6a9a8d405d2a3f1d593ebaf7f07574dd586b9Gloria Wang } else if (scheme.equals("http")) { 766b8b6a9a8d405d2a3f1d593ebaf7f07574dd586b9Gloria Wang path = uri.toString(); 767b8b6a9a8d405d2a3f1d593ebaf7f07574dd586b9Gloria Wang 768f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } else if (scheme.equals(ContentResolver.SCHEME_CONTENT)) { 769f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi String[] projection = new String[] {MediaStore.MediaColumns.DATA}; 770f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi Cursor cursor = null; 771f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi try { 772f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi cursor = mContext.getContentResolver().query(uri, projection, null, 773f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi null, null); 774f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (null == cursor || 0 == cursor.getCount() || !cursor.moveToFirst()) { 775f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi throw new IllegalArgumentException("Given Uri could not be found" + 776f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi " in media store"); 777f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } 778f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); 779f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi path = cursor.getString(pathIndex); 780f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } catch (SQLiteException e) { 781f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi throw new IllegalArgumentException("Given Uri is not formatted in a way " + 782f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi "so that it can be found in media store."); 783f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } finally { 784f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (null != cursor) { 785f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi cursor.close(); 786f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } 787f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } 788f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } else { 789f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi throw new IllegalArgumentException("Given Uri scheme is not supported"); 790c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 791dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 792dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return path; 793dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 794dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 795d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // private native interfaces 796a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang private native int _initialize(Object weak_this); 797d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 798c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi private native void _finalize(int uniqueId); 799d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 800d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native void _installDrmEngine(int uniqueId, String engineFilepath); 801d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 802d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native ContentValues _getConstraints(int uniqueId, String path, int usage); 803d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 804dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi private native ContentValues _getMetadata(int uniqueId, String path); 805dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 806d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native boolean _canHandle(int uniqueId, String path, String mimeType); 807d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 808d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmInfoStatus _processDrmInfo(int uniqueId, DrmInfo drmInfo); 809d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 810d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmInfo _acquireDrmInfo(int uniqueId, DrmInfoRequest drmInfoRequest); 811d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 812dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _saveRights( 813d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DrmRights drmRights, String rightsPath, String contentPath); 814d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 815d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _getDrmObjectType(int uniqueId, String path, String mimeType); 816d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 817d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native String _getOriginalMimeType(int uniqueId, String path); 818d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 819d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _checkRightsStatus(int uniqueId, String path, int action); 820d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 821dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _removeRights(int uniqueId, String path); 822d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 823dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _removeAllRights(int uniqueId); 824d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 825d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _openConvertSession(int uniqueId, String mimeType); 826d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 827dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native DrmConvertedStatus _convertData( 828dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int uniqueId, int convertId, byte[] inputData); 829d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 830d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmConvertedStatus _closeConvertSession(int uniqueId, int convertId); 831d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 832d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmSupportInfo[] _getAllSupportInfo(int uniqueId); 833d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 834d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 835