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 androidx.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.view.ContextThemeWrapper;
29import android.view.View;
30import android.view.ViewGroup.LayoutParams;
31import android.widget.FrameLayout;
32
33import androidx.leanback.R;
34import androidx.leanback.app.HeadersFragment;
35
36import org.junit.Before;
37import org.junit.Test;
38import org.junit.runner.RunWith;
39
40@MediumTest
41@RunWith(AndroidJUnit4.class)
42public class PresenterTest {
43    private Context mContext;
44
45    @Before
46    public void setup() throws Exception {
47        mContext = InstrumentationRegistry.getTargetContext();
48    }
49
50    @Test
51    public void testZoomFactors() throws Throwable {
52        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_SMALL);
53        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM);
54        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
55        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_XSMALL);
56        try {
57            new ListRowPresenter(100);
58            fail("Should have thrown exception");
59        } catch (IllegalArgumentException exception) {
60        }
61    }
62
63    private void testHeaderPresenter(RowHeaderPresenter p) {
64        int expectedVisibility;
65        Presenter.ViewHolder vh = p.onCreateViewHolder(new FrameLayout(mContext));
66        p.onBindViewHolder(vh, null);
67        expectedVisibility = p.isNullItemVisibilityGone() ? View.GONE : View.VISIBLE;
68        assertTrue("Header visibility",
69                vh.view.getVisibility() == expectedVisibility);
70        p.onBindViewHolder(vh, new Row(null));
71        assertTrue("Header visibility",
72                vh.view.getVisibility() == expectedVisibility);
73        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
74        assertTrue("Header visibility",
75                vh.view.getVisibility() == View.VISIBLE);
76    }
77
78    @Test
79    public void testHeaderPresenter() throws Throwable {
80        HeadersFragment hf = new HeadersFragment();
81        PresenterSelector ps = hf.getPresenterSelector();
82
83        Presenter p = ps.getPresenter(new Row());
84        assertTrue("Row header instance",
85                p instanceof RowHeaderPresenter);
86        assertFalse("isNullItemVisibilityGone",
87                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
88        testHeaderPresenter((RowHeaderPresenter) p);
89
90        p = ps.getPresenter(new SectionRow("Section Name"));
91        assertTrue("Row header instance",
92                p instanceof RowHeaderPresenter);
93        assertFalse("isNullItemVisibilityGone",
94                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
95        testHeaderPresenter((RowHeaderPresenter) p);
96
97        p = ps.getPresenter(new DividerRow());
98        assertTrue("Row header instance",
99                p instanceof DividerPresenter);
100
101        ListRowPresenter lrp = new ListRowPresenter();
102        assertTrue("Row header instance",
103                lrp.getHeaderPresenter() instanceof RowHeaderPresenter);
104        RowHeaderPresenter rhp = (RowHeaderPresenter) lrp.getHeaderPresenter();
105        assertTrue("isNullItemVisibilityGone",
106                rhp.isNullItemVisibilityGone());
107        testHeaderPresenter(rhp);
108    }
109
110    @Test
111    public void testRowHeaderPresenter() {
112        RowHeaderPresenter p = new RowHeaderPresenter();
113        p.setNullItemVisibilityGone(true);
114        RowHeaderPresenter.ViewHolder vh = (RowHeaderPresenter.ViewHolder)
115                p.onCreateViewHolder(new FrameLayout(mContext));
116        p.onBindViewHolder(vh, null);
117        assertEquals("Header visibility", View.GONE, vh.view.getVisibility());
118        p.onBindViewHolder(vh, new Row(null));
119        assertEquals("Header visibility", View.GONE, vh.view.getVisibility());
120
121        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
122        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
123        assertEquals("Header Description visibility", View.GONE,
124                vh.mDescriptionView.getVisibility());
125
126        HeaderItem item = new HeaderItem("");
127        item.setDescription("description");
128        p.onBindViewHolder(vh, new Row(item));
129        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
130        assertEquals("Header Description visibility", View.VISIBLE,
131                vh.mDescriptionView.getVisibility());
132    }
133
134    @Test
135    public void testSingleRowHeaderPresenter() {
136        RowHeaderPresenter p = new RowHeaderPresenter();
137        RowHeaderPresenter.ViewHolder vh = new RowHeaderPresenter.ViewHolder(
138                new RowHeaderView(mContext));
139        HeaderItem item = new HeaderItem("");
140        p.onBindViewHolder(vh, new Row(item));
141        assertEquals("Header visibility", View.VISIBLE, vh.view.getVisibility());
142    }
143
144    @Test
145    public void testPlaybackControlsRowPresenter() {
146        Context context = new ContextThemeWrapper(mContext, R.style.Theme_Leanback);
147        Presenter detailsPresenter = new AbstractDetailsDescriptionPresenter() {
148            @Override
149            protected void onBindDescription(ViewHolder vh, Object item) {
150                vh.getTitle().setText("The quick brown fox jumped over the lazy dog");
151                vh.getSubtitle().setText("Subtitle");
152            }
153        };
154        PlaybackControlsRowPresenter controlsRowPresenter = new PlaybackControlsRowPresenter(
155                detailsPresenter);
156        PlaybackControlsRowPresenter.ViewHolder vh = (PlaybackControlsRowPresenter.ViewHolder)
157                controlsRowPresenter.onCreateViewHolder(new FrameLayout(context));
158
159        Object item = new Object();
160        PlaybackControlsRow controlsRow = new PlaybackControlsRow(item);
161
162        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
163        assertEquals("Controls card right panel layout height",
164                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height,
165                LayoutParams.WRAP_CONTENT);
166        assertEquals("Description dock layout height",
167                vh.view.findViewById(R.id.description_dock).getLayoutParams().height,
168                LayoutParams.WRAP_CONTENT);
169        controlsRowPresenter.onUnbindRowViewHolder(vh);
170
171        controlsRow.setImageBitmap(
172                context, Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888));
173        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
174        AssertHelper.assertGreaterThan("Controls card right panel layout height",
175                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height, 0);
176        assertEquals("Description dock layout height",
177                vh.view.findViewById(R.id.description_dock).getLayoutParams().height, 0);
178        controlsRowPresenter.onUnbindRowViewHolder(vh);
179    }
180}
181