163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/*
263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Copyright 2017 The Android Open Source Project
363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * you may not use this file except in compliance with the License.
663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * You may obtain a copy of the License at
763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
1063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Unless required by applicable law or agreed to in writing, software
1163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * See the License for the specific language governing permissions and
1463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * limitations under the License.
1563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */
1663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
172a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikaspackage androidx.recyclerview.selection.testing;
1863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
1963d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.graphics.Point;
2063d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.KeyEvent;
2163d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MotionEvent;
2263d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MotionEvent.PointerCoords;
2363d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MotionEvent.PointerProperties;
2463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
2560dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport androidx.annotation.IntDef;
2660dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikas
2763d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport java.lang.annotation.Retention;
2863d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport java.lang.annotation.RetentionPolicy;
2963d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport java.util.HashSet;
3063d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport java.util.Set;
3163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
3263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/**
3363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Handy-dandy wrapper class to facilitate the creation of MotionEvents.
3463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */
3563d2846409d84487d4856d3b8d18cc4684352e29Steve McKaypublic final class TestEvents {
3663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
3763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
3863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * Common mouse event types...for your convenience.
3963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
4063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public static final class Mouse {
4163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent CLICK =
4263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().primary().build();
4363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent CTRL_CLICK =
4463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().primary().ctrl().build();
4563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent ALT_CLICK =
4663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().primary().alt().build();
4763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent SHIFT_CLICK =
4863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().primary().shift().build();
4963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent SECONDARY_CLICK =
5063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().secondary().build();
5163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent TERTIARY_CLICK =
5263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().mouse().tertiary().build();
5363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
5463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
5563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
5663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * Common touch event types...for your convenience.
5763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
5863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public static final class Touch {
5963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public static final MotionEvent TAP =
6063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                TestEvents.builder().touch().build();
6163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
6263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    static final int ACTION_UNSET = -1;
6463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    // Add other actions from MotionEvent.ACTION_ as needed.
6663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @IntDef(flag = true, value = {
6763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.ACTION_DOWN,
6863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.ACTION_MOVE,
6963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.ACTION_UP
7063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    })
7163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Retention(RetentionPolicy.SOURCE)
7263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public @interface Action {}
7363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
7463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    // Add other types from MotionEvent.TOOL_TYPE_ as needed.
7563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @IntDef(flag = true, value = {
7663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.TOOL_TYPE_FINGER,
7763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.TOOL_TYPE_MOUSE,
7863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.TOOL_TYPE_STYLUS,
7963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.TOOL_TYPE_UNKNOWN
8063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    })
8163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Retention(RetentionPolicy.SOURCE)
8263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public @interface ToolType {}
8363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
8463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @IntDef(flag = true, value = {
8563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.BUTTON_PRIMARY,
8663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            MotionEvent.BUTTON_SECONDARY
8763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    })
8863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Retention(RetentionPolicy.SOURCE)
8963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public @interface Button {}
9063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
9163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @IntDef(flag = true, value = {
9263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            KeyEvent.META_SHIFT_ON,
9363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            KeyEvent.META_CTRL_ON
9463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    })
9563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Retention(RetentionPolicy.SOURCE)
9663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public @interface Key {}
9763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
9863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    private static final class State {
9963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private @Action int mAction = ACTION_UNSET;
10063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private @ToolType int mToolType = MotionEvent.TOOL_TYPE_UNKNOWN;
10163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private int mPointerCount = 1;
10263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private Set<Integer> mButtons = new HashSet<>();
10363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private Set<Integer> mKeys = new HashSet<>();
10463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private Point mLocation = new Point(0, 0);
10563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private Point mRawLocation = new Point(0, 0);
10663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
10763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
10863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public static Builder builder() {
10963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        return new Builder();
11063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
11163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
11363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * Test event builder with convenience methods for common event attrs.
11463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
11563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public static final class Builder {
11663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        private State mState = new State();
11863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        /**
12063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * @param action Any action specified in {@link MotionEvent}.
12163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * @return
12263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         */
12363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder action(int action) {
12463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            mState.mAction = action;
12563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
12663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
12763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
12863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder type(@ToolType int type) {
12963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            mState.mToolType = type;
13063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
13163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
13263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
13363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder location(int x, int y) {
13463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            mState.mLocation = new Point(x, y);
13563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
13663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
13763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
13863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder rawLocation(int x, int y) {
13963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            mState.mRawLocation = new Point(x, y);
14063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
14163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
14263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
14363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder pointerCount(int count) {
14463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            mState.mPointerCount = count;
14563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
14663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
14763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
14863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        /**
14963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * Adds one or more button press attributes.
15063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         */
15163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder pressButton(@Button int... buttons) {
15263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (int button : buttons) {
15363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mState.mButtons.add(button);
15463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
15563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
15663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
15763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
15863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        /**
15963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * Removes one or more button press attributes.
16063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         */
16163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder releaseButton(@Button int... buttons) {
16263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (int button : buttons) {
16363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mState.mButtons.remove(button);
16463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
16563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
16663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
16763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
16863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        /**
16963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * Adds one or more key press attributes.
17063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         */
17163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder pressKey(@Key int... keys) {
17263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (int key : keys) {
17363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mState.mKeys.add(key);
17463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
17563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
17663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
17763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
17863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        /**
17963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         * Removes one or more key press attributes.
18063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay         */
18163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder releaseKey(@Button int... keys) {
18263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (int key : keys) {
18363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mState.mKeys.remove(key);
18463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
18563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
18663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
18763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
18863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder touch() {
18963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            type(MotionEvent.TOOL_TYPE_FINGER);
19063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
19163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
19263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
19363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder mouse() {
19463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            type(MotionEvent.TOOL_TYPE_MOUSE);
19563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
19663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
19763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
19863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder shift() {
19963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressKey(KeyEvent.META_SHIFT_ON);
20063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
20163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
20263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
20363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder unshift() {
20463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseKey(KeyEvent.META_SHIFT_ON);
20563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
20663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
20763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
20863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder ctrl() {
20963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressKey(KeyEvent.META_CTRL_ON);
21063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
21163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
21263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
21363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder alt() {
21463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressKey(KeyEvent.META_ALT_ON);
21563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
21663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
21763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
21863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder primary() {
21963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressButton(MotionEvent.BUTTON_PRIMARY);
22063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_SECONDARY);
22163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_TERTIARY);
22263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
22363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
22463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
22563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder secondary() {
22663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressButton(MotionEvent.BUTTON_SECONDARY);
22763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_PRIMARY);
22863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_TERTIARY);
22963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
23063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
23163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
23263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public Builder tertiary() {
23363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pressButton(MotionEvent.BUTTON_TERTIARY);
23463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_PRIMARY);
23563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            releaseButton(MotionEvent.BUTTON_SECONDARY);
23663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return this;
23763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
23863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
23963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        public MotionEvent build() {
24063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
24163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            PointerProperties[] pointers = new PointerProperties[1];
24263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pointers[0] = new PointerProperties();
24363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pointers[0].id = 0;
24463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            pointers[0].toolType = mState.mToolType;
24563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
24663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            PointerCoords[] coords = new PointerCoords[1];
24763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            coords[0] = new PointerCoords();
24863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            coords[0].x = mState.mLocation.x;
24963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            coords[0].y = mState.mLocation.y;
25063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
25163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            int buttons = 0;
25263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (Integer button : mState.mButtons) {
25363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                buttons |= button;
25463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
25563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
25663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            int keys = 0;
25763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            for (Integer key : mState.mKeys) {
25863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                keys |= key;
25963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
26063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
26163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            return MotionEvent.obtain(
26263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    0,     // down time
26363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    1,     // event time
26463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    mState.mAction,
26563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    1,  // pointerCount,
26663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    pointers,
26763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    coords,
26863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    keys,
26963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    buttons,
27063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    1.0f,  // x precision
27163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    1.0f,  // y precision
27263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    0,     // device id
27363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    0,     // edge flags
27463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    0,     // int source,
27563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    0      // int flags
27663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                    );
27763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        }
27863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
27963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay}
280