/*
KeyEventProfileActivity.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.host.activity;
import java.util.List;
import org.deviceconnect.android.deviceplugin.host.HostDeviceApplication;
import org.deviceconnect.android.deviceplugin.host.R;
import org.deviceconnect.android.deviceplugin.host.profile.HostKeyEventProfile;
import org.deviceconnect.android.event.Event;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.profile.KeyEventProfile;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.profile.KeyEventProfileConstants;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import static org.deviceconnect.android.deviceplugin.host.HostDeviceApplication.STATE_DOWN;
import static org.deviceconnect.android.deviceplugin.host.HostDeviceApplication.STATE_UP;
/**
* Key Event Profile Activity.
*
* @author NTT DOCOMO, INC.
*/
public class KeyEventProfileActivity extends Activity implements OnTouchListener, OnCheckedChangeListener {
/** Application class instance. */
private HostDeviceApplication mApp;
/** Service Id. */
String mServiceId;
/** Key Mode. */
KeyMode mKeyMode;
/** enum:Key Mode. */
public enum KeyMode {
/** Standard Keyboard. */
STD_KEY,
/** Media Control. */
MEDIA_CTRL,
/** Directional Pad / Button. */
DPAD_BUTTON,
/** User defined. */
USER;
}
/** Configure (Standard Keyboard). */
String[] mConfigStdKey = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "Enter"};
/** Configure (Media Control). */
String[] mConfigMediaCtrl = {"stop", "previous", "pause", "next", "", "", "", "", "", "", "", "play"};
/** Configure (Directional Pad). */
String[] mConfigDpad = {"", "", "down", "", "left", "center", "right", "", "up", "", "", ""};
/** Configure (User defined). */
String[] mConfigUser = {"", "", "", "", "", "", "", "", "", "", "USER_CANCEL", "USER_OK"};
/**
* Implementation of BroadcastReceiver.
*/
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
String action = intent.getAction();
if (HostKeyEventProfile.ACTION_FINISH_KEYEVENT_ACTIVITY.equals(action)) {
finish();
}
}
};
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.keyevent_main);
// Get Application class instance.
mApp = (HostDeviceApplication) this.getApplication();
// Set button touchlistener. (Ten Key Emulated)
findViewById(R.id.button_0).setOnTouchListener(this);
findViewById(R.id.button_1).setOnTouchListener(this);
findViewById(R.id.button_2).setOnTouchListener(this);
findViewById(R.id.button_3).setOnTouchListener(this);
findViewById(R.id.button_4).setOnTouchListener(this);
findViewById(R.id.button_5).setOnTouchListener(this);
findViewById(R.id.button_6).setOnTouchListener(this);
findViewById(R.id.button_7).setOnTouchListener(this);
findViewById(R.id.button_8).setOnTouchListener(this);
findViewById(R.id.button_9).setOnTouchListener(this);
findViewById(R.id.button_dot).setOnTouchListener(this);
findViewById(R.id.button_enter).setOnTouchListener(this);
findViewById(R.id.button_keyevent_close).setOnTouchListener(this);
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.RadioGroup);
// Set default select radio button.
radioGroup.check(R.id.radioButton1);
mKeyMode = KeyMode.STD_KEY;
// set radiogroup changelistener
radioGroup.setOnCheckedChangeListener(this);
// Get serviceId.
Intent intent = getIntent();
mServiceId = intent.getStringExtra(DConnectMessage.EXTRA_SERVICE_ID);
}
@Override
public boolean onTouch(final View v, final MotionEvent event) {
int action = event.getAction();
// Emulate ten key down/up event.
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
KeyEvent keyevent = null;
int i = v.getId();
if (i == R.id.button_0) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_0);
} else if (i == R.id.button_1) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_1);
} else if (i == R.id.button_2) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_2);
} else if (i == R.id.button_3) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_3);
} else if (i == R.id.button_4) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_4);
} else if (i == R.id.button_5) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_5);
} else if (i == R.id.button_6) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_6);
} else if (i == R.id.button_7) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_7);
} else if (i == R.id.button_8) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_8);
} else if (i == R.id.button_9) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_9);
} else if (i == R.id.button_dot) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_DOT);
} else if (i == R.id.button_enter) {
keyevent = new KeyEvent(action, KeyEvent.KEYCODE_NUMPAD_ENTER);
} else if (i == R.id.button_keyevent_close) {
finish();
}
if (keyevent != null) {
dispatchKeyEvent(keyevent);
}
break;
default:
break;
}
return false;
}
@Override
public void onCheckedChanged(final RadioGroup group, final int checkedId) {
RadioButton radioButton = (RadioButton) findViewById(checkedId);
// Change key mode.
int i = radioButton.getId();
if (i == R.id.radioButton1) {
mKeyMode = KeyMode.STD_KEY;
} else if (i == R.id.radioButton2) {
mKeyMode = KeyMode.MEDIA_CTRL;
} else if (i == R.id.radioButton3) {
mKeyMode = KeyMode.DPAD_BUTTON;
} else if (i == R.id.radioButton4) {
mKeyMode = KeyMode.USER;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(HostKeyEventProfile.ACTION_FINISH_KEYEVENT_ACTIVITY);
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
}
@Override
public boolean dispatchKeyEvent(final KeyEvent event) {
return super.dispatchKeyEvent(event);
}
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
// "ondown" event processing.
List<Event> events = EventManager.INSTANCE.getEventList(mServiceId, KeyEventProfile.PROFILE_NAME, null,
KeyEventProfile.ATTRIBUTE_ON_DOWN);
sendEventData(STATE_DOWN, keyCode, events);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(final int keyCode, final KeyEvent event) {
// "onup" event processing.
List<Event> events = EventManager.INSTANCE.getEventList(mServiceId, KeyEventProfile.PROFILE_NAME, null,
KeyEventProfile.ATTRIBUTE_ON_UP);
sendEventData(STATE_UP, keyCode, events);
return super.onKeyUp(keyCode, event);
}
/**
* Send event data.
*
* @param state Key state.
* @param keycode key Code.
* @param events Event request list.
*/
private void sendEventData(final String state, final int keycode, final List<Event> events) {
List<Event> changeEvents = EventManager.INSTANCE.getEventList(mServiceId, KeyEventProfile.PROFILE_NAME, null,
HostKeyEventProfile.ATTRIBUTE_ON_KEY_CHANGE);
Bundle keyevent = new Bundle();
int keyId = keycode;
String keyConfig = "";
// Get configure string.
keyConfig = getConfig(mKeyMode, keyId);
// Set key type.
switch (mKeyMode) {
case MEDIA_CTRL:
keyId += KeyEventProfileConstants.KEYTYPE_MEDIA_CTRL;
break;
case DPAD_BUTTON:
keyId += KeyEventProfileConstants.KEYTYPE_DPAD_BUTTON;
break;
case USER:
keyId += KeyEventProfileConstants.KEYTYPE_USER;
break;
case STD_KEY:
default:
keyId += KeyEventProfileConstants.KEYTYPE_STD_KEY;
break;
}
keyevent.putInt(KeyEventProfile.PARAM_ID, keyId);
keyevent.putString(KeyEventProfile.PARAM_CONFIG, keyConfig);
for (int i = 0; i < events.size(); i++) {
Event eventdata = events.get(i);
String attr = eventdata.getAttribute();
Intent intent = EventManager.createEventMessage(eventdata);
intent.putExtra(KeyEventProfile.PARAM_KEYEVENT, keyevent);
getBaseContext().sendBroadcast(intent);
mApp.setKeyEventCache(attr, keyevent);
}
for (int i = 0; i < changeEvents.size(); i++) {
Event eventdata = changeEvents.get(i);
String attr = eventdata.getAttribute();
Intent intent = EventManager.createEventMessage(eventdata);
keyevent.putString("state", state);
intent.putExtra(KeyEventProfile.PARAM_KEYEVENT, keyevent);
getBaseContext().sendBroadcast(intent);
mApp.setKeyEventCache(attr, keyevent);
}
}
/**
* Get Configure string.
*
* @param keymode Key Mode.
* @param keyId Key ID.
* @return config Configure string.
*/
private String getConfig(final KeyMode keymode, final int keyId) {
String config = "";
int nIndex = -1;
switch (keyId) {
case KeyEvent.KEYCODE_NUMPAD_0:
nIndex = 0;
break;
case KeyEvent.KEYCODE_NUMPAD_1:
nIndex = 1;
break;
case KeyEvent.KEYCODE_NUMPAD_2:
nIndex = 2;
break;
case KeyEvent.KEYCODE_NUMPAD_3:
nIndex = 3;
break;
case KeyEvent.KEYCODE_NUMPAD_4:
nIndex = 4;
break;
case KeyEvent.KEYCODE_NUMPAD_5:
nIndex = 5;
break;
case KeyEvent.KEYCODE_NUMPAD_6:
nIndex = 6;
break;
case KeyEvent.KEYCODE_NUMPAD_7:
nIndex = 7;
break;
case KeyEvent.KEYCODE_NUMPAD_8:
nIndex = 8;
break;
case KeyEvent.KEYCODE_NUMPAD_9:
nIndex = 9;
break;
case KeyEvent.KEYCODE_NUMPAD_DOT:
nIndex = 10;
break;
case KeyEvent.KEYCODE_NUMPAD_ENTER:
nIndex = 11;
break;
default:
nIndex = -1;
break;
}
if (nIndex != -1) {
switch (mKeyMode) {
case MEDIA_CTRL:
config = mConfigMediaCtrl[nIndex];
break;
case DPAD_BUTTON:
config = mConfigDpad[nIndex];
break;
case USER:
config = mConfigUser[nIndex];
break;
case STD_KEY:
default:
config = mConfigStdKey[nIndex];
break;
}
} else {
config = "";
}
return config;
}
}