/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tv; import android.content.Context; import android.media.tv.TvTrackInfo; import android.media.tv.TvView; import android.util.AttributeSet; import java.util.HashMap; import java.util.List; import java.util.Map; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.shadows.ShadowView; // TODO(b/78304522): move this class to robolectric /** Shadow class of {@link TvView}. */ @Implements(TvView.class) public class ShadowTvView extends ShadowView { public Map<Integer, String> mSelectedTracks = new HashMap<>(); public Map<Integer, List<TvTrackInfo>> mTracks = new HashMap<>(); public MainActivity.MyOnTuneListener listener; public TvView.TvInputCallback mCallback; public boolean mAudioTrackCountChanged; @Implementation public void __constructor__(Context context) { } @Implementation public void __constructor__(Context context, AttributeSet attrs) { } @Implementation public List<TvTrackInfo> getTracks(int type) { return mTracks.get(type); } @Implementation public void selectTrack(int type, String trackId) { mSelectedTracks.put(type, trackId); int infoIndex = findTrackIndex(type, trackId); // for some drivers, audio track count is set to 0 until the corresponding track is // selected. Here we replace the track with another one whose audio track count is non-zero // to test this case. if (mAudioTrackCountChanged) { replaceTrack(type, infoIndex); } mCallback.onTrackSelected("fakeInputId", type, trackId); } @Implementation public String getSelectedTrack(int type) { return mSelectedTracks.get(type); } @Implementation public void setCallback(TvView.TvInputCallback callback) { mCallback = callback; } private int findTrackIndex(int type, String trackId) { List<TvTrackInfo> tracks = mTracks.get(type); if (tracks == null) { return -1; } for (int i = 0; i < tracks.size(); i++) { TvTrackInfo info = tracks.get(i); if (info.getId().equals(trackId)) { return i; } } return -1; } private void replaceTrack(int type, int trackIndex) { if (trackIndex >= 0) { TvTrackInfo info = mTracks.get(type).get(trackIndex); info = new TvTrackInfo .Builder(info.getType(), info.getId()) .setLanguage(info.getLanguage()) .setAudioChannelCount(info.getAudioChannelCount() + 2) .build(); mTracks.get(type).set(trackIndex, info); } } }