1fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/*
2fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Copyright (C) 2012 The Android Open Source Project
3fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
4fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * you may not use this file except in compliance with the License.
6fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * You may obtain a copy of the License at
7fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
8fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown *
10fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Unless required by applicable law or agreed to in writing, software
11fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * See the License for the specific language governing permissions and
14fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * limitations under the License.
15fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
16fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
17fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brownpackage com.android.server.display;
18fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown
19848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brownimport android.content.Context;
204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownimport android.os.Handler;
21908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackbornimport android.util.DisplayMetrics;
2292130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brownimport android.view.Display;
23908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn
24fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown/**
25fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown * Provides a fake default display for headless systems.
26bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * <p>
274ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * Display adapters are guarded by the {@link DisplayManagerService.SyncRoot} lock.
28bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown * </p>
29fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown */
304ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brownfinal class HeadlessDisplayAdapter extends DisplayAdapter {
31bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown    private static final String TAG = "HeadlessDisplayAdapter";
32848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
3366692500344cab2f53cdb6ee1545c567fff7cb16Jeff Brown    // Called with SyncRoot lock held.
344ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public HeadlessDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
354ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            Context context, Handler handler, Listener listener) {
364ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        super(syncRoot, context, handler, listener, TAG);
37848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    }
38848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
39848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    @Override
404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown    public void registerLocked() {
414ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        super.registerLocked();
424ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        sendDisplayDeviceEventLocked(new HeadlessDisplayDevice(), DISPLAY_DEVICE_EVENT_ADDED);
43848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    }
44848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown
45848c2dc93b6795e171f3dd6f64ea0be65e2762caJeff Brown    private final class HeadlessDisplayDevice extends DisplayDevice {
464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        private DisplayDeviceInfo mInfo;
474ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown
48bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown        public HeadlessDisplayDevice() {
49bd6e1500aedc5461e832f69e76341bff0e55fa2bJeff Brown            super(HeadlessDisplayAdapter.this, null);
5064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        }
5164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
5264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        @Override
534ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown        public DisplayDeviceInfo getDisplayDeviceInfoLocked() {
544ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            if (mInfo == null) {
554ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo = new DisplayDeviceInfo();
564ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.name = getContext().getResources().getString(
574ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                        com.android.internal.R.string.display_manager_built_in_display_name);
584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.width = 640;
594ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.height = 480;
604ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.refreshRate = 60;
614ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.densityDpi = DisplayMetrics.DENSITY_DEFAULT;
624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.xDpi = 160;
634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.yDpi = 160;
644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown                mInfo.flags = DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY
6577aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown                        | DisplayDeviceInfo.FLAG_SECURE
6677aebfdbae489c3712ae3f9bca29d01fb1f09dc2Jeff Brown                        | DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS;
6792130f6407dc51c58b3b941d28a6daf4e04b8d62Jeff Brown                mInfo.type = Display.TYPE_BUILT_IN;
68d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                mInfo.touch = DisplayDeviceInfo.TOUCH_NONE;
694ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            }
704ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown            return mInfo;
71fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown        }
72fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown    }
73fa25bf5382467b1018bd9af7f1cb30a23d7d59f7Jeff Brown}
74