Android Open Source - p1keyboard Button Configuration






From Project

Back to project page p1keyboard.

License

The source code is released under:

GNU Lesser General Public License

If you think the Android project p1keyboard listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/* Copyright (C) 2011, Kenneth Skovhede
 * http://www.hexad.dk, opensource@hexad.dk
 * //w  w w  .j  ava  2  s .c o m
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/
package mobi.omegacentauri.p1keyboard;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Hashtable;

import mobi.omegacentauri.p1keyboard.R;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.view.KeyEvent;

public class ButtonConfiguration extends PreferenceActivity {

  private Preferences m_prefs;
  private ListPreference m_presets;
  private EditTextPreference m_presetName;
  private Hashtable<Integer, String> m_name_lookup;
  private Hashtable<Integer, String> m_meta_name_lookup;
  private Hashtable<Preference, Integer> m_list_lookup;
  private int m_controllerIndex = 0;

  public static final String EXTRA_CONTROLLER = "controller";
      
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.buttonconfiguration);
    
    m_controllerIndex = this.getIntent().getIntExtra("controller", 0);

    m_prefs = new Preferences(this);
    
    m_presets = (ListPreference)this.findPreference("select_preset");
    m_presetName = (EditTextPreference)this.findPreference("rename_preset");
    
    m_presets.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
      @Override
      public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (newValue instanceof String) {
          m_prefs.setCurrentProfile((String)newValue);
          return true;
        } 
        
        return false;
      }
    });
    
    m_presetName.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
      @Override
      public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (newValue instanceof String && !((String)newValue).equals("")) {
          m_prefs.setProfileDisplayName((String)newValue);
          return true;
        } 
        
        return false;
      }
    });
    
    //Use reflection to build a list of possible keys we can send
    m_name_lookup = new Hashtable<Integer, String>();
    m_meta_name_lookup = new Hashtable<Integer, String>();
    for (Field f : KeyEvent.class.getDeclaredFields()) {
      String name = f.getName();
      if (name.startsWith("KEYCODE_"))
        try {
          m_name_lookup.put(f.getInt(null), name.substring("KEYCODE_".length()));
        } catch (Exception e) {  }
      else if (name.startsWith("META_") && name.endsWith("_ON"))
        try {
          m_meta_name_lookup.put(f.getInt(null), name.substring("META_".length(), name.length() - "_ON".length()));
        } catch (Exception e) {  }
    }
    
    //Support for sane(r) names in Android < 2.3
    for (Field f : FutureKeyCodes.class.getDeclaredFields()) {
      String name = f.getName();
      if (name.startsWith("KEYCODE_"))
        try {
          int keyCode = f.getInt(null);
          if (!m_name_lookup.containsKey(keyCode))
            m_name_lookup.put(keyCode, name.substring("KEYCODE_".length()));
        } catch (Exception e) {  }
      else if (name.startsWith("META_") && name.endsWith("_ON"))
        try {
          m_meta_name_lookup.put(f.getInt(null), name.substring("META_".length(), name.length() - "_ON".length()));
        } catch (Exception e) {  }
    }

    String driver = m_prefs.getSelectedDriverName(m_controllerIndex);
    
    int[] buttonCodes;
    int[] buttonNames; 
    
    if (driver.equals(ZeemoteReader.DRIVER_NAME)) {
      buttonCodes = ZeemoteReader.getButtonCodes();
      buttonNames = ZeemoteReader.getButtonNames();
    } else if (driver.equals(BGP100Reader.DRIVER_NAME)) {
      buttonCodes = BGP100Reader.getButtonCodes();
      buttonNames = BGP100Reader.getButtonNames();
    } else if (driver.equals(PhonejoyReader.DRIVER_NAME)) {
      buttonCodes = PhonejoyReader.getButtonCodes();
      buttonNames = PhonejoyReader.getButtonNames();
    } else if (driver.equals(iControlPadReader.DRIVER_NAME)) {
      buttonCodes = iControlPadReader.getButtonCodes();
      buttonNames = iControlPadReader.getButtonNames();
    } else if (driver.equals(WiimoteReader.DRIVER_NAME)) {
      buttonCodes = WiimoteReader.getButtonCodes();
      buttonNames = WiimoteReader.getButtonNames();
        } else if (driver.equals(GameStopReader.DRIVER_NAME)) {
            buttonCodes = GameStopReader.getButtonCodes();
            buttonNames = GameStopReader.getButtonNames();
        } else if (driver.equals(HIDipega.DRIVER_NAME)) {
            buttonCodes = HIDipega.getButtonCodes();
            buttonNames = HIDipega.getButtonNames();
    } else if (driver.equals(HIDKeyboard.DRIVER_NAME)) {
      //TODO: Figure out what the display should look like
      buttonCodes = new int[0];
      buttonNames = new int[0];
    } else if (driver.equals(iCadeReader.DRIVER_NAME)) {
      buttonCodes = iCadeReader.getButtonCodes();
      buttonNames = iCadeReader.getButtonNames();
    } else {
      buttonCodes = new int[0];
      buttonNames = new int[0];
    }
    
    PreferenceCategory buttonCategory = (PreferenceCategory)this.findPreference("cat_buttons");
    Preference resetButton = (Preference)this.findPreference("reset_button");
    resetButton.setOnPreferenceClickListener(new OnPreferenceClickListener() {
      @Override
      public boolean onPreferenceClick(Preference preference) {
        m_prefs.clearKeyMappings(m_controllerIndex);
        return true;
      }
    });
    
    int max_keyvalue = 0;
    for(Integer i : m_name_lookup.keySet())
      max_keyvalue = Math.max(max_keyvalue, i);
    
    int meta_keys = m_meta_name_lookup.size();
    
    CharSequence[] entries = new CharSequence[max_keyvalue + 1 + meta_keys];
    CharSequence[] entryValues = new CharSequence[entries.length];
    
    Integer[] meta_key_set = m_meta_name_lookup.keySet().toArray(new Integer[m_meta_name_lookup.size()]);
    
    for(int i = 0; i < entries.length; i++)
    {
      if (i > max_keyvalue) {
        int ix = i - max_keyvalue - 1;
        entries[i] = String.format(this.getString(R.string.configuration_toggle_meta), m_meta_name_lookup.get(meta_key_set[ix]));
        entryValues[i] = "META_" + meta_key_set[ix].toString();
      } else {
        if (m_name_lookup.containsKey(i))
          entries[i] = m_name_lookup.get(i);
        else
          entries[i] = "UNKNOWN - 0x" + Integer.toHexString(i);
        entryValues[i] =  Integer.toString(i);
      }
    }
    
    m_list_lookup = new Hashtable<Preference, Integer>();
    
    for(int i = 0; i < buttonCodes.length; i++)
    {
      ListPreference lp = new ListPreference(this);
      m_list_lookup.put(lp, buttonCodes[i]);
      
      lp.setTitle(buttonNames[i]);
      lp.setEntries(entries);
      lp.setEntryValues(entryValues);

      lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
          int fromKey = m_list_lookup.get(preference);
          String nv = (String)newValue;
          
          if (nv.startsWith("META_")) {
            int metaKey = Integer.parseInt(nv.substring("META_".length()));
            int curMeta = m_prefs.getMetaKeyMapping(fromKey, m_controllerIndex);
            if ((curMeta & metaKey) == 0)
              curMeta |= metaKey;
            else
              curMeta &= ~metaKey;
            m_prefs.setMetaKeyMapping(fromKey, curMeta, m_controllerIndex);
            return false;
          } else {
            int toKey = Integer.parseInt((String)nv);
            m_prefs.setKeyMapping(fromKey, toKey, m_controllerIndex);            
            return true;
          }
        }
      });
            
      buttonCategory.addPreference(lp);
    }
    
    updateDisplay();
    registerReceiver(preferenceUpdateMonitor, new IntentFilter(Preferences.PREFERENCES_UPDATED));
  }
  
  @Override
  protected void onDestroy() {
    super.onDestroy();

      unregisterReceiver(preferenceUpdateMonitor);
  }
  
  private void updateDisplay() {
    for(Preference p : Collections.list(m_list_lookup.keys())) {
      ListPreference lp = (ListPreference)p;
      int code = m_prefs.getKeyMapping(m_list_lookup.get(p), m_controllerIndex);
      String keycode = m_name_lookup.containsKey(code) ? m_name_lookup.get(code) : "UNKNOWN - 0x" + Integer.toHexString(code); 
      int metacode = m_prefs.getMetaKeyMapping(m_list_lookup.get(p), m_controllerIndex);
      
      for(Integer i : m_meta_name_lookup.keySet()) {
        if ((metacode & i) != 0)
          keycode = m_meta_name_lookup.get(i) + " + " + keycode;
      }

      lp.setSummary(keycode);  
      lp.setValue(Integer.toString(code));
    }
    
    CharSequence[] profileEntries = new CharSequence[Preferences.PROFILE_KEYS.length];
    CharSequence[] profileEntryValues = new CharSequence[Preferences.PROFILE_KEYS.length];
    for(int i = 0; i < profileEntries.length; i++) {
      profileEntryValues[i] = Preferences.PROFILE_KEYS[i];
      profileEntries[i] = m_prefs.getProfileDisplayName(Preferences.PROFILE_KEYS[i]);
    }
    
    m_presets.setEntries(profileEntries);
    m_presets.setEntryValues(profileEntryValues);
    
    String currentProfile = m_prefs.getCurrentProfile();
    if (currentProfile.endsWith(":"))
        currentProfile = currentProfile.substring(0, currentProfile.length() - 1);
    m_presets.setValue(currentProfile);
    
    String display = m_prefs.getProfileDisplayName();
    m_presets.setTitle(display);
    m_presetName.setText(display);
  }
  
  private BroadcastReceiver preferenceUpdateMonitor = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      updateDisplay();
    }
  };  
  
}




Java Source Code List

mobi.omegacentauri.p1keyboard.BGP100Reader.java
mobi.omegacentauri.p1keyboard.BluezDriverInterface.java
mobi.omegacentauri.p1keyboard.BluezForegroundService.java
mobi.omegacentauri.p1keyboard.BluezIMESettings.java
mobi.omegacentauri.p1keyboard.BluezIME.java
mobi.omegacentauri.p1keyboard.BluezService.java
mobi.omegacentauri.p1keyboard.ButtonConfiguration.java
mobi.omegacentauri.p1keyboard.DataDumpReader.java
mobi.omegacentauri.p1keyboard.DeviceScanActivity.java
mobi.omegacentauri.p1keyboard.FutureKeyCodes.java
mobi.omegacentauri.p1keyboard.GameStopReader.java
mobi.omegacentauri.p1keyboard.HIDKeyboard.java
mobi.omegacentauri.p1keyboard.HIDReaderBase.java
mobi.omegacentauri.p1keyboard.HIDipega.java
mobi.omegacentauri.p1keyboard.ImprovedBluetoothDevice.java
mobi.omegacentauri.p1keyboard.PalmOneWirelessKeyboardReader.java
mobi.omegacentauri.p1keyboard.PhonejoyReader.java
mobi.omegacentauri.p1keyboard.Preferences.java
mobi.omegacentauri.p1keyboard.RfcommReader.java
mobi.omegacentauri.p1keyboard.WiimoteReader.java
mobi.omegacentauri.p1keyboard.ZeemoteReader.java
mobi.omegacentauri.p1keyboard.iCadeReader.java
mobi.omegacentauri.p1keyboard.iControlPadReader.java