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 java.util.HashMap;
20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.Iterator;
21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
230e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * An entity class that is used to pass information to an online DRM server. An instance of this
240e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * class is passed to the {@link DrmManagerClient#acquireDrmInfo acquireDrmInfo()} method to get an
250e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber * instance of a {@link DrmInfo}.
26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmInfoRequest {
295c96c65f692f8c2297d213c88450dd601d2b5c1fGloria Wang    // Changes in following constants should be in sync with DrmInfoRequest.h
30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Acquires DRM server registration information.
32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final int TYPE_REGISTRATION_INFO = 1;
340e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber    /**
352980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     * Acquires information for unregistering the DRM server.
362980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     */
37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final int TYPE_UNREGISTRATION_INFO = 2;
380e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber    /**
392980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     * Acquires rights information.
402980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     */
41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final int TYPE_RIGHTS_ACQUISITION_INFO = 3;
420e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber    /**
432980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     * Acquires the progress of the rights acquisition.
442980a213752d6e30edd4c689489cb4a2c3006252Gloria Wang     */
45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final int TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO = 4;
46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
480e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Key that is used to pass the unique session ID for the account or the user.
49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final String ACCOUNT_ID = "account_id";
51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
530e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Key that is used to pass the unique session ID for the subscription.
54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static final String SUBSCRIPTION_ID = "subscription_id";
56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private final int mInfoType;
58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private final String mMimeType;
59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private final HashMap<String, Object> mRequestInformation = new HashMap<String, Object>();
60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
620e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Creates a <code>DrmInfoRequest</code> object with type and MIME type.
63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
640e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param infoType Type of information.
650e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param mimeType MIME type.
66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmInfoRequest(int infoType, String mimeType) {
68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mInfoType = infoType;
69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mMimeType = mimeType;
706c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong        if (!isValid()) {
716c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong            final String msg = "infoType: " + infoType + "," +
726c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong                               "mimeType: " + mimeType;
736c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong            throw new IllegalArgumentException(msg);
746c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong        }
75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
780e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves the MIME type associated with this object.
79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
800e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The MIME type.
81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public String getMimeType() {
83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mMimeType;
84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
870e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves the information type associated with this object.
88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
890e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The information type.
90d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int getInfoType() {
92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mInfoType;
93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
960e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Adds optional information as key-value pairs to this object.
97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
980e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param key The key to add.
990e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param value The value to add.
100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void put(String key, Object value) {
102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mRequestInformation.put(key, value);
103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1060e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves the value of a given key.
1070e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     *
1080e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @param key The key whose value is being retrieved.
109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1100e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The value of the key that is being retrieved. Returns null if the key cannot be
1110e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * found.
112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public Object get(String key) {
114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mRequestInformation.get(key);
115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
116d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1180e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves an iterator object that you can use to iterate over the keys associated with
1190e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * this <code>DrmInfoRequest</code> object.
120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1210e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The iterator object.
122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public Iterator<String> keyIterator() {
124d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mRequestInformation.keySet().iterator();
125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
126d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
1280e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * Retrieves an iterator object that you can use to iterate over the values associated with
1290e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * this <code>DrmInfoRequest</code> object.
130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
1310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber     * @return The iterator object.
132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public Iterator<Object> iterator() {
134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mRequestInformation.values().iterator();
135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Returns whether this instance is valid or not
139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return
141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     true if valid
142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     false if invalid
143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    boolean isValid() {
145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return (null != mMimeType && !mMimeType.equals("")
146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                && null != mRequestInformation && isValidType(mInfoType));
147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /* package */ static boolean isValidType(int infoType) {
150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        boolean isValid = false;
151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        switch (infoType) {
153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        case TYPE_REGISTRATION_INFO:
154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        case TYPE_UNREGISTRATION_INFO:
155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        case TYPE_RIGHTS_ACQUISITION_INFO:
156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        case TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO:
157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            isValid = true;
158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            break;
159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return isValid;
161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}
163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
164