1985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin/* 2985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Copyright (C) 2013 DroidDriver committers 3985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * 4985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Licensed under the Apache License, Version 2.0 (the "License"); 5985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * you may not use this file except in compliance with the License. 6985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * You may obtain a copy of the License at 7985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * 8985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * http://www.apache.org/licenses/LICENSE-2.0 9985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * 10985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Unless required by applicable law or agreed to in writing, software 11985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * distributed under the License is distributed on an "AS IS" BASIS, 12985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * See the License for the specific language governing permissions and 14985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * limitations under the License. 15985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin */ 16985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 174b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinpackage io.appium.droiddriver.finders; 18985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 194b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.UiElement; 204b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.util.Preconditions; 21985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 22985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin/** 230319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * Finds UiElement by applying Finders in turn: using the UiElement returned by 240319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * first Finder as context for the second Finder. It is conceptually similar to 250319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * <a href="http://en.wikipedia.org/wiki/Functional_composition">Function 260319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * composition</a>. The returned UiElement can be thought of as the result of 270319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * second(first(context)). 280319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * <p> 290319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * Note typically first Finder finds the ancestor, then second Finder finds the 300319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * target UiElement, which is a descendant. ChainFinder can be chained with 310319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * additional Finders to make a "chain". 32985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin */ 337576fbbba2bf515908b45293b7156b5bfe088938Kevin Jinpublic class ChainFinder implements Finder { 340319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin private final Finder first; 350319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin private final Finder second; 36985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 370319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin protected ChainFinder(Finder first, Finder second) { 380319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin this.first = Preconditions.checkNotNull(first); 390319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin this.second = Preconditions.checkNotNull(second); 40985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin } 41985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 42985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin @Override 43985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin public String toString() { 440319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin return String.format("Chain{%s, %s}", first, second); 45985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin } 46985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin 47985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin @Override 48985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin public UiElement find(UiElement context) { 490319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin return second.find(first.find(context)); 50985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin } 51985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin} 52