1 /*
2  * Copyright (C) 2024 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.car.oem;
18 
19 import static android.car.feature.Flags.FLAG_CAR_AUDIO_FADE_MANAGER_CONFIGURATION;
20 
21 import android.annotation.FlaggedApi;
22 import android.annotation.NonNull;
23 import android.annotation.SystemApi;
24 import android.media.FadeManagerConfiguration;
25 import android.os.Parcelable;
26 
27 import com.android.internal.annotations.VisibleForTesting;
28 
29 import java.util.Objects;
30 
31 /**
32  * Class to encapsulate the fade configuration settings from a car oem audio service
33  *
34  * @hide
35  */
36 @SystemApi
37 @FlaggedApi(FLAG_CAR_AUDIO_FADE_MANAGER_CONFIGURATION)
38 public final class CarAudioFadeConfiguration implements Parcelable {
39 
40     private final String mName;
41     private final FadeManagerConfiguration mFadeManagerConfiguration;
42 
CarAudioFadeConfiguration(@onNull String name, @NonNull FadeManagerConfiguration fadeManagerConfiguration)43     CarAudioFadeConfiguration(@NonNull String name,
44             @NonNull FadeManagerConfiguration fadeManagerConfiguration) {
45         mName = Objects.requireNonNull(name,
46                 "Name for Car audio fade configuration can not be null");
47         mFadeManagerConfiguration = Objects.requireNonNull(fadeManagerConfiguration,
48                 "Fade manager configuration can not be null");
49     }
50 
51     /**
52      * Returns the name of the car audio fade configuration
53      */
54     @NonNull
getName()55     public String getName() {
56         return mName;
57     }
58 
59     /**
60      * Returns the {@link android.media.FadeManagerConfiguration}
61      */
62     @NonNull
getFadeManagerConfiguration()63     public FadeManagerConfiguration getFadeManagerConfiguration() {
64         return mFadeManagerConfiguration;
65     }
66 
67     @Override
toString()68     public String toString() {
69         return "CarAudioFadeConfiguration {name = " + mName + ", fade manager configuration = "
70                 + mFadeManagerConfiguration + "}";
71     }
72 
73     @Override
writeToParcel(@onNull android.os.Parcel dest, int flags)74     public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
75         dest.writeString(mName);
76         mFadeManagerConfiguration.writeToParcel(dest, flags);
77     }
78 
79     @Override
describeContents()80     public int describeContents() {
81         return 0;
82     }
83 
84     /**
85      * @hide
86      */
87     @SuppressWarnings({"unchecked", "RedundantCast"})
88     @VisibleForTesting
CarAudioFadeConfiguration(@onNull android.os.Parcel in)89     public CarAudioFadeConfiguration(@NonNull android.os.Parcel in) {
90         mName = in.readString();
91         mFadeManagerConfiguration = FadeManagerConfiguration.CREATOR.createFromParcel(in);
92     }
93 
94     @NonNull
95     public static final Parcelable.Creator<CarAudioFadeConfiguration> CREATOR =
96             new Parcelable.Creator<>() {
97                 @Override
98                 public CarAudioFadeConfiguration[] newArray(int size) {
99                     return new CarAudioFadeConfiguration[size];
100                 }
101 
102                 @Override
103                 public CarAudioFadeConfiguration createFromParcel(@NonNull android.os.Parcel in) {
104                     return new CarAudioFadeConfiguration(in);
105                 }
106             };
107 
108     @Override
equals(Object o)109     public boolean equals(Object o) {
110         if (this == o) {
111             return true;
112         }
113 
114         if (!(o instanceof CarAudioFadeConfiguration)) {
115             return false;
116         }
117 
118         CarAudioFadeConfiguration that = (CarAudioFadeConfiguration) o;
119 
120         return mName.equals(that.mName)
121                 && mFadeManagerConfiguration.equals(that.mFadeManagerConfiguration);
122     }
123 
124     @Override
hashCode()125     public int hashCode() {
126         return Objects.hash(mName, mFadeManagerConfiguration);
127     }
128 
129     /**
130      * A builder for {@link CarAudioFadeConfiguration}
131      */
132     @SuppressWarnings("WeakerAccess")
133     @FlaggedApi(FLAG_CAR_AUDIO_FADE_MANAGER_CONFIGURATION)
134     public static final class Builder {
135         private @NonNull String mName;
136         private @NonNull FadeManagerConfiguration mFadeManagerConfiguration;
137         private long mBuilderFieldsSet = 0L;
138 
Builder(@onNull FadeManagerConfiguration fadeManagerConfiguration)139         public Builder(@NonNull FadeManagerConfiguration fadeManagerConfiguration) {
140             mFadeManagerConfiguration = Objects.requireNonNull(fadeManagerConfiguration,
141                     "Fade manager configuration can not be null");
142         }
143 
144         /** @see CarAudioFadeConfiguration#getName() */
setName(@onNull String name)145         public @NonNull Builder setName(@NonNull String name) {
146             mName = Objects.requireNonNull(name, "Name can not be null");
147             return this;
148         }
149 
150         /** Builds the instance. This builder should not be touched after calling this! */
build()151         public @NonNull CarAudioFadeConfiguration build() {
152             checkNotUsed();
153             mBuilderFieldsSet |= 0x1; // Mark builder used
154 
155             if (mName == null || mName.isEmpty()) {
156                 mName = generateSimpleName();
157             }
158             return new CarAudioFadeConfiguration(mName, mFadeManagerConfiguration);
159         }
160 
checkNotUsed()161         private void checkNotUsed() {
162             if ((mBuilderFieldsSet & 0x1) != 0) {
163                 throw new IllegalStateException(
164                         "This Builder should not be reused. Use a new Builder instance instead");
165             }
166         }
167 
generateSimpleName()168         private String generateSimpleName() {
169             return convertFadeStateToString(mFadeManagerConfiguration.getFadeState())
170                     + "_hash#" + mFadeManagerConfiguration.hashCode();
171         }
172 
convertFadeStateToString(int fadeState)173         private String convertFadeStateToString(int fadeState) {
174             switch(fadeState) {
175                 case FadeManagerConfiguration.FADE_STATE_DISABLED:
176                     return "FADE_STATE_DISABLED";
177                 case FadeManagerConfiguration.FADE_STATE_ENABLED_DEFAULT:
178                     return "FADE_STATE_ENABLED_DEFAULT";
179                 default:
180                     return "FADE_STATE_UNKNOWN";
181             }
182         }
183     }
184 }
185