/* WearKeyEventProfileActivity.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.wear.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.support.v4.content.LocalBroadcastManager; import android.support.wearable.view.WatchViewStub; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import org.deviceconnect.android.deviceplugin.wear.R; import org.deviceconnect.android.deviceplugin.wear.WearApplication; import org.deviceconnect.android.deviceplugin.wear.WearConst; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * WearKeyEventProfileActivity. * * @author NTT DOCOMO, INC. */ public class WearKeyEventProfileActivity extends Activity { /** Device NodeID . */ private final List<String> mIds = Collections.synchronizedList(new ArrayList<String>()); /** Event flag. */ private int mRegisterEvent = 0; /** Event flag define (down). */ private static final int REGIST_FLAG_KEYEVENT_DOWN = 0x01; /** Event flag define (up). */ private static final int REGIST_FLAG_KEYEVENT_UP = 0x02; /** Event flag define (keyChange). */ private static final int REGIST_FLAG_KEYEVENT_KEYCHANGE = 0x04; /** Button define. */ private Button mBtnKeyMode, mBtnCancel, mBtnOk; /** Key mode. */ private int mKeyMode = 0; /** Key mode count. */ private static final int KM_MAX_CNT = 4; /** Key mode (Standard Keyboard). */ private static final int KM_STD_KEY = 0; /** Key mode (Media Control). */ private static final int KM_MEDIA_CTRL = 1; /** Key mode (Direction PAd / Button ). */ private static final int KM_DPAD_BUTTON = 2; /** Key mode (User Define). */ private static final int KM_USER = 3; /** Key Code define(cancel). */ private static final int KEYCODE_CANCEL = 0; /** Key Code define(ok). */ private static final int KEYCODE_OK = 1; /** Configure (Standard Keyboard). */ private static final String[] CONFIG_STD_KEY = {"Cancel", "OK"}; /** Configure (Media Control). */ private static final String[] CONFIG_MEDIA_CTRL = {"stop", "play"}; /** Configure (Directional Pad). */ private static final String[] CONFIG_DPAD = {"up", "down"}; /** Configure (User defined). */ private static final String[] CONFIG_USER = {"USER_CANCEL", "USER_OK"}; /** * Wakelock. */ private PowerManager.WakeLock mWakeLock; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); mWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TouchWakelockTag"); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); if (!mWakeLock.isHeld()) { mWakeLock.acquire(); } setRegisterEvent(getIntent()); setContentView(R.layout.activity_wear_keyevent_profile); WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub); stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { @Override public void onLayoutInflated(final WatchViewStub stub) { mBtnKeyMode = (Button) stub.findViewById(R.id.button_key_mode); mBtnKeyMode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { // Update Key Mode. mKeyMode++; if (mKeyMode >= KM_MAX_CNT) { mKeyMode = KM_STD_KEY; } String keyMode; switch (mKeyMode) { case KM_MEDIA_CTRL: keyMode = getString(R.string.key_mode_media_ctrl); break; case KM_DPAD_BUTTON: keyMode = getString(R.string.key_mode_dpad_button); break; case KM_USER: keyMode = getString(R.string.key_mode_user); break; case KM_STD_KEY: default: keyMode = getString(R.string.key_mode_std_key); break; } mBtnKeyMode.setText(keyMode); } }); mBtnCancel = (Button) stub.findViewById(R.id.button_cancel); mBtnCancel.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: sendMessageData(action, KEYCODE_CANCEL); break; default: break; } return false; } }); mBtnOk = (Button) stub.findViewById(R.id.button_ok); mBtnOk.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: sendMessageData(action, KEYCODE_OK); break; default: break; } return false; } }); } }); Intent i = new Intent(WearConst.ACTION_WEAR_PING_SERVICE); LocalBroadcastManager.getInstance(this).sendBroadcast(i); } @Override protected void onNewIntent(Intent intent) { setRegisterEvent(intent); } @Override protected void onDestroy() { super.onDestroy(); mWakeLock.release(); } /** * Get Configure string. * * @param keyMode Key Mode. * @param keyId Key ID. * @return config Configure string. */ private String getConfig(final int keyMode, final int keyId) { String config; int nIndex; switch (keyId) { case KEYCODE_CANCEL: nIndex = 0; break; case KEYCODE_OK: nIndex = 1; break; default: nIndex = -1; break; } if (nIndex != -1) { switch (keyMode) { case KM_MEDIA_CTRL: config = CONFIG_MEDIA_CTRL[nIndex]; break; case KM_DPAD_BUTTON: config = CONFIG_DPAD[nIndex]; break; case KM_USER: config = CONFIG_USER[nIndex]; break; case KM_STD_KEY: default: config = CONFIG_STD_KEY[nIndex]; break; } } else { config = ""; } return config; } /** * Send message data. * * @param action MotionEvent action. * @param keyId Key ID. */ private void sendMessageData(final int action, final int keyId) { int keycode = keyId; String keyConfig = getConfig(mKeyMode, keycode); String keyAction; if (action == MotionEvent.ACTION_DOWN) { if ((mRegisterEvent & REGIST_FLAG_KEYEVENT_KEYCHANGE) == 0 && (mRegisterEvent & REGIST_FLAG_KEYEVENT_DOWN) == 0) { return; } keyAction = WearConst.PARAM_KEYEVENT_DOWN; } else { if ((mRegisterEvent & REGIST_FLAG_KEYEVENT_KEYCHANGE) == 0 && (mRegisterEvent & REGIST_FLAG_KEYEVENT_UP) == 0) { return; } keyAction = WearConst.PARAM_KEYEVENT_UP; } switch (mKeyMode) { case KM_MEDIA_CTRL: keycode += WearConst.KEYTYPE_MEDIA_CTRL; break; case KM_DPAD_BUTTON: keycode += WearConst.KEYTYPE_DPAD_BUTTON; break; case KM_USER: keycode += WearConst.KEYTYPE_USER; break; case KM_STD_KEY: default: keycode += WearConst.KEYTYPE_STD_KEY; break; } String data = keyAction + "," + String.valueOf(keycode) + "," + keyConfig; sendEvent(WearConst.WEAR_TO_DEVICE_KEYEVENT_DATA, data); } private void sendEvent(final String path, final String data) { synchronized (mIds) { for (String id : mIds) { ((WearApplication) getApplication()).sendMessage(id, path, data); } } } private void setRegisterEvent(Intent intent) { String type = intent.getStringExtra(WearConst.PARAM_KEYEVENT_REGIST); String id = intent.getStringExtra(WearConst.PARAM_KEYEVENT_ID); setRegisterEvent(type, id); } /** * Set register event. * * @param regist Request event. */ private void setRegisterEvent(final String regist, final String id) { if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONDOWN_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_KEYEVENT_DOWN; } else if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONUP_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_KEYEVENT_UP; } else if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONKEYCHANGE_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_KEYEVENT_KEYCHANGE; } else if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONDOWN_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_KEYEVENT_DOWN); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONUP_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_KEYEVENT_UP); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_KEYEVENT_ONKEYCHANGE_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_KEYEVENT_KEYCHANGE); if (mRegisterEvent == 0) { finish(); } } } }