1/*
2 * Copyright 2009, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.commands.monkey;
17
18import android.hardware.display.DisplayManagerGlobal;
19import android.os.Build;
20import android.os.SystemClock;
21import android.view.Display;
22import android.util.DisplayMetrics;
23
24import com.android.commands.monkey.MonkeySourceNetwork.CommandQueue;
25import com.android.commands.monkey.MonkeySourceNetwork.MonkeyCommand;
26import com.android.commands.monkey.MonkeySourceNetwork.MonkeyCommandReturn;
27
28import java.lang.Integer;
29import java.lang.Float;
30import java.lang.Long;
31import java.util.List;
32import java.util.Map;
33import java.util.Set;
34import java.util.TreeMap;
35
36public class MonkeySourceNetworkVars {
37    /**
38     * Interface to get the value of a var.
39     */
40    private static interface VarGetter {
41        /**
42         * Get the value of the var.
43         * @returns the value of the var.
44         */
45        public String get();
46    }
47
48    private static class StaticVarGetter implements VarGetter {
49        private final String value;
50
51        public StaticVarGetter(String value) {
52            this.value = value;
53        }
54
55        public String get() {
56            return value;
57        }
58    }
59
60    // Use a TreeMap to keep the keys sorted so they get displayed nicely in listvar
61    private static final Map<String, VarGetter> VAR_MAP = new TreeMap<String, VarGetter>();
62
63    static {
64        VAR_MAP.put("build.board", new StaticVarGetter(Build.BOARD));
65        VAR_MAP.put("build.brand", new StaticVarGetter(Build.BRAND));
66        VAR_MAP.put("build.device", new StaticVarGetter(Build.DEVICE));
67        VAR_MAP.put("build.display", new StaticVarGetter(Build.DISPLAY));
68        VAR_MAP.put("build.fingerprint", new StaticVarGetter(Build.FINGERPRINT));
69        VAR_MAP.put("build.host", new StaticVarGetter(Build.HOST));
70        VAR_MAP.put("build.id", new StaticVarGetter(Build.ID));
71        VAR_MAP.put("build.model", new StaticVarGetter(Build.MODEL));
72        VAR_MAP.put("build.product", new StaticVarGetter(Build.PRODUCT));
73        VAR_MAP.put("build.tags", new StaticVarGetter(Build.TAGS));
74        VAR_MAP.put("build.brand", new StaticVarGetter(Long.toString(Build.TIME)));
75        VAR_MAP.put("build.type", new StaticVarGetter(Build.TYPE));
76        VAR_MAP.put("build.user", new StaticVarGetter(Build.USER));
77        VAR_MAP.put("build.cpu_abi", new StaticVarGetter(Build.CPU_ABI));
78        VAR_MAP.put("build.manufacturer", new StaticVarGetter(Build.MANUFACTURER));
79        VAR_MAP.put("build.version.incremental", new StaticVarGetter(Build.VERSION.INCREMENTAL));
80        VAR_MAP.put("build.version.release", new StaticVarGetter(Build.VERSION.RELEASE));
81        VAR_MAP.put("build.version.sdk", new StaticVarGetter(Integer.toString(Build.VERSION.SDK_INT)));
82        VAR_MAP.put("build.version.codename", new StaticVarGetter(Build.VERSION.CODENAME));
83
84        // Display
85        Display display = DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY);
86        VAR_MAP.put("display.width", new StaticVarGetter(Integer.toString(display.getWidth())));
87        VAR_MAP.put("display.height", new StaticVarGetter(Integer.toString(display.getHeight())));
88
89        DisplayMetrics dm = new DisplayMetrics();
90        display.getMetrics(dm);
91        VAR_MAP.put("display.density", new StaticVarGetter(Float.toString(dm.density)));
92
93        // am.  note that the current activity information isn't valid
94        // until the first activity gets launched after the monkey has
95        // been started.
96        VAR_MAP.put("am.current.package", new VarGetter() {
97                public String get() {
98                    return Monkey.currentPackage;
99                }
100            });
101        VAR_MAP.put("am.current.action", new VarGetter() {
102                public String get() {
103                    if (Monkey.currentIntent == null) {
104                        return null;
105                    }
106                    return Monkey.currentIntent.getAction();
107                }
108            });
109        VAR_MAP.put("am.current.comp.class", new VarGetter() {
110                public String get() {
111                    if (Monkey.currentIntent == null) {
112                        return null;
113                    }
114                    return Monkey.currentIntent.getComponent().getClassName();
115                }
116            });
117        VAR_MAP.put("am.current.comp.package", new VarGetter() {
118                public String get() {
119                    if (Monkey.currentIntent == null) {
120                        return null;
121                    }
122                    return Monkey.currentIntent.getComponent().getPackageName();
123                }
124            });
125        VAR_MAP.put("am.current.data", new VarGetter() {
126                public String get() {
127                    if (Monkey.currentIntent == null) {
128                        return null;
129                    }
130                    return Monkey.currentIntent.getDataString();
131                }
132            });
133        VAR_MAP.put("am.current.categories", new VarGetter() {
134                public String get() {
135                    if (Monkey.currentIntent == null) {
136                        return null;
137                    }
138                    StringBuffer sb = new StringBuffer();
139                    for (String cat : Monkey.currentIntent.getCategories()) {
140                        sb.append(cat).append(" ");
141                    }
142                    return sb.toString();
143                }
144            });
145
146        // clock
147        VAR_MAP.put("clock.realtime", new VarGetter() {
148                public String get() {
149                    return Long.toString(SystemClock.elapsedRealtime());
150                }
151            });
152        VAR_MAP.put("clock.uptime", new VarGetter() {
153                public String get() {
154                    return Long.toString(SystemClock.uptimeMillis());
155                }
156            });
157        VAR_MAP.put("clock.millis", new VarGetter() {
158                public String get() {
159                    return Long.toString(System.currentTimeMillis());
160                }
161            });
162        VAR_MAP.put("monkey.version", new VarGetter() {
163                public String get() {
164                    return Integer.toString(MonkeySourceNetwork.MONKEY_NETWORK_VERSION);
165                }
166            });
167    }
168
169    /**
170     * Command to list the "vars" that the monkey knows about.
171     */
172    public static class ListVarCommand implements MonkeySourceNetwork.MonkeyCommand {
173        // listvar
174        public MonkeyCommandReturn translateCommand(List<String> command,
175                                                    CommandQueue queue) {
176            Set<String> keys = VAR_MAP.keySet();
177            StringBuffer sb = new StringBuffer();
178            for (String key : keys) {
179                sb.append(key).append(" ");
180            }
181            return new MonkeyCommandReturn(true, sb.toString());
182        }
183    }
184
185    /**
186     * Command to get the value of a var.
187     */
188    public static class GetVarCommand implements MonkeyCommand {
189        // getvar varname
190        public MonkeyCommandReturn translateCommand(List<String> command,
191                                                    CommandQueue queue) {
192            if (command.size() == 2) {
193                VarGetter getter = VAR_MAP.get(command.get(1));
194                if (getter == null) {
195                    return new MonkeyCommandReturn(false, "unknown var");
196                }
197                return new MonkeyCommandReturn(true, getter.get());
198            }
199            return MonkeySourceNetwork.EARG;
200        }
201    }
202}
203