// Process a key-up or -down event. A key is "registered" when it is // pressed and then released, with no other keypresses or releases in // between. Registered keys are passed to CheckKey() to see if it // should trigger a visibility toggle, an immediate reboot, or be // queued to be processed next time the foreground thread wants a key // (eg, for the menu). // // We also keep track of which keys are currently down so that // CheckKey can call IsKeyPressed to see what other keys are held when // a key is registered. // // updown == 1 for key down events; 0 for key up events void RecoveryUI::process_key(int key_code, int updown) { bool register_key = false; bool long_press = false; bool reboot_enabled; pthread_mutex_lock(&key_queue_mutex); key_pressed[key_code] = updown; if (updown) { ++key_down_count; key_last_down = key_code; key_long_press = false; pthread_t th; key_timer_t* info = new key_timer_t; info->ui = this; info->key_code = key_code; info->count = key_down_count; pthread_create(&th, NULL, &RecoveryUI::time_key_helper, info); pthread_detach(th); } else { if (key_last_down == key_code) { long_press = key_long_press; register_key = true; } key_last_down = -1; } reboot_enabled = enable_reboot; pthread_mutex_unlock(&key_queue_mutex); if (register_key) { NextCheckKeyIsLong(long_press); switch (CheckKey(key_code)) { case RecoveryUI::IGNORE: break; case RecoveryUI::TOGGLE: ShowText(!IsTextVisible()); break; case RecoveryUI::REBOOT: #ifdef ANDROID_RB_RESTART if (reboot_enabled) { android_reboot(ANDROID_RB_RESTART, 0, 0); } #endif break; case RecoveryUI::ENQUEUE: EnqueueKey(key_code); break; case RecoveryUI::MOUNT_SYSTEM: #ifndef NO_RECOVERY_MOUNT ensure_path_mounted("/system"); Print("Mounted /system."); #endif break; } } }
// Process a key-up or -down event. A key is "registered" when it is // pressed and then released, with no other keypresses or releases in // between. Registered keys are passed to CheckKey() to see if it // should trigger a visibility toggle, an immediate reboot, or be // queued to be processed next time the foreground thread wants a key // (eg, for the menu). // // We also keep track of which keys are currently down so that // CheckKey can call IsKeyPressed to see what other keys are held when // a key is registered. // // updown == 1 for key down events; 0 for key up events void RecoveryUI::process_key(int key_code, int updown) { bool register_key = false; bool long_press = false; pthread_mutex_lock(&key_queue_mutex); key_pressed[key_code] = updown; if (updown) { ++key_down_count; key_last_down = key_code; key_long_press = false; pthread_t th; key_timer_t* info = new key_timer_t; info->ui = this; info->key_code = key_code; info->count = key_down_count; pthread_create(&th, NULL, &RecoveryUI::time_key_helper, info); pthread_detach(th); } else { if (key_last_down == key_code) { long_press = key_long_press; register_key = true; } key_last_down = -1; } pthread_mutex_unlock(&key_queue_mutex); if (register_key) { NextCheckKeyIsLong(long_press); switch (CheckKey(key_code)) { case RecoveryUI::IGNORE: break; case RecoveryUI::TOGGLE: ShowText(!IsTextVisible()); break; case RecoveryUI::REBOOT: android_reboot(ANDROID_RB_RESTART, 0, 0); break; case RecoveryUI::ENQUEUE: EnqueueKey(key_code); break; } } }
// Process a key-up or -down event. A key is "registered" when it is // pressed and then released, with no other keypresses or releases in // between. Registered keys are passed to CheckKey() to see if it // should trigger a visibility toggle, an immediate reboot, or be // queued to be processed next time the foreground thread wants a key // (eg, for the menu). // // We also keep track of which keys are currently down so that // CheckKey can call IsKeyPressed to see what other keys are held when // a key is registered. // // updown == 1 for key down events; 0 for key up events void RecoveryUI::process_key(int key_code, int updown) { bool register_key = false; pthread_mutex_lock(&key_queue_mutex); key_pressed[key_code] = updown; if (updown) { key_last_down = key_code; } else { if (key_last_down == key_code) register_key = true; key_last_down = -1; } pthread_mutex_unlock(&key_queue_mutex); if (register_key) { switch (CheckKey(key_code)) { case RecoveryUI::IGNORE: break; case RecoveryUI::TOGGLE: ShowText(!IsTextVisible()); break; case RecoveryUI::REBOOT: android_reboot(ANDROID_RB_RESTART, 0, 0); break; case RecoveryUI::ENQUEUE: pthread_mutex_lock(&key_queue_mutex); const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]); if (key_queue_len < queue_max) { key_queue[key_queue_len++] = key_code; pthread_cond_signal(&key_queue_cond); } pthread_mutex_unlock(&key_queue_mutex); break; } } }