Wm.java revision f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91f
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" + 68f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale "wm screen-capture: enable/disable screen capture.\n" 6979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn ); 7079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn } 71c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 72d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown @Override 7379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn public void onRun() throws Exception { 74c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 75c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Context.WINDOW_SERVICE)); 76c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (mWm == null) { 77c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 78c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 79c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 80c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 8179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn String op = nextArgRequired(); 82c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 83c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (op.equals("size")) { 84c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplaySize(); 85c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else if (op.equals("density")) { 86c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplayDensity(); 87c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else if (op.equals("overscan")) { 88c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn runDisplayOverscan(); 89d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else if (op.equals("scaling")) { 90d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown runDisplayScaling(); 91f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } else if (op.equals("screen-capture")) { 92f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale runSetScreenCapture(); 93c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 9479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn showError("Error: unknown command '" + op + "'"); 9579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn return; 96c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 97c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 98c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 99f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale private void runSetScreenCapture() throws Exception { 100f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale String userIdStr = nextArg(); 101f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale String enableStr = nextArg(); 102f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale int userId; 103f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale boolean disable; 104f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 105f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale try { 106f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale userId = Integer.parseInt(userIdStr); 107f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } catch (NumberFormatException e) { 108f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale System.err.println("Error: bad number " + e); 109f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale return; 110f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 111f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 112f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale disable = !Boolean.parseBoolean(enableStr); 113f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 114f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale try { 115f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale mWm.setScreenCaptureDisabled(userId, disable); 116f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } catch (RemoteException e) { 117f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale System.err.println("Error: Can't set screen capture " + e); 118f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 119f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale } 120f5ad42f4324bfb7aa28f0967e2fcc89f55d6e91fWale Ogunwale 121c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplaySize() throws Exception { 122672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn String size = nextArg(); 123c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int w, h; 124672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (size == null) { 125672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn Point initialSize = new Point(); 126672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn Point baseSize = new Point(); 127672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn try { 128672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn mWm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize); 129672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn mWm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, baseSize); 130672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Physical size: " + initialSize.x + "x" + initialSize.y); 131672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (!initialSize.equals(baseSize)) { 132672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Override size: " + baseSize.x + "x" + baseSize.y); 133672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 134672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } catch (RemoteException e) { 135672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 136672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn return; 137672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } else if ("reset".equals(size)) { 138c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn w = h = -1; 139c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 140c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int div = size.indexOf('x'); 141c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 142c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad size " + size); 143c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 144c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 145c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String wstr = size.substring(0, div); 146c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String hstr = size.substring(div+1); 147c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 148d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown w = parseDimension(wstr); 149d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown h = parseDimension(hstr); 150c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (NumberFormatException e) { 151c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad number " + e); 152c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 153c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 154c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 155c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 156c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 157c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (w >= 0 && h >= 0) { 158c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 159c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setForcedDisplaySize(Display.DEFAULT_DISPLAY, w, h); 160c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 161c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.clearForcedDisplaySize(Display.DEFAULT_DISPLAY); 162c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 163c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 164c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 165c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 166c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 167c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplayDensity() throws Exception { 168672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn String densityStr = nextArg(); 169c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn int density; 170672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (densityStr == null) { 171672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn try { 172672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn int initialDensity = mWm.getInitialDisplayDensity(Display.DEFAULT_DISPLAY); 173672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn int baseDensity = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY); 174672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Physical density: " + initialDensity); 175672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn if (initialDensity != baseDensity) { 176672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn System.out.println("Override density: " + baseDensity); 177672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 178672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } catch (RemoteException e) { 179672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } 180672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn return; 181672cf45de7aa5ad6fd1f75512ee5a451a16c0b39Dianne Hackborn } else if ("reset".equals(densityStr)) { 182c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn density = -1; 183c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 184c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 185c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn density = Integer.parseInt(densityStr); 186c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (NumberFormatException e) { 187c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad number " + e); 188c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 189c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 190c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (density < 72) { 191c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: density must be >= 72"); 192c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 193c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 194c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 195c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 196c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 197c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (density > 0) { 198c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 199c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); 200c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 201c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); 202c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 203c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 204c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 205c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 206c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 207c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn private void runDisplayOverscan() throws Exception { 208c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn String overscanStr = nextArgRequired(); 209c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Rect rect = new Rect(); 210c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if ("reset".equals(overscanStr)) { 211c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.set(0, 0, 0, 0); 212c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } else { 213c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn final Pattern FLATTENED_PATTERN = Pattern.compile( 214c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn "(-?\\d+),(-?\\d+),(-?\\d+),(-?\\d+)"); 215c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn Matcher matcher = FLATTENED_PATTERN.matcher(overscanStr); 216c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn if (!matcher.matches()) { 217c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn System.err.println("Error: bad rectangle arg: " + overscanStr); 218c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn return; 219c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 220c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.left = Integer.parseInt(matcher.group(1)); 221c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.top = Integer.parseInt(matcher.group(2)); 222c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.right = Integer.parseInt(matcher.group(3)); 223c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn rect.bottom = Integer.parseInt(matcher.group(4)); 224c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 225c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn 226c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn try { 227c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn mWm.setOverscan(Display.DEFAULT_DISPLAY, rect.left, rect.top, rect.right, rect.bottom); 228c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } catch (RemoteException e) { 229c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 230c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn } 231d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown 232d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown private void runDisplayScaling() throws Exception { 233d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown String scalingStr = nextArgRequired(); 234d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if ("auto".equals(scalingStr)) { 235d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 0); 236d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else if ("off".equals(scalingStr)) { 237d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown mWm.setForcedDisplayScalingMode(Display.DEFAULT_DISPLAY, 1); 238d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } else { 239d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown System.err.println("Error: scaling must be 'auto' or 'off'"); 240d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 241d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 242d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown 243d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown private int parseDimension(String s) throws NumberFormatException { 244d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if (s.endsWith("px")) { 245d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s.substring(0, s.length() - 2)); 246d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 247d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown if (s.endsWith("dp")) { 248d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown int density; 249d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown try { 250d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown density = mWm.getBaseDisplayDensity(Display.DEFAULT_DISPLAY); 251d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } catch (RemoteException e) { 252d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown density = DisplayMetrics.DENSITY_DEFAULT; 253d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 254d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s.substring(0, s.length() - 2)) * density / 255d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown DisplayMetrics.DENSITY_DEFAULT; 256d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 257d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown return Integer.parseInt(s); 258d46747a1c64b6ca3282e8841833980ab91829436Jeff Brown } 259c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn} 260