11bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal/*
21bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Copyright (C) 2015 The Android Open Source Project
31bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
41bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License");
51bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * you may not use this file except in compliance with the License.
61bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * You may obtain a copy of the License at
71bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
81bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *      http://www.apache.org/licenses/LICENSE-2.0
91bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Unless required by applicable law or agreed to in writing, software
111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS,
121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * See the License for the specific language governing permissions and
141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * limitations under the License.
151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal */
161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalpackage android.bluetooth;
181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.os.Parcel;
201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.os.Parcelable;
211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.util.Log;
221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.HashMap;
241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.Map;
251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal/**
271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Class used to identify settings associated with the player on AG.
281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal *
291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * {@hide}
301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal */
311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalpublic final class BluetoothAvrcpPlayerSettings implements Parcelable {
321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final String TAG = "BluetoothAvrcpPlayerSettings";
331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Equalizer setting.
361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int SETTING_EQUALIZER    = 0x01;
381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Repeat setting.
411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int SETTING_REPEAT       = 0x02;
431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Shuffle setting.
461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int SETTING_SHUFFLE      = 0x04;
481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Scan mode setting.
511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int SETTING_SCAN         = 0x08;
531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Invalid state.
561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Used for returning error codes.
581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_INVALID = -1;
601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * OFF state.
631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Denotes a general OFF state. Applies to all settings.
651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_OFF = 0x00;
671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * ON state.
701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Applies to {@link SETTING_EQUALIZER}.
721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_ON = 0x01;
741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Single track repeat.
771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Applies only to {@link SETTING_REPEAT}.
791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_SINGLE_TRACK = 0x02;
811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * All track repeat/shuffle.
841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Applies to {@link SETTING_REPEAT}, {@link SETTING_SHUFFLE} and {@link SETTING_SCAN}.
861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_ALL_TRACK    = 0x03;
881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
901bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Group repeat/shuffle.
911bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
921bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Applies to {@link SETTING_REPEAT}, {@link SETTING_SHUFFLE} and {@link SETTING_SCAN}.
931bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
941bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final int STATE_GROUP        = 0x04;
951bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
961bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
971bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * List of supported settings ORed.
981bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
991bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private int mSettings;
1001bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1011bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
1021bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Hash map of current capability values.
1031bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
1041bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private Map<Integer, Integer> mSettingsValue = new HashMap<Integer, Integer>();
1051bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1061bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int describeContents() {
1071bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return 0;
1081bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1091bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public void writeToParcel(Parcel out, int flags) {
1111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        out.writeInt(mSettings);
1121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        out.writeInt(mSettingsValue.size());
1131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        for (int k : mSettingsValue.keySet()) {
1141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            out.writeInt(k);
1151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            out.writeInt(mSettingsValue.get(k));
1161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public static final Parcelable.Creator<BluetoothAvrcpPlayerSettings> CREATOR
1201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            = new Parcelable.Creator<BluetoothAvrcpPlayerSettings>() {
1211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        public BluetoothAvrcpPlayerSettings createFromParcel(Parcel in) {
1221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            return new BluetoothAvrcpPlayerSettings(in);
1231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        public BluetoothAvrcpPlayerSettings[] newArray(int size) {
1261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            return new BluetoothAvrcpPlayerSettings[size];
1271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    };
1291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    private BluetoothAvrcpPlayerSettings(Parcel in) {
1311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mSettings = in.readInt();
1321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        int numSettings = in.readInt();
1331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        for (int i = 0; i < numSettings; i++) {
1341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            mSettingsValue.put(in.readInt(), in.readInt());
1351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
1391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Create a new player settings object.
1401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
1411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @param settings a ORed value of SETTINGS_* defined above.
1421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
1431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public BluetoothAvrcpPlayerSettings(int settings) {
1441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mSettings = settings;
1451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
1481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Get the supported settings.
1491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
1501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @return int ORed value of supported settings.
1511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
1521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getSettings() {
1531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return mSettings;
1541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
1571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Add a setting value.
1581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
1591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * The setting must be part of possible settings in {@link getSettings()}.
1601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @param setting setting config.
1611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @param value value for the setting.
1621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @throws IllegalStateException if the setting is not supported.
1631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
1641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public void addSettingValue(int setting, int value) {
1651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if ((setting & mSettings) == 0) {
1661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            Log.e(TAG, "Setting not supported: " + setting + " " + mSettings);
1671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            throw new IllegalStateException("Setting not supported: " + setting);
1681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        mSettingsValue.put(setting, value);
1701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal
1721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    /**
1731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * Get a setting value.
1741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     *
1751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * The setting must be part of possible settings in {@link getSettings()}.
1761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @param setting setting config.
1771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @return value value for the setting.
1781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     * @throws IllegalStateException if the setting is not supported.
1791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal     */
1801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    public int getSettingValue(int setting) {
1811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if ((setting & mSettings) == 0) {
1821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            Log.e(TAG, "Setting not supported: " + setting + " " + mSettings);
1831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal            throw new IllegalStateException("Setting not supported: " + setting);
1841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        }
1851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        Integer i = mSettingsValue.get(setting);
1861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        if (i == null) return -1;
1871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal        return i;
1881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal    }
1891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal}
190