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