diff options
author | Joe Onorato <joeo@android.com> | 2010-06-30 17:03:42 -0400 |
---|---|---|
committer | Joe Onorato <joeo@android.com> | 2010-07-07 18:33:14 -0400 |
commit | 86f9bd2fd054522e36f84776056cd07531ead9cf (patch) | |
tree | 6a64fdb4569c2b720383f7208e3212b66ad42318 /packages | |
parent | 119a4015f0f7ac1f63d596da158768f880f9fe9b (diff) | |
download | frameworks_base-86f9bd2fd054522e36f84776056cd07531ead9cf.zip frameworks_base-86f9bd2fd054522e36f84776056cd07531ead9cf.tar.gz frameworks_base-86f9bd2fd054522e36f84776056cd07531ead9cf.tar.bz2 |
Add KeyButtonView
Change-Id: Ic32076c07bd45cbf2a6db25d8e8e933701fdf8b2
Diffstat (limited to 'packages')
-rw-r--r-- | packages/SystemUI/res/values/attrs.xml | 22 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/KeyButtonView.java | 113 |
2 files changed, 135 insertions, 0 deletions
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml new file mode 100644 index 0000000..23bcf20 --- /dev/null +++ b/packages/SystemUI/res/values/attrs.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <declare-styleable name="KeyButtonView"> + <attr name="keyCode" format="integer" /> + </declare-styleable> +</resources> + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyButtonView.java new file mode 100644 index 0000000..ea1af36 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyButtonView.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.Drawable; +import android.os.RemoteException; +import android.os.SystemClock; +import android.os.ServiceManager; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.IWindowManager; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.widget.ImageView; +import android.widget.RemoteViews.RemoteView; + +import com.android.systemui.R; + +public class KeyButtonView extends ImageView { + IWindowManager mWindowManager; + long mDownTime; + boolean mSending; + int mCode; + int mRepeat; + + public KeyButtonView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public KeyButtonView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyButtonView, + defStyle, 0); + + mCode = a.getInteger(R.styleable.KeyButtonView_keyCode, 0); + if (mCode == 0) { + Slog.w(StatusBarService.TAG, "KeyButtonView without key code id=0x" + + Integer.toHexString(getId())); + } + + a.recycle(); + + mWindowManager = IWindowManager.Stub.asInterface( + ServiceManager.getService(Context.WINDOW_SERVICE)); + } + + public boolean onTouchEvent(MotionEvent ev) { + final int action = ev.getAction(); + int x, y; + + switch (action) { + case MotionEvent.ACTION_DOWN: + mDownTime = SystemClock.uptimeMillis(); + mRepeat = 0; + mSending = true; + sendEvent(KeyEvent.ACTION_DOWN, mDownTime); + break; + case MotionEvent.ACTION_MOVE: + if (mSending) { + x = (int)ev.getX(); + y = (int)ev.getY(); + if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight()) { + mSending = false; + sendEvent(KeyEvent.ACTION_UP); + } + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + if (mSending) { + sendEvent(KeyEvent.ACTION_UP); + mSending = false; + } + break; + } + + return true; + } + + void sendEvent(int action) { + sendEvent(action, SystemClock.uptimeMillis()); + } + + void sendEvent(int action, long when) { + final KeyEvent ev = new KeyEvent(mDownTime, mDownTime, action, mCode, mRepeat); + try { + Slog.d(StatusBarService.TAG, "injecting event " + ev); + mWindowManager.injectKeyEvent(ev, false); + } catch (RemoteException ex) { + // System process is dead + } + } +} + + |