#include #include #include #include "common/libs/fs/shared_buf.h" #include "common/libs/fs/shared_fd.h" #include "host/libs/config/cuttlefish_config.h" // Messages are always 128 bytes. #define MESSAGE_SIZE 128 using cuttlefish::SharedFD; int main(int argc, char** argv) { if (argc <= 1) { return 1; } // Connect to WebRTC int fd = std::atoi(argv[1]); LOG(INFO) << "Connecting to WebRTC server..."; SharedFD webrtc_socket = SharedFD::Dup(fd); close(fd); if (webrtc_socket->IsOpen()) { LOG(INFO) << "Connected"; } else { LOG(ERROR) << "Could not connect, exiting..."; return 1; } // Track state for our two commands. bool statusbar_expanded = false; bool dnd_on = false; char buf[MESSAGE_SIZE]; while (1) { // Read the command message from the socket. if (!webrtc_socket->IsOpen()) { LOG(WARNING) << "WebRTC was closed."; break; } if (cuttlefish::ReadExact(webrtc_socket, buf, MESSAGE_SIZE) != MESSAGE_SIZE) { LOG(WARNING) << "Failed to read the correct number of bytes."; break; } auto split = android::base::Split(buf, ":"); std::string command = split[0]; std::string state = split[1]; // Ignore button-release events, when state != down. if (state != "down") { continue; } // Demonstrate two commands. For demonstration purposes these two // commands use adb shell, but commands can execute any action you choose. std::string adb_shell_command = cuttlefish::HostBinaryPath("adb"); if (command == "settings") { adb_shell_command += " shell cmd statusbar "; adb_shell_command += statusbar_expanded ? "collapse" : "expand-settings"; statusbar_expanded = !statusbar_expanded; } else if (command == "alert") { adb_shell_command += " shell cmd notification set_dnd "; adb_shell_command += dnd_on ? "off" : "on"; dnd_on = !dnd_on; } else { LOG(WARNING) << "Unexpected command: " << buf; } if (!adb_shell_command.empty()) { if (system(adb_shell_command.c_str()) != 0) { LOG(ERROR) << "Failed to run command: " << adb_shell_command; } } } }