14ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown/*
24ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * Copyright (C) 2013 The Android Open Source Project
34ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown *
44ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
54ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * you may not use this file except in compliance with the License.
64ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * You may obtain a copy of the License at
74ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown *
84ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
94ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown *
104ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * Unless required by applicable law or agreed to in writing, software
114ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
124ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * See the License for the specific language governing permissions and
144ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * limitations under the License.
154ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown */
164ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
174ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownpackage com.android.server;
184ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
194ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownimport android.os.Handler;
204ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
214ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown/**
224ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * Shared singleton foreground thread for the system.  This is a thread for
234ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * operations that affect what's on the display, which needs to have a minimum
244ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * of latency.  This thread should pretty much only be used by the WindowManager,
254ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown * DisplayManager, and InputManager to perform quick operations in real time.
264ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown */
274ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownpublic final class DisplayThread extends ServiceThread {
284ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    private static DisplayThread sInstance;
294ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    private static Handler sHandler;
304ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
314ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    private DisplayThread() {
324ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown        super("android.display", android.os.Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
334ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    }
344ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
354ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    private static void ensureThreadLocked() {
364ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown        if (sInstance == null) {
374ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            sInstance = new DisplayThread();
384ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            sInstance.start();
394ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            sHandler = new Handler(sInstance.getLooper());
404ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown        }
414ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    }
424ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
434ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    public static DisplayThread get() {
44bf58d9b727f1007c7c620f622ac1d8003b1b211bJeff Brown        synchronized (DisplayThread.class) {
454ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            ensureThreadLocked();
464ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            return sInstance;
474ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown        }
484ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    }
494ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown
504ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    public static Handler getHandler() {
51bf58d9b727f1007c7c620f622ac1d8003b1b211bJeff Brown        synchronized (DisplayThread.class) {
524ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            ensureThreadLocked();
534ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown            return sHandler;
544ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown        }
554ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown    }
564ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown}
57