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