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