1abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair/*
2abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * Copyright (C) 2013 The Android Open Source Project
3abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair *
4abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * Licensed under the Apache License, Version 2.0 (the "License");
5abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * you may not use this file except in compliance with the License.
6abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * You may obtain a copy of the License at
7abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair *
8abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair *      http://www.apache.org/licenses/LICENSE-2.0
9abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair *
10abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * Unless required by applicable law or agreed to in writing, software
11abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * distributed under the License is distributed on an "AS IS" BASIS,
12abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * See the License for the specific language governing permissions and
14abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair * limitations under the License.
15abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair */
16abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
17abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairpackage com.android.uiautomator.tests.cts.testapp;
18abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
19abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.app.AlertDialog;
20abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.os.Bundle;
21abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.support.v4.app.Fragment;
22abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.view.LayoutInflater;
23abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.view.MotionEvent;
24abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.view.View;
25abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.view.ViewGroup;
26abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.widget.Button;
27abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.widget.CheckBox;
28abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.widget.ImageButton;
29abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.widget.SeekBar;
30abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairimport android.widget.Spinner;
31abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
32abb2af7d5f4912905cf105466f34ae983310c47bAllen Hairpublic class Test5DetailFragment extends Fragment {
33abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
34abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    public static final String ARG_ITEM_ID = "item_id";
35abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
36abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    class PointerEvent {
37abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int startX;
38abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int startY;
39abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int endX;
40abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int endY;
41abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
42abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
43abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    private final PointerEvent mPointerEvent = new PointerEvent();
44abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
45abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    public Test5DetailFragment() {
46abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
47abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
48abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    @Override
49abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    public void onCreate(Bundle savedInstanceState) {
50abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        super.onCreate(savedInstanceState);
51abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
52abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
53abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    @Override
54abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
55abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        View rootView = inflater.inflate(R.layout.test5_detail_fragment, container, false);
56abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
57abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        // Set the content description for the following
58abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        Spinner spinner = (Spinner) rootView.findViewById(R.id.test_5_spinner);
59abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        spinner.setContentDescription("Spinner");
60abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        ImageButton imageButton = (ImageButton) rootView.findViewById(R.id.test_5_imageButton);
61abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        imageButton.setContentDescription("Image button");
62abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
63abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        // Each time this view is displayed, reset the following states
64abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        SeekBar seekBar = (SeekBar) rootView.findViewById(R.id.test_5_seekBar);
65abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        seekBar.setProgress(50);
66abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        seekBar.setContentDescription("Progress is 50 %");
67abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        CheckBox checkbox = (CheckBox) rootView.findViewById(R.id.test_5_checkBox);
68abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        checkbox.setChecked(false);
69abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
70abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        // Register click event handlers for the following
71abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        Button button = (Button) rootView.findViewById(R.id.test_5_button1);
72abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        button.setOnClickListener(new Button.OnClickListener() {
73abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            @Override
74abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            public void onClick(View v) {
75abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                // we want an artificial crash
76abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                throw new RuntimeException("Artificial crash to test UiWatcher");
77abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            }
78abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        });
79abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
80abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        imageButton.setOnTouchListener(new ImageButton.OnTouchListener() {
81abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
82abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            @Override
83abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            public boolean onTouch(View v, MotionEvent event) {
84abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                if (event.getAction() == MotionEvent.ACTION_DOWN) {
85abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                    resetTouchResults();
86abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                    collectStartAction(event, v);
87abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                } else if (event.getAction() == MotionEvent.ACTION_UP) {
88abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                    collectEndAction(event, v);
89abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                    displayTouchResults();
90abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                }
91abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                return false;
92abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair            }
93abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        });
94abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
95abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        return rootView;
96abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
97abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
98abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    private void displayTouchResults() {
99abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        StringBuilder output = new StringBuilder();
100abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
101abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        output.append(String.format("%d,%d:%d,%d\n",
102abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                mPointerEvent.startX, mPointerEvent.startY, mPointerEvent.endX,
103abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                mPointerEvent.endY));
104abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
105abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        // display the submitted text
106abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
107abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        builder.setTitle(R.string.drag_item_touch_dialog_title);
108abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        builder.setPositiveButton(R.string.OK, null);
109abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        builder.setMessage(output.toString());
110abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        AlertDialog diag = builder.create();
111abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        diag.show();
112abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
113abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
114abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    /**
115abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * Clears all collected pointer results
116abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     */
117abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    private void resetTouchResults() {
118abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair         mPointerEvent.startX = mPointerEvent.startY =
119abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair                    mPointerEvent.endX = mPointerEvent.endY = -1;
120abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
121abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
122abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    /**
123abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * Collects pointer touch information converting from relative to absolute before
124abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * storing it as starting touch coordinates.
125abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     *
126abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param event
127abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param view
128abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param pointerIndex
129abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     */
130abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    private void collectStartAction(MotionEvent event, View view) {
131abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int offsetInScreen[] = new int[2];
132abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        view.getLocationOnScreen(offsetInScreen);
133abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        mPointerEvent.startX = (int)(event.getX() + offsetInScreen[0]);
134abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        mPointerEvent.startY = (int)(event.getY() + offsetInScreen[1]);
135abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
136abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair
137abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    /**
138abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * Collects pointer touch information converting from relative to absolute before
139abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * storing it as ending touch coordinates.
140abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     *
141abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param event
142abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param view
143abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     * @param pointerIndex
144abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair     */
145abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    private void collectEndAction(MotionEvent event, View view) {
146abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        int offsetInScreen[] = new int[2];
147abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        view.getLocationOnScreen(offsetInScreen);
148abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        mPointerEvent.endX = (int)(event.getX() + offsetInScreen[0]);
149abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair        mPointerEvent.endY = (int)(event.getY() + offsetInScreen[1]);
150abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair    }
151abb2af7d5f4912905cf105466f34ae983310c47bAllen Hair}
152