1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.calculator2; 18 19import android.support.v4.view.ViewPager; 20import android.view.KeyEvent; 21import android.view.View; 22import android.widget.Button; 23 24class EventListener implements View.OnKeyListener, 25 View.OnClickListener, 26 View.OnLongClickListener { 27 Logic mHandler; 28 ViewPager mPager; 29 30 void setHandler(Logic handler, ViewPager pager) { 31 mHandler = handler; 32 mPager = pager; 33 } 34 35 @Override 36 public void onClick(View view) { 37 int id = view.getId(); 38 switch (id) { 39 case R.id.del: 40 mHandler.onDelete(); 41 break; 42 43 case R.id.clear: 44 mHandler.onClear(); 45 break; 46 47 case R.id.equal: 48 mHandler.onEnter(); 49 break; 50 51 default: 52 if (view instanceof Button) { 53 String text = ((Button) view).getText().toString(); 54 if (text.length() >= 2) { 55 // add paren after sin, cos, ln, etc. from buttons 56 text += '('; 57 } 58 mHandler.insert(text); 59 if (mPager != null && mPager.getCurrentItem() == Calculator.ADVANCED_PANEL) { 60 mPager.setCurrentItem(Calculator.BASIC_PANEL); 61 } 62 } 63 } 64 } 65 66 @Override 67 public boolean onLongClick(View view) { 68 int id = view.getId(); 69 if (id == R.id.del) { 70 mHandler.onClear(); 71 return true; 72 } 73 return false; 74 } 75 76 @Override 77 public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { 78 int action = keyEvent.getAction(); 79 80 if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || 81 keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { 82 boolean eat = mHandler.eatHorizontalMove(keyCode == KeyEvent.KEYCODE_DPAD_LEFT); 83 return eat; 84 } 85 86 //Work-around for spurious key event from IME, bug #1639445 87 if (action == KeyEvent.ACTION_MULTIPLE && keyCode == KeyEvent.KEYCODE_UNKNOWN) { 88 return true; // eat it 89 } 90 91 //Calculator.log("KEY " + keyCode + "; " + action); 92 93 if (keyEvent.getUnicodeChar() == '=') { 94 if (action == KeyEvent.ACTION_UP) { 95 mHandler.onEnter(); 96 } 97 return true; 98 } 99 100 if (keyCode != KeyEvent.KEYCODE_DPAD_CENTER && 101 keyCode != KeyEvent.KEYCODE_DPAD_UP && 102 keyCode != KeyEvent.KEYCODE_DPAD_DOWN && 103 keyCode != KeyEvent.KEYCODE_ENTER) { 104 if (keyEvent.isPrintingKey() && action == KeyEvent.ACTION_UP) { 105 // Tell the handler that text was updated. 106 mHandler.onTextChanged(); 107 } 108 return false; 109 } 110 111 /* 112 We should act on KeyEvent.ACTION_DOWN, but strangely 113 sometimes the DOWN event isn't received, only the UP. 114 So the workaround is to act on UP... 115 http://b/issue?id=1022478 116 */ 117 118 if (action == KeyEvent.ACTION_UP) { 119 switch (keyCode) { 120 case KeyEvent.KEYCODE_ENTER: 121 case KeyEvent.KEYCODE_DPAD_CENTER: 122 mHandler.onEnter(); 123 break; 124 125 case KeyEvent.KEYCODE_DPAD_UP: 126 mHandler.onUp(); 127 break; 128 129 case KeyEvent.KEYCODE_DPAD_DOWN: 130 mHandler.onDown(); 131 break; 132 } 133 } 134 return true; 135 } 136} 137