1340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk/*
2340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Copyright (C) 2017 The Android Open Source Project
3340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk *
4340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * except in compliance with the License. You may obtain a copy of the License at
6340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk *
7340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk *
9340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * KIND, either express or implied. See the License for the specific language governing
12340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * permissions and limitations under the License.
13340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk */
14340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
15340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkpackage com.android.systemui;
16340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
17340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport static org.mockito.Mockito.mock;
18340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
19340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.Context;
20340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.util.ArrayMap;
21012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtneyimport android.util.ArraySet;
22340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
23340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkpublic class TestableDependency extends Dependency {
24340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    private final ArrayMap<Object, Object> mObjs = new ArrayMap<>();
25012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney    private final ArraySet<Object> mInstantiatedObjects = new ArraySet<>();
26340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
27340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    public TestableDependency(Context context) {
28340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        mContext = context;
29340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        if (SystemUIFactory.getInstance() == null) {
30340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk            SystemUIFactory.createFromConfig(context);
31340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        }
32340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        start();
33340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    }
34340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
35340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    public <T> T injectMockDependency(Class<T> cls) {
36340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        final T mock = mock(cls);
37340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        injectTestDependency(cls, mock);
38340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        return mock;
39340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    }
40340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
41340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    public <T> void injectTestDependency(DependencyKey<T> key, T obj) {
42340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        mObjs.put(key, obj);
43340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    }
44340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
45340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    public <T> void injectTestDependency(Class<T> key, T obj) {
46340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        mObjs.put(key, obj);
47340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    }
48340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk
49340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    @Override
50340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    protected <T> T createDependency(Object key) {
51340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        if (mObjs.containsKey(key)) return (T) mObjs.get(key);
52012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney        mInstantiatedObjects.add(key);
53340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk        return super.createDependency(key);
54340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk    }
55012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney
56012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney    public <T> boolean hasInstantiatedDependency(Class<T> key) {
57012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney        return mObjs.containsKey(key) || mInstantiatedObjects.contains(key);
58012fae99b3ca8f6cf41b496ecc5db834ecb49fbfEliot Courtney    }
59340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk}
60