13713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick/* 23713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Copyright (C) 2011 The Android Open Source Project 33713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 43713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 53713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * you may not use this file except in compliance with the License. 63713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * You may obtain a copy of the License at 73713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 83713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * http://www.apache.org/licenses/LICENSE-2.0 93713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * 103713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * Unless required by applicable law or agreed to in writing, software 113713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * distributed under the License is distributed on an "AS IS" BASIS, 123713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * See the License for the specific language governing permissions and 143713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick * limitations under the License. 153713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick */ 163713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 173713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickpackage com.android.volley.toolbox; 183713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 193713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.content.res.Resources; 203713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.graphics.Bitmap; 213713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.graphics.Bitmap.Config; 223713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport android.test.InstrumentationTestCase; 23cebf98c8edef6b3506258ddb68266febadd0db1aJeff Sharkeyimport android.test.suitebuilder.annotation.SmallTest; 243713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 258ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkeyimport com.android.volley.NetworkResponse; 268ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkeyimport com.android.volley.Response; 278ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkeyimport com.android.volley.tests.R; 288ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkey 293713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.io.ByteArrayOutputStream; 303713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.io.IOException; 313713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickimport java.io.InputStream; 323713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 33cebf98c8edef6b3506258ddb68266febadd0db1aJeff Sharkey@SmallTest 343713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrickpublic class ImageRequestTest extends InstrumentationTestCase { 353713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 363713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void testParseNetworkResponse_resizing() throws Exception { 378ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkey byte[] jpegBytes = readRawResource( 388ff39c8b303bb0194c89bb2b74a6793ddf7d8afeJeff Sharkey getInstrumentation().getContext().getResources(), R.raw.large_jpeg_1024_500); 393713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick NetworkResponse jpeg = new NetworkResponse(jpegBytes); 403713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 413713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // Exact sizes 423713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 512, 250, 512, 250); // exactly half 433713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 511, 249, 509, 249); // just under half 443713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 1080, 500, 1024, 500); // larger 453713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 500, 500, 500, 244); // keep same ratio 463713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 473713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // Specify only width, preserve aspect ratio 483713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 512, 0, 512, 250); 493713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 800, 0, 800, 390); 503713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 1024, 0, 1024, 500); 513713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 523713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // Specify only height, preserve aspect ratio 533713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 0, 250, 512, 250); 543713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 0, 391, 800, 391); 553713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 0, 500, 1024, 500); 563713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 573713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // No resize 583713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick verifyResize(jpeg, 0, 0, 1024, 500); 593713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 603713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 613713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private void verifyResize(NetworkResponse networkResponse, int maxWidth, int maxHeight, 623713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick int expectedWidth, int expectedHeight) { 633713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick ImageRequest request = new ImageRequest( 643713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick "", null, maxWidth, maxHeight, Config.RGB_565, null); 653713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Response<Bitmap> response = request.parseNetworkResponse(networkResponse); 663713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertNotNull(response); 673713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertTrue(response.isSuccess()); 683713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick Bitmap bitmap = response.result; 693713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertNotNull(bitmap); 703713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(expectedWidth, bitmap.getWidth()); 713713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(expectedHeight, bitmap.getHeight()); 723713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 733713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 743713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick public void testFindBestSampleSize() { 753713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // desired == actual == 1 763713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(1, ImageRequest.findBestSampleSize(100, 150, 100, 150)); 773713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 783713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // exactly half == 2 793713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(2, ImageRequest.findBestSampleSize(280, 160, 140, 80)); 803713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 813713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // just over half == 1 823713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(1, ImageRequest.findBestSampleSize(1000, 800, 501, 401)); 833713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 843713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick // just under 1/4 == 4 853713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick assertEquals(4, ImageRequest.findBestSampleSize(100, 200, 24, 50)); 863713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 873713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 883713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick private static byte[] readRawResource(Resources res, int resId) throws IOException { 893713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick InputStream in = res.openRawResource(resId); 903713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 913713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick byte[] buffer = new byte[1024]; 923713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick int count; 933713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick while ((count = in.read(buffer)) != -1) { 943713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick bytes.write(buffer, 0, count); 953713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 963713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick in.close(); 973713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick return bytes.toByteArray(); 983713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick } 993713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick 1003713094c56d25e25df2a508dbee4aea869ffdea1Ficus Kirkpatrick} 101