1182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski/*
2182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Copyright (C) 2013 The Android Open Source Project
3182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *
4182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * you may not use this file except in compliance with the License.
6182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * You may obtain a copy of the License at
7182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *
8182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *
10182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * See the License for the specific language governing permissions and
14182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * limitations under the License.
15182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski */
16182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
17182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipackage com.android.server;
18182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
19182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.util.ArrayMap;
20182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
21182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski/**
22182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * This class is used in a similar way as ServiceManager, except the services registered here
23182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * are not Binder objects and are only available in the same process.
24182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *
25182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Once all services are converted to the SystemService interface, this class can be absorbed
26182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * into SystemServiceManager.
27b102b2cc73baa20e8cc9e4c081235b031c4e8fe0Adam Lesinski *
28b102b2cc73baa20e8cc9e4c081235b031c4e8fe0Adam Lesinski * {@hide}
29182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski */
30182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipublic final class LocalServices {
31182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private LocalServices() {}
32182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
33182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
34182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            new ArrayMap<Class<?>, Object>();
35182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
36182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    /**
37182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * Returns a local service instance that implements the specified interface.
38182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     *
39182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * @param type The type of service.
40182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * @return The service object.
41182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     */
42182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    @SuppressWarnings("unchecked")
43182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    public static <T> T getService(Class<T> type) {
44182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        synchronized (sLocalServiceObjects) {
45182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            return (T) sLocalServiceObjects.get(type);
46182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        }
47182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    }
48182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
49182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    /**
50182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * Adds a service instance of the specified interface to the global registry of local services.
51182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     */
52182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    public static <T> void addService(Class<T> type, T service) {
53182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        synchronized (sLocalServiceObjects) {
54182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            if (sLocalServiceObjects.containsKey(type)) {
55182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski                throw new IllegalStateException("Overriding service registration");
56182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            }
57182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            sLocalServiceObjects.put(type, service);
58182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        }
59182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    }
60182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski}
61