/*
* This file provided by Facebook is for non-commercial testing and evaluation
* purposes only. Facebook reserves all rights not expressly granted.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.fresco.sample.test;
import android.graphics.Point;
import android.os.Build;
import android.test.ActivityInstrumentationTestCase2;
import android.test.TouchUtils;
import android.view.Display;
import android.widget.ListView;
import android.widget.Spinner;
import com.facebook.common.logging.FLog;
import com.facebook.fresco.sample.MainActivity;
import com.facebook.fresco.sample.R;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Instrumentation test that tests glide, picasso, uil and volley in the sample
* app by scrolling down SCROLLS times.
*/
public class ScrollTest extends ActivityInstrumentationTestCase2<MainActivity> {
private static final int SCROLLS = 30;
private static final int SCROLL_TIME_MS = 1000;
private static final int BEFORE_SCROLL_TIME_MS = 500;
private static final int WAIT_FOR_IMAGES_INTERCHECK_MS = 1000;
private static final int WAIT_BEFORE_TEST_END_MS = 5000;
private MainActivity mActivity;
private ListView mImageList;
private Spinner mLoaderSelect;
public ScrollTest() {
super(MainActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
mImageList = (ListView) mActivity.findViewById(R.id.image_list);
mLoaderSelect = (Spinner) mActivity.findViewById(R.id.loader_select);
FLog.setMinimumLoggingLevel(FLog.INFO);
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
public void testFresco() throws Exception {
runScenario(MainActivity.FRESCO_INDEX, true);
}
public void testFrescoOkhttp() throws Exception {
runScenario(MainActivity.FRESCO_OKHTTP_INDEX, true);
}
public void testGlide() throws Exception {
runScenario(MainActivity.GLIDE_INDEX, false);
}
public void testPicasso() throws Exception {
runScenario(MainActivity.PICASSO_INDEX, false);
}
public void testUil() throws Exception {
runScenario(MainActivity.UIL_INDEX, false);
}
public void testVolley() throws Exception {
runScenario(MainActivity.VOLLEY_INDEX, false);
}
public void testDraweeVolley() throws Exception {
runScenario(MainActivity.VOLLEY_INDEX, true);
}
/**
* Runs the test for given library.
*/
private void runScenario(int libraryIndex, boolean useDrawee) throws Exception {
disableAnimatedImages();
setUseDrawee(useDrawee);
selectFramework(libraryIndex);
TouchUtils.tapView(this, mImageList);
waitForImages();
scrollMultipleTimes(SCROLLS);
Thread.sleep(WAIT_BEFORE_TEST_END_MS);
}
/**
* Disables animated images in list view.
*/
private void disableAnimatedImages() {
getInstrumentation().runOnMainSync(
new Runnable() {
@Override
public void run() {
mActivity.setAllowAnimations(false);
}
});
}
/**
* Disables or enables Drawee.
*/
private void setUseDrawee(final boolean useDrawee) {
getInstrumentation().runOnMainSync(
new Runnable() {
@Override
public void run() {
mActivity.setUseDrawee(useDrawee);
}
});
}
/**
* Selects give library in the select component.
*/
private void selectFramework(final int libraryIndex) {
getInstrumentation().runOnMainSync(
new Runnable() {
@Override
public void run() {
mLoaderSelect.setSelection(libraryIndex, true);
}
});
}
/**
* Waits until the list view is populated with content, that is
* until list of images is downloaded.
*/
private void waitForImages() throws Exception {
final AtomicBoolean mImagesLoaded = new AtomicBoolean();
while (!mImagesLoaded.get()) {
Thread.sleep(WAIT_FOR_IMAGES_INTERCHECK_MS);
getInstrumentation().runOnMainSync(
new Runnable() {
@Override
public void run() {
mImagesLoaded.set(mImageList.getAdapter().getCount() > 0);
}
});
}
}
/**
* Scrolls the list view given number of times.
*/
private void scrollMultipleTimes(int times) throws Exception {
final int height = getDisplayHeight();
for (int i = 0; i < times; ++i) {
Thread.sleep(BEFORE_SCROLL_TIME_MS);
getInstrumentation().runOnMainSync(
new Runnable() {
@Override
public void run() {
mImageList.smoothScrollBy(height / 2, SCROLL_TIME_MS);
}
});
Thread.sleep(SCROLL_TIME_MS);
}
}
/**
* Determines display's height.
*/
private int getDisplayHeight() {
Display display = mActivity.getWindowManager().getDefaultDisplay();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
return display.getHeight();
} else {
final Point size = new Point();
display.getSize(size);
return size.y;
}
}
}