/* * Copyright (C) 2016 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.dvr.ui.playback; import android.media.tv.TvTrackInfo; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v17.leanback.app.GuidedStepFragment; import android.support.v17.leanback.widget.GuidedAction; import android.text.TextUtils; import android.transition.Transition; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.tv.R; import com.android.tv.util.TvSettings; import java.util.List; import java.util.Locale; /** * Fragment for DVR playback closed-caption/multi-audio settings. */ public class DvrPlaybackSideFragment extends GuidedStepFragment { /** * The tag for passing track infos to side fragments. */ public static final String TRACK_INFOS = "dvr_key_track_infos"; /** * The tag for passing selected track's ID to side fragments. */ public static final String SELECTED_TRACK_ID = "dvr_key_selected_track_id"; private static final int ACTION_ID_NO_SUBTITLE = -1; private static final int CHECK_SET_ID = 1; private List mTrackInfos; private String mSelectedTrackId; private TvTrackInfo mSelectedTrack; private int mTrackType; private DvrPlaybackOverlayFragment mOverlayFragment; @Override public void onCreate(Bundle savedInstanceState) { mTrackInfos = getArguments().getParcelableArrayList(TRACK_INFOS); mTrackType = mTrackInfos.get(0).getType(); mSelectedTrackId = getArguments().getString(SELECTED_TRACK_ID); mOverlayFragment = ((DvrPlaybackOverlayFragment) getFragmentManager() .findFragmentById(R.id.dvr_playback_controls_fragment)); super.onCreate(savedInstanceState); } @Override public View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View backgroundView = super.onCreateBackgroundView(inflater, container, savedInstanceState); backgroundView.setBackgroundColor(getResources() .getColor(R.color.lb_playback_controls_background_light)); return backgroundView; } @Override public void onCreateActions(@NonNull List actions, Bundle savedInstanceState) { if (mTrackType == TvTrackInfo.TYPE_SUBTITLE) { actions.add(new GuidedAction.Builder(getActivity()) .id(ACTION_ID_NO_SUBTITLE) .title(getString(R.string.closed_caption_option_item_off)) .checkSetId(CHECK_SET_ID) .checked(mSelectedTrackId == null) .build()); } for (int i = 0; i < mTrackInfos.size(); i++) { TvTrackInfo info = mTrackInfos.get(i); boolean checked = TextUtils.equals(info.getId(), mSelectedTrackId); GuidedAction action = new GuidedAction.Builder(getActivity()) .id(i) .title(getTrackLabel(info, i)) .checkSetId(CHECK_SET_ID) .checked(checked) .build(); actions.add(action); if (checked) { mSelectedTrack = info; } } } @Override public void onGuidedActionFocused(GuidedAction action) { int actionId = (int) action.getId(); mOverlayFragment.selectTrack(mTrackType, actionId < 0 ? null : mTrackInfos.get(actionId)); } @Override public void onGuidedActionClicked(GuidedAction action) { int actionId = (int) action.getId(); mSelectedTrack = actionId < 0 ? null : mTrackInfos.get(actionId); TvSettings.setDvrPlaybackTrackSettings(getContext(), mTrackType, mSelectedTrack); getFragmentManager().popBackStack(); } @Override public void onStart() { super.onStart(); // Workaround: when overlay fragment is faded out, any focus will lost due to overlay // fragment's implementation. So we disable overlay fragment's fading here to prevent // losing focus while users are interacting with the side fragment. mOverlayFragment.setFadingEnabled(false); } @Override public void onStop() { super.onStop(); // We disable fading of overlay fragment to prevent side fragment from losing focus, // therefore we should resume it here. mOverlayFragment.setFadingEnabled(true); mOverlayFragment.selectTrack(mTrackType, mSelectedTrack); } private String getTrackLabel(TvTrackInfo track, int trackIndex) { if (track.getLanguage() != null) { return new Locale(track.getLanguage()).getDisplayName(); } return track.getType() == TvTrackInfo.TYPE_SUBTITLE ? getString(R.string.closed_caption_unknown_language, trackIndex + 1) : getString(R.string.multi_audio_unknown_language); } @Override protected void onProvideFragmentTransitions() { super.onProvideFragmentTransitions(); // Excludes the background scrim from transition to prevent the blinking caused by // hiding the overlay fragment and sliding in the side fragment at the same time. Transition t = getEnterTransition(); if (t != null) { t.excludeTarget(R.id.guidedstep_background, true); } } }