/*
 * 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.view.cts;

import android.graphics.Rect;
import android.test.InstrumentationTestCase;
import android.test.TouchUtils;
import android.view.View;
import android.view.Window;

class GestureDetectorTestUtil {

    /**
     * Test GestureDetector.SimpleOnGestureListener
     * @param testcase InstrumentationTestCase
     * @param activity GestureDetectorStubActivity
     */
    public static void testGestureDetector(InstrumentationTestCase testcase,
            GestureDetectorStubActivity activity) {
        // wait for launching view complete
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        View view = activity.getView();
        TouchUtils.clickView(testcase, view);
        TouchUtils.longClickView(testcase, view);
        TouchUtils.scrollToBottom(testcase, activity, activity.getViewGroup());
        TouchUtils.touchAndCancelView(testcase, view);

        Rect windowRect = new Rect();
        Window window = activity.getWindow();
        window.getDecorView().getWindowVisibleDisplayFrame(windowRect);
        int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
        int statusBarHeight = contentViewTop - windowRect.top;

        int fromX = 1;
        int toX = 10;
        // Y has to be outside the status bar bounding box
        int fromY = statusBarHeight + 1;
        int toY = statusBarHeight + 51;
        int stepCount = 20;
        TouchUtils.drag(testcase, fromX, toX, fromY, toY, stepCount);
        InstrumentationTestCase.assertTrue(activity.isDown);
        InstrumentationTestCase.assertTrue(activity.isScroll);
        InstrumentationTestCase.assertTrue(activity.isFling);
        InstrumentationTestCase.assertTrue(activity.isSingleTapUp);
        InstrumentationTestCase.assertTrue(activity.onLongPress);
        InstrumentationTestCase.assertTrue(activity.onShowPress);
        InstrumentationTestCase.assertTrue(activity.onSingleTapConfirmed);

        // Test onDoubleTap
        InstrumentationTestCase.assertFalse(activity.onDoubleTap);
        InstrumentationTestCase.assertFalse(activity.onDoubleTapEvent);
        TouchUtils.tapView(testcase, view);
        TouchUtils.tapView(testcase, view);
        InstrumentationTestCase.assertTrue(activity.onDoubleTap);
        InstrumentationTestCase.assertTrue(activity.onDoubleTapEvent);
    }
}
