KeyButtonView.java revision 86f9bd2fd054522e36f84776056cd07531ead9cf
186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato/* 286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * Copyright (C) 2008 The Android Open Source Project 386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * 486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * you may not use this file except in compliance with the License. 686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * You may obtain a copy of the License at 786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * 886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * 1086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * Unless required by applicable law or agreed to in writing, software 1186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 1286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * See the License for the specific language governing permissions and 1486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato * limitations under the License. 1586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato */ 1686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 1786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratopackage com.android.systemui.statusbar; 1886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 1986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.content.Context; 2086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.content.res.TypedArray; 2186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.graphics.drawable.AnimationDrawable; 2286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.graphics.drawable.Drawable; 2386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.os.RemoteException; 2486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.os.SystemClock; 2586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.os.ServiceManager; 2686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.util.AttributeSet; 2786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.util.Slog; 2886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.view.IWindowManager; 2986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.view.KeyEvent; 3086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.view.MotionEvent; 3186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.widget.ImageView; 3286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport android.widget.RemoteViews.RemoteView; 3386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 3486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratoimport com.android.systemui.R; 3586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 3686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onoratopublic class KeyButtonView extends ImageView { 3786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato IWindowManager mWindowManager; 3886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato long mDownTime; 3986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato boolean mSending; 4086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato int mCode; 4186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato int mRepeat; 4286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 4386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato public KeyButtonView(Context context, AttributeSet attrs) { 4486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato this(context, attrs, 0); 4586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 4686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 4786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato public KeyButtonView(Context context, AttributeSet attrs, int defStyle) { 4886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato super(context, attrs); 4986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 5086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyButtonView, 5186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato defStyle, 0); 5286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 5386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mCode = a.getInteger(R.styleable.KeyButtonView_keyCode, 0); 5486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato if (mCode == 0) { 5586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato Slog.w(StatusBarService.TAG, "KeyButtonView without key code id=0x" 5686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato + Integer.toHexString(getId())); 5786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 5886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 5986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato a.recycle(); 6086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 6186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mWindowManager = IWindowManager.Stub.asInterface( 6286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato ServiceManager.getService(Context.WINDOW_SERVICE)); 6386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 6486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 6586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato public boolean onTouchEvent(MotionEvent ev) { 6686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato final int action = ev.getAction(); 6786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato int x, y; 6886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 6986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato switch (action) { 7086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato case MotionEvent.ACTION_DOWN: 7186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mDownTime = SystemClock.uptimeMillis(); 7286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mRepeat = 0; 7386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mSending = true; 7486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato sendEvent(KeyEvent.ACTION_DOWN, mDownTime); 7586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato break; 7686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato case MotionEvent.ACTION_MOVE: 7786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato if (mSending) { 7886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato x = (int)ev.getX(); 7986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato y = (int)ev.getY(); 8086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) { 8186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mSending = false; 8286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato sendEvent(KeyEvent.ACTION_UP); 8386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 8486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 8586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato break; 8686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato case MotionEvent.ACTION_UP: 8786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato case MotionEvent.ACTION_CANCEL: 8886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato if (mSending) { 8986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato sendEvent(KeyEvent.ACTION_UP); 9086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mSending = false; 9186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 9286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato break; 9386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 9486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 9586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato return true; 9686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 9786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 9886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato void sendEvent(int action) { 9986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato sendEvent(action, SystemClock.uptimeMillis()); 10086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 10186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 10286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato void sendEvent(int action, long when) { 10386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato final KeyEvent ev = new KeyEvent(mDownTime, mDownTime, action, mCode, mRepeat); 10486f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato try { 10586f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato Slog.d(StatusBarService.TAG, "injecting event " + ev); 10686f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato mWindowManager.injectKeyEvent(ev, false); 10786f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } catch (RemoteException ex) { 10886f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato // System process is dead 10986f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 11086f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato } 11186f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato} 11286f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 11386f9bd2fd054522e36f84776056cd07531ead9cfJoe Onorato 114