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
19cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport com.android.internal.annotations.VisibleForTesting;
20cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
21182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.util.ArrayMap;
22182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
23182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski/**
24182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * This class is used in a similar way as ServiceManager, except the services registered here
25182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * are not Binder objects and are only available in the same process.
26182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski *
27182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Once all services are converted to the SystemService interface, this class can be absorbed
28182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * into SystemServiceManager.
29b102b2cc73baa20e8cc9e4c081235b031c4e8fe0Adam Lesinski *
30b102b2cc73baa20e8cc9e4c081235b031c4e8fe0Adam Lesinski * {@hide}
31182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski */
32182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipublic final class LocalServices {
33182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private LocalServices() {}
34182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
35182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
36182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            new ArrayMap<Class<?>, Object>();
37182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
38182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    /**
39182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * Returns a local service instance that implements the specified interface.
40182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     *
41182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * @param type The type of service.
42182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * @return The service object.
43182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     */
44182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    @SuppressWarnings("unchecked")
45182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    public static <T> T getService(Class<T> type) {
46182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        synchronized (sLocalServiceObjects) {
47182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            return (T) sLocalServiceObjects.get(type);
48182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        }
49182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    }
50182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
51182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    /**
52182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     * Adds a service instance of the specified interface to the global registry of local services.
53182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski     */
54182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    public static <T> void addService(Class<T> type, T service) {
55182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        synchronized (sLocalServiceObjects) {
56182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            if (sLocalServiceObjects.containsKey(type)) {
57182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski                throw new IllegalStateException("Overriding service registration");
58182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            }
59182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            sLocalServiceObjects.put(type, service);
60182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        }
61182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    }
62cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
63cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
64cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * Remove a service instance, must be only used in tests.
65cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
66cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @VisibleForTesting
67cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static <T> void removeServiceForTest(Class<T> type) {
68cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        synchronized (sLocalServiceObjects) {
69cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            sLocalServiceObjects.remove(type);
70cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
71cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
72182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski}
73