;;; android-host.el --- Module to use host binaries from an Android dev tree. ;; ;; Copyright (C) 2009 The Android Open Source Project ;; ;; Licensed under the Apache License, Version 2.0 (the "License"); ;; you may not use this file except in compliance with the License. ;; You may obtain a copy of the License at ;; ;; http://www.apache.org/licenses/LICENSE-2.0 ;; ;; Unless required by applicable law or agreed to in writing, software ;; distributed under the License is distributed on an "AS IS" BASIS, ;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;; See the License for the specific language governing permissions and ;; limitations under the License. ;;; Commentary: ;; ;; This module defines interactive functions to send the most common ;; commands to a device. ;; ;; Currently only one device is supported. ;; ;; In your .emacs load this file (e.g (require 'android-host)) then ;; you can either create new shortcuts e.g: ;; ;; (global-set-key [f8] 'android-adb-sync) ;; ;; or rely on autocompletion M-x and-sync will expand to ;; M-x android-adb-sync ;; ;; By default the following key bindings are active: ;; C-x a a android-adb-root ;; C-x a r android-adb-remount ;; C-x a s android-adb-sync ;; C-x a b android-adb-shell-reboot-bootloader ;; C-x a f android-fastboot-flashall ;; ;; android-fastboot-flashall is still work in progress, check the ;; associated buffer (*Android Output*) for errors when you use it. ;;; Code: (require 'android-common) (defvar android-host-command-map (make-sparse-keymap)) (defun android-host-key-prefix-set (var val) "Bind the keys shortcuts to the functions.i" ;; TODO: This should go in a minor mode keymap instead of ;; messing with the global one. (define-key global-map (read-kbd-macro val) android-host-command-map) (custom-set-default var val)) (let ((map android-host-command-map)) (define-key map (kbd "a") 'android-adb-root) (define-key map (kbd "r") 'android-adb-remount) (define-key map (kbd "s") 'android-adb-sync) (define-key map (kbd "p") 'android-adb-push-module-at-point) (define-key map (kbd "b") 'android-adb-shell-reboot-bootloader) (define-key map (kbd "f") 'android-fastboot-flashall)) (defcustom android-host-key-prefix "C-x a" "Prefix keystrokes for Android commands." :group 'android :type 'string :set 'android-host-key-prefix-set) (defun android-adb-remount () "Execute 'adb remount'." (interactive) (android-adb-command "remount")) (defun android-adb-root () "Execute 'adb root'." (interactive) (android-adb-command "root")) (defun android-adb-reboot () "Execute 'adb reboot'." (interactive) (android-adb-command "reboot")) (defun android-adb-shell-reboot-bootloader () "Execute 'adb shell reboot bootloader'." (interactive) (android-adb-shell-command "reboot bootloader")) (defun android-adb-sync () "Execute 'adb sync'." (interactive) ;; Always force root and remount, this way sync always works even on ;; a device that has just rebooted or that runs a userdebug build. (android-adb-root) (android-adb-remount) (android-adb-command "sync" 'p)) (defun android-adb-push-module (source target) "Push specified module into target path." (interactive "fSource: \nsTarget: ") (android-adb-root) (android-adb-remount) (android-adb-command (concat "push " source " " target) 'p)) (defun android-adb-push-module-at-point () "Push module path at cursor point an push to the target path." (interactive) (let* ( (sourcepath (concat (android-find-build-tree-root) (thing-at-point 'filename))) (targetpath (substring sourcepath (string-match "\/system" sourcepath) nil))) (android-adb-push-module sourcepath targetpath))) (defun android-fastboot-sentinel (process event) "Called when the fastboot process is done." ;; TODO: Should barf if the last lines are not: ;; OKAY ;; rebooting... (princ (format "Process: %s had the event `%s'" process event))) (defun android-fastboot-flashall (arg) "Execute 'fastboot -p flashall'. With no ARG, don't wipe the user data. With ARG, wipe the user data." (interactive "P") (when (get-buffer android-output-buffer-name) (with-current-buffer android-output-buffer-name (erase-buffer))) (let ((proc (if arg (start-process-shell-command "fastboot" android-output-buffer-name (concat (android-fastboot) " flashall -w")) (start-process-shell-command "fastboot" android-output-buffer-name (concat (android-fastboot) " flashall"))))) (set-process-sentinel proc 'android-fastboot-sentinel))) (provide 'android-host) ;;; android-host.el ends here