1. 实现关闭hdmi功能。
a. 在状态栏增加一下按键。
base/packages/SystemUI/res/layout-sw600dp/status_bar.xml
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/power"
+ android:layout_width="80dip"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_sysbar_power"
+ android:contentDescription="@string/accessibility_power"
+ systemui:glowBackground="@drawable/ic_sysbar_highlight"
+ />
b. 添加状态栏按键activity的监听事件
base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
import android.os.Handler;
+import android.os.SystemProperties;
+import android.os.SystemClock;
private int mMaxNotificationIcons = 5;
+ // cjcheng add for hdmi turn off, 2-> off, 1 -> on
+ private static final String HDMI_STATUS = "persist.sys.output_mode";
View mMenuButton;
+ View mPowerButton; // cjcheng add for hdmi off
mHomeButton = mNavigationArea.findViewById(R.id.home);
mMenuButton = mNavigationArea.findViewById(R.id.menu);
+ /* cjcheng add for hdmi off start */
+ mPowerButton = mNavigationArea.findViewById(R.id.power);
+ mPowerButton.setOnClickListener(mOnClickListener);
+ /* cjcheng add for hdmi off end */
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
if (v == mRecentButton) {
onClickRecentButton();
} else if (v == mInputMethodSwitchButton) {
onClickInputMethodSwitchButton();
} else if (v == mCompatModeButton) {
onClickCompatModeButton();
}
/* cjcheng add for hdmi off start */
+ else if (v == mPowerButton){
+ if (!("2".equals(SystemProperties.get(HDMI_STATUS, "0")))){
+ SystemClock.sleep(500);
+ SystemProperties.set(HDMI_STATUS, "2");
+ SystemClock.sleep(500);
+ }
+ }
/* cjcheng add for hdmi off end */
}
};
2. USB鼠标和键盘唤醒HDMI
base/services/input/InputReader.cpp
#include <cutils/log.h>
+#include <cutils/properties.h>
namespace android {
+/* cjcheng add for hdmi on start */
+void hdmi_power_on(void)
+{
+ char hdmi_status[4];
+ property_get("persist.sys.output_mode", hdmi_status, NULL);
+ if (strcmp(hdmi_status, "2") == 0)
+ property_set("persist.sys.output_mode", "1");
+}
+/* cjcheng add for hdmi on start */
+
// USB鼠标按键唤醒HDMI
void CursorButtonAccumulator::process(const RawEvent* rawEvent) {
if (rawEvent->type == EV_KEY) {
switch (rawEvent->scanCode) {
case BTN_LEFT:
mBtnLeft = rawEvent->value;
break;
case BTN_RIGHT:
mBtnRight = rawEvent->value;
break;
case BTN_MIDDLE:
mBtnMiddle = rawEvent->value;
break;
case BTN_BACK:
mBtnBack = rawEvent->value;
break;
case BTN_SIDE:
mBtnSide = rawEvent->value;
break;
case BTN_FORWARD:
mBtnForward = rawEvent->value;
break;
case BTN_EXTRA:
mBtnExtra = rawEvent->value;
break;
case BTN_TASK:
mBtnTask = rawEvent->value;
break;
}
+ hdmi_power_on(); // cjcheng add for hdmi on
}
}
// USB鼠标移动唤醒HDMI
void CursorMotionAccumulator::process(const RawEvent* rawEvent) {
if (rawEvent->type == EV_REL) {
switch (rawEvent->scanCode) {
case REL_X:
mRelX = rawEvent->value;
break;
case REL_Y:
mRelY = rawEvent->value;
break;
}
+ hdmi_power_on(); // cjcheng add for hdmi on
}
}
// USB键盘唤醒HDMI
void KeyboardInputMapper::processKey(nsecs_t when, bool down, int32_t keyCode,
int32_t scanCode, uint32_t policyFlags) {
if (down) {
// Rotate key codes according to orientation if needed.
if (mParameters.orientationAware && mParameters.associatedDisplayId >= 0) {
keyCode = rotateKeyCode(keyCode, mOrientation);
}
+ hdmi_power_on(); // cjcheng add hdmi on
……
}
}
}