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  */
16 package com.android.messaging.datamodel.media;
17 
18 import android.content.ContentResolver;
19 import android.graphics.BitmapFactory;
20 import android.net.Uri;
21 import android.test.suitebuilder.annotation.SmallTest;
22 
23 import com.android.messaging.BugleTestCase;
24 import com.android.messaging.FakeFactory;
25 import com.android.messaging.R;
26 import com.android.messaging.datamodel.MemoryCacheManager;
27 import com.android.messaging.util.ImageUtils;
28 
29 import org.mockito.ArgumentCaptor;
30 import org.mockito.Matchers;
31 import org.mockito.Mockito;
32 import org.mockito.Spy;
33 
34 import java.io.IOException;
35 
36 @SmallTest
37 public class ImageRequestTest extends BugleTestCase {
38     private static final int DOWNSAMPLE_IMAGE_SIZE = 2;
39 
40     @Spy protected ImageUtils spyImageUtils;
41 
42     @Override
setUp()43     protected void setUp() throws Exception {
44         super.setUp();
45         FakeFactory.register(getTestContext())
46                    .withMemoryCacheManager(new MemoryCacheManager())
47                    .withMediaCacheManager(new BugleMediaCacheManager());
48         spyImageUtils = Mockito.spy(new ImageUtils());
49         ImageUtils.set(spyImageUtils);
50     }
51 
testLoadImageUnspecifiedSize()52     public void testLoadImageUnspecifiedSize() {
53         final String uriString = ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
54                 getContext().getPackageName() + "/" + R.drawable.ic_audio_light;
55         final Uri uri = Uri.parse(uriString);
56         final UriImageRequest imageRequest = new UriImageRequest(getContext(),
57                 new UriImageRequestDescriptor(uri));
58         try {
59             final ImageResource imageResource = imageRequest.loadMediaBlocking(null);
60             final ArgumentCaptor<BitmapFactory.Options> options =
61                     ArgumentCaptor.forClass(BitmapFactory.Options.class);
62             Mockito.verify(spyImageUtils).calculateInSampleSize(
63                     options.capture(),
64                     Matchers.eq(ImageRequest.UNSPECIFIED_SIZE),
65                     Matchers.eq(ImageRequest.UNSPECIFIED_SIZE));
66             assertEquals(1, options.getValue().inSampleSize);
67             assertNotNull(imageResource);
68             assertNotNull(imageResource.getBitmap());
69 
70             // Make sure there's no scaling on the bitmap.
71             final int bitmapWidth = imageResource.getBitmap().getWidth();
72             final int bitmapHeight = imageResource.getBitmap().getHeight();
73             assertEquals(options.getValue().outWidth, bitmapWidth);
74             assertEquals(options.getValue().outHeight, bitmapHeight);
75         } catch (final IOException e) {
76             fail("IO exception while trying to load image resource");
77         }
78     }
79 
testLoadImageWithDownsampling()80     public void testLoadImageWithDownsampling() {
81         final String uriString = ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
82                 getContext().getPackageName() + "/" + R.drawable.ic_audio_light;
83         final Uri uri = Uri.parse(uriString);
84         final UriImageRequest imageRequest = new UriImageRequest(getContext(),
85                 new UriImageRequestDescriptor(uri, DOWNSAMPLE_IMAGE_SIZE, DOWNSAMPLE_IMAGE_SIZE,
86                         false, true /* isStatic */, false /* cropToCircle */,
87                         ImageUtils.DEFAULT_CIRCLE_BACKGROUND_COLOR /* circleBackgroundColor */,
88                         ImageUtils.DEFAULT_CIRCLE_STROKE_COLOR /* circleStrokeColor */));
89         try {
90             final ImageResource imageResource = imageRequest.loadMediaBlocking(null);
91             final ArgumentCaptor<BitmapFactory.Options> options =
92                     ArgumentCaptor.forClass(BitmapFactory.Options.class);
93             Mockito.verify(spyImageUtils).calculateInSampleSize(
94                     options.capture(),
95                     Matchers.eq(DOWNSAMPLE_IMAGE_SIZE), Matchers.eq(DOWNSAMPLE_IMAGE_SIZE));
96             assertNotSame(1, options.getValue().inSampleSize);
97             assertNotNull(imageResource);
98             assertNotNull(imageResource.getBitmap());
99 
100             // Make sure there's down sampling on the bitmap.
101             final int bitmapWidth = imageResource.getBitmap().getWidth();
102             final int bitmapHeight = imageResource.getBitmap().getHeight();
103             assertTrue(bitmapWidth >= DOWNSAMPLE_IMAGE_SIZE &&
104                     bitmapHeight >= DOWNSAMPLE_IMAGE_SIZE &&
105                     (bitmapWidth <= DOWNSAMPLE_IMAGE_SIZE * 4 ||
106                     bitmapHeight <= DOWNSAMPLE_IMAGE_SIZE * 4));
107         } catch (final IOException e) {
108             fail("IO exception while trying to load image resource");
109         }
110     }
111 }
112