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