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