org.arquillian.droidium.native_.enrichment.NativeActivityManager.java Source code

Java tutorial

Introduction

Here is the source code for org.arquillian.droidium.native_.enrichment.NativeActivityManager.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
 * contributors by the @authors tag. See the copyright.txt in the
 * distribution for a full listing of individual contributors.
 *
 * 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 org.arquillian.droidium.native_.enrichment;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.arquillian.droidium.container.api.ActivityManager;
import org.arquillian.droidium.container.api.AndroidDevice;
import org.arquillian.droidium.native_.configuration.DroidiumDronePointFilter;
import org.arquillian.droidium.native_.exception.NotUniqueWebDriverInstanceException;
import org.arquillian.droidium.native_.exception.WebDriverInstanceNotFoundException;
import org.arquillian.droidium.native_.metadata.DroidiumMetadataKey;
import org.jboss.arquillian.core.spi.Validate;
import org.jboss.arquillian.drone.spi.DroneContext;
import org.jboss.arquillian.drone.spi.DronePoint;
import org.jboss.arquillian.drone.spi.DronePointContext;
import org.openqa.selenium.WebDriver;

/**
 * Manages Android activities by {@link WebDriver} via {@link AndroidDevice} injection point.
 *
 * @author <a href="mailto:smikloso@redhat.com">Stefan Miklosovic</a>
 *
 */
public class NativeActivityManager implements ActivityManager {

    private DroneContext droneContext;

    void setDroneContext(DroneContext droneContext) {
        if (this.droneContext == null && droneContext != null) {
            this.droneContext = droneContext;
        }
    }

    @Override
    public void startActivity(String activity) {
        Validate.notNullOrEmpty(activity,
                "Activity you want to start can not be a null object nor an empty string!");

        final List<DronePoint<WebDriver>> dronePoints = getDronePointsForActivity(activity);

        checkSizes(dronePoints);

        DronePoint<WebDriver> dronePoint = dronePoints.get(0);

        if (activity.startsWith(".")) {
            activity = droneContext.get(dronePoint).getMetadata(DroidiumMetadataKey.TESTED_APP_PACKAGE_NAME.class)
                    + activity;
        }

        WebDriver instance = droneContext.get(dronePoint).getInstance();

        instance.get("and-activity://" + activity);
    }

    @Override
    public void startActivity(Class<?> activity) throws WebDriverInstanceNotFoundException {
        Validate.notNull(activity, "Activity you want to start can not be a null object!");
        startActivity(activity.getName());
    }

    @Override
    public void stopActivity(String activity) throws WebDriverInstanceNotFoundException {
        Validate.notNullOrEmpty(activity,
                "Activity you want to stop can not be a null object nor an empty string!");

        final List<DronePoint<WebDriver>> dronePoints = getDronePointsForActivity(activity);

        checkSizes(dronePoints);

        droneContext.get(dronePoints.get(0)).getInstanceAs(WebDriver.class).close();
    }

    @Override
    public void stopActivity(Class<?> activity) throws WebDriverInstanceNotFoundException {
        Validate.notNull(activity, "Activity you want to stop can not be a null object!");
        stopActivity(activity.getName());
    }

    private List<DronePoint<WebDriver>> getDronePointsForActivity(String activityToStart) {

        final List<DronePoint<WebDriver>> dronePoints = new ArrayList<DronePoint<WebDriver>>();

        if (activityToStart == null || activityToStart.isEmpty()) {
            return dronePoints;
        }

        final Iterator<DronePoint<WebDriver>> dronePointsIterator = droneContext.find(WebDriver.class)
                .filter(new DroidiumDronePointFilter()).iterator();

        while (dronePointsIterator.hasNext()) {
            final DronePoint<WebDriver> dronePoint = dronePointsIterator.next();

            final DronePointContext<?> dronePointContext = droneContext.get(dronePoint);

            if (!dronePointContext.hasMetadata(DroidiumMetadataKey.ACTIVITIES.class)
                    || !dronePointContext.hasMetadata(DroidiumMetadataKey.INSTRUMENTATION_TEST_PACKAGE_NAME.class)
                    || !dronePointContext.hasMetadata(DroidiumMetadataKey.TESTED_APP_PACKAGE_NAME.class)) {
                continue;
            }

            final List<String> activities = dronePointContext.getMetadata(DroidiumMetadataKey.ACTIVITIES.class);

            final String androidPackageName = dronePointContext
                    .getMetadata(DroidiumMetadataKey.TESTED_APP_PACKAGE_NAME.class);

            if (activityToStart.startsWith(".")) {

                String fqcn = androidPackageName + activityToStart;

                if (activities.contains(fqcn)) {
                    dronePoints.add(dronePoint);
                }
            } else if (activities.contains(activityToStart)) {
                dronePoints.add(dronePoint);
            }
        }

        return dronePoints;
    }

    /**
     * @param dronePoints
     * @throws WebDriverInstanceNotFoundException in case size of {@code dronePoints} is 0
     * @throws NotUniqueWebDriverInstanceException in cae size of {@code dronePoints} is not 1
     */
    private void checkSizes(final List<DronePoint<WebDriver>> dronePoints)
            throws WebDriverInstanceNotFoundException, NotUniqueWebDriverInstanceException {
        if (dronePoints.size() == 0) {
            throw new WebDriverInstanceNotFoundException("It seems you are trying to control an "
                    + "activity which is not backed by any WebDriver instance.");
        }

        if (dronePoints.size() != 1) {
            throw new NotUniqueWebDriverInstanceException(
                    "Activity you want to control is found to be " + "controllable by multiple WebDrivers.");
        }
    }

}