1575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout/*
2575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * Copyright (C) 2015 The Android Open Source Project
3575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout *
4575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * Licensed under the Apache License, Version 2.0 (the "License");
5575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * you may not use this file except in compliance with the License.
6575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * You may obtain a copy of the License at
7575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout *
8575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout *      http://www.apache.org/licenses/LICENSE-2.0
9575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout *
10575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * Unless required by applicable law or agreed to in writing, software
11575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * distributed under the License is distributed on an "AS IS" BASIS,
12575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * See the License for the specific language governing permissions and
14575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout * limitations under the License.
15575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout */
16575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stoutpackage android.support.v17.leanback.widget;
17575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout
185d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stoutimport android.graphics.Bitmap;
19ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stoutimport android.support.v17.leanback.app.HeadersFragment;
205d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stoutimport android.support.v17.leanback.R;
21575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stoutimport android.test.AndroidTestCase;
2230670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiriimport android.view.ContextThemeWrapper;
23ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stoutimport android.widget.FrameLayout;
24ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stoutimport android.view.View;
255d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stoutimport android.view.ViewGroup.LayoutParams;
26575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout
27575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stoutpublic class PresenterTest extends AndroidTestCase {
28575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout
29575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout    public void testZoomFactors() throws Throwable {
30575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_SMALL);
31575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM);
32575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
33575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_XSMALL);
34575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        try {
35575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout            new ListRowPresenter(100);
365d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout            fail("Should have thrown exception");
37575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        } catch (IllegalArgumentException exception) {
38575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout        }
39575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout    }
40ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout
41ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout    private void testHeaderPresenter(RowHeaderPresenter p) {
42ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        int expectedVisibility;
43ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        Presenter.ViewHolder vh = p.onCreateViewHolder(new FrameLayout(getContext()));
44ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        p.onBindViewHolder(vh, null);
45ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        expectedVisibility = p.isNullItemVisibilityGone() ? View.GONE : View.VISIBLE;
465d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("Header visibility",
475d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.getVisibility() == expectedVisibility);
48ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        p.onBindViewHolder(vh, new Row(null));
495d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("Header visibility",
505d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.getVisibility() == expectedVisibility);
51ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
525d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("Header visibility",
535d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.getVisibility() == View.VISIBLE);
54ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout    }
55ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout
56ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout    public void testHeaderPresenter() throws Throwable {
57ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        HeadersFragment hf = new HeadersFragment();
58ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        PresenterSelector ps = hf.getPresenterSelector();
5930670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri
6030670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        Presenter p = ps.getPresenter(new Row());
615d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("Row header instance",
625d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                p instanceof RowHeaderPresenter);
635d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertFalse("isNullItemVisibilityGone",
645d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
65ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        testHeaderPresenter((RowHeaderPresenter) p);
66ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout
6730670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        p = ps.getPresenter(new SectionRow("Section Name"));
6830670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        assertTrue("Row header instance",
6930670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri                p instanceof RowHeaderPresenter);
7030670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        assertFalse("isNullItemVisibilityGone",
7130670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
7230670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        testHeaderPresenter((RowHeaderPresenter) p);
7330670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri
7430670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        p = ps.getPresenter(new DividerRow());
7530670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        assertTrue("Row header instance",
7630670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri                p instanceof DividerPresenter);
7730670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri
78ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        ListRowPresenter lrp = new ListRowPresenter();
795d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("Row header instance",
805d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                lrp.getHeaderPresenter() instanceof RowHeaderPresenter);
81ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        RowHeaderPresenter rhp = (RowHeaderPresenter) lrp.getHeaderPresenter();
825d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertTrue("isNullItemVisibilityGone",
835d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                rhp.isNullItemVisibilityGone());
84ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout        testHeaderPresenter(rhp);
85ad9af35ec6a808136478daf7bd57d564ac517e0eCraig Stout    }
865d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout
875d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout    public void testPlaybackControlsRowPresenter() {
8830670ddd3140bf545ae9e2657a44bc5db4bc6c27Keyvan Amiri        setContext(new ContextThemeWrapper(getContext(), R.style.Theme_Leanback));
895d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        Presenter detailsPresenter = new AbstractDetailsDescriptionPresenter() {
905d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout            @Override
915d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout            protected void onBindDescription(ViewHolder vh, Object item) {
925d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.getTitle().setText("The quick brown fox jumped over the lazy dog");
935d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.getSubtitle().setText("Subtitle");
945d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout            }
955d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        };
965d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        PlaybackControlsRowPresenter controlsRowPresenter = new PlaybackControlsRowPresenter(
975d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                detailsPresenter);
985d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        PlaybackControlsRowPresenter.ViewHolder vh = (PlaybackControlsRowPresenter.ViewHolder)
995d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                controlsRowPresenter.onCreateViewHolder(new FrameLayout(getContext()));
1005d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout
1015d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        Object item = new Object();
1025d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        PlaybackControlsRow controlsRow = new PlaybackControlsRow(item);
1035d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout
1045d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
1055d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertEquals("Controls card right panel layout height",
1065d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height,
1075d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                LayoutParams.WRAP_CONTENT);
1085d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertEquals("Description dock layout height",
1095d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.findViewById(R.id.description_dock).getLayoutParams().height,
1105d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                LayoutParams.WRAP_CONTENT);
1115d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        controlsRowPresenter.onUnbindRowViewHolder(vh);
1125d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout
1135d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        controlsRow.setImageBitmap(
1145d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                getContext(), Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888));
1155d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
1165d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        AssertHelper.assertGreaterThan("Controls card right panel layout height",
1175d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height, 0);
1185d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        assertEquals("Description dock layout height",
1195d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout                vh.view.findViewById(R.id.description_dock).getLayoutParams().height, 0);
1205d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout        controlsRowPresenter.onUnbindRowViewHolder(vh);
1215d3875ca7ca9294a00f9da0a92ad9055adeb9703Craig Stout    }
122575dc8a5a5c023aee0c0ec297a7d357685cf49e9Craig Stout}
123