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