该功能的实现逻辑是:在按下音量键后延时3秒执行一个线程,而该线程使用来发送广播,使广播接收者执行上一曲或者下一曲的功能;如果再这3秒内,用户已经弹起按键(不再长按音量键),则取消执行该线程。
修改该功能是在framework/base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java的interceptKeyBeforeQueueing()方法中修改的。以长按音量减键为例:
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
if (down) {
if (isScreenOn && !mVolumeDownKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
mVolumeDownKeyTriggered = true;
mVolumeDownKeyTime = event.getDownTime();
mVolumeDownKeyConsumedByScreenshotChord = false;
cancelPendingPowerKeyAction();
interceptScreenshotChord();
}
else if(mSupportSkipSong && !mVolumeDownKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0){
mVolumeDownKeyTriggered = true;
mVolumeDownKeyTime = event.getDownTime();
cancelPendingPowerKeyAction();
mHandler.postDelayed(mMusicOperationRunnable, MUSIC_OPERATION_DELAY);
}
} else {
if (mSupportSkipSong && mVolumeDownKeyTriggered){
Log.d(TAG,"mVolumeDownKeyTriggered:remove mMusicOperationRunnable!");
mHandler.removeCallbacks(mMusicOperationRunnable);
}
mVolumeDownKeyTriggered = false;
cancelPendingScreenshotChordAction();
}
}