allow CheckKey to request mounting /system
Also provide a default implementation of CheckKey that's reasonable for many devices (those that have power and volume keys). Change-Id: Icf6c7746ebd866152d402059dbd27fd16bd51ff8
This commit is contained in:
parent
e428f62465
commit
9e805d6ca0
3 changed files with 52 additions and 3 deletions
|
@ -82,6 +82,7 @@ include $(CLEAR_VARS)
|
|||
LOCAL_MODULE := verifier_test
|
||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||
LOCAL_MODULE_TAGS := tests
|
||||
LOCAL_CFLAGS += -DNO_RECOVERY_MOUNT
|
||||
LOCAL_SRC_FILES := \
|
||||
verifier_test.cpp \
|
||||
verifier.cpp \
|
||||
|
|
48
ui.cpp
48
ui.cpp
|
@ -31,6 +31,7 @@
|
|||
#include <cutils/android_reboot.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "roots.h"
|
||||
#include "device.h"
|
||||
#include "minui/minui.h"
|
||||
#include "screen_ui.h"
|
||||
|
@ -47,7 +48,10 @@ RecoveryUI::RecoveryUI() :
|
|||
key_queue_len(0),
|
||||
key_last_down(-1),
|
||||
key_long_press(false),
|
||||
key_down_count(0) {
|
||||
key_down_count(0),
|
||||
consecutive_power_keys(0),
|
||||
consecutive_alternate_keys(0),
|
||||
last_key(-1) {
|
||||
pthread_mutex_init(&key_queue_mutex, NULL);
|
||||
pthread_cond_init(&key_queue_cond, NULL);
|
||||
self = this;
|
||||
|
@ -152,6 +156,13 @@ void RecoveryUI::process_key(int key_code, int updown) {
|
|||
case RecoveryUI::ENQUEUE:
|
||||
EnqueueKey(key_code);
|
||||
break;
|
||||
|
||||
case RecoveryUI::MOUNT_SYSTEM:
|
||||
#ifndef NO_RECOVERY_MOUNT
|
||||
ensure_path_mounted("/system");
|
||||
Print("Mounted /system.");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -258,8 +269,41 @@ void RecoveryUI::FlushKeys() {
|
|||
pthread_mutex_unlock(&key_queue_mutex);
|
||||
}
|
||||
|
||||
// The default CheckKey implementation assumes the device has power,
|
||||
// volume up, and volume down keys.
|
||||
//
|
||||
// - Hold power and press vol-up to toggle display.
|
||||
// - Press power seven times in a row to reboot.
|
||||
// - Alternate vol-up and vol-down seven times to mount /system.
|
||||
RecoveryUI::KeyAction RecoveryUI::CheckKey(int key) {
|
||||
return RecoveryUI::ENQUEUE;
|
||||
if (IsKeyPressed(KEY_POWER) && key == KEY_VOLUMEUP) {
|
||||
return TOGGLE;
|
||||
}
|
||||
|
||||
if (key == KEY_POWER) {
|
||||
++consecutive_power_keys;
|
||||
if (consecutive_power_keys >= 7) {
|
||||
return REBOOT;
|
||||
}
|
||||
} else {
|
||||
consecutive_power_keys = 0;
|
||||
}
|
||||
|
||||
if ((key == KEY_VOLUMEUP &&
|
||||
(last_key == KEY_VOLUMEDOWN || last_key == -1)) ||
|
||||
(key == KEY_VOLUMEDOWN &&
|
||||
(last_key == KEY_VOLUMEUP || last_key == -1))) {
|
||||
++consecutive_alternate_keys;
|
||||
if (consecutive_alternate_keys >= 7) {
|
||||
consecutive_alternate_keys = 0;
|
||||
return MOUNT_SYSTEM;
|
||||
}
|
||||
} else {
|
||||
consecutive_alternate_keys = 0;
|
||||
}
|
||||
last_key = key;
|
||||
|
||||
return ENQUEUE;
|
||||
}
|
||||
|
||||
void RecoveryUI::NextCheckKeyIsLong(bool is_long_press) {
|
||||
|
|
6
ui.h
6
ui.h
|
@ -77,7 +77,7 @@ class RecoveryUI {
|
|||
// Return value indicates whether an immediate operation should be
|
||||
// triggered (toggling the display, rebooting the device), or if
|
||||
// the key should be enqueued for use by the main thread.
|
||||
enum KeyAction { ENQUEUE, TOGGLE, REBOOT, IGNORE };
|
||||
enum KeyAction { ENQUEUE, TOGGLE, REBOOT, IGNORE, MOUNT_SYSTEM };
|
||||
virtual KeyAction CheckKey(int key);
|
||||
|
||||
// Called immediately before each call to CheckKey(), tell you if
|
||||
|
@ -121,6 +121,10 @@ private:
|
|||
int key_down_count; // under key_queue_mutex
|
||||
int rel_sum;
|
||||
|
||||
int consecutive_power_keys;
|
||||
int consecutive_alternate_keys;
|
||||
int last_key;
|
||||
|
||||
typedef struct {
|
||||
RecoveryUI* ui;
|
||||
int key_code;
|
||||
|
|
Loading…
Reference in a new issue