PlaybackTestSupportFragment.java revision 5a4d3a98d681cc9042b28a923aa5a23a6b961998
1f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu// CHECKSTYLE:OFF Generated code
2f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu/* This file is auto-generated from PlaybackTestFragment.java.  DO NOT MODIFY. */
3f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu
44c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri/*
54c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * Copyright (C) 2016 The Android Open Source Project
64c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri *
74c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * Licensed under the Apache License, Version 2.0 (the "License");
84c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * you may not use this file except in compliance with the License.
94c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * You may obtain a copy of the License at
104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri *
114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri *      http://www.apache.org/licenses/LICENSE-2.0
124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri *
134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * Unless required by applicable law or agreed to in writing, software
144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * distributed under the License is distributed on an "AS IS" BASIS,
154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * See the License for the specific language governing permissions and
174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri * limitations under the License.
184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri */
194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiripackage android.support.v17.leanback.app;
204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.content.Context;
224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.graphics.drawable.Drawable;
234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.os.Bundle;
244c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.os.Handler;
254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.media.PlaybackControlGlue;
264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.test.R;
274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.Action;
284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.ArrayObjectAdapter;
295a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Guimport android.support.v17.leanback.widget.ClassPresenterSelector;
304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.HeaderItem;
314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.ListRow;
324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.ListRowPresenter;
334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.OnItemViewClickedListener;
344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.PlaybackControlsRow;
354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.Presenter;
364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.PresenterSelector;
374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.Row;
384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.RowPresenter;
394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.support.v17.leanback.widget.SparseArrayObjectAdapter;
404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.util.Log;
414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.view.KeyEvent;
424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.view.View;
434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiriimport android.widget.Toast;
444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
45f37579e64940bfdd642cc315f6347d60b5addd69Dake Gupublic class PlaybackTestSupportFragment extends PlaybackSupportFragment {
46f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu    private static final String TAG = "PlaybackTestSupportFragment";
474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    /**
494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     * Change this to choose a different overlay background.
504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     */
51f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu    private static final int BACKGROUND_TYPE = PlaybackSupportFragment.BG_LIGHT;
524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    /**
544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     * Change this to select hidden
554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     */
564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private static final boolean SECONDARY_HIDDEN = false;
574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    /**
594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     * Change the number of related content rows.
604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri     */
614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private static final int RELATED_CONTENT_ROWS = 3;
624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private android.support.v17.leanback.media.PlaybackControlGlue mGlue;
646f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    boolean mDestroyCalled;
654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public SparseArrayObjectAdapter getAdapter() {
674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        return (SparseArrayObjectAdapter) super.getAdapter();
684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            Log.d(TAG, "onItemClicked: " + item + " row " + row);
754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    };
774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
784c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    @Override
796f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    public void onDestroy() {
806f8b365afb35cda46d1c4042ce633c1177197808Dake Gu        super.onDestroy();
816f8b365afb35cda46d1c4042ce633c1177197808Dake Gu        mDestroyCalled = true;
826f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    }
836f8b365afb35cda46d1c4042ce633c1177197808Dake Gu
846f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    @Override
854c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public void onCreate(Bundle savedInstanceState) {
864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        Log.i(TAG, "onCreate");
874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        super.onCreate(savedInstanceState);
884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        setBackgroundType(BACKGROUND_TYPE);
904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        createComponents(getActivity());
924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        setOnItemViewClickedListener(mOnItemViewClickedListener);
934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private void createComponents(Context context) {
964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        mGlue = new PlaybackControlHelper(context) {
974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public int getUpdatePeriod() {
994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                int totalTime = getControlsRow().getTotalTime();
1004c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) {
1014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return 1000;
1024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
1034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return Math.max(16, totalTime / getView().getWidth());
1044c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public void onActionClicked(Action action) {
1084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (action.getId() == R.id.lb_control_picture_in_picture) {
1094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    getActivity().enterPictureInPictureMode();
1104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return;
1114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
1124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                super.onActionClicked(action);
1134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            protected void onCreateControlsRowAndPresenter() {
1174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                super.onCreateControlsRowAndPresenter();
1184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                getControlsRowPresenter().setSecondaryActionsHidden(SECONDARY_HIDDEN);
1194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        };
1214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        mGlue.setHost(new PlaybackSupportFragmentGlueHost(this));
1235a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        ClassPresenterSelector selector = new ClassPresenterSelector();
1245a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        selector.addClassPresenter(ListRow.class, new ListRowPresenter());
1254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1265a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        setAdapter(new SparseArrayObjectAdapter(selector));
1274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        // Add related content rows
1294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
1304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
1314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            listRowAdapter.add("Some related content");
1324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            listRowAdapter.add("Other related content");
1334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            HeaderItem header = new HeaderItem(i, "Row " + i);
1345a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu            getAdapter().set(1 + i, new ListRow(header, listRowAdapter));
1354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
1374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public PlaybackControlGlue getGlue() {
1394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        return mGlue;
1404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
1414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    abstract static class PlaybackControlHelper extends PlaybackControlGlue {
1434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        /**
1444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri         * Change the location of the thumbs up/down controls
1454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri         */
1464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final boolean THUMBS_PRIMARY = true;
1474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final String FAUX_TITLE = "A short song of silence";
1494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final String FAUX_SUBTITLE = "2014";
1504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final int FAUX_DURATION = 33 * 1000;
1514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        // These should match the playback service FF behavior
1534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static int[] sFastForwardSpeeds = { 2, 3, 4, 5 };
1544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private boolean mIsPlaying;
1564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private int mSpeed = PLAYBACK_SPEED_PAUSED;
1574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private long mStartTime;
1584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private long mStartPosition = 0;
1594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.RepeatAction mRepeatAction;
1614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
1624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
1634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.PictureInPictureAction mPipAction;
1644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static Handler sProgressHandler = new Handler();
1654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private final Runnable mUpdateProgressRunnable = new Runnable() {
1674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public void run() {
1694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                updateProgress();
1704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                sProgressHandler.postDelayed(this, getUpdatePeriod());
1714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        };
1734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        PlaybackControlHelper(Context context) {
1754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            super(context, sFastForwardSpeeds);
1764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
1774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsUpAction.OUTLINE);
1784c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
1794c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsDownAction.OUTLINE);
1804c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
1814c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mPipAction = new PlaybackControlsRow.PictureInPictureAction(context);
1824c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1834c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1844c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
1854c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
1864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                PresenterSelector presenterSelector) {
1874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
1884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (THUMBS_PRIMARY) {
1894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                adapter.set(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
1904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                adapter.set(PlaybackControlGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
1914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return adapter;
1934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
1964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void onActionClicked(Action action) {
1974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (shouldDispatchAction(action)) {
1984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                dispatchAction(action);
1994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
2004c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            super.onActionClicked(action);
2024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2044c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
2064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
2074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                Action action = getControlsRow().getActionForKeyCode(keyEvent.getKeyCode());
2084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (shouldDispatchAction(action)) {
2094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    dispatchAction(action);
2104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return true;
2114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
2124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return super.onKey(view, keyCode, keyEvent);
2144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private boolean shouldDispatchAction(Action action) {
2174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return action == mRepeatAction || action == mThumbsUpAction
2184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    || action == mThumbsDownAction;
2194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private void dispatchAction(Action action) {
2224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            Toast.makeText(getContext(), action.toString(), Toast.LENGTH_SHORT).show();
2234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
2244c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            multiAction.nextIndex();
2254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            notifyActionChanged(multiAction);
2264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
2294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            int index;
2304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            index = getPrimaryActionsAdapter().indexOf(action);
2314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (index >= 0) {
2324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
2334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else {
2344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                index = getSecondaryActionsAdapter().indexOf(action);
2354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (index >= 0) {
2364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
2374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
2384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
2424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (SparseArrayObjectAdapter) getControlsRow().getPrimaryActionsAdapter();
2434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private ArrayObjectAdapter getSecondaryActionsAdapter() {
2464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (ArrayObjectAdapter) getControlsRow().getSecondaryActionsAdapter();
2474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean hasValidMedia() {
2514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return true;
2524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean isMediaPlaying() {
2564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return mIsPlaying;
2574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public CharSequence getMediaTitle() {
2614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_TITLE;
2624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public CharSequence getMediaSubtitle() {
2664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_SUBTITLE;
2674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getMediaDuration() {
2714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_DURATION;
2724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public Drawable getMediaArt() {
2764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return null;
2774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2784c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2794c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2804c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public long getSupportedActions() {
2814c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return ACTION_PLAY_PAUSE | ACTION_FAST_FORWARD | ACTION_REWIND;
2824c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2834c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2844c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2854c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getCurrentSpeedId() {
2864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return mSpeed;
2874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getCurrentPosition() {
2914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            int speed;
2924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
2934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = 0;
2944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_NORMAL) {
2954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = 1;
2964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed >= PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
2974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                int index = mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
2984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = getFastForwardSpeeds()[index];
2994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed <= -PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
3004c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                int index = -mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
3014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = -getRewindSpeeds()[index];
3024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else {
3034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return -1;
3044c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            long position = mStartPosition + (System.currentTimeMillis() - mStartTime) * speed;
3064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (position > getMediaDuration()) {
3074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                position = getMediaDuration();
3084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                onPlaybackComplete(true);
3094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (position < 0) {
3104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                position = 0;
3114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                onPlaybackComplete(false);
3124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (int) position;
3144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        void onPlaybackComplete(final boolean ended) {
3174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            sProgressHandler.post(new Runnable() {
3184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                @Override
3194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                public void run() {
3204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.NONE) {
3214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                        pause();
3224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    } else {
3234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                        play(PlaybackControlGlue.PLAYBACK_SPEED_NORMAL);
3244c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    }
3254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    mStartPosition = 0;
3264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    onStateChanged();
3274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
3284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            });
3294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void play(int speed) {
3334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (speed == mSpeed) {
3344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
3354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartPosition = getCurrentPosition();
3374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mSpeed = speed;
3384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mIsPlaying = true;
3394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartTime = System.currentTimeMillis();
3404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void pause() {
3444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (mSpeed == PLAYBACK_SPEED_PAUSED) {
3454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
3464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartPosition = getCurrentPosition();
3484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mSpeed = PLAYBACK_SPEED_PAUSED;
3494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mIsPlaying = false;
3504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void next() {
3544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            // Not supported
3554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void previous() {
3594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            // Not supported
3604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void enableProgressUpdating(boolean enable) {
3644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            sProgressHandler.removeCallbacks(mUpdateProgressRunnable);
3654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (enable) {
3664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                mUpdateProgressRunnable.run();
3674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
3704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri}
371