DTMFTwelveKeyDialerView.java revision b16363f5fc191b769e88c364243e34b92eb22688
1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/* 2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License. 6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at 7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * 10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and 14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License. 15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone; 18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Context; 20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.graphics.Rect; 21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.AttributeSet; 22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log; 23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.FocusFinder; 24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.KeyEvent; 25b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.MotionEvent; 26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.View; 27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.ViewConfiguration; 28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.ViewGroup; 29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.LinearLayout; 30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport java.util.ArrayList; 32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/** 34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * DTMFTwelveKeyDialerView is the view logic that the DTMFDialer uses. 35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * This is really a thin wrapper around Linear Layout that intercepts 36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * some user interactions to provide the correct UI behaviour for the 37b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * dialer. 38b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 39b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectclass DTMFTwelveKeyDialerView extends LinearLayout { 40b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final String LOG_TAG = "PHONE/DTMFTwelveKeyDialerView"; 42b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private static final boolean DBG = false; 43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 44b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private DTMFTwelveKeyDialer mDialer; 45b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public DTMFTwelveKeyDialerView (Context context) { 47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super(context); 48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public DTMFTwelveKeyDialerView(Context context, AttributeSet attrs) { 51b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project super(context, attrs); 52b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 53b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project void setDialer (DTMFTwelveKeyDialer dialer) { 55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mDialer = dialer; 56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project /** 59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Normally we ignore everything except for the BACK and CALL keys. 60b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * For those, we pass them to the model (and then the InCallScreen). 61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */ 62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("dispatchKeyEvent(" + event + ")..."); 65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int keyCode = event.getKeyCode(); 67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (mDialer != null) { 68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project switch (keyCode) { 69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case KeyEvent.KEYCODE_BACK: 70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project case KeyEvent.KEYCODE_CALL: 71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return event.isDown() ? mDialer.onKeyDown(keyCode, event) : 72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project mDialer.onKeyUp(keyCode, event); 73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 75b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 76b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (DBG) log("==> dispatchKeyEvent: forwarding event to the DTMFDialer"); 77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return super.dispatchKeyEvent(event); 78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 79b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project @Override 81b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project public boolean dispatchTouchEvent(MotionEvent event) { 82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int x = (int)event.getX(); 84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int y = (int)event.getY(); 85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int closestDeltaX = 0; 86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int closestDeltaY = 0; 87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project ArrayList<View> touchables = getTouchables(); 89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int minDistance = Integer.MAX_VALUE; 90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project View closest = null; 91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project final int numTouchables = touchables.size(); 93b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 94b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Rect closestBounds = new Rect(); 95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Rect touchableBounds = new Rect(); 96b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 97b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project for (int i = 0; i < numTouchables; i++) { 98b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project View touchable = touchables.get(i); 99b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project // get visible bounds of other view in same coordinate system 101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project touchable.getDrawingRect(touchableBounds); 102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project offsetDescendantRectToMyCoords(touchable, touchableBounds); 104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (touchableBounds.contains(x, y)) { 106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return super.dispatchTouchEvent(event); 107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int deltaX; 110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (x > touchableBounds.right) { 111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaX = touchableBounds.right - 1 - x; 112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (x < touchableBounds.left) { 113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaX = touchableBounds.left + 1 - x; 114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaX = 0; 116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project int deltaY; 119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (y > touchableBounds.bottom) { 120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaY = touchableBounds.bottom - 1 - y; 121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else if (y < touchableBounds.top) { 122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaY = touchableBounds.top + 1 - y; 123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project deltaY = 0; 125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project final int distanceSquared = (deltaX * deltaX) + (deltaY * deltaY); 128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (distanceSquared < minDistance) { 129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project minDistance = distanceSquared; 130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project closest = touchable; 131b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project closestDeltaX = deltaX; 132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project closestDeltaY = deltaY; 133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project if (closest != null) { 138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project event.offsetLocation(closestDeltaX, closestDeltaY); 139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return super.dispatchTouchEvent(event); 140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } else { 141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project return super.dispatchTouchEvent(event); 142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project private void log(String msg) { 146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project Log.d(LOG_TAG, msg); 147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project } 148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project 149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project} 150