• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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 
17 package android.graphics.drawable.cts;
18 
19 import com.android.cts.graphics.R;
20 
21 import org.xmlpull.v1.XmlPullParser;
22 import org.xmlpull.v1.XmlPullParserException;
23 
24 import java.io.File;
25 import java.io.FileInputStream;
26 import java.io.FileNotFoundException;
27 import java.io.FileOutputStream;
28 import java.io.IOException;
29 import java.io.InputStream;
30 import java.io.OutputStream;
31 
32 import android.content.ContentResolver;
33 import android.content.res.Resources;
34 import android.graphics.BitmapFactory;
35 import android.graphics.Canvas;
36 import android.graphics.ColorFilter;
37 import android.graphics.PixelFormat;
38 import android.graphics.PorterDuff;
39 import android.graphics.Rect;
40 import android.graphics.drawable.Drawable;
41 import android.net.Uri;
42 import android.test.AndroidTestCase;
43 import android.util.AttributeSet;
44 import android.util.StateSet;
45 import android.util.TypedValue;
46 import android.util.Xml;
47 
48 public class DrawableTest extends AndroidTestCase {
49     Resources mResources;
50 
51     @Override
setUp()52     protected void setUp() throws Exception {
53         super.setUp();
54 
55         mResources = mContext.getResources();
56     }
57 
testClearColorFilter()58     public void testClearColorFilter() {
59         MockDrawable mockDrawable = new MockDrawable();
60         mockDrawable.clearColorFilter();
61         assertNull(mockDrawable.getColorFilter());
62 
63         ColorFilter cf = new ColorFilter();
64         mockDrawable.setColorFilter(cf);
65         assertEquals(cf, mockDrawable.getColorFilter());
66 
67         mockDrawable.clearColorFilter();
68         assertNull(mockDrawable.getColorFilter());
69     }
70 
testCopyBounds()71     public void testCopyBounds() {
72         MockDrawable mockDrawable = new MockDrawable();
73         Rect rect1 = mockDrawable.copyBounds();
74         Rect r1 = new Rect();
75         mockDrawable.copyBounds(r1);
76         assertEquals(0, rect1.bottom);
77         assertEquals(0, rect1.left);
78         assertEquals(0, rect1.right);
79         assertEquals(0, rect1.top);
80         assertEquals(0, r1.bottom);
81         assertEquals(0, r1.left);
82         assertEquals(0, r1.right);
83         assertEquals(0, r1.top);
84 
85         mockDrawable.setBounds(10, 10, 100, 100);
86         Rect rect2 = mockDrawable.copyBounds();
87         Rect r2 = new Rect();
88         mockDrawable.copyBounds(r2);
89         assertEquals(100, rect2.bottom);
90         assertEquals(10, rect2.left);
91         assertEquals(100, rect2.right);
92         assertEquals(10, rect2.top);
93         assertEquals(100, r2.bottom);
94         assertEquals(10, r2.left);
95         assertEquals(100, r2.right);
96         assertEquals(10, r2.top);
97 
98         mockDrawable.setBounds(new Rect(50, 50, 500, 500));
99         Rect rect3 = mockDrawable.copyBounds();
100         Rect r3 = new Rect();
101         mockDrawable.copyBounds(r3);
102         assertEquals(500, rect3.bottom);
103         assertEquals(50, rect3.left);
104         assertEquals(500, rect3.right);
105         assertEquals(50, rect3.top);
106         assertEquals(500, r3.bottom);
107         assertEquals(50, r3.left);
108         assertEquals(500, r3.right);
109         assertEquals(50, r3.top);
110 
111         try {
112             mockDrawable.copyBounds(null);
113             fail("should throw NullPointerException.");
114         } catch (NullPointerException e) {
115         }
116     }
117 
testCreateFromPath()118     public void testCreateFromPath() throws IOException {
119         assertNull(Drawable.createFromPath(null));
120 
121         Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
122                 mContext.getPackageName() + R.raw.testimage);
123         assertNull(Drawable.createFromPath(uri.getPath()));
124 
125         File imageFile = new File(mContext.getFilesDir(), "tempimage.jpg");
126         assertTrue(imageFile.createNewFile());
127         assertTrue(imageFile.exists());
128         writeSampleImage(imageFile);
129 
130         final String path = imageFile.getPath();
131         Uri u = Uri.parse(path);
132         assertNotNull(Drawable.createFromPath(u.toString()));
133         assertTrue(imageFile.delete());
134     }
135 
writeSampleImage(File imagefile)136     private void writeSampleImage(File imagefile) throws IOException {
137         InputStream source = null;
138         OutputStream target = null;
139 
140         try {
141             source = mResources.openRawResource(R.raw.testimage);
142             target = new FileOutputStream(imagefile);
143 
144             byte[] buffer = new byte[1024];
145             for (int len = source.read(buffer); len >= 0; len = source.read(buffer)) {
146                 target.write(buffer, 0, len);
147             }
148         } finally {
149             if (target != null) {
150                 target.close();
151             }
152 
153             if (source != null) {
154                 source.close();
155             }
156         }
157     }
158 
testCreateFromStream()159     public void testCreateFromStream() throws FileNotFoundException, IOException {
160         FileInputStream inputEmptyStream = null;
161         FileInputStream inputStream = null;
162         File imageFile = null;
163         OutputStream outputEmptyStream = null;
164 
165         assertNull(Drawable.createFromStream(null, "test.bmp"));
166 
167         File emptyFile = new File(mContext.getFilesDir(), "tempemptyimage.jpg");
168 
169         // write some random data.
170         try {
171             outputEmptyStream = new FileOutputStream(emptyFile);
172             outputEmptyStream.write(10);
173 
174             inputEmptyStream = new FileInputStream(emptyFile);
175             assertNull(Drawable.createFromStream(inputEmptyStream, "Sample"));
176 
177             imageFile = new File(mContext.getFilesDir(), "tempimage.jpg");
178 
179             writeSampleImage(imageFile);
180 
181             inputStream = new FileInputStream(imageFile);
182             assertNotNull(Drawable.createFromStream(inputStream, "Sample"));
183         } finally {
184 
185             if (null != outputEmptyStream) {
186                 outputEmptyStream.close();
187             }
188             if (null != inputEmptyStream) {
189                 inputEmptyStream.close();
190             }
191             if (null != inputStream) {
192                 inputStream.close();
193             }
194             if (emptyFile.exists()) {
195                 assertTrue(emptyFile.delete());
196             }
197             if (imageFile.exists()) {
198                 assertTrue(imageFile.delete());
199             }
200         }
201     }
202 
testCreateFromResourceStream1()203     public void testCreateFromResourceStream1() throws FileNotFoundException, IOException {
204         FileInputStream inputEmptyStream = null;
205         FileInputStream inputStream = null;
206         File imageFile = null;
207         OutputStream outputEmptyStream = null;
208 
209         assertNull(Drawable.createFromResourceStream(null, null, inputStream, "test.bmp"));
210 
211         File emptyFile = new File(mContext.getFilesDir(), "tempemptyimage.jpg");
212 
213         // write some random data.
214         try {
215             outputEmptyStream = new FileOutputStream(emptyFile);
216             outputEmptyStream.write(10);
217 
218             inputEmptyStream = new FileInputStream(emptyFile);
219             assertNull(Drawable.createFromResourceStream(mResources, null, inputEmptyStream,
220                     "Sample"));
221 
222             imageFile = new File(mContext.getFilesDir(), "tempimage.jpg");
223 
224             writeSampleImage(imageFile);
225 
226             inputStream = new FileInputStream(imageFile);
227             final TypedValue value = new TypedValue();
228             assertNotNull(Drawable.createFromResourceStream(mResources, value, inputStream,
229                     "Sample"));
230         } finally {
231 
232             if (null != outputEmptyStream) {
233                 outputEmptyStream.close();
234             }
235             if (null != inputEmptyStream) {
236                 inputEmptyStream.close();
237             }
238             if (null != inputStream) {
239                 inputStream.close();
240             }
241             if (emptyFile.exists()) {
242                 assertTrue(emptyFile.delete());
243             }
244             if (imageFile.exists()) {
245                 assertTrue(imageFile.delete());
246             }
247         }
248     }
249 
testCreateFromResourceStream2()250     public void testCreateFromResourceStream2() throws FileNotFoundException, IOException {
251         FileInputStream inputEmptyStream = null;
252         FileInputStream inputStream = null;
253         File imageFile = null;
254         OutputStream outputEmptyStream = null;
255 
256         BitmapFactory.Options opt = new BitmapFactory.Options();
257         opt.inScaled = false;
258 
259         assertNull(Drawable.createFromResourceStream(null, null, inputStream, "test.bmp", opt));
260 
261         File emptyFile = new File(mContext.getFilesDir(), "tempemptyimage.jpg");
262 
263         // write some random data.
264         try {
265             outputEmptyStream = new FileOutputStream(emptyFile);
266             outputEmptyStream.write(10);
267 
268             inputEmptyStream = new FileInputStream(emptyFile);
269             assertNull(Drawable.createFromResourceStream(mResources, null, inputEmptyStream,
270                     "Sample", opt));
271 
272             imageFile = new File(mContext.getFilesDir(), "tempimage.jpg");
273 
274             writeSampleImage(imageFile);
275 
276             inputStream = new FileInputStream(imageFile);
277             final TypedValue value = new TypedValue();
278             assertNotNull(Drawable.createFromResourceStream(mResources, value, inputStream,
279                     "Sample", opt));
280         } finally {
281 
282             if (null != outputEmptyStream) {
283                 outputEmptyStream.close();
284             }
285             if (null != inputEmptyStream) {
286                 inputEmptyStream.close();
287             }
288             if (null != inputStream) {
289                 inputStream.close();
290             }
291             if (emptyFile.exists()) {
292                 assertTrue(emptyFile.delete());
293             }
294             if (imageFile.exists()) {
295                 assertTrue(imageFile.delete());
296             }
297         }
298     }
299 
testCreateFromXml()300     public void testCreateFromXml() throws XmlPullParserException, IOException {
301         XmlPullParser parser = mResources.getXml(R.drawable.gradientdrawable);
302         Drawable drawable = Drawable.createFromXml(mResources, parser);
303         // values from gradientdrawable.xml
304         assertEquals(42, drawable.getIntrinsicWidth());
305         assertEquals(63, drawable.getIntrinsicHeight());
306     }
307 
testCreateFromXmlInner()308     public void testCreateFromXmlInner() throws XmlPullParserException, IOException {
309         XmlPullParser parser = mResources.getXml(R.drawable.gradientdrawable);
310         while (parser.next() != XmlPullParser.START_TAG) {
311             // ignore event, just seek to first tag
312         }
313         AttributeSet attrs = Xml.asAttributeSet(parser);
314         Drawable drawable = Drawable.createFromXmlInner(mResources, parser, attrs);
315         assertNotNull(drawable);
316 
317         Drawable expected = mResources.getDrawable(R.drawable.gradientdrawable);
318 
319         assertEquals(expected.getIntrinsicWidth(), drawable.getIntrinsicWidth());
320         assertEquals(expected.getIntrinsicHeight(), drawable.getIntrinsicHeight());
321     }
322 
testAccessBounds()323     public void testAccessBounds() {
324         MockDrawable mockDrawable = new MockDrawable();
325         mockDrawable.setBounds(0, 0, 100, 100);
326         Rect r = mockDrawable.getBounds();
327         assertEquals(0, r.left);
328         assertEquals(0, r.top);
329         assertEquals(100, r.bottom);
330         assertEquals(100, r.right);
331 
332         mockDrawable.setBounds(new Rect(10, 10, 150, 150));
333         r = mockDrawable.getBounds();
334         assertEquals(10, r.left);
335         assertEquals(10, r.top);
336         assertEquals(150, r.bottom);
337         assertEquals(150, r.right);
338 
339         try {
340             mockDrawable.setBounds(null);
341             fail("should throw NullPointerException.");
342         } catch (NullPointerException e) {
343         }
344     }
345 
testAccessChangingConfigurations()346     public void testAccessChangingConfigurations() {
347         MockDrawable mockDrawable = new MockDrawable();
348         assertEquals(0, mockDrawable.getChangingConfigurations());
349 
350         mockDrawable.setChangingConfigurations(1);
351         assertEquals(1, mockDrawable.getChangingConfigurations());
352 
353         mockDrawable.setChangingConfigurations(Integer.MAX_VALUE);
354         assertEquals(Integer.MAX_VALUE, mockDrawable.getChangingConfigurations());
355 
356         mockDrawable.setChangingConfigurations(Integer.MIN_VALUE);
357         assertEquals(Integer.MIN_VALUE, mockDrawable.getChangingConfigurations());
358     }
359 
testGetConstantState()360     public void testGetConstantState() {
361         MockDrawable mockDrawable = new MockDrawable();
362         assertNull(mockDrawable.getConstantState());
363     }
364 
testGetCurrent()365     public void testGetCurrent() {
366         MockDrawable mockDrawable = new MockDrawable();
367         assertSame(mockDrawable, mockDrawable.getCurrent());
368     }
369 
testGetIntrinsicHeight()370     public void testGetIntrinsicHeight() {
371         MockDrawable mockDrawable = new MockDrawable();
372         assertEquals(-1, mockDrawable.getIntrinsicHeight());
373     }
374 
testGetIntrinsicWidth()375     public void testGetIntrinsicWidth() {
376         MockDrawable mockDrawable = new MockDrawable();
377         assertEquals(-1, mockDrawable.getIntrinsicWidth());
378     }
379 
testAccessLevel()380     public void testAccessLevel() {
381         MockDrawable mockDrawable = new MockDrawable();
382         assertEquals(0, mockDrawable.getLevel());
383 
384         assertFalse(mockDrawable.setLevel(10));
385         assertEquals(10, mockDrawable.getLevel());
386 
387         assertFalse(mockDrawable.setLevel(20));
388         assertEquals(20, mockDrawable.getLevel());
389 
390         assertFalse(mockDrawable.setLevel(0));
391         assertEquals(0, mockDrawable.getLevel());
392 
393         assertFalse(mockDrawable.setLevel(10000));
394         assertEquals(10000, mockDrawable.getLevel());
395     }
396 
testGetMinimumHeight()397     public void testGetMinimumHeight() {
398         MockDrawable mockDrawable = new MockDrawable();
399         assertEquals(0, mockDrawable.getMinimumHeight());
400     }
401 
testGetMinimumWidth()402     public void testGetMinimumWidth() {
403         MockDrawable mockDrawable = new MockDrawable();
404         assertEquals(0, mockDrawable.getMinimumWidth());
405     }
406 
testGetPadding()407     public void testGetPadding() {
408         MockDrawable mockDrawable = new MockDrawable();
409         Rect r = new Rect(10, 10, 20, 20);
410         assertFalse(mockDrawable.getPadding(r));
411         assertEquals(0, r.bottom);
412         assertEquals(0, r.top);
413         assertEquals(0, r.left);
414         assertEquals(0, r.right);
415 
416         try {
417             mockDrawable.getPadding(null);
418             fail("should throw NullPointerException.");
419         } catch (NullPointerException e) {
420         }
421     }
422 
testAccessState()423     public void testAccessState() {
424         MockDrawable mockDrawable = new MockDrawable();
425         assertEquals(StateSet.WILD_CARD, mockDrawable.getState());
426 
427         int[] states = new int[] {1, 2, 3};
428         assertFalse(mockDrawable.setState(states));
429         assertEquals(states, mockDrawable.getState());
430 
431         mockDrawable.setState(null);
432     }
433 
testGetTransparentRegion()434     public void testGetTransparentRegion() {
435         MockDrawable mockDrawable = new MockDrawable();
436         assertNull(mockDrawable.getTransparentRegion());
437     }
438 
testInflate()439     public void testInflate() throws XmlPullParserException, IOException {
440         MockDrawable mockDrawable = new MockDrawable();
441 
442         XmlPullParser parser = mResources.getXml(R.xml.drawable_test);
443         while (parser.next() != XmlPullParser.START_TAG) {
444             // ignore event, just seek to first tag
445         }
446         AttributeSet attrs = Xml.asAttributeSet(parser);
447 
448         mockDrawable.inflate(mResources, parser, attrs);
449         // visibility set to false in resource
450         assertFalse(mockDrawable.isVisible());
451     }
452 
testInvalidateSelf()453     public void testInvalidateSelf() {
454         MockDrawable mockDrawable = new MockDrawable();
455         // if setCallback() is not called, invalidateSelf() would do nothing,
456         // so just call it to check whether it throws exceptions.
457         mockDrawable.invalidateSelf();
458 
459         MockCallback mockCallback = new MockCallback();
460         mockDrawable.setCallback(mockCallback);
461         mockDrawable.invalidateSelf();
462         assertEquals(mockDrawable, mockCallback.getInvalidateDrawable());
463     }
464 
testIsStateful()465     public void testIsStateful() {
466         MockDrawable mockDrawable = new MockDrawable();
467         assertFalse(mockDrawable.isStateful());
468     }
469 
testVisible()470     public void testVisible() {
471         MockDrawable mockDrawable = new MockDrawable();
472         assertTrue(mockDrawable.isVisible());
473 
474         assertTrue(mockDrawable.setVisible(false, false));
475         assertFalse(mockDrawable.isVisible());
476 
477         assertFalse(mockDrawable.setVisible(false, false));
478         assertFalse(mockDrawable.isVisible());
479 
480         assertTrue(mockDrawable.setVisible(true, false));
481         assertTrue(mockDrawable.isVisible());
482     }
483 
testOnBoundsChange()484     public void testOnBoundsChange() {
485         MockDrawable mockDrawable = new MockDrawable();
486 
487         // onBoundsChange is a non-operation function.
488         mockDrawable.onBoundsChange(new Rect(0, 0, 10, 10));
489     }
490 
testOnLevelChange()491     public void testOnLevelChange() {
492         MockDrawable mockDrawable = new MockDrawable();
493         assertFalse(mockDrawable.onLevelChange(0));
494     }
495 
testOnStateChange()496     public void testOnStateChange() {
497         MockDrawable mockDrawable = new MockDrawable();
498         assertFalse(mockDrawable.onStateChange(null));
499     }
500 
testResolveOpacity()501     public void testResolveOpacity() {
502         assertEquals(PixelFormat.TRANSLUCENT,
503                 Drawable.resolveOpacity(PixelFormat.TRANSLUCENT, PixelFormat.TRANSLUCENT));
504         assertEquals(PixelFormat.UNKNOWN,
505                 Drawable.resolveOpacity(PixelFormat.UNKNOWN, PixelFormat.TRANSLUCENT));
506         assertEquals(PixelFormat.TRANSLUCENT,
507                 Drawable.resolveOpacity(PixelFormat.OPAQUE, PixelFormat.TRANSLUCENT));
508         assertEquals(PixelFormat.TRANSPARENT,
509                 Drawable.resolveOpacity(PixelFormat.OPAQUE, PixelFormat.TRANSPARENT));
510         assertEquals(PixelFormat.OPAQUE,
511                 Drawable.resolveOpacity(PixelFormat.RGB_888, PixelFormat.RGB_565));
512     }
513 
testScheduleSelf()514     public void testScheduleSelf() {
515         MockDrawable mockDrawable = new MockDrawable();
516         MockCallback mockCallback = new MockCallback();
517         mockDrawable.setCallback(mockCallback);
518         mockDrawable.scheduleSelf(null, 1000L);
519         assertEquals(mockDrawable, mockCallback.getScheduleDrawable());
520         assertNull(mockCallback.getRunnable());
521         assertEquals(1000L, mockCallback.getWhen());
522     }
523 
testSetCallback()524     public void testSetCallback() {
525         MockDrawable mockDrawable = new MockDrawable();
526 
527         MockCallback mockCallback = new MockCallback();
528         mockDrawable.setCallback(mockCallback);
529         mockDrawable.scheduleSelf(null, 1000L);
530         assertEquals(mockDrawable, mockCallback.getScheduleDrawable());
531         assertNull(mockCallback.getRunnable());
532         assertEquals(1000L, mockCallback.getWhen());
533     }
534 
testSetColorFilter()535     public void testSetColorFilter() {
536         MockDrawable mockDrawable = new MockDrawable();
537 
538         mockDrawable.setColorFilter(5, PorterDuff.Mode.CLEAR);
539     }
540 
testSetDither()541     public void testSetDither() {
542         MockDrawable mockDrawable = new MockDrawable();
543 
544         // setDither is a non-operation function.
545         mockDrawable.setDither(false);
546     }
547 
testSetFilterBitmap()548     public void testSetFilterBitmap() {
549         MockDrawable mockDrawable = new MockDrawable();
550 
551         // setFilterBitmap is a non-operation function.
552         mockDrawable.setFilterBitmap(false);
553     }
554 
testUnscheduleSelf()555     public void testUnscheduleSelf() {
556         MockDrawable mockDrawable = new MockDrawable();
557         MockCallback mockCallback = new MockCallback();
558         mockDrawable.setCallback(mockCallback);
559         mockDrawable.unscheduleSelf(null);
560         assertEquals(mockDrawable, mockCallback.getScheduleDrawable());
561         assertNull(mockCallback.getRunnable());
562     }
563 
testMutate()564     public void testMutate() {
565         MockDrawable mockDrawable = new MockDrawable();
566 
567         assertSame(mockDrawable, mockDrawable.mutate());
568     }
569 
570     private static class MockDrawable extends Drawable {
571         private ColorFilter mColorFilter;
572 
draw(Canvas canvas)573         public void draw(Canvas canvas) {
574         }
575 
setAlpha(int alpha)576         public void setAlpha(int alpha) {
577         }
578 
setColorFilter(ColorFilter cf)579         public void setColorFilter(ColorFilter cf) {
580             mColorFilter = cf;
581         }
582 
getColorFilter()583         public ColorFilter getColorFilter() {
584             return mColorFilter;
585         }
586 
getOpacity()587         public int getOpacity() {
588             return 0;
589         }
590 
onBoundsChange(Rect bounds)591         protected void onBoundsChange(Rect bounds) {
592             super.onBoundsChange(bounds);
593         }
594 
onLevelChange(int level)595         protected boolean onLevelChange(int level) {
596             return super.onLevelChange(level);
597         }
598 
onStateChange(int[] state)599         protected boolean onStateChange(int[] state) {
600             return super.onStateChange(state);
601         }
602     }
603 
604     private static class MockCallback implements Drawable.Callback {
605         private Drawable mInvalidateDrawable;
606         private Drawable mScheduleDrawable;
607         private Runnable mRunnable;
608         private long mWhen;
609 
MockCallback()610         public MockCallback() {
611         }
612 
getInvalidateDrawable()613         public Drawable getInvalidateDrawable() {
614             return mInvalidateDrawable;
615         }
616 
getScheduleDrawable()617         public Drawable getScheduleDrawable() {
618             return mScheduleDrawable;
619         }
620 
getRunnable()621         public Runnable getRunnable() {
622             return mRunnable;
623         }
624 
getWhen()625         public long getWhen() {
626             return mWhen;
627         }
628 
invalidateDrawable(Drawable who)629         public void invalidateDrawable(Drawable who) {
630             mInvalidateDrawable = who;
631         }
632 
scheduleDrawable(Drawable who, Runnable what, long when)633         public void scheduleDrawable(Drawable who, Runnable what, long when) {
634             mScheduleDrawable = who;
635             mRunnable = what;
636             mWhen = when;
637         }
638 
unscheduleDrawable(Drawable who, Runnable what)639         public void unscheduleDrawable(Drawable who, Runnable what) {
640             mScheduleDrawable = who;
641             mRunnable = what;
642         }
643     }
644 }
645