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 com.android.messaging.ui.mediapicker;
17
18import android.content.Context;
19import android.provider.MediaStore.Images.Media;
20import android.view.View;
21import android.widget.CheckBox;
22
23import com.android.messaging.FakeFactory;
24import com.android.messaging.R;
25import com.android.messaging.datamodel.FakeCursor;
26import com.android.messaging.datamodel.FakeDataModel;
27import com.android.messaging.datamodel.data.GalleryGridItemData;
28import com.android.messaging.datamodel.data.TestDataFactory;
29import com.android.messaging.ui.AsyncImageView;
30import com.android.messaging.ui.ViewTest;
31import com.android.messaging.util.UriUtil;
32
33import org.mockito.Matchers;
34import org.mockito.Mock;
35import org.mockito.Mockito;
36
37public class GalleryGridItemViewTest extends ViewTest<GalleryGridItemView> {
38
39    @Mock GalleryGridItemView.HostInterface mockHost;
40
41    @Override
42    protected void setUp() throws Exception {
43        super.setUp();
44        final Context context = getInstrumentation().getTargetContext();
45        FakeFactory.register(context)
46            .withDataModel(new FakeDataModel(context));
47    }
48
49    protected void verifyClickedItem(final View view, final GalleryGridItemData data) {
50        Mockito.verify(mockHost).onItemClicked(view, data, false /* longClick */);
51    }
52
53    protected void verifyContent(
54            final GalleryGridItemView view,
55            final String imageUrl,
56            final boolean showCheckbox,
57            final boolean isSelected) {
58        final AsyncImageView imageView = (AsyncImageView) view.findViewById(R.id.image);
59        final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
60
61        assertNotNull(imageView);
62        assertTrue(imageView.mImageRequestBinding.isBound());
63        assertTrue(imageView.mImageRequestBinding.getData().getKey().startsWith(imageUrl));
64        assertNotNull(checkBox);
65        if (showCheckbox) {
66            assertEquals(View.VISIBLE, checkBox.getVisibility());
67            assertEquals(isSelected, checkBox.isChecked());
68        } else {
69            assertNotSame(View.VISIBLE, checkBox.getVisibility());
70        }
71    }
72
73    public void testBind() {
74        Mockito.when(mockHost.isMultiSelectEnabled()).thenReturn(false);
75        Mockito.when(mockHost.isItemSelected(Matchers.<GalleryGridItemData>any()))
76                .thenReturn(false);
77        final GalleryGridItemView view = getView();
78        final FakeCursor cursor = TestDataFactory.getGalleryGridCursor();
79        cursor.moveToFirst();
80        final String path = (String) cursor.getAt(Media.DATA, 0);
81        view.bind(cursor, mockHost);
82        verifyContent(view, UriUtil.getUriForResourceFile(path).toString(),
83                false, false);
84    }
85
86    public void testBindMultiSelectUnSelected() {
87        Mockito.when(mockHost.isMultiSelectEnabled()).thenReturn(true);
88        Mockito.when(mockHost.isItemSelected(Matchers.<GalleryGridItemData>any()))
89                .thenReturn(false);
90        final GalleryGridItemView view = getView();
91        final FakeCursor cursor = TestDataFactory.getGalleryGridCursor();
92        cursor.moveToFirst();
93        final String path = (String) cursor.getAt(Media.DATA, 0);
94        view.bind(cursor, mockHost);
95        verifyContent(view, UriUtil.getUriForResourceFile(path).toString(),
96                true, false);
97    }
98
99    public void testBindMultiSelectSelected() {
100        Mockito.when(mockHost.isMultiSelectEnabled()).thenReturn(true);
101        Mockito.when(mockHost.isItemSelected(Matchers.<GalleryGridItemData>any()))
102                .thenReturn(true);
103        final GalleryGridItemView view = getView();
104        final FakeCursor cursor = TestDataFactory.getGalleryGridCursor();
105        cursor.moveToFirst();
106        final String path = (String) cursor.getAt(Media.DATA, 0);
107        view.bind(cursor, mockHost);
108        verifyContent(view, UriUtil.getUriForResourceFile(path).toString(),
109                true, true);
110    }
111
112    public void testClick() {
113        Mockito.when(mockHost.isMultiSelectEnabled()).thenReturn(false);
114        Mockito.when(mockHost.isItemSelected(Matchers.<GalleryGridItemData>any()))
115                .thenReturn(false);
116        final GalleryGridItemView view = getView();
117        final FakeCursor cursor = TestDataFactory.getGalleryGridCursor();
118        cursor.moveToFirst();
119        view.bind(cursor, mockHost);
120        view.performClick();
121        verifyClickedItem(view, view.mData);
122    }
123
124    public void testBindTwice() {
125        Mockito.when(mockHost.isMultiSelectEnabled()).thenReturn(true);
126        Mockito.when(mockHost.isItemSelected(Matchers.<GalleryGridItemData>any()))
127                .thenReturn(false);
128        final GalleryGridItemView view = getView();
129        final FakeCursor cursor = TestDataFactory.getGalleryGridCursor();
130
131        cursor.moveToFirst();
132        view.bind(cursor, mockHost);
133
134        cursor.moveToNext();
135        final String path = (String) cursor.getAt(Media.DATA, 1);
136        view.bind(cursor, mockHost);
137        verifyContent(view, UriUtil.getUriForResourceFile(path).toString(),
138                true, false);
139    }
140
141    @Override
142    protected int getLayoutIdForView() {
143        return R.layout.gallery_grid_item_view;
144    }
145}
146