Wm.java revision 672cf45de7aa5ad6fd1f75512ee5a451a16c0b39
1c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn/*
2c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn**
3c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** Copyright 2013, The Android Open Source Project
4c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn**
5c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** Licensed under the Apache License, Version 2.0 (the "License");
6c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** you may not use this file except in compliance with the License.
7c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** You may obtain a copy of the License at
8c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn**
9c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn**     http://www.apache.org/licenses/LICENSE-2.0
10c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn**
11c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** Unless required by applicable law or agreed to in writing, software
12c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** distributed under the License is distributed on an "AS IS" BASIS,
13c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** See the License for the specific language governing permissions and
15c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn** limitations under the License.
16c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn*/
17c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
18c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
19c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornpackage com.android.commands.wm;
20c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
21c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.content.Context;
22672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackbornimport android.graphics.Point;
23c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.graphics.Rect;
24c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.os.RemoteException;
25c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.os.ServiceManager;
26c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.util.AndroidException;
27c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.view.Display;
28c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.view.IWindowManager;
29c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
30c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport java.util.regex.Matcher;
31c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport java.util.regex.Pattern;
32c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
33c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornpublic class Wm {
34c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
35c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private IWindowManager mWm;
36c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private String[] mArgs;
37c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private int mNextArg;
38c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private String mCurArgData;
39c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
40c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    // These are magic strings understood by the Eclipse plugin.
41c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private static final String FATAL_ERROR_CODE = "Error type 1";
42c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private static final String NO_SYSTEM_ERROR_CODE = "Error type 2";
43c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private static final String NO_CLASS_ERROR_CODE = "Error type 3";
44c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
45c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    /**
46c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * Command-line entry point.
47c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     *
48c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     * @param args The command-line arguments
49c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn     */
50c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    public static void main(String[] args) {
51c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        try {
52c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            (new Wm()).run(args);
53c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } catch (IllegalArgumentException e) {
54c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            showUsage();
55c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            System.err.println("Error: " + e.getMessage());
56c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } catch (Exception e) {
57c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            e.printStackTrace(System.err);
58c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            System.exit(1);
59c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
60c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
61c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
62c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private void run(String[] args) throws Exception {
63c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (args.length < 1) {
64c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            showUsage();
65c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return;
66c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
67c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
68c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService(
69c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                        Context.WINDOW_SERVICE));
70c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (mWm == null) {
71c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            System.err.println(NO_SYSTEM_ERROR_CODE);
72c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            throw new AndroidException("Can't connect to window manager; is the system running?");
73c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
74c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
75c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        mArgs = args;
76c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        String op = args[0];
77c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        mNextArg = 1;
78c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
79c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (op.equals("size")) {
80c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            runDisplaySize();
81c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else if (op.equals("density")) {
82c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            runDisplayDensity();
83c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else if (op.equals("overscan")) {
84c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            runDisplayOverscan();
85c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else {
86c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            throw new IllegalArgumentException("Unknown command: " + op);
87c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
88c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
89c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
90c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private void runDisplaySize() throws Exception {
91672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        String size = nextArg();
92c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        int w, h;
93672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        if (size == null) {
94672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            Point initialSize = new Point();
95672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            Point baseSize = new Point();
96672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            try {
97672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                mWm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize);
98672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                mWm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, baseSize);
99672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                System.out.println("Physical size: " + initialSize.x + "x" + initialSize.y);
100672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                if (!initialSize.equals(baseSize)) {
101672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                    System.out.println("Override size: " + baseSize.x + "x" + baseSize.y);
102672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                }
103672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            } catch (RemoteException e) {
104672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            }
105672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            return;
106672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        } else if ("reset".equals(size)) {
107c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            w = h = -1;
108c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else {
109c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            int div = size.indexOf('x');
110c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (div <= 0 || div >= (size.length()-1)) {
111c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                System.err.println("Error: bad size " + size);
112c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return;
113c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
114c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            String wstr = size.substring(0, div);
115c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            String hstr = size.substring(div+1);
116c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            try {
117c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                w = Integer.parseInt(wstr);
118c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                h = Integer.parseInt(hstr);
119c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            } catch (NumberFormatException e) {
120c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                System.err.println("Error: bad number " + e);
121c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return;
122c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
123c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
124c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
125c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        try {
126c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (w >= 0 && h >= 0) {
127c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                // TODO(multidisplay): For now Configuration only applies to main screen.
128c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mWm.setForcedDisplaySize(Display.DEFAULT_DISPLAY, w, h);
129c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            } else {
130c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mWm.clearForcedDisplaySize(Display.DEFAULT_DISPLAY);
131c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
132c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } catch (RemoteException e) {
133c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
134c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
135c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
136c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private void runDisplayDensity() throws Exception {
137672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        String densityStr = nextArg();
138c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        int density;
139672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        if (densityStr == null) {
140672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            try {
141672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                int initialDensity = mWm.getInitialDisplayDensity(Display.DEFAULT_DISPLAY);
142672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                int baseDensity = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY);
143672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                System.out.println("Physical density: " + initialDensity);
144672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                if (initialDensity != baseDensity) {
145672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                    System.out.println("Override density: " + baseDensity);
146672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                }
147672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            } catch (RemoteException e) {
148672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            }
149672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn            return;
150672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn        } else if ("reset".equals(densityStr)) {
151c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            density = -1;
152c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else {
153c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            try {
154c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                density = Integer.parseInt(densityStr);
155c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            } catch (NumberFormatException e) {
156c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                System.err.println("Error: bad number " + e);
157c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return;
158c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
159c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (density < 72) {
160c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                System.err.println("Error: density must be >= 72");
161c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return;
162c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
163c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
164c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
165c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        try {
166c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (density > 0) {
167c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                // TODO(multidisplay): For now Configuration only applies to main screen.
168c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mWm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density);
169c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            } else {
170c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mWm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);
171c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
172c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } catch (RemoteException e) {
173c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
174c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
175c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
176c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private void runDisplayOverscan() throws Exception {
177c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        String overscanStr = nextArgRequired();
178c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        Rect rect = new Rect();
179c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        int density;
180c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if ("reset".equals(overscanStr)) {
181c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            rect.set(0, 0, 0, 0);
182c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else {
183c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            final Pattern FLATTENED_PATTERN = Pattern.compile(
184c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                    "(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+)");
185c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            Matcher matcher = FLATTENED_PATTERN.matcher(overscanStr);
186c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (!matcher.matches()) {
187c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                System.err.println("Error: bad rectangle arg: " + overscanStr);
188c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return;
189c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
190c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            rect.left = Integer.parseInt(matcher.group(1));
191c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            rect.top = Integer.parseInt(matcher.group(2));
192c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            rect.right = Integer.parseInt(matcher.group(3));
193c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            rect.bottom = Integer.parseInt(matcher.group(4));
194c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
195c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
196c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        try {
197c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            mWm.setOverscan(Display.DEFAULT_DISPLAY, rect.left, rect.top, rect.right, rect.bottom);
198c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } catch (RemoteException e) {
199c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
200c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
201c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
202c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private String nextOption() {
203c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (mCurArgData != null) {
204c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            String prev = mArgs[mNextArg - 1];
205c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            throw new IllegalArgumentException("No argument expected after \"" + prev + "\"");
206c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
207c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (mNextArg >= mArgs.length) {
208c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return null;
209c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
210c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        String arg = mArgs[mNextArg];
211c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (!arg.startsWith("-")) {
212c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return null;
213c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
214c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        mNextArg++;
215c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (arg.equals("--")) {
216c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return null;
217c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
218c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (arg.length() > 1 && arg.charAt(1) != '-') {
219c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            if (arg.length() > 2) {
220c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mCurArgData = arg.substring(2);
221c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return arg.substring(0, 2);
222c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            } else {
223c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                mCurArgData = null;
224c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                return arg;
225c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            }
226c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
227c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        mCurArgData = null;
228c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        return arg;
229c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
230c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
231c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private String nextArg() {
232c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (mCurArgData != null) {
233c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            String arg = mCurArgData;
234c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            mCurArgData = null;
235c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return arg;
236c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else if (mNextArg < mArgs.length) {
237c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return mArgs[mNextArg++];
238c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        } else {
239c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            return null;
240c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
241c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
242c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
243c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private String nextArgRequired() {
244c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        String arg = nextArg();
245c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        if (arg == null) {
246c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            String prev = mArgs[mNextArg - 1];
247c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn            throw new IllegalArgumentException("Argument expected after \"" + prev + "\"");
248c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        }
249c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        return arg;
250c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
251c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn
252c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    private static void showUsage() {
253c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn        System.err.println(
254c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "usage: wm [subcommand] [options]\n" +
255c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "       wm size [reset|WxH]\n" +
256c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "       wm density [reset|DENSITY]\n" +
257c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "       wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]\n" +
258c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "\n" +
259672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn                "wm size: return or override display size.\n" +
260c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "\n" +
261c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "wm density: override display density.\n" +
262c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "\n" +
263c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                "wm overscan: set overscan area for display.\n"
264c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn                );
265c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn    }
266c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn}
267