164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato/*
264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* Copyright (C) 2016 The Android Open Source Project
364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato*
464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* Licensed under the Apache License, Version 2.0 (the "License");
564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* you may not use this file except in compliance with the License.
664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* You may obtain a copy of the License at
764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato*
864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato*      http://www.apache.org/licenses/LICENSE-2.0
964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato*
1064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* Unless required by applicable law or agreed to in writing, software
1164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* distributed under the License is distributed on an "AS IS" BASIS,
1264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* See the License for the specific language governing permissions and
1464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato* limitations under the License.
1564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato*/
1664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
1764f5117b7edc174f57b087b3a9f97602e7980e02Sara Katopackage android.view;
1864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
1964f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.content.Context;
2064f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.support.test.InstrumentationRegistry;
2164f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.support.test.runner.AndroidJUnit4;
2264f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.test.ActivityInstrumentationTestCase2;
2364f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.util.DisplayMetrics;
2464f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.view.PinchZoomAction;
2564f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.view.ScaleGesture;
2664f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.view.WindowManager;
2764f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport android.widget.TextView;
2864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
2964f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport com.android.frameworks.coretests.R;
3064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
3164f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport org.junit.After;
3264f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport org.junit.Before;
3364f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport org.junit.Test;
3464f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport org.junit.runner.RunWith;
3564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
3664f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport static android.support.test.espresso.matcher.ViewMatchers.withId;
3764f5117b7edc174f57b087b3a9f97602e7980e02Sara Katoimport static android.support.test.espresso.Espresso.onView;
3864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
3964f5117b7edc174f57b087b3a9f97602e7980e02Sara Katopublic class ScaleGestureDetectorTest extends ActivityInstrumentationTestCase2<ScaleGesture> {
4064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    private ScaleGesture mScaleGestureActivity;
4164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
4264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    public ScaleGestureDetectorTest() {
4364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        super("com.android.frameworks.coretests", ScaleGesture.class);
4464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    }
4564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
4664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    @Before
4764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    public void setUp() throws Exception {
4864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        super.setUp();
4964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
5064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        mScaleGestureActivity = getActivity();
5164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    }
5264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
5364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    @After
5464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    public void tearDown() throws Exception {
5564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        super.tearDown();
5664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    }
5764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
5864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    @Test
5964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    public void testScaleGestureDetector() {
6064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        // No scaling should have occurred prior to performing pinch zoom action.
6164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final float initialScaleFactor = 1.0f;
6264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        assertEquals(initialScaleFactor, mScaleGestureActivity.getScaleFactor());
6364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
6464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        // Specify start and end coordinates, irrespective of device display size.
6564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final DisplayMetrics dm = new DisplayMetrics();
6664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final WindowManager wm = (WindowManager) (mScaleGestureActivity.getApplicationContext())
6764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato                .getSystemService(Context.WINDOW_SERVICE);
6864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        wm.getDefaultDisplay().getMetrics(dm);
6964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final int displayWidth = dm.widthPixels;
7064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final int displayHeight = dm.heightPixels;
7164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
7264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        // Obtain coordinates to perform pinch and zoom from the center, to 75% of the display.
7364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final int centerX = displayWidth / 2;
7464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final int centerY = displayHeight / 2;
7564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
7664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        // Offset center coordinates by one, so that the two starting points are different.
7764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final float[] firstFingerStartCoords = new float[] {centerX + 1.0f, centerY - 1.0f};
7864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final float[] firstFingerEndCoords =
7964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        new float[] {0.75f * displayWidth, 0.25f * displayHeight};
8064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final float[] secondFingerStartCoords = new float[] {centerX - 1.0f, centerY + 1.0f};
8164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        final float[] secondFingerEndCoords =
8264f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        new float[] {0.25f * displayWidth, 0.75f * displayHeight};
8364f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
8464f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        onView(withId(R.id.article)).perform(new PinchZoomAction(firstFingerStartCoords,
8564f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato                firstFingerEndCoords, secondFingerStartCoords, secondFingerEndCoords,
8664f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato                TextView.class));
8764f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato
8864f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        // Text should have been 'zoomed', meaning scale factor increased.
8964f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato        assertTrue(mScaleGestureActivity.getScaleFactor() > initialScaleFactor);
9064f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato    }
9164f5117b7edc174f57b087b3a9f97602e7980e02Sara Kato}