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