|  | ;;;; Copyright 2007 The Android Open Source Project | 
|  |  | 
|  | ;;; Set up GUD+JDB to attach to a Java process running on the phone or | 
|  | ;;; under the emulator. | 
|  |  | 
|  | (defvar android-jdb-port-history '("8700") | 
|  | "history of ports supplied to `android-jdb'") | 
|  |  | 
|  | (defvar android-jdb-project-root-history '() | 
|  | "history of project roots supplied to `android-jdb'") | 
|  | (defvar android-jdb-history nil | 
|  | "history of commands supplied to `android-jdb'") | 
|  |  | 
|  | (defvar android-jdb-activity-class-history () | 
|  | "history of activity classes supplied to `start-android-activity'") | 
|  |  | 
|  | (defcustom  android-jdb-command-name "jdb" | 
|  | "Name of Java debugger." | 
|  | :type 'string | 
|  | :group 'android) | 
|  |  | 
|  | (defgroup android nil | 
|  | "Android Applications." | 
|  | :group 'applications) | 
|  |  | 
|  | (defcustom android-project-root nil | 
|  | "This is where your Android project root is stored." | 
|  | :type 'directory | 
|  | :group 'android ) | 
|  |  | 
|  | (defcustom android-apk nil | 
|  | "This is where your Android Application Package is stored." | 
|  | :type 'string | 
|  | :group 'android) | 
|  |  | 
|  | (defcustom android-activity-class nil | 
|  | "This is where your Android Activity class is stored." | 
|  | :type 'string | 
|  | :group 'android) | 
|  |  | 
|  | (defun android-read-project-root () | 
|  | (if (or (string-match "XEmacs" emacs-version) | 
|  | (>= emacs-major-version 22)) | 
|  | (read-file-name "Android project root: " | 
|  | android-project-root | 
|  | nil | 
|  | t | 
|  | nil | 
|  | 'file-directory-p) | 
|  | (labels ((read-directory () | 
|  | (read-file-name "Android project root: " | 
|  | android-project-root | 
|  | nil | 
|  | t | 
|  | nil))) | 
|  | (do ((entered-root (read-directory) (read-directory))) | 
|  | ((and entered-root | 
|  | (file-directory-p entered-root)) | 
|  | (expand-file-name entered-root)))))) | 
|  |  | 
|  | (defun android-jdb (port root) | 
|  | "Set GUD+JDB up to run against Android on PORT in directory ROOT." | 
|  | (interactive | 
|  | (list | 
|  | (read-from-minibuffer "Activity's JDWP DDMS port: " | 
|  | (car android-jdb-port-history) | 
|  | nil | 
|  | t | 
|  | 'android-jdb-port-history) | 
|  | (android-read-project-root))) | 
|  | (setq android-project-root root) | 
|  | (let ((jdb-command | 
|  | (format "%s -attach localhost:%s -sourcepath%s" | 
|  | android-jdb-command-name | 
|  | port | 
|  | (format "%s/src" root)))) | 
|  | (if (not (string= jdb-command (car android-jdb-history))) | 
|  | (push jdb-command android-jdb-history)) | 
|  | (jdb jdb-command))) | 
|  |  | 
|  | (defun android-emulate () | 
|  | "Run the Android emulator. This expects the SDK tools directory to be in the current path." | 
|  | (interactive) | 
|  | (compile "emulator")) | 
|  |  | 
|  | (defun android-install-app (apk) | 
|  | "Install an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path." | 
|  | (interactive (list (expand-file-name | 
|  | (read-file-name "Android Application Package (.apk): " | 
|  | nil | 
|  | android-apk | 
|  | t | 
|  | nil | 
|  | nil)))) | 
|  | (setq android-apk apk) | 
|  | (compile (format "adb install -r %s" apk))) | 
|  |  | 
|  | (defun android-uninstall-app (package-name) | 
|  | "Uninstall an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path. | 
|  | Specify the package name --- and not the name of the application e.g., com.android.foo." | 
|  | (interactive | 
|  | (list | 
|  | (read-from-minibuffer "Package: "))) | 
|  | (compile (format "adb uninstall %s" package-name))) | 
|  |  | 
|  | (defun android-start-activity (package class) | 
|  | "Start the activity PACKAGE/CLASS in the Android emulator. This expects the SDK tools directory to be in the current path." | 
|  | (interactive | 
|  | (list | 
|  | (read-from-minibuffer "Package: ") | 
|  | (read-from-minibuffer "Activity Java class: " | 
|  | (car android-jdb-activity-class-history) | 
|  | nil | 
|  | t | 
|  | 'android-jdb-activity-class-history))) | 
|  | (compile (format "adb shell am start -n %s/%s" package class))) | 
|  |  | 
|  | (defun android-debug-activity (package class) | 
|  | "Start the activity PACKAGE/CLASS within the debugger in the Android emulator. This expects the SDK tools directory to be in the current path." | 
|  | (interactive | 
|  | (list | 
|  | (read-from-minibuffer "Package: ") | 
|  | (read-from-minibuffer "Activity Java class: " | 
|  | (car android-jdb-activity-class-history) | 
|  | nil | 
|  | t | 
|  | 'android-jdb-activity-class-history))) | 
|  | (compile (format "adb shell am start -D -n %s/%s" package class))) | 
|  |  | 
|  | (provide 'android) | 
|  |  |