1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.support.v17.leanback.widget;
17
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertFalse;
20import static org.junit.Assert.assertTrue;
21import static org.junit.Assert.fail;
22
23import android.content.Context;
24import android.graphics.Bitmap;
25import android.support.test.InstrumentationRegistry;
26import android.support.test.filters.MediumTest;
27import android.support.test.runner.AndroidJUnit4;
28import android.support.v17.leanback.R;
29import android.support.v17.leanback.app.HeadersFragment;
30import android.view.ContextThemeWrapper;
31import android.view.View;
32import android.view.ViewGroup.LayoutParams;
33import android.widget.FrameLayout;
34
35import org.junit.Before;
36import org.junit.Test;
37import org.junit.runner.RunWith;
38
39@MediumTest
40@RunWith(AndroidJUnit4.class)
41public class PresenterTest {
42    private Context mContext;
43
44    @Before
45    public void setup() throws Exception {
46        mContext = InstrumentationRegistry.getTargetContext();
47    }
48
49    @Test
50    public void testZoomFactors() throws Throwable {
51        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_SMALL);
52        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM);
53        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
54        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_XSMALL);
55        try {
56            new ListRowPresenter(100);
57            fail("Should have thrown exception");
58        } catch (IllegalArgumentException exception) {
59        }
60    }
61
62    private void testHeaderPresenter(RowHeaderPresenter p) {
63        int expectedVisibility;
64        Presenter.ViewHolder vh = p.onCreateViewHolder(new FrameLayout(mContext));
65        p.onBindViewHolder(vh, null);
66        expectedVisibility = p.isNullItemVisibilityGone() ? View.GONE : View.VISIBLE;
67        assertTrue("Header visibility",
68                vh.view.getVisibility() == expectedVisibility);
69        p.onBindViewHolder(vh, new Row(null));
70        assertTrue("Header visibility",
71                vh.view.getVisibility() == expectedVisibility);
72        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
73        assertTrue("Header visibility",
74                vh.view.getVisibility() == View.VISIBLE);
75    }
76
77    @Test
78    public void testHeaderPresenter() throws Throwable {
79        HeadersFragment hf = new HeadersFragment();
80        PresenterSelector ps = hf.getPresenterSelector();
81
82        Presenter p = ps.getPresenter(new Row());
83        assertTrue("Row header instance",
84                p instanceof RowHeaderPresenter);
85        assertFalse("isNullItemVisibilityGone",
86                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
87        testHeaderPresenter((RowHeaderPresenter) p);
88
89        p = ps.getPresenter(new SectionRow("Section Name"));
90        assertTrue("Row header instance",
91                p instanceof RowHeaderPresenter);
92        assertFalse("isNullItemVisibilityGone",
93                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
94        testHeaderPresenter((RowHeaderPresenter) p);
95
96        p = ps.getPresenter(new DividerRow());
97        assertTrue("Row header instance",
98                p instanceof DividerPresenter);
99
100        ListRowPresenter lrp = new ListRowPresenter();
101        assertTrue("Row header instance",
102                lrp.getHeaderPresenter() instanceof RowHeaderPresenter);
103        RowHeaderPresenter rhp = (RowHeaderPresenter) lrp.getHeaderPresenter();
104        assertTrue("isNullItemVisibilityGone",
105                rhp.isNullItemVisibilityGone());
106        testHeaderPresenter(rhp);
107    }
108
109    @Test
110    public void testRowHeaderPresenter() {
111        RowHeaderPresenter p = new RowHeaderPresenter();
112        p.setNullItemVisibilityGone(true);
113        RowHeaderPresenter.ViewHolder vh = (RowHeaderPresenter.ViewHolder)
114                p.onCreateViewHolder(new FrameLayout(mContext));
115        p.onBindViewHolder(vh, null);
116        assertEquals("Header visibility", View.GONE, vh.view.getVisibility());
117        p.onBindViewHolder(vh, new Row(null));
118        assertEquals("Header visibility", View.GONE, vh.view.getVisibility());
119
120        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
121        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
122        assertEquals("Header Description visibility", View.GONE,
123                vh.mDescriptionView.getVisibility());
124
125        HeaderItem item = new HeaderItem("");
126        item.setDescription("description");
127        p.onBindViewHolder(vh, new Row(item));
128        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
129        assertEquals("Header Description visibility", View.VISIBLE,
130                vh.mDescriptionView.getVisibility());
131    }
132
133    @Test
134    public void testSingleRowHeaderPresenter() {
135        RowHeaderPresenter p = new RowHeaderPresenter();
136        RowHeaderPresenter.ViewHolder vh = new RowHeaderPresenter.ViewHolder(
137                new RowHeaderView(mContext));
138        HeaderItem item = new HeaderItem("");
139        p.onBindViewHolder(vh, new Row(item));
140        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
141    }
142
143    @Test
144    public void testPlaybackControlsRowPresenter() {
145        Context context = new ContextThemeWrapper(mContext, R.style.Theme_Leanback);
146        Presenter detailsPresenter = new AbstractDetailsDescriptionPresenter() {
147            @Override
148            protected void onBindDescription(ViewHolder vh, Object item) {
149                vh.getTitle().setText("The quick brown fox jumped over the lazy dog");
150                vh.getSubtitle().setText("Subtitle");
151            }
152        };
153        PlaybackControlsRowPresenter controlsRowPresenter = new PlaybackControlsRowPresenter(
154                detailsPresenter);
155        PlaybackControlsRowPresenter.ViewHolder vh = (PlaybackControlsRowPresenter.ViewHolder)
156                controlsRowPresenter.onCreateViewHolder(new FrameLayout(context));
157
158        Object item = new Object();
159        PlaybackControlsRow controlsRow = new PlaybackControlsRow(item);
160
161        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
162        assertEquals("Controls card right panel layout height",
163                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height,
164                LayoutParams.WRAP_CONTENT);
165        assertEquals("Description dock layout height",
166                vh.view.findViewById(R.id.description_dock).getLayoutParams().height,
167                LayoutParams.WRAP_CONTENT);
168        controlsRowPresenter.onUnbindRowViewHolder(vh);
169
170        controlsRow.setImageBitmap(
171                context, Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888));
172        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
173        AssertHelper.assertGreaterThan("Controls card right panel layout height",
174                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height, 0);
175        assertEquals("Description dock layout height",
176                vh.view.findViewById(R.id.description_dock).getLayoutParams().height, 0);
177        controlsRowPresenter.onUnbindRowViewHolder(vh);
178    }
179}
180