diff options
author | Christofer Ã…kersten <akersten@google.com> | 2014-07-17 23:03:14 +0900 |
---|---|---|
committer | Christofer Ã…kersten <akersten@google.com> | 2014-07-25 16:25:28 +0900 |
commit | c7fc1a88b5ec29ae1290f6256f120f60f1406949 (patch) | |
tree | d0b9626d5c541c192d5bb013a98e31f132d31059 /src | |
parent | 0c53fed1e83119ba11e214d2f62f5d5068062801 (diff) | |
download | TV-c7fc1a88b5ec29ae1290f6256f120f60f1406949.tar.gz |
Add keypad view.
Bug: 15842368
Change-Id: I2400c3d2b1a734d2a498d635f8b7169acdfa5ad4
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/tv/TvActivity.java | 23 | ||||
-rw-r--r-- | src/com/android/tv/ui/KeypadView.java | 130 |
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 |