ListRowPresenterTest.java revision a23c768a1a61495852074869b244064cf535b4c1
1/*
2 * Copyright (C) 2017 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 */
16
17package android.support.v17.leanback.widget;
18
19import static junit.framework.Assert.assertEquals;
20import static junit.framework.Assert.assertFalse;
21import static junit.framework.Assert.assertTrue;
22
23import android.content.Context;
24import android.graphics.Color;
25import android.graphics.drawable.ColorDrawable;
26import android.graphics.drawable.Drawable;
27import android.os.Build;
28import android.support.test.InstrumentationRegistry;
29import android.support.test.filters.SmallTest;
30import android.support.test.runner.AndroidJUnit4;
31import android.support.v17.leanback.R;
32import android.support.v4.view.ViewCompat;
33import android.view.View;
34import android.view.ViewGroup;
35import android.widget.FrameLayout;
36
37import org.junit.Test;
38import org.junit.runner.RunWith;
39
40@RunWith(AndroidJUnit4.class)
41@SmallTest
42public class ListRowPresenterTest {
43
44    // default overlay color when setSelectLevel(0.5f)
45    static final int HALF_OVERLAY_COLOR = 0x4C000000;
46    static int sFocusedZ;
47
48    static class DummyPresenter extends Presenter {
49        @Override
50        public ViewHolder onCreateViewHolder(ViewGroup parent) {
51            View view = new View(parent.getContext());
52            view.setFocusable(true);
53            view.setId(R.id.lb_action_button);
54            view.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
55            return new Presenter.ViewHolder(view);
56        }
57
58        @Override
59        public void onBindViewHolder(ViewHolder viewHolder, Object item) {
60        }
61
62        @Override
63        public void onUnbindViewHolder(ViewHolder viewHolder) {
64        }
65    }
66
67    Context mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
68    ListRowPresenter mListRowPresenter;
69    ListRow mRow;
70    ListRowPresenter.ViewHolder mListVh;
71
72    void setup(ListRowPresenter listRowPresenter, ObjectAdapter adapter) {
73        sFocusedZ = mContext.getResources().getDimensionPixelSize(
74                R.dimen.lb_material_shadow_focused_z);
75        assertTrue(sFocusedZ > 0);
76        mListRowPresenter = listRowPresenter;
77        mRow = new ListRow(adapter);
78        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
79            @Override
80            public void run() {
81                final ViewGroup parent = new FrameLayout(mContext);
82                Presenter.ViewHolder containerVh = mListRowPresenter.onCreateViewHolder(parent);
83                parent.addView(containerVh.view, 1000, 1000);
84                mListVh = (ListRowPresenter.ViewHolder) mListRowPresenter.getRowViewHolder(
85                        containerVh);
86                mListRowPresenter.onBindViewHolder(mListVh, mRow);
87                runRecyclerViewLayout();
88            }
89        });
90    }
91
92    void runRecyclerViewLayout() {
93        mListVh.view.measure(View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY),
94                View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY));
95        mListVh.view.layout(0, 0, 1000, 1000);
96    }
97
98    static void assertChildrenHaveAlpha(ViewGroup group, int numChildren, float alpha) {
99        assertEquals(numChildren, group.getChildCount());
100        for (int i = 0; i < numChildren; i++) {
101            assertEquals(alpha, group.getChildAt(i).getAlpha());
102        }
103    }
104
105    static Drawable getForeground(View view) {
106        if (Build.VERSION.SDK_INT >= 23) {
107            return view.getForeground();
108        }
109        return null;
110    }
111
112    static void assertChildrenHaveColorOverlay(ViewGroup group, int numChildren, int overlayColor,
113            boolean keepChildForeground) {
114        assertEquals(numChildren, group.getChildCount());
115        for (int i = 0; i < numChildren; i++) {
116            View view = group.getChildAt(i);
117            if (keepChildForeground) {
118                assertTrue("When keepChildForeground, always create a"
119                        + " ShadowOverlayContainer", view instanceof ShadowOverlayContainer);
120                assertEquals(overlayColor, ((ShadowOverlayContainer) view).mOverlayColor);
121            } else {
122                if (view instanceof ShadowOverlayContainer) {
123                    assertEquals(overlayColor, ((ShadowOverlayContainer) view).mOverlayColor);
124                } else {
125                    Drawable foreground = getForeground(view);
126                    assertEquals(overlayColor,
127                            foreground instanceof ColorDrawable
128                                    ? ((ColorDrawable) foreground).getColor() : Color.TRANSPARENT);
129                }
130            }
131        }
132    }
133
134    public void defaultListRowOverlayColor(ListRowPresenter listRowPresenter) {
135        final ArrayObjectAdapter arrayAdapter = new ArrayObjectAdapter(new DummyPresenter());
136        arrayAdapter.add("abc");
137        setup(listRowPresenter, arrayAdapter);
138        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
139            @Override
140            public void run() {
141                mListVh.getGridView().setItemAnimator(null);
142                mListRowPresenter.setSelectLevel(mListVh, 0.5f);
143            }
144        });
145        boolean keepChildForeground = listRowPresenter.isKeepChildForeground();
146        assertChildrenHaveColorOverlay(mListVh.getGridView(), 1, HALF_OVERLAY_COLOR,
147                keepChildForeground);
148        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
149            @Override
150            public void run() {
151                arrayAdapter.add("def");
152                runRecyclerViewLayout();
153            }
154        });
155        assertChildrenHaveColorOverlay(mListVh.getGridView(), 2, HALF_OVERLAY_COLOR,
156                keepChildForeground);
157    }
158
159    @Test
160    public void defaultListRowOverlayColor() {
161        defaultListRowOverlayColor(new ListRowPresenter());
162    }
163
164    @Test
165    public void defaultListRowOverlayColorCombinations() {
166        for (boolean keepChildForeground: new boolean[] {false, true}) {
167            for (boolean isUzingZorder : new boolean[]{false, true}) {
168                for (boolean isUsingDefaultShadow : new boolean[]{false, true}) {
169                    for (boolean enableRoundedCorner : new boolean[]{false, true}) {
170                        for (boolean shadowEnabled : new boolean[]{false, true}) {
171                            final boolean paramIsUsingZorder = isUzingZorder;
172                            final boolean paramIsUsingDefaultShadow = isUsingDefaultShadow;
173                            ListRowPresenter presenter = new ListRowPresenter() {
174                                @Override
175                                public boolean isUsingZOrder(Context context) {
176                                    return paramIsUsingZorder;
177                                }
178
179                                @Override
180                                public boolean isUsingDefaultShadow() {
181                                    return paramIsUsingDefaultShadow;
182                                }
183                            };
184                            presenter.setKeepChildForeground(keepChildForeground);
185                            presenter.setShadowEnabled(shadowEnabled);
186                            presenter.enableChildRoundedCorners(enableRoundedCorner);
187                            defaultListRowOverlayColor(presenter);
188                        }
189                    }
190                }
191            }
192        }
193    }
194
195    static class CustomSelectEffectRowPresenter extends ListRowPresenter {
196        @Override
197        public boolean isUsingDefaultListSelectEffect() {
198            return false;
199        }
200
201        @Override
202        protected void applySelectLevelToChild(ViewHolder rowViewHolder, View childView) {
203            childView.setAlpha(rowViewHolder.getSelectLevel());
204        }
205    };
206
207    public void customListRowSelectEffect(ListRowPresenter presenter) {
208        final ArrayObjectAdapter arrayAdapter = new ArrayObjectAdapter(new DummyPresenter());
209        arrayAdapter.add("abc");
210        setup(presenter, arrayAdapter);
211        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
212            @Override
213            public void run() {
214                mListVh.getGridView().setItemAnimator(null);
215                mListRowPresenter.setSelectLevel(mListVh, 0.5f);
216            }
217        });
218        assertChildrenHaveAlpha(mListVh.getGridView(), 1, 0.5f);
219        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
220            @Override
221            public void run() {
222                arrayAdapter.add("def");
223                runRecyclerViewLayout();
224            }
225        });
226        assertChildrenHaveAlpha(mListVh.getGridView(), 2, 0.5f);
227    }
228
229    @Test
230    public void customListRowSelectEffect() {
231        customListRowSelectEffect(new CustomSelectEffectRowPresenter());
232    }
233
234    @Test
235    public void customListRowSelectEffectCombinations() {
236        for (boolean keepChildForeground: new boolean[] {false, true}) {
237            for (boolean isUzingZorder: new boolean[] {false, true}) {
238                for (boolean isUsingDefaultShadow: new boolean[] {false, true}) {
239                    for (boolean enableRoundedCorner : new boolean[]{false, true}) {
240                        for (boolean shadowEnabled : new boolean[]{false, true}) {
241                            final boolean paramIsUsingZorder = isUzingZorder;
242                            final boolean paramIsUsingDefaultShadow = isUsingDefaultShadow;
243                            ListRowPresenter presenter = new CustomSelectEffectRowPresenter() {
244                                @Override
245                                public boolean isUsingZOrder(Context context) {
246                                    return paramIsUsingZorder;
247                                }
248
249                                @Override
250                                public boolean isUsingDefaultShadow() {
251                                    return paramIsUsingDefaultShadow;
252                                }
253                            };
254                            presenter.setKeepChildForeground(keepChildForeground);
255                            presenter.setShadowEnabled(shadowEnabled);
256                            presenter.enableChildRoundedCorners(enableRoundedCorner);
257                            customListRowSelectEffect(presenter);
258                        }
259                    }
260                }
261            }
262        }
263    }
264
265    static class ShadowOverlayResult {
266        boolean mShadowOverlayContainer;
267        int mShadowOverlayContainerOverlayColor;
268        float mShadowOverlayContainerOverlayZ;
269        boolean mShadowOverlayContainerOpticalBounds;
270        int mViewOverlayColor;
271        float mViewZ;
272        boolean mViewOpticalBounds;
273        void expect(boolean shadowOverlayContainer, int shadowOverlayContainerOverlayColor,
274                float shadowOverlayContainerOverlayZ, boolean shadowOverlayContainerOpticalBounds,
275                int viewOverlayColor, float viewZ, boolean viewOpticalBounds) {
276            assertEquals(this.mShadowOverlayContainer, shadowOverlayContainer);
277            assertEquals(this.mShadowOverlayContainerOverlayColor,
278                    shadowOverlayContainerOverlayColor);
279            assertEquals(this.mShadowOverlayContainerOverlayZ, shadowOverlayContainerOverlayZ);
280            assertEquals(this.mShadowOverlayContainerOpticalBounds,
281                    shadowOverlayContainerOpticalBounds);
282            assertEquals(this.mViewOverlayColor, viewOverlayColor);
283            assertEquals(this.mViewZ, viewZ);
284            assertEquals(this.mViewOpticalBounds, viewOpticalBounds);
285        }
286    }
287
288    ShadowOverlayResult setupDefaultPresenterWithSingleElement(final boolean isUsingZorder,
289            final boolean isUsingDefaultShadow,
290            final boolean enableRoundedCorner,
291            final boolean shadowEnabled,
292            final boolean keepChildForeground) {
293        ArrayObjectAdapter adapter = new ArrayObjectAdapter(new DummyPresenter());
294        adapter.add("abc");
295        ListRowPresenter listRowPresenter = new ListRowPresenter() {
296            @Override
297            public boolean isUsingZOrder(Context context) {
298                return isUsingZorder;
299            }
300
301            @Override
302            public boolean isUsingDefaultShadow() {
303                return isUsingDefaultShadow;
304            }
305        };
306        listRowPresenter.setShadowEnabled(shadowEnabled);
307        listRowPresenter.enableChildRoundedCorners(enableRoundedCorner);
308        listRowPresenter.setKeepChildForeground(keepChildForeground);
309        setup(listRowPresenter, adapter);
310        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
311            @Override
312            public void run() {
313                mListVh.getGridView().setItemAnimator(null);
314                mListRowPresenter.setSelectLevel(mListVh, 0.5f);
315                View child = mListVh.getGridView().getChildAt(0);
316                FocusHighlightHelper.FocusAnimator animator = (FocusHighlightHelper.FocusAnimator)
317                        child.getTag(R.id.lb_focus_animator);
318                animator.animateFocus(true, true);
319            }
320        });
321        return collectResult();
322    }
323
324    ShadowOverlayResult collectResult() {
325        ShadowOverlayResult result = new ShadowOverlayResult();
326        View view = mListVh.getGridView().getChildAt(0);
327        if (view instanceof ShadowOverlayContainer) {
328            result.mShadowOverlayContainer = true;
329            result.mShadowOverlayContainerOverlayColor = ((ShadowOverlayContainer) view)
330                    .mOverlayColor;
331            result.mShadowOverlayContainerOverlayZ = ViewCompat.getZ(view);
332            result.mShadowOverlayContainerOpticalBounds = view.getWidth() > 100;
333        } else {
334            result.mShadowOverlayContainer = false;
335        }
336        view = view.findViewById(R.id.lb_action_button);
337        Drawable d = getForeground(view);
338        result.mViewOverlayColor = d instanceof ColorDrawable ? ((ColorDrawable) d).getColor()
339                : Color.TRANSPARENT;
340        result.mViewZ = ViewCompat.getZ(view);
341        result.mViewOpticalBounds = view.getWidth() > 100;
342        return result;
343    }
344
345    @Test
346    public void shadowOverlayContainerTest01() {
347        final boolean isUsingZorder = false;
348        final boolean isUsingDefaultShadow = false;
349        final boolean enableRoundedCorner = false;
350        final boolean shadowEnabled = false;
351        final boolean keepChildForeground = false;
352        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
353                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
354        final int version = Build.VERSION.SDK_INT;
355        if (version < 21) {
356            // nothing supported
357            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
358                    0, 0, false);
359        } else if (version < 23) {
360            // supports static/dynamic shadow, supports rounded corner
361            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
362                    0, 0, false);
363        } else {
364            // supports foreground
365            result.expect(false, 0, 0, false,
366                    HALF_OVERLAY_COLOR, 0, false);
367        }
368    }
369
370    @Test
371    public void shadowOverlayContainerTest02() {
372        final boolean isUsingZorder = false;
373        final boolean isUsingDefaultShadow = false;
374        final boolean enableRoundedCorner = false;
375        final boolean shadowEnabled = false;
376        final boolean keepChildForeground = true;
377        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
378                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
379        final int version = Build.VERSION.SDK_INT;
380        if (version < 21) {
381            // nothing supported
382            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
383                    0, 0, false);
384        } else if (version < 23) {
385            // supports static/dynamic shadow, supports rounded corner
386            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
387                    0, 0, false);
388        } else {
389            // supports foreground
390            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
391                    0, 0, false);
392        }
393    }
394
395    @Test
396    public void shadowOverlayContainerTest03() {
397        final boolean isUsingZorder = false;
398        final boolean isUsingDefaultShadow = false;
399        final boolean enableRoundedCorner = false;
400        final boolean shadowEnabled = true;
401        final boolean keepChildForeground = false;
402        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
403                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
404        final int version = Build.VERSION.SDK_INT;
405        if (version < 21) {
406            // nothing supported
407            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
408                    0, 0, false);
409        } else if (version < 23) {
410            // supports static/dynamic shadow, supports rounded corner
411            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
412                    0, 0, false);
413        } else {
414            // supports foreground
415            result.expect(false, 0, 0, false,
416                    HALF_OVERLAY_COLOR, 0, false);
417        }
418    }
419
420    @Test
421    public void shadowOverlayContainerTest04() {
422        final boolean isUsingZorder = false;
423        final boolean isUsingDefaultShadow = false;
424        final boolean enableRoundedCorner = false;
425        final boolean shadowEnabled = true;
426        final boolean keepChildForeground = true;
427        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
428                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
429        final int version = Build.VERSION.SDK_INT;
430        if (version < 21) {
431            // nothing supported
432            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
433                    0, 0, false);
434        } else if (version < 23) {
435            // supports static/dynamic shadow, supports rounded corner
436            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
437                    0, 0, false);
438        } else {
439            // supports foreground
440            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
441                    0, 0, false);
442        }
443    }
444
445    @Test
446    public void shadowOverlayContainerTest05() {
447        final boolean isUsingZorder = false;
448        final boolean isUsingDefaultShadow = false;
449        final boolean enableRoundedCorner = true;
450        final boolean shadowEnabled = false;
451        final boolean keepChildForeground = false;
452        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
453                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
454        final int version = Build.VERSION.SDK_INT;
455        if (version < 21) {
456            // nothing supported
457            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
458                    0, 0, false);
459        } else if (version < 23) {
460            // supports static/dynamic shadow, supports rounded corner
461            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
462                    0, 0, false);
463        } else {
464            // supports foreground
465            result.expect(false, 0, 0, false,
466                    HALF_OVERLAY_COLOR, 0, false);
467        }
468    }
469
470    @Test
471    public void shadowOverlayContainerTest06() {
472        final boolean isUsingZorder = false;
473        final boolean isUsingDefaultShadow = false;
474        final boolean enableRoundedCorner = true;
475        final boolean shadowEnabled = false;
476        final boolean keepChildForeground = true;
477        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
478                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
479        final int version = Build.VERSION.SDK_INT;
480        if (version < 21) {
481            // nothing supported
482            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
483                    0, 0, false);
484        } else if (version < 23) {
485            // supports static/dynamic shadow, supports rounded corner
486            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
487                    0, 0, false);
488        } else {
489            // supports foreground
490            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
491                    0, 0, false);
492        }
493    }
494
495    @Test
496    public void shadowOverlayContainerTest07() {
497        final boolean isUsingZorder = false;
498        final boolean isUsingDefaultShadow = false;
499        final boolean enableRoundedCorner = true;
500        final boolean shadowEnabled = true;
501        final boolean keepChildForeground = false;
502        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
503                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
504        final int version = Build.VERSION.SDK_INT;
505        if (version < 21) {
506            // nothing supported
507            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
508                    0, 0, false);
509        } else if (version < 23) {
510            // supports static/dynamic shadow, supports rounded corner
511            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
512                    0, 0, false);
513        } else {
514            // supports foreground
515            result.expect(false, 0, 0, false,
516                    HALF_OVERLAY_COLOR, 0, false);
517        }
518    }
519
520    @Test
521    public void shadowOverlayContainerTest08() {
522        final boolean isUsingZorder = false;
523        final boolean isUsingDefaultShadow = false;
524        final boolean enableRoundedCorner = true;
525        final boolean shadowEnabled = true;
526        final boolean keepChildForeground = true;
527        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
528                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
529        final int version = Build.VERSION.SDK_INT;
530        if (version < 21) {
531            // nothing supported
532            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
533                    0, 0, false);
534        } else if (version < 23) {
535            // supports static/dynamic shadow, supports rounded corner
536            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
537                    0, 0, false);
538        } else {
539            // supports foreground
540            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
541                    0, 0, false);
542        }
543    }
544
545    @Test
546    public void shadowOverlayContainerTest09() {
547        final boolean isUsingZorder = false;
548        final boolean isUsingDefaultShadow = true;
549        final boolean enableRoundedCorner = false;
550        final boolean shadowEnabled = false;
551        final boolean keepChildForeground = false;
552        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
553                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
554        final int version = Build.VERSION.SDK_INT;
555        if (version < 21) {
556            // nothing supported
557            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
558                    0, 0, false);
559        } else if (version < 23) {
560            // supports static/dynamic shadow, supports rounded corner
561            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
562                    0, 0, false);
563        } else {
564            // supports foreground
565            result.expect(false, 0, 0, false,
566                    HALF_OVERLAY_COLOR, 0, false);
567        }
568    }
569
570    @Test
571    public void shadowOverlayContainerTest10() {
572        final boolean isUsingZorder = false;
573        final boolean isUsingDefaultShadow = true;
574        final boolean enableRoundedCorner = false;
575        final boolean shadowEnabled = false;
576        final boolean keepChildForeground = true;
577        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
578                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
579        final int version = Build.VERSION.SDK_INT;
580        if (version < 21) {
581            // nothing supported
582            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
583                    0, 0, false);
584        } else if (version < 23) {
585            // supports static/dynamic shadow, supports rounded corner
586            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
587                    0, 0, false);
588        } else {
589            // supports foreground
590            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
591                    0, 0, false);
592        }
593    }
594
595    @Test
596    public void shadowOverlayContainerTest11() {
597        final boolean isUsingZorder = false;
598        final boolean isUsingDefaultShadow = true;
599        final boolean enableRoundedCorner = false;
600        final boolean shadowEnabled = true;
601        final boolean keepChildForeground = false;
602        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
603                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
604        final int version = Build.VERSION.SDK_INT;
605        if (version < 21) {
606            // nothing supported
607            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
608                    0, 0, false);
609        } else if (version < 23) {
610            // supports static/dynamic shadow, supports rounded corner
611            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
612                    0, 0, false);
613        } else {
614            // supports foreground
615            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
616                    0, 0, false);
617        }
618    }
619
620    @Test
621    public void shadowOverlayContainerTest12() {
622        final boolean isUsingZorder = false;
623        final boolean isUsingDefaultShadow = true;
624        final boolean enableRoundedCorner = false;
625        final boolean shadowEnabled = true;
626        final boolean keepChildForeground = true;
627        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
628                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
629        final int version = Build.VERSION.SDK_INT;
630        if (version < 21) {
631            // nothing supported
632            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
633                    0, 0, false);
634        } else if (version < 23) {
635            // supports static/dynamic shadow, supports rounded corner
636            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
637                    0, 0, false);
638        } else {
639            // supports foreground
640            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
641                    0, 0, false);
642        }
643    }
644
645    @Test
646    public void shadowOverlayContainerTest13() {
647        final boolean isUsingZorder = false;
648        final boolean isUsingDefaultShadow = true;
649        final boolean enableRoundedCorner = true;
650        final boolean shadowEnabled = false;
651        final boolean keepChildForeground = false;
652        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
653                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
654        final int version = Build.VERSION.SDK_INT;
655        if (version < 21) {
656            // nothing supported
657            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
658                    0, 0, false);
659        } else if (version < 23) {
660            // supports static/dynamic shadow, supports rounded corner
661            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
662                    0, 0, false);
663        } else {
664            // supports foreground
665            result.expect(false, 0, 0, false,
666                    HALF_OVERLAY_COLOR, 0, false);
667        }
668    }
669
670    @Test
671    public void shadowOverlayContainerTest14() {
672        final boolean isUsingZorder = false;
673        final boolean isUsingDefaultShadow = true;
674        final boolean enableRoundedCorner = true;
675        final boolean shadowEnabled = false;
676        final boolean keepChildForeground = true;
677        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
678                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
679        final int version = Build.VERSION.SDK_INT;
680        if (version < 21) {
681            // nothing supported
682            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
683                    0, 0, false);
684        } else if (version < 23) {
685            // supports static/dynamic shadow, supports rounded corner
686            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
687                    0, 0, false);
688        } else {
689            // supports foreground
690            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
691                    0, 0, false);
692        }
693    }
694
695    @Test
696    public void shadowOverlayContainerTest15() {
697        final boolean isUsingZorder = false;
698        final boolean isUsingDefaultShadow = true;
699        final boolean enableRoundedCorner = true;
700        final boolean shadowEnabled = true;
701        final boolean keepChildForeground = false;
702        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
703                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
704        final int version = Build.VERSION.SDK_INT;
705        if (version < 21) {
706            // nothing supported
707            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
708                    0, 0, false);
709        } else if (version < 23) {
710            // supports static/dynamic shadow, supports rounded corner
711            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
712                    0, 0, false);
713        } else {
714            // supports foreground
715            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
716                    0, 0, false);
717        }
718    }
719
720    @Test
721    public void shadowOverlayContainerTest16() {
722        final boolean isUsingZorder = false;
723        final boolean isUsingDefaultShadow = true;
724        final boolean enableRoundedCorner = true;
725        final boolean shadowEnabled = true;
726        final boolean keepChildForeground = true;
727        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
728                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
729        final int version = Build.VERSION.SDK_INT;
730        if (version < 21) {
731            // nothing supported
732            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
733                    0, 0, false);
734        } else if (version < 23) {
735            // supports static/dynamic shadow, supports rounded corner
736            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
737                    0, 0, false);
738        } else {
739            // supports foreground
740            result.expect(true, HALF_OVERLAY_COLOR, 0, true,
741                    0, 0, false);
742        }
743    }
744
745    @Test
746    public void shadowOverlayContainerTest17() {
747        final boolean isUsingZorder = true;
748        final boolean isUsingDefaultShadow = false;
749        final boolean enableRoundedCorner = false;
750        final boolean shadowEnabled = false;
751        final boolean keepChildForeground = false;
752        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
753                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
754        final int version = Build.VERSION.SDK_INT;
755        if (version < 21) {
756            // nothing supported
757            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
758                    0, 0, false);
759        } else if (version < 23) {
760            // supports static/dynamic shadow, supports rounded corner
761            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
762                    0, 0, false);
763        } else {
764            // supports foreground
765            result.expect(false, 0, 0, false,
766                    HALF_OVERLAY_COLOR, 0, false);
767        }
768    }
769
770    @Test
771    public void shadowOverlayContainerTest18() {
772        final boolean isUsingZorder = true;
773        final boolean isUsingDefaultShadow = false;
774        final boolean enableRoundedCorner = false;
775        final boolean shadowEnabled = false;
776        final boolean keepChildForeground = true;
777        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
778                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
779        final int version = Build.VERSION.SDK_INT;
780        if (version < 21) {
781            // nothing supported
782            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
783                    0, 0, false);
784        } else if (version < 23) {
785            // supports static/dynamic shadow, supports rounded corner
786            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
787                    0, 0, false);
788        } else {
789            // supports foreground
790            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
791                    0, 0, false);
792        }
793    }
794
795    @Test
796    public void shadowOverlayContainerTest19() {
797        final boolean isUsingZorder = true;
798        final boolean isUsingDefaultShadow = false;
799        final boolean enableRoundedCorner = false;
800        final boolean shadowEnabled = true;
801        final boolean keepChildForeground = false;
802        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
803                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
804        final int version = Build.VERSION.SDK_INT;
805        if (version < 21) {
806            // nothing supported
807            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
808                    0, 0, false);
809        } else if (version < 23) {
810            // supports static/dynamic shadow, supports rounded corner
811            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
812                    0, 0, false);
813        } else {
814            // supports foreground
815            result.expect(false, 0, 0, false,
816                    HALF_OVERLAY_COLOR, 0, false);
817        }
818    }
819
820    @Test
821    public void shadowOverlayContainerTest20() {
822        final boolean isUsingZorder = true;
823        final boolean isUsingDefaultShadow = false;
824        final boolean enableRoundedCorner = false;
825        final boolean shadowEnabled = true;
826        final boolean keepChildForeground = true;
827        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
828                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
829        final int version = Build.VERSION.SDK_INT;
830        if (version < 21) {
831            // nothing supported
832            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
833                    0, 0, false);
834        } else if (version < 23) {
835            // supports static/dynamic shadow, supports rounded corner
836            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
837                    0, 0, false);
838        } else {
839            // supports foreground
840            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
841                    0, 0, false);
842        }
843    }
844
845    @Test
846    public void shadowOverlayContainerTest21() {
847        final boolean isUsingZorder = true;
848        final boolean isUsingDefaultShadow = false;
849        final boolean enableRoundedCorner = true;
850        final boolean shadowEnabled = false;
851        final boolean keepChildForeground = false;
852        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
853                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
854        final int version = Build.VERSION.SDK_INT;
855        if (version < 21) {
856            // nothing supported
857            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
858                    0, 0, false);
859        } else if (version < 23) {
860            // supports static/dynamic shadow, supports rounded corner
861            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
862                    0, 0, false);
863        } else {
864            // supports foreground
865            result.expect(false, 0, 0, false,
866                    HALF_OVERLAY_COLOR, 0, false);
867        }
868    }
869
870    @Test
871    public void shadowOverlayContainerTest22() {
872        final boolean isUsingZorder = true;
873        final boolean isUsingDefaultShadow = false;
874        final boolean enableRoundedCorner = true;
875        final boolean shadowEnabled = false;
876        final boolean keepChildForeground = true;
877        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
878                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
879        final int version = Build.VERSION.SDK_INT;
880        if (version < 21) {
881            // nothing supported
882            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
883                    0, 0, false);
884        } else if (version < 23) {
885            // supports static/dynamic shadow, supports rounded corner
886            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
887                    0, 0, false);
888        } else {
889            // supports foreground
890            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
891                    0, 0, false);
892        }
893    }
894
895    @Test
896    public void shadowOverlayContainerTest23() {
897        final boolean isUsingZorder = true;
898        final boolean isUsingDefaultShadow = false;
899        final boolean enableRoundedCorner = true;
900        final boolean shadowEnabled = true;
901        final boolean keepChildForeground = false;
902        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
903                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
904        final int version = Build.VERSION.SDK_INT;
905        if (version < 21) {
906            // nothing supported
907            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
908                    0, 0, false);
909        } else if (version < 23) {
910            // supports static/dynamic shadow, supports rounded corner
911            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
912                    0, 0, false);
913        } else {
914            // supports foreground
915            result.expect(false, 0, 0, false,
916                    HALF_OVERLAY_COLOR, 0, false);
917        }
918    }
919
920    @Test
921    public void shadowOverlayContainerTest24() {
922        final boolean isUsingZorder = true;
923        final boolean isUsingDefaultShadow = false;
924        final boolean enableRoundedCorner = true;
925        final boolean shadowEnabled = true;
926        final boolean keepChildForeground = true;
927        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
928                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
929        final int version = Build.VERSION.SDK_INT;
930        if (version < 21) {
931            // nothing supported
932            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
933                    0, 0, false);
934        } else if (version < 23) {
935            // supports static/dynamic shadow, supports rounded corner
936            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
937                    0, 0, false);
938        } else {
939            // supports foreground
940            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
941                    0, 0, false);
942        }
943    }
944
945    @Test
946    public void shadowOverlayContainerTest25() {
947        final boolean isUsingZorder = true;
948        final boolean isUsingDefaultShadow = true;
949        final boolean enableRoundedCorner = false;
950        final boolean shadowEnabled = false;
951        final boolean keepChildForeground = false;
952        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
953                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
954        final int version = Build.VERSION.SDK_INT;
955        if (version < 21) {
956            // nothing supported
957            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
958                    0, 0, false);
959        } else if (version < 23) {
960            // supports static/dynamic shadow, supports rounded corner
961            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
962                    0, 0, false);
963        } else {
964            // supports foreground
965            result.expect(false, 0, 0, false,
966                    HALF_OVERLAY_COLOR, 0, false);
967        }
968    }
969
970    @Test
971    public void shadowOverlayContainerTest26() {
972        final boolean isUsingZorder = true;
973        final boolean isUsingDefaultShadow = true;
974        final boolean enableRoundedCorner = false;
975        final boolean shadowEnabled = false;
976        final boolean keepChildForeground = true;
977        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
978                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
979        final int version = Build.VERSION.SDK_INT;
980        if (version < 21) {
981            // nothing supported
982            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
983                    0, 0, false);
984        } else if (version < 23) {
985            // supports static/dynamic shadow, supports rounded corner
986            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
987                    0, 0, false);
988        } else {
989            // supports foreground
990            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
991                    0, 0, false);
992        }
993    }
994
995    @Test
996    public void shadowOverlayContainerTest27() {
997        final boolean isUsingZorder = true;
998        final boolean isUsingDefaultShadow = true;
999        final boolean enableRoundedCorner = false;
1000        final boolean shadowEnabled = true;
1001        final boolean keepChildForeground = false;
1002        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1003                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1004        final int version = Build.VERSION.SDK_INT;
1005        if (version < 21) {
1006            // nothing supported
1007            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1008                    0, 0, false);
1009        } else if (version < 23) {
1010            // supports static/dynamic shadow, supports rounded corner
1011            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1012                    0, 0, false);
1013        } else {
1014            // supports foreground
1015            result.expect(false, 0, 0, false,
1016                    HALF_OVERLAY_COLOR, sFocusedZ, false);
1017        }
1018    }
1019
1020    @Test
1021    public void shadowOverlayContainerTest28() {
1022        final boolean isUsingZorder = true;
1023        final boolean isUsingDefaultShadow = true;
1024        final boolean enableRoundedCorner = false;
1025        final boolean shadowEnabled = true;
1026        final boolean keepChildForeground = true;
1027        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1028                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1029        final int version = Build.VERSION.SDK_INT;
1030        if (version < 21) {
1031            // nothing supported
1032            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1033                    0, 0, false);
1034        } else if (version < 23) {
1035            // supports static/dynamic shadow, supports rounded corner
1036            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1037                    0, 0, false);
1038        } else {
1039            // supports foreground
1040            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1041                    0, 0, false);
1042        }
1043    }
1044
1045    @Test
1046    public void shadowOverlayContainerTest29() {
1047        final boolean isUsingZorder = true;
1048        final boolean isUsingDefaultShadow = true;
1049        final boolean enableRoundedCorner = true;
1050        final boolean shadowEnabled = false;
1051        final boolean keepChildForeground = false;
1052        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1053                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1054        final int version = Build.VERSION.SDK_INT;
1055        if (version < 21) {
1056            // nothing supported
1057            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1058                    0, 0, false);
1059        } else if (version < 23) {
1060            // supports static/dynamic shadow, supports rounded corner
1061            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1062                    0, 0, false);
1063        } else {
1064            // supports foreground
1065            result.expect(false, 0, 0, false,
1066                    HALF_OVERLAY_COLOR, 0, false);
1067        }
1068    }
1069
1070    @Test
1071    public void shadowOverlayContainerTest30() {
1072        final boolean isUsingZorder = true;
1073        final boolean isUsingDefaultShadow = true;
1074        final boolean enableRoundedCorner = true;
1075        final boolean shadowEnabled = false;
1076        final boolean keepChildForeground = true;
1077        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1078                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1079        final int version = Build.VERSION.SDK_INT;
1080        if (version < 21) {
1081            // nothing supported
1082            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1083                    0, 0, false);
1084        } else if (version < 23) {
1085            // supports static/dynamic shadow, supports rounded corner
1086            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1087                    0, 0, false);
1088        } else {
1089            // supports foreground
1090            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1091                    0, 0, false);
1092        }
1093    }
1094
1095    @Test
1096    public void shadowOverlayContainerTest31() {
1097        final boolean isUsingZorder = true;
1098        final boolean isUsingDefaultShadow = true;
1099        final boolean enableRoundedCorner = true;
1100        final boolean shadowEnabled = true;
1101        final boolean keepChildForeground = false;
1102        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1103                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1104        final int version = Build.VERSION.SDK_INT;
1105        if (version < 21) {
1106            // nothing supported
1107            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1108                    0, 0, false);
1109        } else if (version < 23) {
1110            // supports static/dynamic shadow, supports rounded corner
1111            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1112                    0, 0, false);
1113        } else {
1114            // supports foreground
1115            result.expect(false, 0, 0, false,
1116                    HALF_OVERLAY_COLOR, sFocusedZ, false);
1117        }
1118    }
1119
1120    @Test
1121    public void shadowOverlayContainerTest32() {
1122        final boolean isUsingZorder = true;
1123        final boolean isUsingDefaultShadow = true;
1124        final boolean enableRoundedCorner = true;
1125        final boolean shadowEnabled = true;
1126        final boolean keepChildForeground = true;
1127        ShadowOverlayResult result = setupDefaultPresenterWithSingleElement(isUsingZorder,
1128                isUsingDefaultShadow, enableRoundedCorner, shadowEnabled, keepChildForeground);
1129        final int version = Build.VERSION.SDK_INT;
1130        if (version < 21) {
1131            // nothing supported
1132            result.expect(true, HALF_OVERLAY_COLOR, 0, false,
1133                    0, 0, false);
1134        } else if (version < 23) {
1135            // supports static/dynamic shadow, supports rounded corner
1136            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1137                    0, 0, false);
1138        } else {
1139            // supports foreground
1140            result.expect(true, HALF_OVERLAY_COLOR, sFocusedZ, false,
1141                    0, 0, false);
1142        }
1143    }
1144
1145    @Test
1146    public void shadowOverlayContainerTestDefaultSettings() {
1147        ListRowPresenter presenter = new ListRowPresenter();
1148        final int version = Build.VERSION.SDK_INT;
1149        if (version < 21) {
1150            assertFalse(presenter.isUsingZOrder(mContext));
1151            assertFalse(presenter.isUsingDefaultShadow());
1152        } else {
1153            assertTrue(presenter.isUsingZOrder(mContext));
1154            assertTrue(presenter.isUsingDefaultShadow());
1155        }
1156        assertTrue(presenter.areChildRoundedCornersEnabled());
1157        assertTrue(presenter.getShadowEnabled());
1158        assertTrue(presenter.isKeepChildForeground());
1159    }
1160}
1161