먼저 강좌를 시작 하기 전, 이 글은

영구땡칠님의 글을 그냥 사진만 추가해서 올린다고 해도 뭐라 할것이 없습니다...ㅠㅠ

원문 / http://cafe.naver.com/androidhacker/461


먼저 하시기 전에, 손가락 운동 한번만^^


일딴 대부분의 디바이스가 정상 동작을 하겠지만, 몇몇 디바이스들은 CWM리커버리 기본 셋팅으로 빌드를 하면

선택키가 없고, 볼륨키로만 왔다 갔다만 할수 있는....그런 상황이 일어나 버립니다...ㅠㅠ


제가 만들어본 LG 옵티머스Q2와 옵티머스Ex 에선 그랬습니다.


그래서 약간 글을 써볼려고 합니다.

위에서 말했듯이, 이 글은 영구땡칠님께서 써주신 글 입니다.

올라온거 보고, 덧글도 제가 1등으로 달았어요!


영구땡칠님曰 / "이미 초급딱치를 뗀 개발자라고 생각하신다면 이 글을 안보고도 쉽사리 고칠 부분을 찾아내실수 있습니다. 그런 분들이라면 이 문서를 참고하지 말고 직접 고보시기 바랍니다"


아아...전 아직 못뗏어요...ㅠㅠ


언제나 그렇지만 저에게 언제나 도움을 주시는 영구땡칠님 (LG 기기에서 많은 활약을...), hPa님 (이분은 너무 글로벌 하셔서), 베르제브님 (옵티머스Q2와 Ex를 구원해 주신 분...)등의 수많은 능력자 분들이 있기에, 전 낼름 받아 먹기만 하고 글을 써 봅니다.


먼저 개념은 이러 합니다.


grep VOLUME 라는 명령어를 내려, 자신이 수행했던 기록을 거슬러 올라갈수 있습니다.

그렇게 해서 파일을 찾는 방식 입니다.


하지만...전 왜 저 명령어가 안먹히죠...ㅠㅠ 그래서 글을 그대로 날름 했습니다.



ClcokworkMod 리커버리 5에선 아래와 같은 파일을 수정 하시면 됩니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_ui.c


ClockworkMod 리커버리 6에선 아래와 같은 파일을 수정 하시면 됩니다.

/home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_keys.c


전 CWM5의 작업 파일을 만저 본적이 없어, CWM6을 기준으로 글을 써 봅니다.


1. /home/(사용자 계정명)/android/system/bootable/recovery/default_recovery_keys.c 파일을 열어 줍니다.


2. 열어 보시면 아래와 비슷한 내용이 있습니다. 여기서 대충 딱 보시고! 아 이거군아! 하시면 초급자 딱지는 땟다고 봐도 된다고 합니다! 오오 (불행중 다행)


아래 내용은 Git Hub 에서 가져온 가장 기본 상태의 파일 내용 입니다.

#include <linux/input.h>


#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_HOME:
                return HIGHLIGHT_UP;

            case KEY_POWER:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
                break;
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
                return SELECT_ITEM;
            
            case KEY_END:
            case KEY_BACKSPACE:
            case KEY_SEARCH:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


딱 보시고 아실 분은 다 아실듯 합니다! 우둔한 저도 알아 차렸으니;


아래 부분을 보아 봅시다.

            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN;


위와 같은 내용 입니다.


위 내용은 다음과 같은 뜻을 가지고 있습니다.


CapsLock 버튼, Down 버튼, 볼륨 다운버튼, 메뉴 버튼 으로 아래쪽 항목을 선택 할수 있습니다.


그럼 아래 와 같이 수정을 하면, 검색키를 통해 아래쪽 항목을 선택 가능 합니다.

※단 검색키 이용은 약간의 수정이 필요 합니다


            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:

            case KEY_SEARCH:

                return HIGHLIGHT_DOWN;


위와 같이 "case KEY_XXX"를 추가하면, 됩니다.



#include <linux/input.h>


