package com.mindbodyonline.ironhide.Infrastructure.Extensions; import android.support.test.espresso.action.CoordinatesProvider; import android.support.test.espresso.action.Press; import android.support.v4.util.Pair; import java.util.HashMap; import static android.support.test.espresso.action.GeneralLocation.BOTTOM_LEFT; import static android.support.test.espresso.action.GeneralLocation.CENTER; import static android.support.test.espresso.action.GeneralLocation.TOP_RIGHT; /** * An extension for {@link GeneralZoomAction}. * Uses directions rather than start and end locations for easier use and buffers the creation of * ZoomActions so that they do not need to be created multiple times. */ public class ZoomAction { /** * Initial size is the number of combination of most used zoom speeds * (from {@link com.mindbodyonline.ironhide.Infrastructure.Extensions.Zoom}) and the number of * {@link ZoomDirection}s */ private static final HashMap<Pair<Zoomer, ZoomDirection>, GeneralZoomAction> bufferedZoomActions = new HashMap<>(ZoomDirection.values().length * Zoom.values().length); /** * Gets a zoom action. * * @param speed the speed of the zoom * @param direction the direction of the zoom * @return the zoom action requested */ public static GeneralZoomAction getZoom(Zoomer speed, ZoomDirection direction) { Pair<Zoomer, ZoomDirection> key = new Pair<>(speed, direction); if (!bufferedZoomActions.containsKey(key)) bufferedZoomActions.put(key, generateZoom(speed, direction)); return bufferedZoomActions.get(key); } /** * Creates a new zoom action. * * @param speed the speed of the zoom * @param direction the direction of the zoom * @return the zoom action requested */ private static GeneralZoomAction generateZoom(Zoomer speed, ZoomDirection direction) { return new GeneralZoomAction(speed, direction.start, direction.end, Press.FINGER); } /** * An enum to associate directions with start and end locations on a screen. */ public enum ZoomDirection { IN (CENTER, CENTER, TOP_RIGHT, BOTTOM_LEFT), OUT (TOP_RIGHT, BOTTOM_LEFT, CENTER, CENTER); public final CoordinatesProvider[] start, end; /** * Variadic parameters to simplify the look of this function. * First two assumed to be start locations, * next two assumed to be end location, * and the rest are ignored. */ private ZoomDirection(CoordinatesProvider... providers) { this.start = new CoordinatesProvider[]{ providers[0], providers[1] }; this.end = new CoordinatesProvider[]{ providers[2], providers[3] }; } } }