1ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk/*
2ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * Copyright (C) 2017 The Android Open Source Project
3ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk *
4ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * except in compliance with the License. You may obtain a copy of the License at
6ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk *
7ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk *
9ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * KIND, either express or implied. See the License for the specific language governing
12ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk * permissions and limitations under the License.
13ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk */
14ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
15ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monkpackage com.android.systemui.plugins;
16ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
17ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monkimport android.util.ArrayMap;
18ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
19ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monkimport com.android.systemui.Dependency;
20ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monkimport com.android.systemui.plugins.PluginDependency.DependencyProvider;
21ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
22ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monkpublic class PluginDependencyProvider extends DependencyProvider {
23ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
24ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    private final ArrayMap<Class<?>, Object> mDependencies = new ArrayMap<>();
25ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    private final PluginManager mManager;
26ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
27ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    public PluginDependencyProvider(PluginManager manager) {
28ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        mManager = manager;
29ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        PluginDependency.sProvider = this;
30ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    }
31ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
32ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    public <T> void allowPluginDependency(Class<T> cls) {
33ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        allowPluginDependency(cls, Dependency.get(cls));
34ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    }
35ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
36ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    public <T> void allowPluginDependency(Class<T> cls, T obj) {
3725f3db72a620b672b69681c1b8edf9f601020236Jason Monk        synchronized (mDependencies) {
3825f3db72a620b672b69681c1b8edf9f601020236Jason Monk            mDependencies.put(cls, obj);
3925f3db72a620b672b69681c1b8edf9f601020236Jason Monk        }
40ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    }
41ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk
42ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    @Override
43ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    <T> T get(Plugin p, Class<T> cls) {
44ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        if (!mManager.dependsOn(p, cls)) {
45ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk            throw new IllegalArgumentException(p.getClass() + " does not depend on " + cls);
46ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        }
4725f3db72a620b672b69681c1b8edf9f601020236Jason Monk        synchronized (mDependencies) {
4825f3db72a620b672b69681c1b8edf9f601020236Jason Monk            if (!mDependencies.containsKey(cls)) {
4925f3db72a620b672b69681c1b8edf9f601020236Jason Monk                throw new IllegalArgumentException("Unknown dependency " + cls);
5025f3db72a620b672b69681c1b8edf9f601020236Jason Monk            }
5125f3db72a620b672b69681c1b8edf9f601020236Jason Monk            return (T) mDependencies.get(cls);
52ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk        }
53ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk    }
54ec34da8f6f31c5ee1e543c0c7999a067487e0ce9Jason Monk}
55