blob: 13c90adf607720b92ebcb8b5371254aab4b9eeee [file] [log] [blame]
/*
* 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.
*/
package com.replica.replicaisland;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnKeyListener;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
public class KeyboardConfigDialogPreference extends DialogPreference implements OnKeyListener {
private SharedPreferences mSharedPrefs;
private Context mContext;
private String mLeftPrefKey;
private String mRightPrefKey;
private String mJumpPrefKey;
private String mAttackPrefKey;
private String[] mKeyLabels;
private int mListeningId = 0;
private View mLeftBorder;
private View mRightBorder;
private View mJumpBorder;
private View mAttackBorder;
private Drawable mUnselectedBorder;
private Drawable mSelectedBorder;
private int mLeftKeyCode;
private int mRightKeyCode;
private int mJumpKeyCode;
private int mAttackKeyCode;
private TextView mLeftText;
private TextView mRightText;
private TextView mJumpText;
private TextView mAttackText;
private class ConfigClickListener implements View.OnClickListener {
private int mId;
public ConfigClickListener(int id) {
mId = id;
}
public void onClick(View v) {
selectId(mId);
}
}
public KeyboardConfigDialogPreference(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.dialogPreferenceStyle);
}
public KeyboardConfigDialogPreference(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.KeyConfigPreference, defStyle, 0);
mLeftPrefKey = a.getString(R.styleable.KeyConfigPreference_leftKey);
mRightPrefKey = a.getString(R.styleable.KeyConfigPreference_rightKey);
mJumpPrefKey = a.getString(R.styleable.KeyConfigPreference_jumpKey);
mAttackPrefKey = a.getString(R.styleable.KeyConfigPreference_attackKey);
a.recycle();
}
public KeyboardConfigDialogPreference(Context context) {
this(context, null);
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
if (mSharedPrefs != null) {
mLeftKeyCode = mSharedPrefs.getInt(mLeftPrefKey, KeyEvent.KEYCODE_DPAD_LEFT);
mRightKeyCode = mSharedPrefs.getInt(mRightPrefKey, KeyEvent.KEYCODE_DPAD_RIGHT);
mJumpKeyCode = mSharedPrefs.getInt(mJumpPrefKey, KeyEvent.KEYCODE_SPACE);
mAttackKeyCode = mSharedPrefs.getInt(mAttackPrefKey, KeyEvent.KEYCODE_SHIFT_LEFT);
mLeftText = (TextView)view.findViewById(R.id.key_left);
mLeftText.setText(getKeyLabel(mLeftKeyCode));
mRightText = (TextView)view.findViewById(R.id.key_right);
mRightText.setText(getKeyLabel(mRightKeyCode));
mJumpText = (TextView)view.findViewById(R.id.key_jump);
mJumpText.setText(getKeyLabel(mJumpKeyCode));
mAttackText = (TextView)view.findViewById(R.id.key_attack);
mAttackText.setText(getKeyLabel(mAttackKeyCode));
mLeftBorder = view.findViewById(R.id.left_border);
mRightBorder = view.findViewById(R.id.right_border);
mJumpBorder = view.findViewById(R.id.jump_border);
mAttackBorder = view.findViewById(R.id.attack_border);
mLeftBorder.setOnClickListener(new ConfigClickListener(R.id.key_left));
mRightBorder.setOnClickListener(new ConfigClickListener(R.id.key_right));
mJumpBorder.setOnClickListener(new ConfigClickListener(R.id.key_jump));
mAttackBorder.setOnClickListener(new ConfigClickListener(R.id.key_attack));
mUnselectedBorder = mContext.getResources().getDrawable(R.drawable.key_config_border);
mSelectedBorder = mContext.getResources().getDrawable(R.drawable.key_config_border_active);
}
mListeningId = 0;
}
@Override
protected void showDialog(Bundle state) {
super.showDialog(state);
getDialog().setOnKeyListener(this);
getDialog().takeKeyEvents(true);
}
protected String getKeyLabel(int keycode) {
String result = "Unknown Key";
if (mKeyLabels == null) {
mKeyLabels = mContext.getResources().getStringArray(R.array.keycode_labels);
}
if (keycode > 0 && keycode < mKeyLabels.length) {
result = mKeyLabels[keycode - 1];
}
return result;
}
public void selectId(int id) {
if (mListeningId != 0) {
// unselect the current box
View border = getConfigViewById(mListeningId);
border.setBackgroundDrawable(mUnselectedBorder);
}
if (id == mListeningId || id == 0) {
mListeningId = 0; // toggle off and end.
} else {
// select the new box
View border = getConfigViewById(id);
border.setBackgroundDrawable(mSelectedBorder);
mListeningId = id;
}
}
private View getConfigViewById(int id) {
View config = null;
switch(id) {
case R.id.key_left:
config = mLeftBorder;
break;
case R.id.key_right:
config = mRightBorder;
break;
case R.id.key_jump:
config = mJumpBorder;
break;
case R.id.key_attack:
config = mAttackBorder;
break;
}
return config;
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
// save changes
SharedPreferences.Editor editor = mSharedPrefs.edit();
editor.putInt(mLeftPrefKey, mLeftKeyCode);
editor.putInt(mRightPrefKey, mRightKeyCode);
editor.putInt(mJumpPrefKey, mJumpKeyCode);
editor.putInt(mAttackPrefKey, mAttackKeyCode);
editor.commit();
}
}
public void setPrefs(SharedPreferences sharedPreferences) {
mSharedPrefs = sharedPreferences;
}
public void setContext(Context context) {
mContext = context;
}
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
boolean eatKey = false;
if (mListeningId != 0) {
eatKey = true;
switch (mListeningId) {
case R.id.key_left:
mLeftText.setText(getKeyLabel(keyCode));
mLeftKeyCode = keyCode;
break;
case R.id.key_right:
mRightText.setText(getKeyLabel(keyCode));
mRightKeyCode = keyCode;
break;
case R.id.key_jump:
mJumpText.setText(getKeyLabel(keyCode));
mJumpKeyCode = keyCode;
break;
case R.id.key_attack:
mAttackText.setText(getKeyLabel(keyCode));
mAttackKeyCode = keyCode;
break;
}
selectId(0); // deselect the current config box;
}
return eatKey;
}
}