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