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