Home | History | Annotate | Download | only in media
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.media;
     18 
     19 import android.annotation.SystemApi;
     20 import android.os.Parcel;
     21 import android.os.Parcelable;
     22 
     23 import java.util.Objects;
     24 
     25 /**
     26  * @hide
     27  * A class to encapsulate information about an audio focus owner or request.
     28  */
     29 @SystemApi
     30 public final class AudioFocusInfo implements Parcelable {
     31 
     32     private final AudioAttributes mAttributes;
     33     private final int mClientUid;
     34     private final String mClientId;
     35     private final String mPackageName;
     36     private final int mSdkTarget;
     37     private int mGainRequest;
     38     private int mLossReceived;
     39     private int mFlags;
     40 
     41     // generation count for the validity of a request/response async exchange between
     42     // external focus policy and MediaFocusControl
     43     private long mGenCount = -1;
     44 
     45 
     46     /**
     47      * Class constructor
     48      * @param aa
     49      * @param clientId
     50      * @param packageName
     51      * @param gainRequest
     52      * @param lossReceived
     53      * @param flags
     54      * @hide
     55      */
     56     public AudioFocusInfo(AudioAttributes aa, int clientUid, String clientId, String packageName,
     57             int gainRequest, int lossReceived, int flags, int sdk) {
     58         mAttributes = aa == null ? new AudioAttributes.Builder().build() : aa;
     59         mClientUid = clientUid;
     60         mClientId = clientId == null ? "" : clientId;
     61         mPackageName = packageName == null ? "" : packageName;
     62         mGainRequest = gainRequest;
     63         mLossReceived = lossReceived;
     64         mFlags = flags;
     65         mSdkTarget = sdk;
     66     }
     67 
     68     /** @hide */
     69     public void setGen(long g) {
     70         mGenCount = g;
     71     }
     72 
     73     /** @hide */
     74     public long getGen() {
     75         return mGenCount;
     76     }
     77 
     78 
     79     /**
     80      * The audio attributes for the audio focus request.
     81      * @return non-null {@link AudioAttributes}.
     82      */
     83     @SystemApi
     84     public AudioAttributes getAttributes() { return mAttributes; }
     85 
     86     @SystemApi
     87     public int getClientUid() { return mClientUid; }
     88 
     89     @SystemApi
     90     public String getClientId() { return mClientId; }
     91 
     92     @SystemApi
     93     public String getPackageName() { return mPackageName; }
     94 
     95     /**
     96      * The type of audio focus gain request.
     97      * @return one of {@link AudioManager#AUDIOFOCUS_GAIN},
     98      *     {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
     99      *     {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK},
    100      *     {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}.
    101      */
    102     @SystemApi
    103     public int getGainRequest() { return mGainRequest; }
    104 
    105     /**
    106      * The type of audio focus loss that was received by the
    107      * {@link AudioManager.OnAudioFocusChangeListener} if one was set.
    108      * @return 0 if focus wasn't lost, or one of {@link AudioManager#AUDIOFOCUS_LOSS},
    109      *   {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT} or
    110      *   {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}.
    111      */
    112     @SystemApi
    113     public int getLossReceived() { return mLossReceived; }
    114 
    115     /** @hide */
    116     public int getSdkTarget() { return mSdkTarget; }
    117 
    118     /** @hide */
    119     public void clearLossReceived() { mLossReceived = 0; }
    120 
    121     /**
    122      * The flags set in the audio focus request.
    123      * @return 0 or a combination of {link AudioManager#AUDIOFOCUS_FLAG_DELAY_OK},
    124      *     {@link AudioManager#AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS}, and
    125      *     {@link AudioManager#AUDIOFOCUS_FLAG_LOCK}.
    126      */
    127     @SystemApi
    128     public int getFlags() { return mFlags; }
    129 
    130     @Override
    131     public int describeContents() {
    132         return 0;
    133     }
    134 
    135     @Override
    136     public void writeToParcel(Parcel dest, int flags) {
    137         mAttributes.writeToParcel(dest, flags);
    138         dest.writeInt(mClientUid);
    139         dest.writeString(mClientId);
    140         dest.writeString(mPackageName);
    141         dest.writeInt(mGainRequest);
    142         dest.writeInt(mLossReceived);
    143         dest.writeInt(mFlags);
    144         dest.writeInt(mSdkTarget);
    145         dest.writeLong(mGenCount);
    146     }
    147 
    148     @Override
    149     public int hashCode() {
    150         return Objects.hash(mAttributes, mClientUid, mClientId, mPackageName, mGainRequest, mFlags);
    151     }
    152 
    153     @Override
    154     public boolean equals(Object obj) {
    155         if (this == obj)
    156             return true;
    157         if (obj == null)
    158             return false;
    159         if (getClass() != obj.getClass())
    160             return false;
    161         AudioFocusInfo other = (AudioFocusInfo) obj;
    162         if (!mAttributes.equals(other.mAttributes)) {
    163             return false;
    164         }
    165         if (mClientUid != other.mClientUid) {
    166             return false;
    167         }
    168         if (!mClientId.equals(other.mClientId)) {
    169             return false;
    170         }
    171         if (!mPackageName.equals(other.mPackageName)) {
    172             return false;
    173         }
    174         if (mGainRequest != other.mGainRequest) {
    175             return false;
    176         }
    177         if (mLossReceived != other.mLossReceived) {
    178             return false;
    179         }
    180         if (mFlags != other.mFlags) {
    181             return false;
    182         }
    183         if (mSdkTarget != other.mSdkTarget) {
    184             return false;
    185         }
    186         // mGenCount is not used to verify equality between two focus holds as multiple requests
    187         // (hence of different generations) could correspond to the same hold
    188         return true;
    189     }
    190 
    191     public static final Parcelable.Creator<AudioFocusInfo> CREATOR
    192             = new Parcelable.Creator<AudioFocusInfo>() {
    193 
    194         public AudioFocusInfo createFromParcel(Parcel in) {
    195             final AudioFocusInfo afi = new AudioFocusInfo(
    196                     AudioAttributes.CREATOR.createFromParcel(in), //AudioAttributes aa
    197                     in.readInt(), // int clientUid
    198                     in.readString(), //String clientId
    199                     in.readString(), //String packageName
    200                     in.readInt(), //int gainRequest
    201                     in.readInt(), //int lossReceived
    202                     in.readInt(), //int flags
    203                     in.readInt()  //int sdkTarget
    204                     );
    205             afi.setGen(in.readLong());
    206             return afi;
    207         }
    208 
    209         public AudioFocusInfo[] newArray(int size) {
    210             return new AudioFocusInfo[size];
    211         }
    212     };
    213 }
    214