DrmManagerClient.java revision dc549d60f98d809f626c99de614960409a847054
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 android.content.ContentValues; 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.content.Context; 21dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.database.Cursor; 22dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.net.Uri; 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Handler; 24dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.os.HandlerThread; 25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Looper; 26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Message; 27dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport android.provider.MediaStore; 28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.util.Log; 29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.io.IOException; 31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.lang.ref.WeakReference; 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.ArrayList; 33dc549d60f98d809f626c99de614960409a847054Takeshi Aimiimport java.util.HashMap; 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Interface of DRM Framework. 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Java application will instantiate this class 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * to access DRM agent through DRM Framework. 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmManagerClient { 42dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 43dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Constant field signifies the success or no error occurred 44dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 45dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static final int ERROR_NONE = 0; 46dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 47dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Constant field signifies that error occurred and the reason is not known 48dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 49dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static final int ERROR_UNKNOWN = -2000; 50dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 51dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final String TAG = "DrmManagerClient"; 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static { 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // Load the respective library 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi System.loadLibrary("drmframework_jni"); 56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Interface definition of a callback to be invoked to communicate 60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * some info and/or warning about DrmManagerClient. 61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public interface OnInfoListener { 63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Called to indicate an info or a warning. 65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param client DrmManagerClient instance 67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param event instance which wraps reason and necessary information 68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void onInfo(DrmManagerClient client, DrmInfoEvent event); 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 72dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 73dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Interface definition of a callback to be invoked to communicate 74dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * the result of time consuming APIs asynchronously 75dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 76dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public interface OnEventListener { 77dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 78dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Called to indicate the result of asynchronous APIs. 79dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 80dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param client DrmManagerClient instance 81dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param event instance which wraps type and message 82dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param attributes resultant values in key and value pair. 83dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 84dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public void onEvent(DrmManagerClient client, DrmEvent event, 85dc549d60f98d809f626c99de614960409a847054Takeshi Aimi HashMap<String, Object> attributes); 86dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 87dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 88dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 89dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Interface definition of a callback to be invoked to communicate 90dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * the error occurred 91dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 92dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public interface OnErrorListener { 93dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 94dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Called to indicate the error occurred. 95dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 96dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param client DrmManagerClient instance 97dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param event instance which wraps error type and message 98dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 99dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public void onError(DrmManagerClient client, DrmErrorEvent event); 100dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 101dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 102dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int STATE_UNINITIALIZED = 0; 103dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int STATE_INITIALIZED = 1; 104dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 105dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int ACTION_INITIALIZE = 1000; 106dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int ACTION_FINALIZE = 1001; 107dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int ACTION_REMOVE_ALL_RIGHTS = 1002; 108dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int ACTION_ACQUIRE_DRM_INFO = 1003; 109dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private static final int ACTION_PROCESS_DRM_INFO = 1004; 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int mUniqueId; 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int mNativeContext; 113dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private Context mContext; 114dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private InfoHandler mInfoHandler; 115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private EventHandler mEventHandler; 116d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private OnInfoListener mOnInfoListener; 117dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private OnEventListener mOnEventListener; 118dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private OnErrorListener mOnErrorListener; 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int mCurrentState = STATE_UNINITIALIZED; 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 121dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private class EventHandler extends Handler { 122dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 123dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public EventHandler(Looper looper) { 124dc549d60f98d809f626c99de614960409a847054Takeshi Aimi super(looper); 125dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 126dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 127dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public void handleMessage(Message msg) { 128dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmEvent event = null; 129dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent error = null; 130dc549d60f98d809f626c99de614960409a847054Takeshi Aimi HashMap<String, Object> attributes = new HashMap<String, Object>(); 131dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 132dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch(msg.what) { 133dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_INITIALIZE: { 134dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (ERROR_NONE == _loadPlugIns(mUniqueId, msg.obj)) { 135dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mCurrentState = STATE_INITIALIZED; 136dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, DrmEvent.TYPE_INITIALIZED, null); 137dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 138dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 139dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent.TYPE_INITIALIZE_FAILED, null); 140dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 141dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 142dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 143dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_ACQUIRE_DRM_INFO: { 144dc549d60f98d809f626c99de614960409a847054Takeshi Aimi final DrmInfoRequest request = (DrmInfoRequest) msg.obj; 145dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmInfo drmInfo = _acquireDrmInfo(mUniqueId, request); 146dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != drmInfo) { 147dc549d60f98d809f626c99de614960409a847054Takeshi Aimi attributes.put(DrmEvent.DRM_INFO_OBJECT, drmInfo); 148dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, DrmEvent.TYPE_DRM_INFO_ACQUIRED, null); 149dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 150dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 151dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent.TYPE_DRM_INFO_ACQUISITION_FAILED, null); 152dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 153dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 154dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 155dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_PROCESS_DRM_INFO: { 156dc549d60f98d809f626c99de614960409a847054Takeshi Aimi final DrmInfo drmInfo = (DrmInfo) msg.obj; 157dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmInfoStatus status = _processDrmInfo(mUniqueId, drmInfo); 158dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != status && DrmInfoStatus.STATUS_OK == status.statusCode) { 159dc549d60f98d809f626c99de614960409a847054Takeshi Aimi attributes.put(DrmEvent.DRM_INFO_STATUS_OBJECT, status); 160dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, getEventType(drmInfo.getInfoType()), null); 161dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 162dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 163dc549d60f98d809f626c99de614960409a847054Takeshi Aimi getErrorType(drmInfo.getInfoType()), null); 164dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 165dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 166dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 167dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_REMOVE_ALL_RIGHTS: { 168dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (ERROR_NONE == _removeAllRights(mUniqueId)) { 169dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, DrmEvent.TYPE_ALL_RIGHTS_REMOVED, null); 170dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 171dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 172dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent.TYPE_REMOVE_ALL_RIGHTS_FAILED, null); 173dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 174dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 175dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 176dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case ACTION_FINALIZE: { 177dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (ERROR_NONE == _unloadPlugIns(mUniqueId)) { 178dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mCurrentState = STATE_UNINITIALIZED; 179dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmEvent(mUniqueId, DrmEvent.TYPE_FINALIZED, null); 180dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 181dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(mUniqueId, 182dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent.TYPE_FINALIZE_FAILED, null); 183dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 184dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 185dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 186dc549d60f98d809f626c99de614960409a847054Takeshi Aimi default: 187dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Log.e(TAG, "Unknown message type " + msg.what); 188dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return; 189dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 190dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnEventListener && null != event) { 191dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnEventListener.onEvent(DrmManagerClient.this, event, attributes); 192dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 193dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnErrorListener && null != error) { 194dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener.onError(DrmManagerClient.this, error); 195dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 196dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 197dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 198dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * {@hide} 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 202dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public static void notify( 203dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Object thisReference, int uniqueId, int infoType, String message) { 204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get(); 205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 206dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != instance && null != instance.mInfoHandler) { 207dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message m = instance.mInfoHandler.obtainMessage( 208dc549d60f98d809f626c99de614960409a847054Takeshi Aimi InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message); 209dc549d60f98d809f626c99de614960409a847054Takeshi Aimi instance.mInfoHandler.sendMessage(m); 210d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 213dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private class InfoHandler extends Handler { 214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public static final int INFO_EVENT_TYPE = 1; 215d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 216dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public InfoHandler(Looper looper) { 217d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi super(looper); 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 220d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void handleMessage(Message msg) { 221dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmInfoEvent event = null; 222dc549d60f98d809f626c99de614960409a847054Takeshi Aimi DrmErrorEvent error = null; 223d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 224d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi switch (msg.what) { 225dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case InfoHandler.INFO_EVENT_TYPE: 226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId = msg.arg1; 227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int infoType = msg.arg2; 228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String message = msg.obj.toString(); 229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 230dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 231dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoEvent.TYPE_REMOVE_RIGHTS: { 232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi try { 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmUtils.removeFile(message); 234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } catch (IOException e) { 235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi e.printStackTrace(); 236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 237dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmInfoEvent(uniqueId, infoType, message); 238dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 239dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 240dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoEvent.TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT: { 241dc549d60f98d809f626c99de614960409a847054Takeshi Aimi event = new DrmInfoEvent(uniqueId, infoType, message); 242dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 243dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 244dc549d60f98d809f626c99de614960409a847054Takeshi Aimi default: 245dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = new DrmErrorEvent(uniqueId, infoType, message); 246dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 248d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 249dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnInfoListener && null != event) { 250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mOnInfoListener.onInfo(DrmManagerClient.this, event); 251d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 252dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mOnErrorListener && null != error) { 253dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener.onError(DrmManagerClient.this, error); 254dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi default: 257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Log.e(TAG, "Unknown message type " + msg.what); 258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return; 259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 260d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 264d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * To instantiate DrmManagerClient 265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param context context of the caller 267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmManagerClient(Context context) { 269dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mContext = context; 270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Looper looper; 271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null != (looper = Looper.myLooper())) { 273dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mInfoHandler = new InfoHandler(looper); 274d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else if (null != (looper = Looper.getMainLooper())) { 275dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mInfoHandler = new InfoHandler(looper); 276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 277dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mInfoHandler = null; 278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 280dc549d60f98d809f626c99de614960409a847054Takeshi Aimi HandlerThread thread = new HandlerThread("DrmManagerClient.EventHandler"); 281dc549d60f98d809f626c99de614960409a847054Takeshi Aimi thread.start(); 282dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mEventHandler = new EventHandler(thread.getLooper()); 283dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // save the unique id 285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mUniqueId = hashCode(); 286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Register a callback to be invoked when the caller required to receive 290dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * supplementary information. 291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param infoListener 293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 294dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnInfoListener(OnInfoListener infoListener) { 295dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != infoListener) { 296dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnInfoListener = infoListener; 297dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 298dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 299dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 300dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 301dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Register a callback to be invoked when the caller required to receive 302dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * the result of asynchronous APIs. 303dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 304dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param eventListener 305dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 306dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnEventListener(OnEventListener eventListener) { 307dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != eventListener) { 308dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnEventListener = eventListener; 309dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 310dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 311dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 312dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 313dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Register a callback to be invoked when the caller required to receive 314dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * error result of asynchronous APIs. 315dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 316dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param errorListener 317dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 318dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public synchronized void setOnErrorListener(OnErrorListener errorListener) { 319dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != errorListener) { 320dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mOnErrorListener = errorListener; 321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Initializes DrmFramework, which loads all available plug-ins 326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * in the default plug-in directory path 327d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 328dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 329dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 330dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 332dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int loadPlugIns() { 333dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 334dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (STATE_UNINITIALIZED == getState()) { 335dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 336dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage( 337dc549d60f98d809f626c99de614960409a847054Takeshi Aimi ACTION_INITIALIZE, new WeakReference<DrmManagerClient>(this)); 338dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 339dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 340dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 341dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = ERROR_NONE; 342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 343dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Finalize DrmFramework, which release resources associated with each plug-in 348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * and unload all plug-ins. 349dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 350dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 351dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 352dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 354dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int unloadPlugIns() { 355dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 356dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (STATE_INITIALIZED == getState()) { 357dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 358dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_FINALIZE); 359dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 360dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 361dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else { 362dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = ERROR_NONE; 363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 364dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Retrieves informations about all the plug-ins registered with DrmFramework. 369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Array of DrmEngine plug-in strings 371d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public String[] getAvailableDrmEngines() { 373dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (STATE_UNINITIALIZED == getState()) { 374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo[] supportInfos = _getAllSupportInfo(mUniqueId); 378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ArrayList<String> descriptions = new ArrayList<String>(); 379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 380d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < supportInfos.length; i++) { 381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi descriptions.add(supportInfos[i].getDescriprition()); 382d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 383d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String[] drmEngines = new String[descriptions.size()]; 385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return descriptions.toArray(drmEngines); 386d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 387d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Get constraints information evaluated from DRM content 390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Content path from where DRM constraints would be retrieved. 392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param action Actions defined in {@link DrmStore.Action} 393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return ContentValues instance in which constraints key-value pairs are embedded 394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * or null in case of failure 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public ContentValues getConstraints(String path, int action) { 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { 398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given usage or path is invalid/null"); 399dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 402d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getConstraints(mUniqueId, path, action); 403d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 404d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 406dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Get constraints information evaluated from DRM content 407dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 408dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The Content URI of the data 409dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param action Actions defined in {@link DrmStore.Action} 410dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return ContentValues instance in which constraints key-value pairs are embedded 411dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * or null in case of failure 412dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 413dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public ContentValues getConstraints(Uri uri, int action) { 414dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getConstraints(convertUriToPath(uri), action); 415dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 416dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 417dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Save DRM rights to specified rights path 419d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * and make association with content path. 420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 421b01e10c5bc0a29d1b0da96783b6d1582baeb2af2Joe Onorato * <p class="note">In case of OMA or WM-DRM, rightsPath and contentPath could be null.</p> 422b01e10c5bc0a29d1b0da96783b6d1582baeb2af2Joe Onorato * 423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param drmRights DrmRights to be saved 424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param rightsPath File path where rights to be saved 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param contentPath File path where content was saved 426dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 427dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 428dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @throws IOException if failed to save rights information in the given path 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 431dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int saveRights( 432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmRights drmRights, String rightsPath, String contentPath) throws IOException { 433dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == drmRights || !drmRights.isValid()) { 434d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmRights or contentPath is not valid"); 435dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 437d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 438d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null != rightsPath && !rightsPath.equals("")) { 439d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmUtils.writeToFile(rightsPath, drmRights.getData()); 440d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 441dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return _saveRights(mUniqueId, drmRights, rightsPath, contentPath); 442d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 443d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 444d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 445d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Install new DRM Engine Plug-in at the runtime 446d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 447d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param engineFilePath Path of the plug-in file to be installed 448d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * {@hide} 449d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 450d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public void installDrmEngine(String engineFilePath) { 451d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == engineFilePath || engineFilePath.equals("")) { 452d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException( 453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi "Given engineFilePath: "+ engineFilePath + "is not valid"); 454dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 455d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 456d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 457d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi _installDrmEngine(mUniqueId, engineFilePath); 458d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 459d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 460d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 461d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Check whether the given mimetype or path can be handled. 462d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the content to be handled 464d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param mimeType Mimetype of the object to be handled 465d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return 466dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * true - if the given mimeType or path can be handled 467dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * false - cannot be handled. false will be return in case 468b01e10c5bc0a29d1b0da96783b6d1582baeb2af2Joe Onorato * the state is uninitialized 469d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 470d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public boolean canHandle(String path, String mimeType) { 471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { 472d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimetype should be non null"); 473dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 474d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 476d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _canHandle(mUniqueId, path, mimeType); 477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 478d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 479d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 480dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Check whether the given mimetype or uri can be handled. 481dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 482dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 483dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param mimeType Mimetype of the object to be handled 484dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 485dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * true - if the given mimeType or path can be handled 486dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * false - cannot be handled. false will be return in case 487dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * the state is uninitialized 488dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 489dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public boolean canHandle(Uri uri, String mimeType) { 490dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) { 491dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Uri or the mimetype should be non null"); 492dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 493dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return canHandle(convertUriToPath(uri), mimeType); 494dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 495dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 496dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 497d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Executes given drm information based on its type 498d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 499d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param drmInfo Information needs to be processed 500dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 501dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 502dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 503d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 504dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int processDrmInfo(DrmInfo drmInfo) { 505d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == drmInfo || !drmInfo.isValid()) { 506d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmInfo is invalid/null"); 507dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 508d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 509d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 510dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 511dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 512dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_PROCESS_DRM_INFO, drmInfo); 513dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 514dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 515dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 517d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 518d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 519d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Retrieves necessary information for register, unregister or rights acquisition. 520d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 521d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param drmInfoRequest Request information to retrieve drmInfo 522dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 523dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 524dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 525d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 526dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int acquireDrmInfo(DrmInfoRequest drmInfoRequest) { 527d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == drmInfoRequest || !drmInfoRequest.isValid()) { 528d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given drmInfoRequest is invalid/null"); 529dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 530d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 531d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 532dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 533dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 534dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_ACQUIRE_DRM_INFO, drmInfoRequest); 535dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 536dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 537dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 538d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 539d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 540d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 541d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Retrieves the type of the protected object (content, rights, etc..) 542d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * using specified path or mimetype. At least one parameter should be non null 543d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * to retrieve DRM object type 544d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 545d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the content or null. 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param mimeType Mimetype of the content or null. 547d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Type of the DRM content. 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @see DrmStore.DrmObjectType 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int getDrmObjectType(String path, String mimeType) { 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) { 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimetype should be non null"); 553dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getDrmObjectType(mUniqueId, path, mimeType); 557d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 558d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 559d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 560dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Retrieves the type of the protected object (content, rights, etc..) 561dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * using specified uri or mimetype. At least one parameter should be non null 562dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * to retrieve DRM object type 563dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 564dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 565dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param mimeType Mimetype of the content or null. 566dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return Type of the DRM content. 567dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @see DrmStore.DrmObjectType 568dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 569dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int getDrmObjectType(Uri uri, String mimeType) { 570dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) { 571dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Uri or the mimetype should be non null"); 572dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 573dc549d60f98d809f626c99de614960409a847054Takeshi Aimi String path = ""; 574dc549d60f98d809f626c99de614960409a847054Takeshi Aimi try { 575dc549d60f98d809f626c99de614960409a847054Takeshi Aimi path = convertUriToPath(uri); 576dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } catch (Exception e) { 577dc549d60f98d809f626c99de614960409a847054Takeshi Aimi // Even uri is invalid the mimetype shall be valid, so allow to proceed further. 578dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Log.w(TAG, "Given Uri could not be found in media store"); 579dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 580dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getDrmObjectType(path, mimeType); 581dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 582dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 583dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 584d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Retrieves the mime type embedded inside the original content 585d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 586d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the protected content 587d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Mimetype of the original content, such as "video/mpeg" 588d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 589d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public String getOriginalMimeType(String path) { 590d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("")) { 591d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path should be non null"); 592dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 593d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 594d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 595d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _getOriginalMimeType(mUniqueId, path); 596d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 597d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 598d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 599dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Retrieves the mime type embedded inside the original content 600dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 601dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 602dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return Mimetype of the original content, such as "video/mpeg" 603dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 604dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public String getOriginalMimeType(Uri uri) { 605dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 606dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 607dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 608dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return getOriginalMimeType(convertUriToPath(uri)); 609dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 610dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 611dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 612d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Check whether the given content has valid rights or not 613d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 614d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the protected content 615d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Status of the rights for the protected content 616d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @see DrmStore.RightsStatus 617d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 618d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int checkRightsStatus(String path) { 619d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return checkRightsStatus(path, DrmStore.Action.DEFAULT); 620d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 621d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 622d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 623dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Check whether the given content has valid rights or not 624dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 625dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 626dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return Status of the rights for the protected content 627dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @see DrmStore.RightsStatus 628dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 629dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int checkRightsStatus(Uri uri) { 630dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 631dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 632dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 633dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return checkRightsStatus(convertUriToPath(uri)); 634dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 635dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 636dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 637d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Check whether the given content has valid rights or not for specified action. 638d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 639d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the protected content 640d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param action Action to perform 641d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Status of the rights for the protected content 642d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @see DrmStore.RightsStatus 643d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 644d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int checkRightsStatus(String path, int action) { 645d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) { 646d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path or action is not valid"); 647dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 648d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 649d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 650d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _checkRightsStatus(mUniqueId, path, action); 651d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 652d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 653d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 654dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Check whether the given content has valid rights or not for specified action. 655dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 656dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 657dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param action Action to perform 658dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return Status of the rights for the protected content 659dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @see DrmStore.RightsStatus 660dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 661dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int checkRightsStatus(Uri uri, int action) { 662dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 663dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 664dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 665dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return checkRightsStatus(convertUriToPath(uri), action); 666dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 667dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 668dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 669d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Removes the rights associated with the given protected content 670d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 671d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param path Path of the protected content 672dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 673dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 674dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 675d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 676dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeRights(String path) { 677d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == path || path.equals("")) { 678d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given path should be non null"); 679dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 680d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 681d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 682dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return _removeRights(mUniqueId, path); 683dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 684dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 685dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 686dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Removes the rights associated with the given protected content 687dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 688dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @param uri The content URI of the data 689dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 690dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 691dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 692dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 693dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeRights(Uri uri) { 694dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == uri || Uri.EMPTY == uri) { 695dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given uri is not valid"); 696dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 697dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return removeRights(convertUriToPath(uri)); 698d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 699d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 700d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 701d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Removes all the rights information of every plug-in associated with 702d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * DRM framework. Will be used in master reset 703dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 704dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * @return 705dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_NONE for success 706dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * ERROR_UNKNOWN for failure 707d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 708dc549d60f98d809f626c99de614960409a847054Takeshi Aimi public int removeAllRights() { 709dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (STATE_UNINITIALIZED == getState()) { 710d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 711d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 712dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int result = ERROR_UNKNOWN; 713dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null != mEventHandler) { 714dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Message msg = mEventHandler.obtainMessage(ACTION_REMOVE_ALL_RIGHTS); 715dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result; 716dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 717dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 718d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 719d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 720d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 721d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * This API is for Forward Lock based DRM scheme. 722d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Each time the application tries to download a new DRM file 723d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * which needs to be converted, then the application has to 724d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * begin with calling this API. 725d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 726d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param mimeType Description/MIME type of the input data packet 727d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return convert ID which will be used for maintaining convert session. 728d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 729d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public int openConvertSession(String mimeType) { 730d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == mimeType || mimeType.equals("")) { 731d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Path or the mimeType should be non null"); 732dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 733d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 734d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 735d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _openConvertSession(mUniqueId, mimeType); 736d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 737d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 738d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 739d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Accepts and converts the input data which is part of DRM file. 740d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * The resultant converted data and the status is returned in the DrmConvertedInfo 741d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * object. This method will be called each time there are new block 742d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * of data received by the application. 743d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 744d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param convertId Handle for the convert session 745d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param inputData Input Data which need to be converted 746d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Return object contains the status of the data conversion, 747d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * the output converted data and offset. In this case the 748d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * application will ignore the offset information. 749d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 750d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmConvertedStatus convertData(int convertId, byte[] inputData) { 751d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (null == inputData || 0 >= inputData.length) { 752d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalArgumentException("Given inputData should be non null"); 753dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } else if (STATE_UNINITIALIZED == getState()) { 754d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 755d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 756d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _convertData(mUniqueId, convertId, inputData); 757d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 758d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 759d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /** 760d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Informs the Drm Agent when there is no more data which need to be converted 761d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * or when an error occurs. Upon successful conversion of the complete data, 762d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * the agent will inform that where the header and body signature 763d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * should be added. This signature appending is needed to integrity 764d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * protect the converted file. 765d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 766d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @param convertId Handle for the convert session 767d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * @return Return object contains the status of the data conversion, 768d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * the header and body signature data. It also informs 769d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * the application on which offset these signature data should be appended. 770d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 771d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi public DrmConvertedStatus closeConvertSession(int convertId) { 772dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (STATE_UNINITIALIZED == getState()) { 773d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi throw new IllegalStateException("Not Initialized yet"); 774d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 775d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return _closeConvertSession(mUniqueId, convertId); 776d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 777d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 778d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private int getState() { 779d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return mCurrentState; 780d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 781d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 782dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private int getEventType(int infoType) { 783dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int eventType = -1; 784dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 785dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 786dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_REGISTRATION_INFO: 787dc549d60f98d809f626c99de614960409a847054Takeshi Aimi eventType = DrmEvent.TYPE_REGISTERED; 788dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 789dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: 790dc549d60f98d809f626c99de614960409a847054Takeshi Aimi eventType = DrmEvent.TYPE_UNREGISTERED; 791dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 792dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: 793dc549d60f98d809f626c99de614960409a847054Takeshi Aimi eventType = DrmEvent.TYPE_RIGHTS_ACQUIRED; 794dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 795dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 796dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return eventType; 797dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 798dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 799dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private int getErrorType(int infoType) { 800dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int error = -1; 801dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 802dc549d60f98d809f626c99de614960409a847054Takeshi Aimi switch (infoType) { 803dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_REGISTRATION_INFO: 804dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = DrmErrorEvent.TYPE_REGISTRATION_FAILED; 805dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 806dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_UNREGISTRATION_INFO: 807dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = DrmErrorEvent.TYPE_UNREGISTRATION_FAILED; 808dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 809dc549d60f98d809f626c99de614960409a847054Takeshi Aimi case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO: 810dc549d60f98d809f626c99de614960409a847054Takeshi Aimi error = DrmErrorEvent.TYPE_RIGHTS_ACQUISITION_FAILED; 811dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 812dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 813dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return error; 814dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 815dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 816dc549d60f98d809f626c99de614960409a847054Takeshi Aimi /** 817dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * This method expects uri in the following format 818dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * content://media/<table_name>/<row_index> (or) 819dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * file://sdcard/test.mp4 820dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * 821dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * Here <table_name> shall be "video" or "audio" or "images" 822dc549d60f98d809f626c99de614960409a847054Takeshi Aimi * <row_index> the index of the content in given table 823dc549d60f98d809f626c99de614960409a847054Takeshi Aimi */ 824dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private String convertUriToPath(Uri uri) { 825dc549d60f98d809f626c99de614960409a847054Takeshi Aimi String scheme = uri.getScheme(); 826dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == scheme || scheme.equals("file")) { 827dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return uri.getPath(); 828dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 829dc549d60f98d809f626c99de614960409a847054Takeshi Aimi String[] projection = new String[] {MediaStore.MediaColumns.DATA}; 830dc549d60f98d809f626c99de614960409a847054Takeshi Aimi Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null); 831dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (null == cursor || 0 == cursor.getCount() || !cursor.moveToFirst()) { 832dc549d60f98d809f626c99de614960409a847054Takeshi Aimi throw new IllegalArgumentException("Given Uri could not be found in media store"); 833dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 834dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); 835dc549d60f98d809f626c99de614960409a847054Takeshi Aimi String path = cursor.getString(pathIndex); 836dc549d60f98d809f626c99de614960409a847054Takeshi Aimi cursor.close(); 837dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return path; 838dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 839dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 840d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi // private native interfaces 841dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _loadPlugIns(int uniqueId, Object weak_this); 842d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 843dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _unloadPlugIns(int uniqueId); 844d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 845d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native void _installDrmEngine(int uniqueId, String engineFilepath); 846d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 847d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native ContentValues _getConstraints(int uniqueId, String path, int usage); 848d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 849d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native boolean _canHandle(int uniqueId, String path, String mimeType); 850d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 851d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmInfoStatus _processDrmInfo(int uniqueId, DrmInfo drmInfo); 852d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 853d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmInfo _acquireDrmInfo(int uniqueId, DrmInfoRequest drmInfoRequest); 854d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 855dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _saveRights( 856d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DrmRights drmRights, String rightsPath, String contentPath); 857d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 858d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _getDrmObjectType(int uniqueId, String path, String mimeType); 859d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 860d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native String _getOriginalMimeType(int uniqueId, String path); 861d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 862d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _checkRightsStatus(int uniqueId, String path, int action); 863d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 864dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _removeRights(int uniqueId, String path); 865d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 866dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native int _removeAllRights(int uniqueId); 867d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 868d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native int _openConvertSession(int uniqueId, String mimeType); 869d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 870dc549d60f98d809f626c99de614960409a847054Takeshi Aimi private native DrmConvertedStatus _convertData( 871dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int uniqueId, int convertId, byte[] inputData); 872d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 873d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmConvertedStatus _closeConvertSession(int uniqueId, int convertId); 874d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 875d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi private native DrmSupportInfo[] _getAllSupportInfo(int uniqueId); 876d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 877d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 878