1ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi/*
2ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * Copyright (C) 2017 The Android Open Source Project
3ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi *
4ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * you may not use this file except in compliance with the License.
6ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * You may obtain a copy of the License at
7ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi *
8ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi *
10ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * Unless required by applicable law or agreed to in writing, software
11ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * See the License for the specific language governing permissions and
14ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi * limitations under the License
15ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi */
16ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
17ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggipackage com.android.server;
18ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
19ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggiimport static android.os.Process.THREAD_PRIORITY_DISPLAY;
20ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
21ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggiimport android.os.Handler;
22ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggiimport android.os.Trace;
23ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
24ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi/**
2521c39a77712d494f0ec8980a39dc99ff98c46c37Jorim Jaggi * Thread for handling all legacy window animations, or anything that's directly impacting
2621c39a77712d494f0ec8980a39dc99ff98c46c37Jorim Jaggi * animations like starting windows or traversals.
27ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi */
28ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggipublic final class AnimationThread extends ServiceThread {
29ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private static AnimationThread sInstance;
30ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private static Handler sHandler;
31ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
32ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private AnimationThread() {
33ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        super("android.anim", THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
34ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    }
35ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
36ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private static void ensureThreadLocked() {
37ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        if (sInstance == null) {
38ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            sInstance = new AnimationThread();
39ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            sInstance.start();
40ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_WINDOW_MANAGER);
41ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            sHandler = new Handler(sInstance.getLooper());
42ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        }
43ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    }
44ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
45ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    public static AnimationThread get() {
46ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        synchronized (AnimationThread.class) {
47ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            ensureThreadLocked();
48ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            return sInstance;
49ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        }
50ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    }
51ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
52ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    public static Handler getHandler() {
53ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        synchronized (AnimationThread.class) {
54ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            ensureThreadLocked();
55ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            return sHandler;
56ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        }
57ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    }
58ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi}
59