/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.drm;

import java.util.HashMap;

/**
 * An entity class that is passed to the 
 * {@link DrmManagerClient.OnInfoListener#onInfo onInfo()} callback.
 *
 */
public class DrmInfoEvent extends DrmEvent {
    /**
     * The registration has already been done by another account ID.
     */
    public static final int TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT = 1;
    /**
     * The rights need to be removed completely.
     */
    public static final int TYPE_REMOVE_RIGHTS = 2;
    /**
     * The rights have been successfully downloaded and installed.
     */
    public static final int TYPE_RIGHTS_INSTALLED = 3;
    /**
     * The rights object is being delivered to the device. You must wait before
     * calling {@link DrmManagerClient#acquireRights acquireRights()} again.
     */
    public static final int TYPE_WAIT_FOR_RIGHTS = 4;
    /**
     * The registration has already been done for the given account.
     */
    public static final int TYPE_ACCOUNT_ALREADY_REGISTERED = 5;
    /**
     * The rights have been removed.
     */
    public static final int TYPE_RIGHTS_REMOVED = 6;

    /**
     * Creates a <code>DrmInfoEvent</code> object with the specified parameters.
     *
     * @param uniqueId Unique session identifier.
     * @param type Type of the event. Could be any of the event types defined above.
     * @param message Message description.
     */
    public DrmInfoEvent(int uniqueId, int type, String message) {
        super(uniqueId, type, message);
    }

    /**
     * Creates a <code>DrmInfoEvent</code> object with the specified parameters.
     *
     * @param uniqueId Unique session identifier.
     * @param type Type of the event. Could be any of the event types defined above.
     * @param message Message description.
     * @param attributes Attributes for extensible information. Could be any
     * information provided by the plug-in.
     */
    public DrmInfoEvent(int uniqueId, int type, String message,
                            HashMap<String, Object> attributes) {
        super(uniqueId, type, message, attributes);
    }
}

