aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristofer Ã…kersten <akersten@google.com>2014-07-17 23:03:14 +0900
committerChristofer Ã…kersten <akersten@google.com>2014-07-25 16:25:28 +0900
commitc7fc1a88b5ec29ae1290f6256f120f60f1406949 (patch)
treed0b9626d5c541c192d5bb013a98e31f132d31059 /src
parent0c53fed1e83119ba11e214d2f62f5d5068062801 (diff)
downloadTV-c7fc1a88b5ec29ae1290f6256f120f60f1406949.tar.gz
Add keypad view.
Bug: 15842368 Change-Id: I2400c3d2b1a734d2a498d635f8b7169acdfa5ad4
Diffstat (limited to 'src')
-rw-r--r--src/com/android/tv/TvActivity.java23
-rw-r--r--src/com/android/tv/ui/KeypadView.java130
2 files changed, 150 insertions, 3 deletions
diff --git a/src/com/android/tv/TvActivity.java b/src/com/android/tv/TvActivity.java
index d0919bb2..98efdcf0 100644
--- a/src/com/android/tv/TvActivity.java
+++ b/src/com/android/tv/TvActivity.java
@@ -65,6 +65,7 @@ import com.android.tv.input.TvInput;
import com.android.tv.input.UnifiedTvInput;
import com.android.tv.ui.ChannelBannerView;
import com.android.tv.ui.ChannelNumberView;
+import com.android.tv.ui.KeypadView;
import com.android.tv.ui.MainMenuView;
import com.android.tv.ui.TunableTvView;
import com.android.tv.ui.TunableTvView.OnTuneListener;
@@ -125,6 +126,7 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
private MainMenuView mMainMenuView;
private ChannelBannerView mChannelBanner;
private ChannelNumberView mChannelNumberView;
+ private KeypadView mKeypadView;
private SidePanelContainer mSidePanelContainer;
private HideRunnable mHideChannelBanner;
private HideRunnable mHideControlGuide;
@@ -220,6 +222,7 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
mMainMenuView.setTvActivity(this);
mChannelNumberView = (ChannelNumberView) findViewById(R.id.channel_number_view);
mChannelNumberView.setTvActivity(this);
+ mKeypadView = (KeypadView) findViewById(R.id.keypad);
// Initially hide the channel banner and the control guide.
mChannelBanner.setVisibility(View.GONE);
@@ -646,7 +649,8 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (DEBUG) Log.d(TAG, "dispatchKeyEvent(" + event + ")");
- if (mMainMenuView.isShown() || getFragmentManager().getBackStackEntryCount() > 0) {
+ if (mMainMenuView.isShown() || mKeypadView.wantKeys()
+ || getFragmentManager().getBackStackEntryCount() > 0) {
return super.dispatchKeyEvent(event);
}
int eventKeyCode = event.getKeyCode();
@@ -988,7 +992,7 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (mMainMenuView.getVisibility() == View.VISIBLE
+ if (mMainMenuView.getVisibility() == View.VISIBLE || mKeypadView.wantKeys()
|| getFragmentManager().getBackStackEntryCount() > 0) {
return super.onKeyDown(keyCode, event);
}
@@ -1030,6 +1034,13 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
return super.onKeyUp(keyCode, event);
}
}
+ if (mKeypadView.wantKeys()) {
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ mKeypadView.setVisibility(View.GONE);
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
if (mChannelNumberView.isShown()) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
mChannelNumberView.hide();
@@ -1141,9 +1152,15 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
showDisplayModeOption(BaseSideFragment.INITIATOR_SHORTCUT_KEY);
return true;
}
+
case KeyEvent.KEYCODE_D:
showDebugOptions(BaseSideFragment.INITIATOR_UNKNOWN);
return true;
+
+ case KeyEvent.KEYCODE_K:
+ mKeypadView.setVisibility(View.VISIBLE);
+ mKeypadView.requestFocus();
+ return true;
}
}
return super.onKeyUp(keyCode, event);
@@ -1193,7 +1210,7 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (mMainMenuView.getVisibility() != View.VISIBLE) {
+ if (mMainMenuView.getVisibility() != View.VISIBLE && !mKeypadView.wantKeys()) {
mGestureDetector.onTouchEvent(event);
}
return super.onTouchEvent(event);
diff --git a/src/com/android/tv/ui/KeypadView.java b/src/com/android/tv/ui/KeypadView.java
new file mode 100644
index 00000000..1eef81ee
--- /dev/null
+++ b/src/com/android/tv/ui/KeypadView.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2014 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.tv.ui;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
+import android.widget.Toast;
+
+import com.android.tv.R;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class KeypadView extends RelativeLayout implements View.OnClickListener,
+ View.OnFocusChangeListener {
+ private static final IdToKeyCodeBiMap sIdToKeyCodeBiMap;
+ static {
+ sIdToKeyCodeBiMap = new IdToKeyCodeBiMap();
+ sIdToKeyCodeBiMap.put(R.id.key_red, KeyEvent.KEYCODE_PROG_RED);
+ sIdToKeyCodeBiMap.put(R.id.key_green, KeyEvent.KEYCODE_PROG_GREEN);
+ sIdToKeyCodeBiMap.put(R.id.key_yellow, KeyEvent.KEYCODE_PROG_YELLOW);
+ sIdToKeyCodeBiMap.put(R.id.key_blue, KeyEvent.KEYCODE_PROG_BLUE);
+ sIdToKeyCodeBiMap.put(R.id.key_1, KeyEvent.KEYCODE_1);
+ sIdToKeyCodeBiMap.put(R.id.key_2, KeyEvent.KEYCODE_2);
+ sIdToKeyCodeBiMap.put(R.id.key_3, KeyEvent.KEYCODE_3);
+ sIdToKeyCodeBiMap.put(R.id.key_4, KeyEvent.KEYCODE_4);
+ sIdToKeyCodeBiMap.put(R.id.key_5, KeyEvent.KEYCODE_5);
+ sIdToKeyCodeBiMap.put(R.id.key_6, KeyEvent.KEYCODE_6);
+ sIdToKeyCodeBiMap.put(R.id.key_7, KeyEvent.KEYCODE_7);
+ sIdToKeyCodeBiMap.put(R.id.key_8, KeyEvent.KEYCODE_8);
+ sIdToKeyCodeBiMap.put(R.id.key_9, KeyEvent.KEYCODE_9);
+ sIdToKeyCodeBiMap.put(R.id.key_l, KeyEvent.KEYCODE_SPACE); // TODO find better mapping
+ sIdToKeyCodeBiMap.put(R.id.key_0, KeyEvent.KEYCODE_0);
+ sIdToKeyCodeBiMap.put(R.id.key_r, KeyEvent.KEYCODE_MINUS); // TODO find better mapping
+ }
+
+ public KeypadView(Context context) {
+ this(context, null);
+ }
+
+ public KeypadView(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.keypadViewStyle);
+ }
+
+ public KeypadView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public KeypadView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ inflate(getContext(), R.layout.keypad_view, this);
+ }
+
+ public boolean wantKeys() {
+ return isShown();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ for (int i = 0; i < getChildCount(); ++i) {
+ getChildAt(i).setOnFocusChangeListener(this);
+ getChildAt(i).setOnClickListener(this);
+ }
+ }
+
+ @Override
+ public void onFocusChange(View view, boolean hasFocus) {
+ if (hasFocus && view.isInTouchMode()) {
+ view.performClick();
+ }
+ }
+
+ @Override
+ public void onClick(View view) {
+ int keyCode = getKeyCodeForView(view);
+ if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
+ Toast.makeText(getContext(), R.string.not_implemented_yet, Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private int getKeyCodeForView(View view) {
+ return sIdToKeyCodeBiMap.getKeyCode(view.getId());
+ }
+
+ private static class IdToKeyCodeBiMap {
+ private Map<Integer, Integer> idToKeyCodeMap = new HashMap<>();
+ private Map<Integer, Integer> keyCodeToIdMap = new HashMap<>();
+
+ public void put(int id, int keyCode){
+ if (id == 0 || id == View.NO_ID) {
+ throw new IllegalArgumentException("Invalid id");
+ }
+ if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
+ throw new IllegalArgumentException("Invalid key code");
+ }
+ if (idToKeyCodeMap.put(id, keyCode) != null) {
+ throw new IllegalArgumentException("The given id is already added");
+ }
+ if (keyCodeToIdMap.put(keyCode, id) != null) {
+ throw new IllegalArgumentException("The given key code is already added");
+ }
+ }
+
+ public int getKeyCode(int id){
+ Integer keyCode = idToKeyCodeMap.get(id);
+ if (keyCode == null) {
+ return View.NO_ID;
+ }
+ return keyCode;
+ }
+ }
+} \ No newline at end of file