1 /*
2  * Copyright (C) 2020 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 com.android.server.hdmi;
18 
19 import static org.mockito.Mockito.doReturn;
20 import static org.mockito.Mockito.spy;
21 
22 import android.annotation.NonNull;
23 import android.content.Context;
24 import android.content.ContextWrapper;
25 import android.content.res.Resources;
26 
27 import com.android.internal.R;
28 
29 import java.util.HashMap;
30 
31 /**
32  * Fake class which stubs default system configuration with user-configurable
33  * settings (useful for testing).
34  */
35 final class FakeHdmiCecConfig extends HdmiCecConfig {
36     private static final String TAG = "FakeHdmiCecConfig";
37 
38     private final HashMap<String, String> mSettings = new HashMap<>();
39 
buildContext(Context context)40     public static Context buildContext(Context context) {
41         Context contextSpy = spy(new ContextWrapper(context));
42         doReturn(buildResources(context)).when(contextSpy).getResources();
43         return contextSpy;
44     }
45 
buildResources(Context context)46     private static Resources buildResources(Context context) {
47         Resources resources = spy(context.getResources());
48 
49         doReturn(true).when(resources).getBoolean(
50                 R.bool.config_cecHdmiCecEnabled_userConfigurable);
51         doReturn(true).when(resources).getBoolean(
52                 R.bool.config_cecHdmiCecControlEnabled_allowed);
53         doReturn(true).when(resources).getBoolean(
54                 R.bool.config_cecHdmiCecControlEnabled_default);
55         doReturn(true).when(resources).getBoolean(
56                 R.bool.config_cecHdmiCecControlDisabled_allowed);
57         doReturn(false).when(resources).getBoolean(
58                 R.bool.config_cecHdmiCecControlDisabled_default);
59 
60         doReturn(true).when(resources).getBoolean(
61                 R.bool.config_cecHdmiCecVersion_userConfigurable);
62         doReturn(true).when(resources).getBoolean(
63                 R.bool.config_cecHdmiCecVersion14b_allowed);
64         doReturn(true).when(resources).getBoolean(
65                 R.bool.config_cecHdmiCecVersion14b_default);
66         doReturn(true).when(resources).getBoolean(
67                 R.bool.config_cecHdmiCecVersion20_allowed);
68         doReturn(false).when(resources).getBoolean(
69                 R.bool.config_cecHdmiCecVersion20_default);
70 
71         doReturn(true).when(resources).getBoolean(
72                 R.bool.config_cecRoutingControl_userConfigurable);
73         doReturn(true).when(resources).getBoolean(
74                 R.bool.config_cecRoutingControlEnabled_allowed);
75         doReturn(false).when(resources).getBoolean(
76                 R.bool.config_cecRoutingControlEnabled_default);
77         doReturn(true).when(resources).getBoolean(
78                 R.bool.config_cecRoutingControlDisabled_allowed);
79         doReturn(true).when(resources).getBoolean(
80                 R.bool.config_cecRoutingControlDisabled_default);
81 
82         doReturn(true).when(resources).getBoolean(
83                 R.bool.config_cecSoundbarMode_userConfigurable);
84         doReturn(true).when(resources).getBoolean(
85                 R.bool.config_cecSoundbarModeEnabled_allowed);
86         doReturn(false).when(resources).getBoolean(
87                 R.bool.config_cecSoundbarModeEnabled_default);
88         doReturn(true).when(resources).getBoolean(
89                 R.bool.config_cecSoundbarModeDisabled_allowed);
90         doReturn(true).when(resources).getBoolean(
91                 R.bool.config_cecSoundbarModeDisabled_default);
92 
93         doReturn(true).when(resources).getBoolean(
94                 R.bool.config_cecPowerControlMode_userConfigurable);
95         doReturn(true).when(resources).getBoolean(
96                 R.bool.config_cecPowerControlModeTv_allowed);
97         doReturn(false).when(resources).getBoolean(
98                 R.bool.config_cecPowerControlModeTv_default);
99         doReturn(true).when(resources).getBoolean(
100                 R.bool.config_cecPowerControlModeTvAndAudioSystem_allowed);
101         doReturn(true).when(resources).getBoolean(
102                 R.bool.config_cecPowerControlModeTvAndAudioSystem_default);
103         doReturn(true).when(resources).getBoolean(
104                 R.bool.config_cecPowerControlModeBroadcast_allowed);
105         doReturn(false).when(resources).getBoolean(
106                 R.bool.config_cecPowerControlModeBroadcast_default);
107         doReturn(true).when(resources).getBoolean(
108                 R.bool.config_cecPowerControlModeNone_allowed);
109         doReturn(false).when(resources).getBoolean(
110                 R.bool.config_cecPowerControlModeNone_default);
111 
112         doReturn(true).when(resources).getBoolean(
113                 R.bool.config_cecPowerStateChangeOnActiveSourceLost_userConfigurable);
114         doReturn(true).when(resources).getBoolean(
115                 R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_allowed);
116         doReturn(true).when(resources).getBoolean(
117                 R.bool.config_cecPowerStateChangeOnActiveSourceLostNone_default);
118         doReturn(true).when(resources).getBoolean(
119                 R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_allowed);
120         doReturn(false).when(resources).getBoolean(
121                 R.bool.config_cecPowerStateChangeOnActiveSourceLostStandbyNow_default);
122 
123         doReturn(true).when(resources).getBoolean(
124                 R.bool.config_cecSystemAudioControl_userConfigurable);
125         doReturn(true).when(resources).getBoolean(
126                 R.bool.config_cecSystemAudioControlEnabled_allowed);
127         doReturn(true).when(resources).getBoolean(
128                 R.bool.config_cecSystemAudioControlEnabled_default);
129         doReturn(true).when(resources).getBoolean(
130                 R.bool.config_cecSystemAudioControlDisabled_allowed);
131         doReturn(false).when(resources).getBoolean(
132                 R.bool.config_cecSystemAudioControlDisabled_default);
133 
134         doReturn(true).when(resources).getBoolean(
135                 R.bool.config_cecSystemAudioModeMuting_userConfigurable);
136         doReturn(true).when(resources).getBoolean(
137                 R.bool.config_cecSystemAudioModeMutingEnabled_allowed);
138         doReturn(true).when(resources).getBoolean(
139                 R.bool.config_cecSystemAudioModeMutingEnabled_default);
140         doReturn(true).when(resources).getBoolean(
141                 R.bool.config_cecSystemAudioModeMutingDisabled_allowed);
142         doReturn(false).when(resources).getBoolean(
143                 R.bool.config_cecSystemAudioModeMutingDisabled_default);
144 
145         doReturn(true).when(resources).getBoolean(
146                 R.bool.config_cecVolumeControlMode_userConfigurable);
147         doReturn(true).when(resources).getBoolean(
148                 R.bool.config_cecVolumeControlModeEnabled_allowed);
149         doReturn(true).when(resources).getBoolean(
150                 R.bool.config_cecVolumeControlModeEnabled_default);
151         doReturn(true).when(resources).getBoolean(
152                 R.bool.config_cecVolumeControlModeDisabled_allowed);
153         doReturn(false).when(resources).getBoolean(
154                 R.bool.config_cecVolumeControlModeDisabled_default);
155 
156         doReturn(true).when(resources).getBoolean(
157                 R.bool.config_cecTvWakeOnOneTouchPlay_userConfigurable);
158         doReturn(true).when(resources).getBoolean(
159                 R.bool.config_cecTvWakeOnOneTouchPlayEnabled_allowed);
160         doReturn(true).when(resources).getBoolean(
161                 R.bool.config_cecTvWakeOnOneTouchPlayEnabled_default);
162         doReturn(true).when(resources).getBoolean(
163                 R.bool.config_cecTvWakeOnOneTouchPlayDisabled_allowed);
164         doReturn(false).when(resources).getBoolean(
165                 R.bool.config_cecTvWakeOnOneTouchPlayDisabled_default);
166 
167         doReturn(true).when(resources).getBoolean(
168                 R.bool.config_cecTvSendStandbyOnSleep_userConfigurable);
169         doReturn(true).when(resources).getBoolean(
170                 R.bool.config_cecTvSendStandbyOnSleepEnabled_allowed);
171         doReturn(true).when(resources).getBoolean(
172                 R.bool.config_cecTvSendStandbyOnSleepEnabled_default);
173         doReturn(true).when(resources).getBoolean(
174                 R.bool.config_cecTvSendStandbyOnSleepDisabled_allowed);
175         doReturn(false).when(resources).getBoolean(
176                 R.bool.config_cecTvSendStandbyOnSleepDisabled_default);
177 
178         doReturn(true).when(resources).getBoolean(
179                 R.bool.config_cecSetMenuLanguage_userConfigurable);
180         doReturn(true).when(resources).getBoolean(
181                 R.bool.config_cecSetMenuLanguageEnabled_allowed);
182         doReturn(true).when(resources).getBoolean(
183                 R.bool.config_cecSetMenuLanguageEnabled_default);
184         doReturn(true).when(resources).getBoolean(
185                 R.bool.config_cecSetMenuLanguageDisabled_allowed);
186         doReturn(false).when(resources).getBoolean(
187                 R.bool.config_cecSetMenuLanguageDisabled_default);
188 
189         doReturn(true).when(resources).getBoolean(
190                 R.bool.config_cecRcProfileTv_userConfigurable);
191         doReturn(true).when(resources).getBoolean(
192                 R.bool.config_cecRcProfileTvNone_allowed);
193         doReturn(true).when(resources).getBoolean(
194                 R.bool.config_cecRcProfileTvNone_default);
195         doReturn(true).when(resources).getBoolean(
196                 R.bool.config_cecRcProfileTvOne_allowed);
197         doReturn(false).when(resources).getBoolean(
198                 R.bool.config_cecRcProfileTvOne_default);
199         doReturn(true).when(resources).getBoolean(
200                 R.bool.config_cecRcProfileTvTwo_allowed);
201         doReturn(false).when(resources).getBoolean(
202                 R.bool.config_cecRcProfileTvTwo_default);
203         doReturn(true).when(resources).getBoolean(
204                 R.bool.config_cecRcProfileTvThree_allowed);
205         doReturn(false).when(resources).getBoolean(
206                 R.bool.config_cecRcProfileTvThree_default);
207         doReturn(true).when(resources).getBoolean(
208                 R.bool.config_cecRcProfileTvFour_allowed);
209         doReturn(false).when(resources).getBoolean(
210                 R.bool.config_cecRcProfileTvFour_default);
211 
212         doReturn(true).when(resources).getBoolean(
213                 R.bool.config_cecRcProfileSourceRootMenu_userConfigurable);
214         doReturn(true).when(resources).getBoolean(
215                 R.bool.config_cecRcProfileSourceRootMenuHandled_allowed);
216         doReturn(true).when(resources).getBoolean(
217                 R.bool.config_cecRcProfileSourceRootMenuHandled_default);
218         doReturn(true).when(resources).getBoolean(
219                 R.bool.config_cecRcProfileSourceRootMenuNotHandled_allowed);
220         doReturn(false).when(resources).getBoolean(
221                 R.bool.config_cecRcProfileSourceRootMenuNotHandled_default);
222 
223         doReturn(true).when(resources).getBoolean(
224                 R.bool.config_cecRcProfileSourceSetupMenu_userConfigurable);
225         doReturn(true).when(resources).getBoolean(
226                 R.bool.config_cecRcProfileSourceSetupMenuHandled_allowed);
227         doReturn(true).when(resources).getBoolean(
228                 R.bool.config_cecRcProfileSourceSetupMenuHandled_default);
229         doReturn(true).when(resources).getBoolean(
230                 R.bool.config_cecRcProfileSourceSetupMenuNotHandled_allowed);
231         doReturn(false).when(resources).getBoolean(
232                 R.bool.config_cecRcProfileSourceSetupMenuNotHandled_default);
233 
234         doReturn(true).when(resources).getBoolean(
235                 R.bool.config_cecRcProfileSourceContentsMenu_userConfigurable);
236         doReturn(true).when(resources).getBoolean(
237                 R.bool.config_cecRcProfileSourceContentsMenuHandled_allowed);
238         doReturn(false).when(resources).getBoolean(
239                 R.bool.config_cecRcProfileSourceContentsMenuHandled_default);
240         doReturn(true).when(resources).getBoolean(
241                 R.bool.config_cecRcProfileSourceContentsMenuNotHandled_allowed);
242         doReturn(true).when(resources).getBoolean(
243                 R.bool.config_cecRcProfileSourceContentsMenuNotHandled_default);
244 
245         doReturn(true).when(resources).getBoolean(
246                 R.bool.config_cecRcProfileSourceTopMenu_userConfigurable);
247         doReturn(true).when(resources).getBoolean(
248                 R.bool.config_cecRcProfileSourceTopMenuHandled_allowed);
249         doReturn(false).when(resources).getBoolean(
250                 R.bool.config_cecRcProfileSourceTopMenuHandled_default);
251         doReturn(true).when(resources).getBoolean(
252                 R.bool.config_cecRcProfileSourceTopMenuNotHandled_allowed);
253         doReturn(true).when(resources).getBoolean(
254                 R.bool.config_cecRcProfileSourceTopMenuNotHandled_default);
255 
256         doReturn(true).when(resources).getBoolean(
257                 R.bool.config_cecRcProfileSourceMediaContextSensitiveMenu_userConfigurable);
258         doReturn(true).when(resources).getBoolean(
259                 R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_allowed);
260         doReturn(false).when(resources).getBoolean(
261                 R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuHandled_default);
262         doReturn(true).when(resources).getBoolean(
263                 R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_allowed);
264         doReturn(true).when(resources).getBoolean(
265                 R.bool.config_cecRcProfileSourceMediaContextSensitiveMenuNotHandled_default);
266 
267         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcm_userConfigurable);
268         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmEnabled_allowed);
269         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmEnabled_default);
270         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmDisabled_allowed);
271         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadLpcmDisabled_default);
272 
273         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDd_userConfigurable);
274         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdEnabled_allowed);
275         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdEnabled_default);
276         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdDisabled_allowed);
277         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDdDisabled_default);
278 
279         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1_userConfigurable);
280         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Enabled_allowed);
281         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Enabled_default);
282         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Disabled_allowed);
283         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg1Disabled_default);
284 
285         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3_userConfigurable);
286         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Enabled_allowed);
287         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Enabled_default);
288         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Disabled_allowed);
289         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMp3Disabled_default);
290 
291         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2_userConfigurable);
292         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Enabled_allowed);
293         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Enabled_default);
294         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Disabled_allowed);
295         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMpeg2Disabled_default);
296 
297         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAac_userConfigurable);
298         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacEnabled_allowed);
299         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacEnabled_default);
300         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAacDisabled_allowed);
301         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadAacDisabled_default);
302 
303         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDts_userConfigurable);
304         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsEnabled_allowed);
305         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsEnabled_default);
306         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtsDisabled_allowed);
307         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDtsDisabled_default);
308 
309         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtrac_userConfigurable);
310         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracEnabled_allowed);
311         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracEnabled_default);
312         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadAtracDisabled_allowed);
313         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadAtracDisabled_default);
314 
315         doReturn(true).when(resources).getBoolean(
316                 R.bool.config_cecQuerySadOnebitaudio_userConfigurable);
317         doReturn(true).when(resources).getBoolean(
318                 R.bool.config_cecQuerySadOnebitaudioEnabled_allowed);
319         doReturn(true).when(resources).getBoolean(
320                 R.bool.config_cecQuerySadOnebitaudioEnabled_default);
321         doReturn(true).when(resources).getBoolean(
322                 R.bool.config_cecQuerySadOnebitaudioDisabled_allowed);
323         doReturn(false).when(resources).getBoolean(
324                 R.bool.config_cecQuerySadOnebitaudioDisabled_default);
325 
326         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdp_userConfigurable);
327         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpEnabled_allowed);
328         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpEnabled_default);
329         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDdpDisabled_allowed);
330         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDdpDisabled_default);
331 
332         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshd_userConfigurable);
333         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdEnabled_allowed);
334         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdEnabled_default);
335         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdDisabled_allowed);
336         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDtshdDisabled_default);
337 
338         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehd_userConfigurable);
339         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdEnabled_allowed);
340         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdEnabled_default);
341         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdDisabled_allowed);
342         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadTruehdDisabled_default);
343 
344         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDst_userConfigurable);
345         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstEnabled_allowed);
346         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstEnabled_default);
347         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadDstDisabled_allowed);
348         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadDstDisabled_default);
349 
350         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmapro_userConfigurable);
351         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproEnabled_allowed);
352         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproEnabled_default);
353         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproDisabled_allowed);
354         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadWmaproDisabled_default);
355 
356         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMax_userConfigurable);
357         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxEnabled_allowed);
358         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxEnabled_default);
359         doReturn(true).when(resources).getBoolean(R.bool.config_cecQuerySadMaxDisabled_allowed);
360         doReturn(false).when(resources).getBoolean(R.bool.config_cecQuerySadMaxDisabled_default);
361 
362         doReturn(true).when(resources).getBoolean(
363                 R.bool.config_earcEnabled_userConfigurable);
364         doReturn(true).when(resources).getBoolean(
365                 R.bool.config_earcFeatureEnabled_allowed);
366         doReturn(true).when(resources).getBoolean(
367                 R.bool.config_earcFeatureEnabled_default);
368         doReturn(true).when(resources).getBoolean(
369                 R.bool.config_earcFeatureDisabled_allowed);
370         doReturn(false).when(resources).getBoolean(
371                 R.bool.config_earcFeatureDisabled_default);
372 
373         return resources;
374     }
375 
FakeHdmiCecConfig(@onNull Context context)376     FakeHdmiCecConfig(@NonNull Context context) {
377         super(buildContext(context), new StorageAdapter(context));
378     }
379 
380     @Override
retrieveValue(@onNull Setting setting, @NonNull String defaultValue)381     protected String retrieveValue(@NonNull Setting setting, @NonNull String defaultValue) {
382         return mSettings.getOrDefault(setting.getName(), defaultValue);
383     }
384 
385     @Override
storeValue(@onNull Setting setting, @NonNull String value)386     protected void storeValue(@NonNull Setting setting, @NonNull String value) {
387         mSettings.put(setting.getName(), value);
388         notifySettingChanged(setting);
389     }
390 }
391