1 /* 2 * Copyright (C) 2010 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 17 package com.replica.replicaisland; 18 19 import android.content.Context; 20 import android.content.DialogInterface; 21 import android.content.SharedPreferences; 22 import android.content.DialogInterface.OnKeyListener; 23 import android.content.res.TypedArray; 24 import android.graphics.drawable.Drawable; 25 import android.os.Bundle; 26 import android.preference.DialogPreference; 27 import android.util.AttributeSet; 28 import android.view.KeyEvent; 29 import android.view.View; 30 import android.widget.TextView; 31 32 33 public class KeyboardConfigDialogPreference extends DialogPreference implements OnKeyListener { 34 private SharedPreferences mSharedPrefs; 35 private Context mContext; 36 private String mLeftPrefKey; 37 private String mRightPrefKey; 38 private String mJumpPrefKey; 39 private String mAttackPrefKey; 40 private String[] mKeyLabels; 41 private int mListeningId = 0; 42 private View mLeftBorder; 43 private View mRightBorder; 44 private View mJumpBorder; 45 private View mAttackBorder; 46 private Drawable mUnselectedBorder; 47 private Drawable mSelectedBorder; 48 private int mLeftKeyCode; 49 private int mRightKeyCode; 50 private int mJumpKeyCode; 51 private int mAttackKeyCode; 52 private TextView mLeftText; 53 private TextView mRightText; 54 private TextView mJumpText; 55 private TextView mAttackText; 56 57 private class ConfigClickListener implements View.OnClickListener { 58 private int mId; ConfigClickListener(int id)59 public ConfigClickListener(int id) { 60 mId = id; 61 } 62 onClick(View v)63 public void onClick(View v) { 64 selectId(mId); 65 } 66 67 } 68 KeyboardConfigDialogPreference(Context context, AttributeSet attrs)69 public KeyboardConfigDialogPreference(Context context, AttributeSet attrs) { 70 this(context, attrs, android.R.attr.dialogPreferenceStyle); 71 } 72 KeyboardConfigDialogPreference(Context context, AttributeSet attrs, int defStyle)73 public KeyboardConfigDialogPreference(Context context, AttributeSet attrs, 74 int defStyle) { 75 super(context, attrs, defStyle); 76 77 TypedArray a = context.obtainStyledAttributes(attrs, 78 R.styleable.KeyConfigPreference, defStyle, 0); 79 mLeftPrefKey = a.getString(R.styleable.KeyConfigPreference_leftKey); 80 mRightPrefKey = a.getString(R.styleable.KeyConfigPreference_rightKey); 81 mJumpPrefKey = a.getString(R.styleable.KeyConfigPreference_jumpKey); 82 mAttackPrefKey = a.getString(R.styleable.KeyConfigPreference_attackKey); 83 84 a.recycle(); 85 } 86 KeyboardConfigDialogPreference(Context context)87 public KeyboardConfigDialogPreference(Context context) { 88 this(context, null); 89 } 90 91 @Override onBindDialogView(View view)92 protected void onBindDialogView(View view) { 93 super.onBindDialogView(view); 94 if (mSharedPrefs != null) { 95 mLeftKeyCode = mSharedPrefs.getInt(mLeftPrefKey, KeyEvent.KEYCODE_DPAD_LEFT); 96 mRightKeyCode = mSharedPrefs.getInt(mRightPrefKey, KeyEvent.KEYCODE_DPAD_RIGHT); 97 mJumpKeyCode = mSharedPrefs.getInt(mJumpPrefKey, KeyEvent.KEYCODE_SPACE); 98 mAttackKeyCode = mSharedPrefs.getInt(mAttackPrefKey, KeyEvent.KEYCODE_SHIFT_LEFT); 99 100 101 mLeftText = (TextView)view.findViewById(R.id.key_left); 102 mLeftText.setText(getKeyLabel(mLeftKeyCode)); 103 104 mRightText = (TextView)view.findViewById(R.id.key_right); 105 mRightText.setText(getKeyLabel(mRightKeyCode)); 106 107 mJumpText = (TextView)view.findViewById(R.id.key_jump); 108 mJumpText.setText(getKeyLabel(mJumpKeyCode)); 109 110 mAttackText = (TextView)view.findViewById(R.id.key_attack); 111 mAttackText.setText(getKeyLabel(mAttackKeyCode)); 112 113 mLeftBorder = view.findViewById(R.id.left_border); 114 mRightBorder = view.findViewById(R.id.right_border); 115 mJumpBorder = view.findViewById(R.id.jump_border); 116 mAttackBorder = view.findViewById(R.id.attack_border); 117 118 mLeftBorder.setOnClickListener(new ConfigClickListener(R.id.key_left)); 119 mRightBorder.setOnClickListener(new ConfigClickListener(R.id.key_right)); 120 mJumpBorder.setOnClickListener(new ConfigClickListener(R.id.key_jump)); 121 mAttackBorder.setOnClickListener(new ConfigClickListener(R.id.key_attack)); 122 123 mUnselectedBorder = mContext.getResources().getDrawable(R.drawable.key_config_border); 124 mSelectedBorder = mContext.getResources().getDrawable(R.drawable.key_config_border_active); 125 } 126 127 mListeningId = 0; 128 129 130 } 131 132 @Override showDialog(Bundle state)133 protected void showDialog(Bundle state) { 134 super.showDialog(state); 135 getDialog().setOnKeyListener(this); 136 getDialog().takeKeyEvents(true); 137 } 138 getKeyLabel(int keycode)139 protected String getKeyLabel(int keycode) { 140 String result = "Unknown Key"; 141 if (mKeyLabels == null) { 142 mKeyLabels = mContext.getResources().getStringArray(R.array.keycode_labels); 143 } 144 145 if (keycode > 0 && keycode < mKeyLabels.length) { 146 result = mKeyLabels[keycode - 1]; 147 } 148 return result; 149 } 150 selectId(int id)151 public void selectId(int id) { 152 if (mListeningId != 0) { 153 // unselect the current box 154 View border = getConfigViewById(mListeningId); 155 border.setBackgroundDrawable(mUnselectedBorder); 156 } 157 158 if (id == mListeningId || id == 0) { 159 mListeningId = 0; // toggle off and end. 160 } else { 161 // select the new box 162 View border = getConfigViewById(id); 163 border.setBackgroundDrawable(mSelectedBorder); 164 mListeningId = id; 165 } 166 } 167 getConfigViewById(int id)168 private View getConfigViewById(int id) { 169 View config = null; 170 switch(id) { 171 case R.id.key_left: 172 config = mLeftBorder; 173 break; 174 case R.id.key_right: 175 config = mRightBorder; 176 break; 177 case R.id.key_jump: 178 config = mJumpBorder; 179 break; 180 case R.id.key_attack: 181 config = mAttackBorder; 182 break; 183 } 184 185 return config; 186 } 187 188 @Override onDialogClosed(boolean positiveResult)189 protected void onDialogClosed(boolean positiveResult) { 190 super.onDialogClosed(positiveResult); 191 192 if (positiveResult) { 193 // save changes 194 SharedPreferences.Editor editor = mSharedPrefs.edit(); 195 editor.putInt(mLeftPrefKey, mLeftKeyCode); 196 editor.putInt(mRightPrefKey, mRightKeyCode); 197 editor.putInt(mJumpPrefKey, mJumpKeyCode); 198 editor.putInt(mAttackPrefKey, mAttackKeyCode); 199 editor.commit(); 200 } 201 } 202 setPrefs(SharedPreferences sharedPreferences)203 public void setPrefs(SharedPreferences sharedPreferences) { 204 mSharedPrefs = sharedPreferences; 205 } 206 setContext(Context context)207 public void setContext(Context context) { 208 mContext = context; 209 } 210 onKey(DialogInterface dialog, int keyCode, KeyEvent event)211 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 212 boolean eatKey = false; 213 if (mListeningId != 0) { 214 eatKey = true; 215 switch (mListeningId) { 216 case R.id.key_left: 217 mLeftText.setText(getKeyLabel(keyCode)); 218 mLeftKeyCode = keyCode; 219 break; 220 case R.id.key_right: 221 mRightText.setText(getKeyLabel(keyCode)); 222 mRightKeyCode = keyCode; 223 break; 224 case R.id.key_jump: 225 mJumpText.setText(getKeyLabel(keyCode)); 226 mJumpKeyCode = keyCode; 227 break; 228 case R.id.key_attack: 229 mAttackText.setText(getKeyLabel(keyCode)); 230 mAttackKeyCode = keyCode; 231 break; 232 } 233 234 selectId(0); // deselect the current config box; 235 } 236 return eatKey; 237 } 238 239 } 240