feat: 설정 화면, 키 프리뷰, 상용구, 스킨 시스템 등 다수 기능 추가#12
Conversation
- 설정 화면(SettingsActivity) 추가: 한글 입력 모드, 키패드 높이, 한손 모드 설정 - 모아키 레이아웃(open_moa_view_moakey) 추가 및 OpenMoaView에서 모드 전환 지원 - LanguageKey 길게 누르면 설정 화면 열기(OPEN_SETTINGS 특수키 추가) - HangulInputMode, KeypadHeight, OneHandMode config 클래스 추가 - SettingsPreferences로 SharedPreferences 접근 일원화
- 자음 키 터치 시 키 위쪽에 반투명 팝업으로 입력될 글자 표시 - 드래그 중 조합 글자 실시간 업데이트 (예: ㅇ → 오른쪽 스와이프 → 아) - PopupWindow 사용으로 SYSTEM_ALERT_WINDOW 권한 불필요 - 설정 화면에서 키 미리보기 ON/OFF 토글 지원
- 자음 키 오른쪽 위에 상용구 첫 글자 뱃지 표시 - 탭: 상용구 전체 텍스트 입력 - 드래그: 기존 자음+모음 제스처 동작 유지 - 롱키: 팝업 메뉴 표시 (상용구 내용 / 수정 / 취소, 스와이프 선택) - 상용구 내용 선택 시 텍스트 입력 - 수정 선택 시 QuickPhraseEditActivity 팝업 실행 - 상용구 키 터치 시 키 프리뷰 미표시 - QuickPhraseEditActivity: 스피너로 키 선택, EditText로 내용 편집 - SettingsActivity에 상용구 섹션 추가 - longPressThresholdTime은 Config 공통 설정값 사용
- JaumKeyTouchListener에 numberChar 파라미터 추가 - 롱프레스 시 프리뷰 팝업 자음→숫자로 전환, 손가락 뗄 때 숫자 전송 - 롱프레스 진입 후 드래그는 무시하고 숫자 입력 유지 (B안) - 양손모드/모아키 모드 두 레이아웃에 1~0 숫자 뱃지 표시
- key_preview_popup.xml: 52dp→78dp, 32sp→48sp, 8dp→12dp (1.5배) - SimpleKeyTouchListener: previewController 파라미터 추가, 문자 키 DOWN/UP/CANCEL 처리 - CrossKeyTouchListener: List<StringKeyMessage> 타입 강제, resolveKey() 추출, MOVE에서 방향별 실시간 업데이트 - FunctionalKeyTouchListener: previewController 추가, view.text로 프리뷰 표시, named param 명시 - OpenMoaView: 특수키 제외 모든 문자 키에 previewController 전달 - QuertyView: KoinComponent 추가, lazy previewController, 문자/숫자 키 프리뷰 적용 - PunctuationView: 동일 패턴으로 기호 키 프리뷰 적용
- SpaceLongPressAction enum 추가 (IME 선택 팝업/언어 전환/없음) - SpaceKeyTouchListener 추가: 롱키 감지, 발동 시 공백 입력 억제 및 배경 수동 복원 - SpecialKey.SHOW_IME_PICKER 추가 및 OpenMoaIME에서 InputMethodManager.showInputMethodPicker() 호출 - 자동 마침표: 1초 이내 스페이스 두 번 입력 시 ". " 로 대체 (기본 Off) - 7개 키보드 뷰(OpenMoaView x2, QuertyView, ArrowView, NumberView, PhoneView, PunctuationView) 스페이스 리스너 교체 - 설정 화면에 스페이스 롱키 기능(라디오), 자동 마침표 입력(스위치) 항목 추가
- KeyboardSkin enum 추가 (화이트/다크그레이/블랙/블루/그린, 기본값: 다크그레이) - SkinApplier: 키 배경, 텍스트색, 프리뷰 배경, 키보드 배경색 생성 유틸 - 설정 화면에 키보드 스킨 선택 항목 추가 - 설정 변경 후 키보드로 돌아올 때 스킨 즉시 재적용 (onStartInputView 감지) - 키 프리뷰 팝업 색상을 스킨에 맞게 적용 - 한손 입력 모드 빈 영역 및 네비게이션 바 배경색을 스킨 색상으로 설정 - 네비게이션 바 아이콘 색상을 스킨 밝기에 따라 자동 조정 - 키 탭 시 배경색이 흰색으로 변경되는 버그 수정 (BaseKeyTouchListener)
- Config를 data class에서 class로 변경하여 longPressThresholdTime, keyPreviewEnabled를 getter로 전환, 설정 변경 시 앱 재시작 없이 즉시 반영 - configModule을 Config(androidContext()) 형태로 단순화 - 한손모드 활성 시 이모티콘 키 크기를 20sp → 16sp(80%)로 축소
- PhraseKey 인터페이스 도입으로 QuickPhraseKey, QwertyLongKey 공통화 - QuickPhraseEditActivity + QwertyLongKeyEditActivity → PhraseEditActivity 하나로 통합 - 영문 롱키 팝업에 Spinner 추가하여 한글 팝업과 동일한 UX 제공 - 버튼 명칭 변경: OK → 저장, Cancel → 취소 - 버튼 순서 변경: [기본값] 왼쪽 고정, [취소][저장] 오른쪽 정렬 - 버튼 minWidth="0dp" 적용으로 Cancel 줄바꿈 현상 해결 - KeypadHeight 명칭 변경: 낮게 → 보통(기본)
- 팝업 인스턴스 공유 버그 수정: 키마다 QuickPhraseMenuPopup 개별 생성 - onWindowFocusChanged에서 keyHint 갱신하여 stale 표시 문제 해결 - PhraseKey 인터페이스에 name 추가로 unsafe cast 제거 - SettingsActivity commit() → apply() 변경 (메인 스레드 블로킹 방지) - 상용구 수정 팝업 타이틀 한글/영문 통일
- QuertyView에 configurableLongKeyListeners 수집, onDetachedFromWindow/onWindowFocusChanged(false)에서 cancel() 호출 - importSettings에서 json.get() 런타임 타입 추측 제거 -> 알려진 Boolean/String 키를 optBoolean/optString으로 명시 처리
- UserCharKey enum 추가: ~ ^ ; * ! ? . 7개 키 (PhraseKey 구현) - UserCharKeyTouchListener 추가: 탭→문자 입력, 롱탭→수정화면 바로 오픈 - PhraseEditActivity에 TYPE_USER_CHAR 추가, 첫 코드포인트만 저장 - OpenMoaView: 투핸드 4개(~^;*), 모아키 7개 전체 터치 리스너 교체 - 키보드 표시 시 onStartInputView에서 사용자 문자 라벨 갱신 - SettingsPreferences.ALL_KEYS에 UserCharKey prefKey 포함 (export/import 반영)
- 영문 자동 대문자 on/off 설정 추가 - 스페이스/엔터 길게 누름 기능 설정 추가 (방향키, 키보드 선택, 언어 전환, 없음) - 한글/영문 단축키 명칭 정리 (상용구 → 단축키) - 설정 메뉴 순서 정리 및 롱키 → 길게 누름 용어 통일 - importSettings 타입 안전성 개선 (optString null 전달 제거)
- 기호/방향키/숫자/전화/이모지 키보드의 엔터키를 SimpleKeyTouchListener에서 EnterKeyTouchListener로 교체하여 롱키 동작 활성화 - 영문/기호/방향키/숫자 키보드의 한/영 키를 LanguageKeyTouchListener로 교체하여 롱프레스(300ms) 시 설정 화면 열기 기능 추가 - LanguageKeyTouchListener에 cancel() 메서드 추가 (Timer 누수 방지) - 각 뷰의 onDetachedFromWindow()에서 enterKeyListener/languageKeyListener cancel 처리 - 기호/영문/방향키/숫자 키보드 한/영 키 레이아웃을 LinearLayout으로 변경하여 한글 키보드와 동일하게 '설정' 힌트 텍스트 표시
|
아이구 PR 올리신 걸 이제 봤네요... 간단히 써 보니 기능을 정말 많이 추가해주셨네요! |
|
@AiOO 안녕하세요. PR 답변이 없으셔서 이미 다른 방향으로 개발한 저장소가 따로 있습니다. https://github.com/verlane/moakey-vim 이 저장소인데 제가 생각한 기능은 대부분 다 구현했고 저에게 필요한 하드웨어 키보드 vim 특수 기능을 넣었는데 혹시 동작 확인해 보시고 괜찮으면 전체 기능 PR 만들어서 OpenMoa에 올릴까하는데 어떠세요? |
@verlane 안녕하세요, 늦게 메시지 드렸는데도 답변 주셔서 감사합니다. 조금 고민해봤는데 이 PR에서 올려주신 기능들처럼 코어한 기능들은 OpenMoa에 포함시킬 수 있으면 정말 좋을 것 같습니다. 그 외에 하드웨어 키보드, vim 특수 기능과 같이 추가적인 편의 기능들은 (저도 Vim을 써서 많이 유용할 것 같습니다만 😓) 이 저장소에서 어떻게 다룰지부터 먼저 결정을 해야 할 것 같습니다. OpenMoa 저장소는 코어한 기능만 있도록 유지하는 것이 장점이 될 수 있을 것 같아서요. 그래서 코어한 기능들 같은 경우는 PR 올려주시면 최소한으로 검토 후 머지 진행될 수 있도록 하겠습니다. 편의 기능을 어떻게 다룰지는 결정하는대로 이 PR에 추가 코멘트를 달아 전달드리도록 하겠습니다. 혹시 다른 의견이 있으시다면 언제든지 말씀 주시면 감사하겠습니다. |
|
@AiOO 답변 감사합니다. 말씀하신 대로 OpenMoa 코어에 맞춰 독립적으로 머지하기 쉬운 작은 단위부터 PR 올려보겠습니다. 😊 |
Summary
Test plan