/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * 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 android.util;

import junit.framework.Assert;

import android.test.InstrumentationTestCase;
import android.test.TouchUtils;
import android.view.View;

/**
 * When entering touch mode via touch, the tests can be flaky.  These asserts
 * are more flexible (allowing up to MAX_ATTEMPTS touches to enter touch mode via touch or
 * tap) until we can find a way to solve the flakiness.
 */
public class TouchModeFlexibleAsserts {

    private static int MAX_ATTEMPTS = 2;

    private static int MAX_DELAY_MILLIS = 2000;

    public static void assertInTouchModeAfterClick(InstrumentationTestCase test, View viewToTouch) {
        int numAttemptsAtTouchMode = 0;
        while (numAttemptsAtTouchMode < MAX_ATTEMPTS &&
                !viewToTouch.isInTouchMode()) {
            TouchUtils.clickView(test, viewToTouch);
            numAttemptsAtTouchMode++;
        }
        Assert.assertTrue("even after " + MAX_ATTEMPTS + " clicks, did not enter "
                + "touch mode", viewToTouch.isInTouchMode());
        //Assert.assertEquals("number of touches to enter touch mode", 1, numAttemptsAtTouchMode);
    }

    public static void assertInTouchModeAfterTap(InstrumentationTestCase test, View viewToTouch) {
        int numAttemptsAtTouchMode = 0;
        while (numAttemptsAtTouchMode < MAX_ATTEMPTS &&
                !viewToTouch.isInTouchMode()) {
            TouchUtils.tapView(test, viewToTouch);
            numAttemptsAtTouchMode++;
        }
        Assert.assertTrue("even after " + MAX_ATTEMPTS + " taps, did not enter "
                + "touch mode", viewToTouch.isInTouchMode());
        //Assert.assertEquals("number of touches to enter touch mode", 1, numAttemptsAtTouchMode);
    }

    public static void assertNotInTouchModeAfterKey(InstrumentationTestCase test, int keyCode, View checkForTouchMode) {
        test.sendKeys(keyCode);
        int amountLeft = MAX_DELAY_MILLIS;

        while (checkForTouchMode.isInTouchMode() && amountLeft > 0) {
            amountLeft -= 200;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        Assert.assertFalse("even after waiting " + MAX_DELAY_MILLIS + " millis after " 
                + "pressing key event, still in touch mode", checkForTouchMode.isInTouchMode());
    }
}