#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_MENU:
                return HIGHLIGHT_DOWN; / 항목 아래로 이동

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_HOME:
                return HIGHLIGHT_UP; / 항목 위로 이동

            case KEY_POWER:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
                break; / 이놈 때문에 파워버튼이 정상동작을...지우고 수정해야 할듯 합니다. 뭐하는 놈인지 모르겠어요,...ㅠㅠ
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
                return SELECT_ITEM; / 항목을 선택
            
            case KEY_END:
            case KEY_BACKSPACE:
            case KEY_SEARCH:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK; / 뒤로 가기
                }
        }
    }

    return NO_ACTION;
}


입니다.


제가 약간 응용한 부분을 보겠습니다.

Q2에 적용된 파일이며, Q2는 하단 하드웨어 키가


옆의 사진과 같습니다.

그래서 저는 전원키 대신


메뉴 - 위로 이동 (방향키 및 볼륨키 대응)

홈 - 아래로 이동 (방향키 및 볼륨키 대응)

뒤로 - 뒤로 (백스페이스 키 대응)

검색 - 선택 (엔터키 및 전원키 대응)




그래서 아래와 같이 수정해 보았습니다.


#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_HOME:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_MENU:
                return HIGHLIGHT_UP;

//            case KEY_POWER:
//                if (ui_get_showing_back_button()) {
//                    return SELECT_ITEM;
//                }
//                if (!get_allow_toggle_display() && !ui_root_menu) {
//                    return GO_BACK;
//                }
//                break;
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
            case KEY_SEARCH:
            case KEY_POWER:
                return SELECT_ITEM;
           
            case KEY_END:
            case KEY_BACKSPACE:
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


// 파란색은 주석 처리를 한것 입니다.


즉 저 문장들은 실제로는 없는것과 같이 처리 된다는 것 입니다.


해석을...


#include <linux/input.h>

#include "recovery_ui.h"
#include "common.h"
#include "extendedcommands.h"


int device_toggle_display(volatile char* key_pressed, int key_code) {
    int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT];
    if (alt && key_code == KEY_L)
        return 1;
    // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off
    if (ui_get_showing_back_button()) {
        return 0;
        //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END);
    }
    return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END);
}

int device_handle_key(int key_code, int visible) {
    if (visible) {
        switch (key_code) {
            case KEY_CAPSLOCK:
            case KEY_DOWN:
            case KEY_VOLUMEDOWN:
            case KEY_HOME:
                return HIGHLIGHT_DOWN;

            case KEY_LEFTSHIFT:
            case KEY_UP:
            case KEY_VOLUMEUP:
            case KEY_MENU:
                return HIGHLIGHT_UP;

//            case KEY_POWER:
//                if (ui_get_showing_back_button()) {

//                    return SELECT_ITEM;

//                }

//                if (!get_allow_toggle_display() && !ui_root_menu) {

//                    return GO_BACK;

//                }

//                break;

// 일딴 이놈때문에 전원키가 동작을 안하니 삭제를...
            case KEY_LEFTBRACE:
            case KEY_ENTER:
            case BTN_MOUSE:
            case KEY_CAMERA:
            case KEY_F21:
            case KEY_SEND:
            case KEY_SEARCH:
            case KEY_POWER:

// 전원키와 검색키를 선택 항목에 넣습니다
                return SELECT_ITEM;
           
            case KEY_END:
            case KEY_BACKSPACE:

// 이 부분에 검색 값이있었지만, 위쪽으로 이동을 했습니다
                if (ui_get_showing_back_button()) {
                    return SELECT_ITEM;
                }
                if (!get_allow_toggle_display() && !ui_root_menu) {
                    return GO_BACK;
                }
            case KEY_BACK:
                if (!ui_root_menu) {
                    return GO_BACK;
                }
        }
    }

    return NO_ACTION;
}


이제 그리고 빌드를 하시면 됩니다!


다음번에는 메인 화면 수정 및 리커버리 정보 수정을 한번 흐흐

+ Recent posts