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
66e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas    @Override
674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public SparseArrayObjectAdapter getAdapter() {
684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        return (SparseArrayObjectAdapter) super.getAdapter();
694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            Log.d(TAG, "onItemClicked: " + item + " row " + row);
764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    };
784c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
794c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    @Override
806f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    public void onDestroy() {
816f8b365afb35cda46d1c4042ce633c1177197808Dake Gu        super.onDestroy();
826f8b365afb35cda46d1c4042ce633c1177197808Dake Gu        mDestroyCalled = true;
836f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    }
846f8b365afb35cda46d1c4042ce633c1177197808Dake Gu
856f8b365afb35cda46d1c4042ce633c1177197808Dake Gu    @Override
864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public void onCreate(Bundle savedInstanceState) {
874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        Log.i(TAG, "onCreate");
884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        super.onCreate(savedInstanceState);
894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        setBackgroundType(BACKGROUND_TYPE);
914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        createComponents(getActivity());
934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        setOnItemViewClickedListener(mOnItemViewClickedListener);
944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    private void createComponents(Context context) {
974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        mGlue = new PlaybackControlHelper(context) {
984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public int getUpdatePeriod() {
1003bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                long totalTime = getControlsRow().getDuration();
1014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) {
1024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return 1000;
1034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
1043bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                return 16;
1054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public void onActionClicked(Action action) {
1094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (action.getId() == R.id.lb_control_picture_in_picture) {
1104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    getActivity().enterPictureInPictureMode();
1114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return;
1124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
1134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                super.onActionClicked(action);
1144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            protected void onCreateControlsRowAndPresenter() {
1184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                super.onCreateControlsRowAndPresenter();
1194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                getControlsRowPresenter().setSecondaryActionsHidden(SECONDARY_HIDDEN);
1204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        };
1224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        mGlue.setHost(new PlaybackSupportFragmentGlueHost(this));
1245a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        ClassPresenterSelector selector = new ClassPresenterSelector();
1255a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        selector.addClassPresenter(ListRow.class, new ListRowPresenter());
1264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1275a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu        setAdapter(new SparseArrayObjectAdapter(selector));
1284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        // Add related content rows
1304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
1314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
1324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            listRowAdapter.add("Some related content");
1334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            listRowAdapter.add("Other related content");
1344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            HeaderItem header = new HeaderItem(i, "Row " + i);
1355a4d3a98d681cc9042b28a923aa5a23a6b961998Dake Gu            getAdapter().set(1 + i, new ListRow(header, listRowAdapter));
1364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
1384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    public PlaybackControlGlue getGlue() {
1404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        return mGlue;
1414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
1424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    abstract static class PlaybackControlHelper extends PlaybackControlGlue {
1444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        /**
1454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri         * Change the location of the thumbs up/down controls
1464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri         */
1474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final boolean THUMBS_PRIMARY = true;
1484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final String FAUX_TITLE = "A short song of silence";
1504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final String FAUX_SUBTITLE = "2014";
1514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static final int FAUX_DURATION = 33 * 1000;
1524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        // These should match the playback service FF behavior
1544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static int[] sFastForwardSpeeds = { 2, 3, 4, 5 };
1554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private boolean mIsPlaying;
1574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private int mSpeed = PLAYBACK_SPEED_PAUSED;
1584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private long mStartTime;
1594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private long mStartPosition = 0;
1604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.RepeatAction mRepeatAction;
1624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
1634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
1644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private PlaybackControlsRow.PictureInPictureAction mPipAction;
1654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private static Handler sProgressHandler = new Handler();
1664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private final Runnable mUpdateProgressRunnable = new Runnable() {
1684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            @Override
1694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            public void run() {
1704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                updateProgress();
1714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                sProgressHandler.postDelayed(this, getUpdatePeriod());
1724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        };
1744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        PlaybackControlHelper(Context context) {
1764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            super(context, sFastForwardSpeeds);
1774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
178946a01cfedb6838e98d7a37e30f64c39b603893dDake Gu            mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsUpAction.INDEX_OUTLINE);
1794c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
180946a01cfedb6838e98d7a37e30f64c39b603893dDake Gu            mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsDownAction.INDEX_OUTLINE);
1814c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
1824c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mPipAction = new PlaybackControlsRow.PictureInPictureAction(context);
1834c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1844c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1854c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
1864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
1874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                PresenterSelector presenterSelector) {
1884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
1894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (THUMBS_PRIMARY) {
1904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                adapter.set(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
1914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                adapter.set(PlaybackControlGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
1924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
1934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return adapter;
1944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
1954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
1964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
1974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void onActionClicked(Action action) {
1984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (shouldDispatchAction(action)) {
1994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                dispatchAction(action);
2004c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
2014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            super.onActionClicked(action);
2034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2044c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
2074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
2084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                Action action = getControlsRow().getActionForKeyCode(keyEvent.getKeyCode());
2094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (shouldDispatchAction(action)) {
2104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    dispatchAction(action);
2114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    return true;
2124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
2134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return super.onKey(view, keyCode, keyEvent);
2154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private boolean shouldDispatchAction(Action action) {
2184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return action == mRepeatAction || action == mThumbsUpAction
2194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    || action == mThumbsDownAction;
2204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2214c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private void dispatchAction(Action action) {
2234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            Toast.makeText(getContext(), action.toString(), Toast.LENGTH_SHORT).show();
2244c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
2254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            multiAction.nextIndex();
2264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            notifyActionChanged(multiAction);
2274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
2304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            int index;
2314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            index = getPrimaryActionsAdapter().indexOf(action);
2324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (index >= 0) {
2334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
2344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else {
2354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                index = getSecondaryActionsAdapter().indexOf(action);
2364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                if (index >= 0) {
2374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
2384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
2394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
2404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
2434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (SparseArrayObjectAdapter) getControlsRow().getPrimaryActionsAdapter();
2444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        private ArrayObjectAdapter getSecondaryActionsAdapter() {
2474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (ArrayObjectAdapter) getControlsRow().getSecondaryActionsAdapter();
2484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean hasValidMedia() {
2524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return true;
2534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public boolean isMediaPlaying() {
2574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return mIsPlaying;
2584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public CharSequence getMediaTitle() {
2624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_TITLE;
2634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public CharSequence getMediaSubtitle() {
2674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_SUBTITLE;
2684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getMediaDuration() {
2724c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return FAUX_DURATION;
2734c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2744c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2754c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2764c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public Drawable getMediaArt() {
2774c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return null;
2784c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2794c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2804c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2814c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public long getSupportedActions() {
2824c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return ACTION_PLAY_PAUSE | ACTION_FAST_FORWARD | ACTION_REWIND;
2834c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2844c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2854c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2864c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getCurrentSpeedId() {
2874c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return mSpeed;
2884c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
2894c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
2904c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
2914c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public int getCurrentPosition() {
2924c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            int speed;
2934c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
2944c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = 0;
2954c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_NORMAL) {
2964c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = 1;
2974c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed >= PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
2984c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                int index = mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
2994c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = getFastForwardSpeeds()[index];
3004c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (mSpeed <= -PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
3014c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                int index = -mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
3024c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                speed = -getRewindSpeeds()[index];
3034c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else {
3044c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return -1;
3054c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3064c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            long position = mStartPosition + (System.currentTimeMillis() - mStartTime) * speed;
3074c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (position > getMediaDuration()) {
3084c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                position = getMediaDuration();
3094c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                onPlaybackComplete(true);
3104c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            } else if (position < 0) {
3114c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                position = 0;
3124c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                onPlaybackComplete(false);
3134c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3144c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            return (int) position;
3154c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3164c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3174c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        void onPlaybackComplete(final boolean ended) {
3184c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            sProgressHandler.post(new Runnable() {
3194c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                @Override
3204c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                public void run() {
321946a01cfedb6838e98d7a37e30f64c39b603893dDake Gu                    if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.INDEX_NONE) {
3224c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                        pause();
3234c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    } else {
3244c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                        play(PlaybackControlGlue.PLAYBACK_SPEED_NORMAL);
3254c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    }
3264c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    mStartPosition = 0;
3274c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                    onStateChanged();
3284c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                }
3294c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            });
3304c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3314c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3324c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3334c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void play(int speed) {
3344c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (speed == mSpeed) {
3354c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
3364c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3374c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartPosition = getCurrentPosition();
3384c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mSpeed = speed;
3394c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mIsPlaying = true;
3404c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartTime = System.currentTimeMillis();
3414c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3424c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3434c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3444c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void pause() {
3454c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (mSpeed == PLAYBACK_SPEED_PAUSED) {
3464c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                return;
3474c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3484c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mStartPosition = getCurrentPosition();
3494c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mSpeed = PLAYBACK_SPEED_PAUSED;
3504c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            mIsPlaying = false;
3514c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3524c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3534c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3544c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void next() {
3554c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            // Not supported
3564c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3574c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3584c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3594c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void previous() {
3604c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            // Not supported
3614c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3624c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri
3634c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        @Override
3644c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        public void enableProgressUpdating(boolean enable) {
3654c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            sProgressHandler.removeCallbacks(mUpdateProgressRunnable);
3664c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            if (enable) {
3674c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri                mUpdateProgressRunnable.run();
3684c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri            }
3694c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri        }
3704c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri    }
3714c9758b25091b36c0fd55bf422188e5ac9314da4Keyvan Amiri}
372