/* * Copyright (C) 2013 DroidDriver committers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.droiddriver.finders; import com.google.android.droiddriver.UiElement; import com.google.android.droiddriver.util.Preconditions; /** * Finds UiElement by applying Finders in turn: using the UiElement returned by * first Finder as context for the second Finder. It is conceptually similar to * Function * composition. The returned UiElement can be thought of as the result of * second(first(context)). *

* Note typically first Finder finds the ancestor, then second Finder finds the * target UiElement, which is a descendant. ChainFinder can be chained with * additional Finders to make a "chain". */ public class ChainFinder implements Finder { private final Finder first; private final Finder second; protected ChainFinder(Finder first, Finder second) { this.first = Preconditions.checkNotNull(first); this.second = Preconditions.checkNotNull(second); } @Override public String toString() { return String.format("Chain{%s, %s}", first, second); } @Override public UiElement find(UiElement context) { return second.find(first.find(context)); } }