1;;;; Copyright 2007 The Android Open Source Project
2
3;;; Set up GUD+JDB to attach to a Java process running on the phone or
4;;; under the emulator.
5
6(defvar android-jdb-port-history '("8700")
7 "history of ports supplied to `android-jdb'")
8
9(defvar android-jdb-project-root-history '()
10 "history of project roots supplied to `android-jdb'")
11(defvar android-jdb-history nil
12 "history of commands supplied to `android-jdb'")
13
14(defvar android-jdb-activity-class-history ()
15 "history of activity classes supplied to `start-android-activity'")
16
17(defcustom  android-jdb-command-name "jdb"
18  "Name of Java debugger."
19  :type 'string
20  :group 'android)
21
22(defgroup android nil
23  "Android Applications."
24  :group 'applications)
25
26(defcustom android-project-root nil
27 "This is where your Android project root is stored."
28  :type 'directory
29 :group 'android )
30
31(defcustom android-apk nil
32 "This is where your Android Application Package is stored."
33 :type 'string
34 :group 'android)
35
36(defcustom android-activity-class nil
37 "This is where your Android Activity class is stored."
38 :type 'string
39 :group 'android)
40
41(defun android-read-project-root ()
42 (if (or (string-match "XEmacs" emacs-version)
43         (>= emacs-major-version 22))
44     (read-file-name "Android project root: "
45                     android-project-root
46                     nil
47                     t
48                     nil
49                     'file-directory-p)
50   (labels ((read-directory ()
51                            (read-file-name "Android project root: "
52                                            android-project-root
53                                            nil
54                                            t
55                                            nil)))
56     (do ((entered-root (read-directory) (read-directory)))
57         ((and entered-root
58               (file-directory-p entered-root))
59          (expand-file-name entered-root))))))
60
61(defun android-jdb (port root)
62 "Set GUD+JDB up to run against Android on PORT in directory ROOT."
63 (interactive
64  (list
65   (read-from-minibuffer "Activity's JDWP DDMS port: "
66                     (car android-jdb-port-history)
67                     nil
68                     t
69                     'android-jdb-port-history)
70                    (android-read-project-root)))
71 (setq android-project-root root)
72 (let ((jdb-command
73        (format "%s -attach localhost:%s -sourcepath%s"
74                android-jdb-command-name
75                port
76                (format "%s/src" root))))
77   (if (not (string= jdb-command (car android-jdb-history)))
78       (push jdb-command android-jdb-history))
79   (jdb jdb-command)))
80
81(defun android-emulate ()
82 "Run the Android emulator. This expects the SDK tools directory to be in the current path."
83 (interactive)
84 (compile "emulator"))
85
86(defun android-install-app (apk)
87  "Install an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path."
88  (interactive (list (expand-file-name
89                      (read-file-name "Android Application Package (.apk): "
90                                      nil
91                                      android-apk
92                                      t
93                                      nil
94                                      nil))))
95  (setq android-apk apk)
96  (compile (format "adb install -r %s" apk)))
97
98(defun android-uninstall-app (package-name)
99  "Uninstall an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path.
100Specify the package name --- and not the name of the application e.g., com.android.foo."
101  (interactive
102   (list
103    (read-from-minibuffer "Package: ")))
104  (compile (format "adb uninstall %s" package-name)))
105
106(defun android-start-activity (package class)
107 "Start the activity PACKAGE/CLASS in the Android emulator. This expects the SDK tools directory to be in the current path."
108 (interactive
109  (list
110   (read-from-minibuffer "Package: ")
111   (read-from-minibuffer "Activity Java class: "
112         (car android-jdb-activity-class-history)
113         nil
114         t
115         'android-jdb-activity-class-history)))
116 (compile (format "adb shell am start -n %s/%s" package class)))
117
118(defun android-debug-activity (package class)
119 "Start the activity PACKAGE/CLASS within the debugger in the Android emulator. This expects the SDK tools directory to be in the current path."
120 (interactive
121  (list
122   (read-from-minibuffer "Package: ")
123   (read-from-minibuffer "Activity Java class: "
124         (car android-jdb-activity-class-history)
125         nil
126         t
127         'android-jdb-activity-class-history)))
128 (compile (format "adb shell am start -D -n %s/%s" package class)))
129
130(provide 'android)
131
132