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; 27d46747a1c64b6ca3282e8841833980ab91829436Jeff Brownimport android.util.DisplayMetrics; 28c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.view.Display; 29c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport android.view.IWindowManager; 3079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackbornimport com.android.internal.os.BaseCommand; 31c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 3279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackbornimport java.io.PrintStream; 33c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport java.util.regex.Matcher; 34c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackbornimport java.util.regex.Pattern; 35c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 3679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackbornpublic class Wm extends BaseCommand { 37c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 38c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private IWindowManager mWm; 39c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 40c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn /** 41c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * Command-line entry point. 42c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * 43c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn * @param args The command-line arguments 44c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn */ 45c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn public static void main(String[] args) { 4679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn (new Wm()).run(args); 47c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 48c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 49d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown @Override 5079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn public void onShowUsage(PrintStream out) { 5179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn out.println( 5279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "usage: wm [subcommand] [options]\n" + 53d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown " wm size [reset|WxH|WdpxHdp]\n" + 5479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " wm density [reset|DENSITY]\n" + 5579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]\n" + 56d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown " wm scaling [off|auto]\n" + 57f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale " wm screen-capture [userId] [true|false]\n" + 5879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 5979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "wm size: return or override display size.\n" + 60d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown " width and height in pixels unless suffixed with 'dp'.\n" + 6179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 6279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "wm density: override display density.\n" + 6379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 64d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown "wm overscan: set overscan area for display.\n" + 65d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown "\n" + 66f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale "wm scaling: set display scaling mode.\n" + 67f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale "\n" + 68f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn "wm screen-capture: enable/disable screen capture.\n" + 69f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn "\n" + 70f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn "wm dismiss-keyguard: dismiss the keyguard, prompting the user for auth if " + 71f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn "necessary.\n" 7279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn ); 7379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn } 74c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 75d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown @Override 7679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn public void onRun() throws Exception { 77c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 78c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Context.WINDOW_SERVICE)); 79c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (mWm == null) { 80c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 81c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 82c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 83c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 8479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn String op = nextArgRequired(); 85c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 86c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (op.equals("size")) { 87c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplaySize(); 88c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else if (op.equals("density")) { 89c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplayDensity(); 90c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else if (op.equals("overscan")) { 91c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplayOverscan(); 92d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else if (op.equals("scaling")) { 93d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown runDisplayScaling(); 94f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } else if (op.equals("screen-capture")) { 95f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale runSetScreenCapture(); 96f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn } else if (op.equals("dismiss-keyguard")) { 97f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn runDismissKeyguard(); 98c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 9979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn showError("Error: unknown command '" + op + "'"); 10079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn return; 101c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 102c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 103c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 104f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale private void runSetScreenCapture() throws Exception { 105f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale String userIdStr = nextArg(); 106f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale String enableStr = nextArg(); 107f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale int userId; 108f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale boolean disable; 109f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 110f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale try { 111f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale userId = Integer.parseInt(userIdStr); 112f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } catch (NumberFormatException e) { 113f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale System.err.println("Error: bad number " + e); 114f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale return; 115f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 116f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 117f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale disable = !Boolean.parseBoolean(enableStr); 118f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 119f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale try { 120f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale mWm.setScreenCaptureDisabled(userId, disable); 121f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } catch (RemoteException e) { 122f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale System.err.println("Error: Can't set screen capture " + e); 123f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 124f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 125f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 126c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplaySize() throws Exception { 127672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn String size = nextArg(); 128c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int w, h; 129672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (size == null) { 130672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn Point initialSize = new Point(); 131672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn Point baseSize = new Point(); 132672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn try { 133672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn mWm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize); 134672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn mWm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, baseSize); 135672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Physical size: " + initialSize.x + "x" + initialSize.y); 136672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (!initialSize.equals(baseSize)) { 137672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Override size: " + baseSize.x + "x" + baseSize.y); 138672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 139672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } catch (RemoteException e) { 140672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 141672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn return; 142672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } else if ("reset".equals(size)) { 143c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn w = h = -1; 144c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 145c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int div = size.indexOf('x'); 146c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 147c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad size " + size); 148c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 149c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 150c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String wstr = size.substring(0, div); 151c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String hstr = size.substring(div+1); 152c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 153d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown w = parseDimension(wstr); 154d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown h = parseDimension(hstr); 155c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (NumberFormatException e) { 156c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad number " + e); 157c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 158c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 159c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 160c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 161c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 162c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (w >= 0 && h >= 0) { 163c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 164c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setForcedDisplaySize(Display.DEFAULT_DISPLAY, w, h); 165c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 166c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.clearForcedDisplaySize(Display.DEFAULT_DISPLAY); 167c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 168c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 169c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 170c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 171c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 172c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplayDensity() throws Exception { 173672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn String densityStr = nextArg(); 174c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int density; 175672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (densityStr == null) { 176672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn try { 177672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn int initialDensity = mWm.getInitialDisplayDensity(Display.DEFAULT_DISPLAY); 178672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn int baseDensity = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY); 179672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Physical density: " + initialDensity); 180672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (initialDensity != baseDensity) { 181672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Override density: " + baseDensity); 182672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 183672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } catch (RemoteException e) { 184672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 185672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn return; 186672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } else if ("reset".equals(densityStr)) { 187c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn density = -1; 188c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 189c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 190c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn density = Integer.parseInt(densityStr); 191c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (NumberFormatException e) { 192c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad number " + e); 193c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 194c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 195c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (density < 72) { 196c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: density must be >= 72"); 197c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 198c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 199c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 200c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 201c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 202c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (density > 0) { 203c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 204c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); 205c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 206c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); 207c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 208c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 209c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 210c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 211c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 212c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplayOverscan() throws Exception { 213c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String overscanStr = nextArgRequired(); 214c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Rect rect = new Rect(); 215c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if ("reset".equals(overscanStr)) { 216c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.set(0, 0, 0, 0); 217c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 218c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn final Pattern FLATTENED_PATTERN = Pattern.compile( 219c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn "(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+)"); 220c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Matcher matcher = FLATTENED_PATTERN.matcher(overscanStr); 221c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (!matcher.matches()) { 222c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad rectangle arg: " + overscanStr); 223c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 224c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 225c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.left = Integer.parseInt(matcher.group(1)); 226c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.top = Integer.parseInt(matcher.group(2)); 227c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.right = Integer.parseInt(matcher.group(3)); 228c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.bottom = Integer.parseInt(matcher.group(4)); 229c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 230c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 231c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 232c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setOverscan(Display.DEFAULT_DISPLAY, rect.left, rect.top, rect.right, rect.bottom); 233c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 234c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 235c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 236d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown 237d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown private void runDisplayScaling() throws Exception { 238d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown String scalingStr = nextArgRequired(); 239d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if ("auto".equals(scalingStr)) { 240d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 0); 241d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else if ("off".equals(scalingStr)) { 242d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 1); 243d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else { 244d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown System.err.println("Error: scaling must be 'auto' or 'off'"); 245d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 246d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 247d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown 248f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn private void runDismissKeyguard() throws Exception { 249f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn mWm.dismissKeyguard(); 250f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn } 251f40c66d1a13b7cf88ba06cff10f6343471afd840Tim Kilbourn 252d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown private int parseDimension(String s) throws NumberFormatException { 253d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if (s.endsWith("px")) { 254d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s.substring(0, s.length() - 2)); 255d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 256d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if (s.endsWith("dp")) { 257d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown int density; 258d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown try { 259d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown density = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY); 260d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } catch (RemoteException e) { 261d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown density = DisplayMetrics.DENSITY_DEFAULT; 262d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 263d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s.substring(0, s.length() - 2)) * density / 264d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown DisplayMetrics.DENSITY_DEFAULT; 265d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 266d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s); 267d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 268c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn} 269