blob: a89198ae37083dcdbb5f881740aec4c56102ec35 [file] [log] [blame]
Amy2a6c3dc2018-06-05 17:31:55 -07001/*
2 * Copyright (C) 2018 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 */
16package com.android.server.hdmi;
17
Amy89e93af2018-10-15 09:56:54 -070018import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE;
19import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_UPDATE_DEVICE;
20
Amy2a6c3dc2018-06-05 17:31:55 -070021import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
Amy9b91e8c2018-06-11 17:26:26 -070022import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
Amy8b4a4a92018-09-18 16:01:01 -070023import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
Amyaa8ae682018-12-12 16:11:50 -080024import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
Amy06dc4cd2018-08-09 18:22:40 -070025import static com.android.server.hdmi.Constants.ADDR_TUNER_1;
Amy2a6c3dc2018-06-05 17:31:55 -070026import static com.android.server.hdmi.Constants.ADDR_TV;
Amy4e7ff1a2018-06-07 16:24:31 -070027import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
Amyb887fa02018-06-21 11:22:13 -070028import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
Amy2a6c3dc2018-06-05 17:31:55 -070029
Amy93a97b92018-08-17 14:58:41 -070030import static com.google.common.truth.Truth.assertThat;
Brett Chabota26eda92018-07-23 13:08:30 -070031
Amy89e93af2018-10-15 09:56:54 -070032import android.hardware.hdmi.HdmiDeviceInfo;
Amyaa8ae682018-12-12 16:11:50 -080033import android.hardware.hdmi.HdmiPortInfo;
Amy2a6c3dc2018-06-05 17:31:55 -070034import android.media.AudioManager;
Amy4e7ff1a2018-06-07 16:24:31 -070035import android.os.Looper;
Amy4e7ff1a2018-06-07 16:24:31 -070036import android.os.test.TestLooper;
Amy93a97b92018-08-17 14:58:41 -070037
Nick Chalko8cdd5592018-07-31 14:42:01 -070038import androidx.test.InstrumentationRegistry;
Brett Chabota26eda92018-07-23 13:08:30 -070039import androidx.test.filters.SmallTest;
Amy93a97b92018-08-17 14:58:41 -070040
Amye30f9932018-07-13 13:54:52 -070041import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
Brett Chabota26eda92018-07-23 13:08:30 -070042
Amy2a6c3dc2018-06-05 17:31:55 -070043import org.junit.Before;
Amycd18d282018-09-25 11:19:06 -070044import org.junit.Ignore;
Nick Chalko8cdd5592018-07-31 14:42:01 -070045import org.junit.Test;
Amy2a6c3dc2018-06-05 17:31:55 -070046import org.junit.runner.RunWith;
47import org.junit.runners.JUnit4;
48
Brett Chabota26eda92018-07-23 13:08:30 -070049import java.util.ArrayList;
Amy2a6c3dc2018-06-05 17:31:55 -070050@SmallTest
51@RunWith(JUnit4.class)
Nick Chalko10e52c92018-07-25 16:07:16 -070052/** Tests for {@link HdmiCecLocalDeviceAudioSystem} class. */
Amy2a6c3dc2018-06-05 17:31:55 -070053public class HdmiCecLocalDeviceAudioSystemTest {
54
Nick Chalko167529c2018-07-18 13:11:31 -070055 private static final HdmiCecMessage MESSAGE_REQUEST_SAD_LCPM =
56 HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
57 ADDR_TV, ADDR_AUDIO_SYSTEM, new int[] {Constants.AUDIO_CODEC_LPCM});
58
Amy2a6c3dc2018-06-05 17:31:55 -070059 private HdmiControlService mHdmiControlService;
Amy4e7ff1a2018-06-07 16:24:31 -070060 private HdmiCecController mHdmiCecController;
Amy2a6c3dc2018-06-05 17:31:55 -070061 private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
Amy8b4a4a92018-09-18 16:01:01 -070062 private HdmiCecLocalDevicePlayback mHdmiCecLocalDevicePlayback;
Nick Chalko7206f3b2018-06-19 10:17:03 -070063 private FakeNativeWrapper mNativeWrapper;
Amy4e7ff1a2018-06-07 16:24:31 -070064 private Looper mMyLooper;
65 private TestLooper mTestLooper = new TestLooper();
66 private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
Amy2a6c3dc2018-06-05 17:31:55 -070067 private int mMusicVolume;
68 private int mMusicMaxVolume;
69 private boolean mMusicMute;
Amyaa8ae682018-12-12 16:11:50 -080070 private static final int SELF_PHYSICAL_ADDRESS = 0x2000;
71 private static final int HDMI_1_PHYSICAL_ADDRESS = 0x2100;
72 private static final int HDMI_2_PHYSICAL_ADDRESS = 0x2200;
73 private static final int HDMI_3_PHYSICAL_ADDRESS = 0x2300;
Amy89e93af2018-10-15 09:56:54 -070074 private int mInvokeDeviceEventState;
75 private HdmiDeviceInfo mDeviceInfo;
Amyaa8ae682018-12-12 16:11:50 -080076 private boolean mMutingEnabled;
77 private boolean mArcSupport;
78 private HdmiPortInfo[] mHdmiPortInfo;
Amy2a6c3dc2018-06-05 17:31:55 -070079
80 @Before
Nick Chalko8cdd5592018-07-31 14:42:01 -070081 public void setUp() {
Nick Chalko10e52c92018-07-25 16:07:16 -070082 mHdmiControlService =
Amy06dc4cd2018-08-09 18:22:40 -070083 new HdmiControlService(InstrumentationRegistry.getTargetContext()) {
84 @Override
85 AudioManager getAudioManager() {
86 return new AudioManager() {
87 @Override
88 public int getStreamVolume(int streamType) {
89 switch (streamType) {
90 case STREAM_MUSIC:
91 return mMusicVolume;
92 default:
93 return 0;
Nick Chalko10e52c92018-07-25 16:07:16 -070094 }
Amy06dc4cd2018-08-09 18:22:40 -070095 }
Amy0fd41e32018-06-21 13:40:27 -070096
Amy06dc4cd2018-08-09 18:22:40 -070097 @Override
98 public boolean isStreamMute(int streamType) {
99 switch (streamType) {
100 case STREAM_MUSIC:
101 return mMusicMute;
102 default:
103 return false;
Nick Chalko10e52c92018-07-25 16:07:16 -0700104 }
Amy06dc4cd2018-08-09 18:22:40 -0700105 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700106
Amy06dc4cd2018-08-09 18:22:40 -0700107 @Override
108 public int getStreamMaxVolume(int streamType) {
109 switch (streamType) {
110 case STREAM_MUSIC:
111 return mMusicMaxVolume;
112 default:
113 return 100;
Nick Chalko10e52c92018-07-25 16:07:16 -0700114 }
Amy06dc4cd2018-08-09 18:22:40 -0700115 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700116
Amy06dc4cd2018-08-09 18:22:40 -0700117 @Override
118 public void adjustStreamVolume(
119 int streamType, int direction, int flags) {
120 switch (streamType) {
121 case STREAM_MUSIC:
122 if (direction == AudioManager.ADJUST_UNMUTE) {
123 mMusicMute = false;
124 } else if (direction == AudioManager.ADJUST_MUTE) {
125 mMusicMute = true;
126 }
127 break;
128 default:
Nick Chalko10e52c92018-07-25 16:07:16 -0700129 }
Amy06dc4cd2018-08-09 18:22:40 -0700130 }
Amy77c7c982018-07-23 18:27:36 -0700131
Amy06dc4cd2018-08-09 18:22:40 -0700132 @Override
133 public void setWiredDeviceConnectionState(
134 int type, int state, String address, String name) {
135 // Do nothing.
136 }
137 };
138 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700139
Amy06dc4cd2018-08-09 18:22:40 -0700140 @Override
141 void wakeUp() {}
Amy89e93af2018-10-15 09:56:54 -0700142
143 @Override
144 void invokeDeviceEventListeners(HdmiDeviceInfo device, int status) {
145 mDeviceInfo = device;
146 mInvokeDeviceEventState = status;
147 }
148
149 @Override
Amy59c06c12019-01-18 15:35:15 -0800150 void writeStringSystemProperty(String key, String value) {
Amyaa8ae682018-12-12 16:11:50 -0800151 // do nothing
152 }
153
154 @Override
Amy59c06c12019-01-18 15:35:15 -0800155 boolean readBooleanSystemProperty(String key, boolean defVal) {
Amyaa8ae682018-12-12 16:11:50 -0800156 switch (key) {
157 case Constants.PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE:
158 return mMutingEnabled;
159 case Constants.PROPERTY_ARC_SUPPORT:
160 return mArcSupport;
161 default:
162 return defVal;
163 }
Amy89e93af2018-10-15 09:56:54 -0700164 }
Amy06dc4cd2018-08-09 18:22:40 -0700165 };
Amy77c7c982018-07-23 18:27:36 -0700166
Amy4e7ff1a2018-06-07 16:24:31 -0700167 mMyLooper = mTestLooper.getLooper();
Amy2a6c3dc2018-06-05 17:31:55 -0700168 mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
Amycd18d282018-09-25 11:19:06 -0700169 mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService) {
170 @Override
171 void setIsActiveSource(boolean on) {
172 mIsActiveSource = on;
173 }
Amyaa8ae682018-12-12 16:11:50 -0800174
175 @Override
176 protected int getPreferredAddress() {
177 return ADDR_PLAYBACK_1;
178 }
Amycd18d282018-09-25 11:19:06 -0700179 };
Amy4e7ff1a2018-06-07 16:24:31 -0700180 mHdmiCecLocalDeviceAudioSystem.init();
Amy8b4a4a92018-09-18 16:01:01 -0700181 mHdmiCecLocalDevicePlayback.init();
Amy4e7ff1a2018-06-07 16:24:31 -0700182 mHdmiControlService.setIoLooper(mMyLooper);
Nick Chalko7206f3b2018-06-19 10:17:03 -0700183 mNativeWrapper = new FakeNativeWrapper();
Amyaa8ae682018-12-12 16:11:50 -0800184 mNativeWrapper.setPhysicalAddress(SELF_PHYSICAL_ADDRESS);
Nick Chalko10e52c92018-07-25 16:07:16 -0700185 mHdmiCecController =
Amy06dc4cd2018-08-09 18:22:40 -0700186 HdmiCecController.createWithNativeWrapper(mHdmiControlService, mNativeWrapper);
Amy4e7ff1a2018-06-07 16:24:31 -0700187 mHdmiControlService.setCecController(mHdmiCecController);
188 mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
Amy9b91e8c2018-06-11 17:26:26 -0700189 mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
Amy4e7ff1a2018-06-07 16:24:31 -0700190 mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
Amy8b4a4a92018-09-18 16:01:01 -0700191 mLocalDevices.add(mHdmiCecLocalDevicePlayback);
Amyaa8ae682018-12-12 16:11:50 -0800192 mHdmiCecLocalDeviceAudioSystem.setRoutingControlFeatureEnables(true);
193 mHdmiPortInfo = new HdmiPortInfo[4];
194 mHdmiPortInfo[0] =
195 new HdmiPortInfo(
196 0, HdmiPortInfo.PORT_INPUT, SELF_PHYSICAL_ADDRESS, true, false, false);
197 mHdmiPortInfo[1] =
198 new HdmiPortInfo(
199 2, HdmiPortInfo.PORT_INPUT, HDMI_1_PHYSICAL_ADDRESS, true, false, false);
200 mHdmiPortInfo[2] =
201 new HdmiPortInfo(
202 1, HdmiPortInfo.PORT_INPUT, HDMI_2_PHYSICAL_ADDRESS, true, false, false);
203 mHdmiPortInfo[3] =
204 new HdmiPortInfo(
205 4, HdmiPortInfo.PORT_INPUT, HDMI_3_PHYSICAL_ADDRESS, true, false, false);
206 mNativeWrapper.setPortInfo(mHdmiPortInfo);
Amy4e7ff1a2018-06-07 16:24:31 -0700207 mHdmiControlService.initPortInfo();
Amyfc56efb2018-07-09 16:37:07 -0700208 // No TV device interacts with AVR so system audio control won't be turned on here
Amy4e7ff1a2018-06-07 16:24:31 -0700209 mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
Amy4e7ff1a2018-06-07 16:24:31 -0700210 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700211 mNativeWrapper.clearResultMessages();
Amyaa8ae682018-12-12 16:11:50 -0800212 mMutingEnabled = true;
213 mArcSupport = true;
Amy89e93af2018-10-15 09:56:54 -0700214 mInvokeDeviceEventState = 0;
215 mDeviceInfo = null;
Amy2a6c3dc2018-06-05 17:31:55 -0700216 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700217
Amy2a6c3dc2018-06-05 17:31:55 -0700218 @Test
Amy93a97b92018-08-17 14:58:41 -0700219 public void handleGiveAudioStatus_volume_10_mute_true() throws Exception {
Amy2a6c3dc2018-06-05 17:31:55 -0700220 mMusicVolume = 10;
221 mMusicMute = true;
222 mMusicMaxVolume = 20;
223 int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume);
Nick Chalko10e52c92018-07-25 16:07:16 -0700224 HdmiCecMessage expectedMessage =
225 HdmiCecMessageBuilder.buildReportAudioStatus(
226 ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);
227 HdmiCecMessage messageGive =
228 HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
Nick Chalko90d44322018-07-27 08:35:12 -0700229 assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)).isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700230 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700231 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amy2a6c3dc2018-06-05 17:31:55 -0700232 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700233
Amy87eda822018-06-06 17:56:39 -0700234 @Test
Amy93a97b92018-08-17 14:58:41 -0700235 public void handleGiveSystemAudioModeStatus_originalOff() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700236 HdmiCecMessage expectedMessage =
Amy06dc4cd2018-08-09 18:22:40 -0700237 HdmiCecMessageBuilder.buildReportSystemAudioMode(
238 ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Nick Chalko10e52c92018-07-25 16:07:16 -0700239 HdmiCecMessage messageGive =
240 HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
Shubang2fd186e2018-07-18 16:53:12 -0700241 assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
Amy06dc4cd2018-08-09 18:22:40 -0700242 .isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700243 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700244 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amy9b91e8c2018-06-11 17:26:26 -0700245 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700246
Amy9b91e8c2018-06-11 17:26:26 -0700247 @Test
Nick Chalko167529c2018-07-18 13:11:31 -0700248 public void handleRequestShortAudioDescriptor_featureDisabled() throws Exception {
249 HdmiCecMessage expectedMessage =
250 HdmiCecMessageBuilder.buildFeatureAbortCommand(
251 ADDR_AUDIO_SYSTEM,
252 ADDR_TV,
253 Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
254 Constants.ABORT_REFUSED);
255
256 mHdmiCecLocalDeviceAudioSystem.setSystemAudioControlFeatureEnabled(false);
257 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700258 mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
259 MESSAGE_REQUEST_SAD_LCPM))
260 .isTrue();
Nick Chalko167529c2018-07-18 13:11:31 -0700261 mTestLooper.dispatchAll();
262 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
263 }
264
265 @Test
266 public void handleRequestShortAudioDescriptor_samOff() throws Exception {
267 HdmiCecMessage expectedMessage =
268 HdmiCecMessageBuilder.buildFeatureAbortCommand(
269 ADDR_AUDIO_SYSTEM,
270 ADDR_TV,
271 Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
272 Constants.ABORT_NOT_IN_CORRECT_MODE);
273
Amy06dc4cd2018-08-09 18:22:40 -0700274 mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
Nick Chalko167529c2018-07-18 13:11:31 -0700275 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700276 mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
277 MESSAGE_REQUEST_SAD_LCPM))
278 .isEqualTo(true);
Nick Chalko167529c2018-07-18 13:11:31 -0700279 mTestLooper.dispatchAll();
280 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
281 }
282
Amyaa8ae682018-12-12 16:11:50 -0800283 // Testing device has sadConfig.xml
284 @Ignore("b/120845532")
Nick Chalko167529c2018-07-18 13:11:31 -0700285 @Test
286 public void handleRequestShortAudioDescriptor_noAudioDeviceInfo() throws Exception {
287 HdmiCecMessage expectedMessage =
288 HdmiCecMessageBuilder.buildFeatureAbortCommand(
289 ADDR_AUDIO_SYSTEM,
290 ADDR_TV,
291 Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
292 Constants.ABORT_UNABLE_TO_DETERMINE);
293
Amy06dc4cd2018-08-09 18:22:40 -0700294 mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
Nick Chalko167529c2018-07-18 13:11:31 -0700295 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700296 mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
297 MESSAGE_REQUEST_SAD_LCPM))
298 .isEqualTo(true);
Nick Chalko167529c2018-07-18 13:11:31 -0700299 mTestLooper.dispatchAll();
300 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
301 }
302
303 @Test
Amy93a97b92018-08-17 14:58:41 -0700304 public void handleSetSystemAudioMode_setOn_orignalOff() throws Exception {
Amyfc56efb2018-07-09 16:37:07 -0700305 mMusicMute = true;
Nick Chalko10e52c92018-07-25 16:07:16 -0700306 HdmiCecMessage messageSet =
307 HdmiCecMessageBuilder.buildSetSystemAudioMode(ADDR_TV, ADDR_AUDIO_SYSTEM, true);
308 HdmiCecMessage messageGive =
309 HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amyfc56efb2018-07-09 16:37:07 -0700310 // Check if originally off
Nick Chalko10e52c92018-07-25 16:07:16 -0700311 HdmiCecMessage expectedMessage =
312 HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Shubang2fd186e2018-07-18 16:53:12 -0700313 assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
Amy06dc4cd2018-08-09 18:22:40 -0700314 .isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700315 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700316 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amyfc56efb2018-07-09 16:37:07 -0700317 // Check if correctly turned on
Nick Chalko90d44322018-07-27 08:35:12 -0700318 mNativeWrapper.clearResultMessages();
Nick Chalko10e52c92018-07-25 16:07:16 -0700319 expectedMessage =
Amy06dc4cd2018-08-09 18:22:40 -0700320 HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
Nick Chalko90d44322018-07-27 08:35:12 -0700321 assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)).isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700322 mTestLooper.dispatchAll();
Shubang2fd186e2018-07-18 16:53:12 -0700323 assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
Amy06dc4cd2018-08-09 18:22:40 -0700324 .isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700325 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700326 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amy77c7c982018-07-23 18:27:36 -0700327 assertThat(mMusicMute).isFalse();
Amy9b91e8c2018-06-11 17:26:26 -0700328 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700329
Amy9b91e8c2018-06-11 17:26:26 -0700330 @Test
Amy93a97b92018-08-17 14:58:41 -0700331 public void handleSystemAudioModeRequest_turnOffByTv() throws Exception {
Amy77c7c982018-07-23 18:27:36 -0700332 assertThat(mMusicMute).isFalse();
Amy9b91e8c2018-06-11 17:26:26 -0700333 // Check if feature correctly turned off
Nick Chalko10e52c92018-07-25 16:07:16 -0700334 HdmiCecMessage messageGive =
335 HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
336 HdmiCecMessage messageRequestOff =
337 HdmiCecMessageBuilder.buildSystemAudioModeRequest(
338 ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false);
339 HdmiCecMessage expectedMessage =
340 HdmiCecMessageBuilder.buildSetSystemAudioMode(
341 ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
Shubang2fd186e2018-07-18 16:53:12 -0700342 assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff))
Amy06dc4cd2018-08-09 18:22:40 -0700343 .isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700344 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700345 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
346
347 mNativeWrapper.clearResultMessages();
Nick Chalko10e52c92018-07-25 16:07:16 -0700348 expectedMessage =
Amy06dc4cd2018-08-09 18:22:40 -0700349 HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
Shubang2fd186e2018-07-18 16:53:12 -0700350 assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
Amy06dc4cd2018-08-09 18:22:40 -0700351 .isTrue();
Amy9b91e8c2018-06-11 17:26:26 -0700352 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700353 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amy77c7c982018-07-23 18:27:36 -0700354 assertThat(mMusicMute).isTrue();
Amy4e7ff1a2018-06-07 16:24:31 -0700355 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700356
Amyb887fa02018-06-21 11:22:13 -0700357 @Test
Amy93a97b92018-08-17 14:58:41 -0700358 public void onStandbyAudioSystem_currentSystemAudioControlOn() throws Exception {
Amyb887fa02018-06-21 11:22:13 -0700359 // Set system audio control on first
Amy06dc4cd2018-08-09 18:22:40 -0700360 mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
Amyb887fa02018-06-21 11:22:13 -0700361 // Check if standby correctly turns off the feature
362 mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF);
363 mTestLooper.dispatchAll();
Nick Chalko10e52c92018-07-25 16:07:16 -0700364 HdmiCecMessage expectedMessage =
365 HdmiCecMessageBuilder.buildSetSystemAudioMode(
366 ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
Nick Chalko90d44322018-07-27 08:35:12 -0700367 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amy77c7c982018-07-23 18:27:36 -0700368 assertThat(mMusicMute).isTrue();
Amyb887fa02018-06-21 11:22:13 -0700369 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700370
Amy6506bd62018-07-02 17:29:36 -0700371 @Test
Amy93a97b92018-08-17 14:58:41 -0700372 public void systemAudioControlOnPowerOn_alwaysOn() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700373 mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
Amy6506bd62018-07-02 17:29:36 -0700374 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Shubangeff3c882018-07-19 16:00:29 -0700375 Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
Nick Chalko10e52c92018-07-25 16:07:16 -0700376 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700377 mHdmiCecLocalDeviceAudioSystem.getActions(
378 SystemAudioInitiationActionFromAvr.class))
379 .isNotEmpty();
Amy6506bd62018-07-02 17:29:36 -0700380 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700381
Amy6506bd62018-07-02 17:29:36 -0700382 @Test
Amy93a97b92018-08-17 14:58:41 -0700383 public void systemAudioControlOnPowerOn_neverOn() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700384 mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
Amy6506bd62018-07-02 17:29:36 -0700385 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Shubangeff3c882018-07-19 16:00:29 -0700386 Constants.NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
Nick Chalko10e52c92018-07-25 16:07:16 -0700387 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700388 mHdmiCecLocalDeviceAudioSystem.getActions(
389 SystemAudioInitiationActionFromAvr.class))
390 .isEmpty();
Amy6506bd62018-07-02 17:29:36 -0700391 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700392
Amy6506bd62018-07-02 17:29:36 -0700393 @Test
Amy93a97b92018-08-17 14:58:41 -0700394 public void systemAudioControlOnPowerOn_useLastState_off() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700395 mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
Amy6506bd62018-07-02 17:29:36 -0700396 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Shubangeff3c882018-07-19 16:00:29 -0700397 Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false);
Nick Chalko10e52c92018-07-25 16:07:16 -0700398 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700399 mHdmiCecLocalDeviceAudioSystem.getActions(
400 SystemAudioInitiationActionFromAvr.class))
401 .isEmpty();
Amy6506bd62018-07-02 17:29:36 -0700402 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700403
Amy6506bd62018-07-02 17:29:36 -0700404 @Test
Amy93a97b92018-08-17 14:58:41 -0700405 public void systemAudioControlOnPowerOn_useLastState_on() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700406 mHdmiCecLocalDeviceAudioSystem.removeAction(SystemAudioInitiationActionFromAvr.class);
Amy6506bd62018-07-02 17:29:36 -0700407 mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn(
Shubangeff3c882018-07-19 16:00:29 -0700408 Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true);
Nick Chalko10e52c92018-07-25 16:07:16 -0700409 assertThat(
Amy06dc4cd2018-08-09 18:22:40 -0700410 mHdmiCecLocalDeviceAudioSystem.getActions(
411 SystemAudioInitiationActionFromAvr.class))
412 .isNotEmpty();
Amy6506bd62018-07-02 17:29:36 -0700413 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700414
Amye30f9932018-07-13 13:54:52 -0700415 @Test
Amy93a97b92018-08-17 14:58:41 -0700416 public void handleActiveSource_updateActiveSource() throws Exception {
Nick Chalko10e52c92018-07-25 16:07:16 -0700417 HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
Amye30f9932018-07-13 13:54:52 -0700418 ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000);
Nick Chalko90d44322018-07-27 08:35:12 -0700419 assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue();
Amye30f9932018-07-13 13:54:52 -0700420 mTestLooper.dispatchAll();
Shubang2fd186e2018-07-18 16:53:12 -0700421 assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource))
Amy06dc4cd2018-08-09 18:22:40 -0700422 .isTrue();
Shubang2fd186e2018-07-18 16:53:12 -0700423 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700424
Shubang2fd186e2018-07-18 16:53:12 -0700425 @Test
Amy93a97b92018-08-17 14:58:41 -0700426 public void terminateSystemAudioMode_systemAudioModeOff() throws Exception {
Amy06dc4cd2018-08-09 18:22:40 -0700427 mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
Amy77c7c982018-07-23 18:27:36 -0700428 assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
Shubang2fd186e2018-07-18 16:53:12 -0700429 mMusicMute = false;
Nick Chalko10e52c92018-07-25 16:07:16 -0700430 HdmiCecMessage message =
431 HdmiCecMessageBuilder.buildSetSystemAudioMode(
432 ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
Shubang2fd186e2018-07-18 16:53:12 -0700433 mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode();
Amy77c7c982018-07-23 18:27:36 -0700434 assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
435 assertThat(mMusicMute).isFalse();
Nick Chalko90d44322018-07-27 08:35:12 -0700436 assertThat(mNativeWrapper.getResultMessages()).isEmpty();
Shubang2fd186e2018-07-18 16:53:12 -0700437 }
Nick Chalko10e52c92018-07-25 16:07:16 -0700438
Shubang2fd186e2018-07-18 16:53:12 -0700439 @Test
Amy93a97b92018-08-17 14:58:41 -0700440 public void terminateSystemAudioMode_systemAudioModeOn() throws Exception {
Amy06dc4cd2018-08-09 18:22:40 -0700441 mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
Amy77c7c982018-07-23 18:27:36 -0700442 assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
Shubang2fd186e2018-07-18 16:53:12 -0700443 mMusicMute = false;
Nick Chalko10e52c92018-07-25 16:07:16 -0700444 HdmiCecMessage expectedMessage =
445 HdmiCecMessageBuilder.buildSetSystemAudioMode(
446 ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
Shubang2fd186e2018-07-18 16:53:12 -0700447 mHdmiCecLocalDeviceAudioSystem.terminateSystemAudioMode();
Amy77c7c982018-07-23 18:27:36 -0700448 assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
449 assertThat(mMusicMute).isTrue();
Shubang2fd186e2018-07-18 16:53:12 -0700450 mTestLooper.dispatchAll();
Shubangeff3c882018-07-19 16:00:29 -0700451 assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
Amye30f9932018-07-13 13:54:52 -0700452 }
Amyac1a55c2018-07-13 16:38:23 -0700453
454 @Test
Amy93a97b92018-08-17 14:58:41 -0700455 public void handleRequestArcInitiate_isNotDirectConnectedToTv() throws Exception {
Nick Chalko90d44322018-07-27 08:35:12 -0700456 HdmiCecMessage message =
457 HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
458 HdmiCecMessage expectedMessage =
459 HdmiCecMessageBuilder.buildFeatureAbortCommand(
460 ADDR_AUDIO_SYSTEM,
461 ADDR_TV,
462 Constants.MESSAGE_REQUEST_ARC_INITIATION,
463 Constants.ABORT_NOT_IN_CORRECT_MODE);
Amy77c7c982018-07-23 18:27:36 -0700464 mNativeWrapper.setPhysicalAddress(0x1100);
465
Nick Chalko90d44322018-07-27 08:35:12 -0700466 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
Amy77c7c982018-07-23 18:27:36 -0700467 mTestLooper.dispatchAll();
468 assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
469 }
470
471 @Test
Amy93a97b92018-08-17 14:58:41 -0700472 public void handleRequestArcInitiate_startArcInitiationActionFromAvr() throws Exception {
Nick Chalko90d44322018-07-27 08:35:12 -0700473 HdmiCecMessage message =
474 HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
Amy77c7c982018-07-23 18:27:36 -0700475 mNativeWrapper.setPhysicalAddress(0x1000);
Nick Chalko90d44322018-07-27 08:35:12 -0700476 mHdmiCecLocalDeviceAudioSystem.removeAction(ArcInitiationActionFromAvr.class);
Amy77c7c982018-07-23 18:27:36 -0700477
Nick Chalko90d44322018-07-27 08:35:12 -0700478 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
Amy77c7c982018-07-23 18:27:36 -0700479 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700480 assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcInitiationActionFromAvr.class))
Amy06dc4cd2018-08-09 18:22:40 -0700481 .isNotEmpty();
Amy77c7c982018-07-23 18:27:36 -0700482 }
483
484 @Test
Amy93a97b92018-08-17 14:58:41 -0700485 public void handleRequestArcTerminate_arcIsOn_startTerminationActionFromAvr() throws Exception {
Amy77c7c982018-07-23 18:27:36 -0700486 mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
487 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isTrue();
488
Nick Chalko90d44322018-07-27 08:35:12 -0700489 HdmiCecMessage message =
490 HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
491 mHdmiCecLocalDeviceAudioSystem.removeAction(ArcTerminationActionFromAvr.class);
Amy77c7c982018-07-23 18:27:36 -0700492
Nick Chalko90d44322018-07-27 08:35:12 -0700493 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue();
Amy77c7c982018-07-23 18:27:36 -0700494 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700495 assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcTerminationActionFromAvr.class))
Amy06dc4cd2018-08-09 18:22:40 -0700496 .isNotEmpty();
Amy77c7c982018-07-23 18:27:36 -0700497 }
498
499 @Test
Amy93a97b92018-08-17 14:58:41 -0700500 public void handleRequestArcTerminate_arcIsNotOn() throws Exception {
Amy77c7c982018-07-23 18:27:36 -0700501 assertThat(mHdmiCecLocalDeviceAudioSystem.isArcEnabled()).isFalse();
Nick Chalko90d44322018-07-27 08:35:12 -0700502 HdmiCecMessage message =
503 HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
504 HdmiCecMessage expectedMessage =
505 HdmiCecMessageBuilder.buildFeatureAbortCommand(
506 ADDR_AUDIO_SYSTEM,
507 ADDR_TV,
508 Constants.MESSAGE_REQUEST_ARC_TERMINATION,
509 Constants.ABORT_NOT_IN_CORRECT_MODE);
Amy77c7c982018-07-23 18:27:36 -0700510
Nick Chalko90d44322018-07-27 08:35:12 -0700511 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue();
Amy77c7c982018-07-23 18:27:36 -0700512 mTestLooper.dispatchAll();
513 assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
514 }
515
516 @Test
Amy93a97b92018-08-17 14:58:41 -0700517 public void handleRequestArcInit_arcIsNotSupported() throws Exception {
Nick Chalko90d44322018-07-27 08:35:12 -0700518 HdmiCecMessage message =
519 HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
520 HdmiCecMessage expectedMessage =
521 HdmiCecMessageBuilder.buildFeatureAbortCommand(
522 ADDR_AUDIO_SYSTEM,
523 ADDR_TV,
524 Constants.MESSAGE_REQUEST_ARC_INITIATION,
525 Constants.ABORT_UNRECOGNIZED_OPCODE);
Amyaa8ae682018-12-12 16:11:50 -0800526 mArcSupport = false;
Amy77c7c982018-07-23 18:27:36 -0700527
Nick Chalko90d44322018-07-27 08:35:12 -0700528 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue();
Amy77c7c982018-07-23 18:27:36 -0700529 mTestLooper.dispatchAll();
Nick Chalko90d44322018-07-27 08:35:12 -0700530 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
Amyac1a55c2018-07-13 16:38:23 -0700531 }
Amy93a97b92018-08-17 14:58:41 -0700532
Amy06dc4cd2018-08-09 18:22:40 -0700533 public void handleSystemAudioModeRequest_fromNonTV_tVNotSupport() {
534 HdmiCecMessage message =
535 HdmiCecMessageBuilder.buildSystemAudioModeRequest(
536 ADDR_TUNER_1, ADDR_AUDIO_SYSTEM,
Amyaa8ae682018-12-12 16:11:50 -0800537 SELF_PHYSICAL_ADDRESS, true);
Amy06dc4cd2018-08-09 18:22:40 -0700538 HdmiCecMessage expectedMessage =
539 HdmiCecMessageBuilder.buildFeatureAbortCommand(
540 ADDR_AUDIO_SYSTEM,
541 ADDR_TUNER_1,
542 Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST,
543 Constants.ABORT_REFUSED);
544
545 assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue();
546 mTestLooper.dispatchAll();
547 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
548 }
549
550 @Test
551 public void handleSystemAudioModeRequest_fromNonTV_tVSupport() {
552 HdmiCecMessage message =
553 HdmiCecMessageBuilder.buildSystemAudioModeRequest(
554 ADDR_TUNER_1, ADDR_AUDIO_SYSTEM,
Amyaa8ae682018-12-12 16:11:50 -0800555 SELF_PHYSICAL_ADDRESS, true);
Amy06dc4cd2018-08-09 18:22:40 -0700556 HdmiCecMessage expectedMessage =
557 HdmiCecMessageBuilder.buildSetSystemAudioMode(
558 ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true);
559 mHdmiCecLocalDeviceAudioSystem.setTvSystemAudioModeSupport(true);
560
561
562 assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue();
563 mTestLooper.dispatchAll();
564 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
565 }
Amy225d55a2018-09-06 11:03:51 -0700566
567 @Test
568 public void handleActiveSource_activeSourceFromTV_swithToArc() {
569 mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
570 HdmiCecMessage message =
571 HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
572
573 ActiveSource expectedActiveSource = ActiveSource.of(ADDR_TV, 0x0000);
574
575 assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue();
576 mTestLooper.dispatchAll();
577 assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
578 .isEqualTo(expectedActiveSource);
579 }
Amy79b54e92018-09-11 17:02:28 -0700580
581 @Test
582 public void handleRoutingChange_currentActivePortIsHome() {
583 HdmiCecMessage message =
Amyaa8ae682018-12-12 16:11:50 -0800584 HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x3000, SELF_PHYSICAL_ADDRESS);
Amy79b54e92018-09-11 17:02:28 -0700585
586 HdmiCecMessage expectedMessage =
Amyaa8ae682018-12-12 16:11:50 -0800587 HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS);
588 ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS);
Amy79b54e92018-09-11 17:02:28 -0700589 int expectedLocalActivePort = Constants.CEC_SWITCH_HOME;
590
591 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue();
592 mTestLooper.dispatchAll();
593 assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
594 .isEqualTo(expectedActiveSource);
Amy03afe482018-09-18 16:57:45 -0700595 assertThat(mHdmiCecLocalDeviceAudioSystem.getRoutingPort())
Amy79b54e92018-09-11 17:02:28 -0700596 .isEqualTo(expectedLocalActivePort);
Amycd18d282018-09-25 11:19:06 -0700597 assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
Amy79b54e92018-09-11 17:02:28 -0700598 }
599
600 @Test
601 public void handleRoutingInformation_currentActivePortIsHDMI1() {
602 HdmiCecMessage message =
Amyaa8ae682018-12-12 16:11:50 -0800603 HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, SELF_PHYSICAL_ADDRESS);
604 mHdmiCecLocalDeviceAudioSystem.setRoutingPort(mHdmiPortInfo[1].getId());
Amy79b54e92018-09-11 17:02:28 -0700605 HdmiCecMessage expectedMessage =
Amyaa8ae682018-12-12 16:11:50 -0800606 HdmiCecMessageBuilder.buildRoutingInformation(
607 ADDR_AUDIO_SYSTEM, HDMI_1_PHYSICAL_ADDRESS);
Amy79b54e92018-09-11 17:02:28 -0700608
609 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingInformation(message)).isTrue();
610 mTestLooper.dispatchAll();
611 assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
612 }
Amy8b4a4a92018-09-18 16:01:01 -0700613
Amyaa8ae682018-12-12 16:11:50 -0800614 @Ignore("b/120845532")
Amy8b4a4a92018-09-18 16:01:01 -0700615 @Test
616 public void handleRoutingChange_homeIsActive_playbackSendActiveSource() {
617 HdmiCecMessage message =
618 HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x2000);
619
620 HdmiCecMessage expectedMessage =
621 HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, 0x2000);
622
623 assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue();
624 mTestLooper.dispatchAll();
Amycd18d282018-09-25 11:19:06 -0700625 assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
Amy8b4a4a92018-09-18 16:01:01 -0700626 }
Amy89e93af2018-10-15 09:56:54 -0700627
628 @Test
629 public void updateCecDevice_deviceNotExists_addDevice() {
630 assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_ADD_DEVICE);
631 HdmiDeviceInfo newDevice = new HdmiDeviceInfo(
632 ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
633 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
634
635 mHdmiCecLocalDeviceAudioSystem.updateCecDevice(newDevice);
636 assertThat(mDeviceInfo).isEqualTo(newDevice);
637 assertThat(mHdmiCecLocalDeviceAudioSystem
638 .getCecDeviceInfo(newDevice.getLogicalAddress())).isEqualTo(newDevice);
639 assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_ADD_DEVICE);
640 }
641
642 @Test
643 public void updateCecDevice_deviceExists_doNothing() {
644 mInvokeDeviceEventState = 0;
645 HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
646 ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
647 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
648 mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
649
650 mHdmiCecLocalDeviceAudioSystem.updateCecDevice(oldDevice);
651 assertThat(mInvokeDeviceEventState).isEqualTo(0);
652 }
653
654 @Test
655 public void updateCecDevice_deviceInfoDifferent_updateDevice() {
656 assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_UPDATE_DEVICE);
657 HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
658 ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
659 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
660 mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
661
662 HdmiDeviceInfo differentDevice = new HdmiDeviceInfo(
Amyaa8ae682018-12-12 16:11:50 -0800663 ADDR_PLAYBACK_1, 0x2300, 4, HdmiDeviceInfo.DEVICE_PLAYBACK,
Amy89e93af2018-10-15 09:56:54 -0700664 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
665
666 mHdmiCecLocalDeviceAudioSystem.updateCecDevice(differentDevice);
667 assertThat(mDeviceInfo).isEqualTo(differentDevice);
668 assertThat(mHdmiCecLocalDeviceAudioSystem
669 .getCecDeviceInfo(differentDevice.getLogicalAddress())).isEqualTo(differentDevice);
670 assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_UPDATE_DEVICE);
671 }
672
673 @Test
674 public void handleReportPhysicalAddress_differentPath_addDevice() {
675 assertThat(mInvokeDeviceEventState).isNotEqualTo(DEVICE_EVENT_ADD_DEVICE);
676 HdmiDeviceInfo oldDevice = new HdmiDeviceInfo(
677 ADDR_PLAYBACK_1, 0x2100, 2, HdmiDeviceInfo.DEVICE_PLAYBACK,
678 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_1));
679 mHdmiCecLocalDeviceAudioSystem.addDeviceInfo(oldDevice);
680
681 HdmiDeviceInfo differentDevice = new HdmiDeviceInfo(
Amyaa8ae682018-12-12 16:11:50 -0800682 ADDR_PLAYBACK_2, 0x2200, 1, HdmiDeviceInfo.DEVICE_PLAYBACK,
683 Constants.UNKNOWN_VENDOR_ID, HdmiUtils.getDefaultDeviceName(ADDR_PLAYBACK_2));
Amy89e93af2018-10-15 09:56:54 -0700684 HdmiCecMessage reportPhysicalAddress = HdmiCecMessageBuilder
685 .buildReportPhysicalAddressCommand(
Amyaa8ae682018-12-12 16:11:50 -0800686 ADDR_PLAYBACK_2, 0x2200, HdmiDeviceInfo.DEVICE_PLAYBACK);
Amy89e93af2018-10-15 09:56:54 -0700687 mHdmiCecLocalDeviceAudioSystem.handleReportPhysicalAddress(reportPhysicalAddress);
688
Amy89e93af2018-10-15 09:56:54 -0700689 mTestLooper.dispatchAll();
690 assertThat(mDeviceInfo).isEqualTo(differentDevice);
691 assertThat(mHdmiCecLocalDeviceAudioSystem
692 .getCecDeviceInfo(differentDevice.getLogicalAddress())).isEqualTo(differentDevice);
693 assertThat(mInvokeDeviceEventState).isEqualTo(DEVICE_EVENT_ADD_DEVICE);
694 }
Amy2a6c3dc2018-06-05 17:31:55 -0700695}