19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/* 2f04335f899f2cce69f843692a3cb9cec229683c2tturney * Copyright (C) 2017 The Android Open Source Project 39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 4f04335f899f2cce69f843692a3cb9cec229683c2tturney * Licensed under the Apache License, Version 2.0 (the "License"); 5f04335f899f2cce69f843692a3cb9cec229683c2tturney * you may not use this file except in compliance with the License. 6f04335f899f2cce69f843692a3cb9cec229683c2tturney * You may obtain a copy of the License at 79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 8f04335f899f2cce69f843692a3cb9cec229683c2tturney * http://www.apache.org/licenses/LICENSE-2.0 99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * 109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software 11f04335f899f2cce69f843692a3cb9cec229683c2tturney * distributed under the License is distributed on an "AS IS" BASIS, 12f04335f899f2cce69f843692a3cb9cec229683c2tturney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f04335f899f2cce69f843692a3cb9cec229683c2tturney * See the License for the specific language governing permissions and 14f04335f899f2cce69f843692a3cb9cec229683c2tturney * limitations under the License. 159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */ 169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting.facade; 189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport java.util.HashMap; 209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.Service; 229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.Context; 239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.graphics.Point; 249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.hardware.display.DisplayManager; 259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.util.DisplayMetrics; 269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.Display; 279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.jsonrpc.RpcReceiver; 299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.rpc.Rpc; 309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.rpc.RpcDefault; 319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.rpc.RpcParameter; 329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class DisplayFacade extends RpcReceiver { 349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private final Service mService; 369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private final DisplayManager mDisplayManager; 379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private HashMap<Integer, Display> mDisplays; 389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public DisplayFacade(FacadeManager manager) { 409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li super(manager); 419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mService = manager.getService(); 429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mDisplayManager = (DisplayManager) mService.getSystemService(Context.DISPLAY_SERVICE); 439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li updateDisplays(mDisplayManager.getDisplays()); 449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li private void updateDisplays(Display[] displays) { 479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li if (mDisplays == null) { 489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mDisplays = new HashMap<Integer, Display>(); 499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mDisplays.clear(); 519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li for(Display d : displays) { 529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li mDisplays.put(d.getDisplayId(), d); 539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @Rpc(description = "Get a list of IDs of the logical displays connected." 579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li + "Also updates the cached displays.") 589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public Integer[] displayGetDisplays() { 599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Display[] displays = mDisplayManager.getDisplays(); 609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li updateDisplays(displays); 619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Integer[] results = new Integer[displays.length]; 629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li for(int i = 0; i < displays.length; i++) { 639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li results[i] = displays[i].getDisplayId(); 649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return results; 669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @Rpc(description = "Get the size of the specified display in pixels.") 699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public Point displayGetSize( 709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcParameter(name = "displayId") 719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcDefault(value = "0") 729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Integer displayId) { 739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Point outSize = new Point(); 749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Display d = mDisplays.get(displayId); 759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li d.getSize(outSize); 769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return outSize; 779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @Rpc(description = "Get the maximum screen size dimension that will happen.") 809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public Integer displayGetMaximumSizeDimension( 819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcParameter(name = "displayId") 829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcDefault(value = "0") 839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Integer displayId) { 849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Display d = mDisplays.get(displayId); 859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return d.getMaximumSizeDimension(); 869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @Rpc(description = "Get display metrics based on the real size of this display.") 899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public DisplayMetrics displayGetRealMetrics( 909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcParameter(name = "displayId") 919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @RpcDefault(value = "0") 929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Integer displayId) { 939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li Display d = mDisplays.get(displayId); 949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li DisplayMetrics outMetrics = new DisplayMetrics(); 959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li d.getRealMetrics(outMetrics); 969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li return outMetrics; 979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li 999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li @Override 1009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li public void shutdown() { 1019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li } 1029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li} 103