blob: 18bf75e3cfb1425f9664210ad7eaae82fee46e44 [file] [log] [blame]
Jason Monk340b0e52017-03-08 14:57:56 -05001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui;
16
17import static org.mockito.Mockito.mock;
18
19import android.content.Context;
20import android.util.ArrayMap;
Eliot Courtney012fae92018-01-10 18:22:55 +090021import android.util.ArraySet;
Jason Monk340b0e52017-03-08 14:57:56 -050022
23public class TestableDependency extends Dependency {
24 private final ArrayMap<Object, Object> mObjs = new ArrayMap<>();
Eliot Courtney012fae92018-01-10 18:22:55 +090025 private final ArraySet<Object> mInstantiatedObjects = new ArraySet<>();
Jason Monk340b0e52017-03-08 14:57:56 -050026
27 public TestableDependency(Context context) {
Jason Monk297c04e2018-08-23 17:16:59 -040028 if (context instanceof SysuiTestableContext) {
29 mComponents = ((SysuiTestableContext) context).getComponents();
30 }
Jason Monk340b0e52017-03-08 14:57:56 -050031 mContext = context;
Jason Monk27d01a622018-12-10 15:57:09 -050032 SystemUIFactory.createFromConfig(context);
33 SystemUIFactory.getInstance().getRootComponent()
34 .createDependency()
35 .createSystemUI(this);
Jason Monk340b0e52017-03-08 14:57:56 -050036 start();
37 }
38
39 public <T> T injectMockDependency(Class<T> cls) {
40 final T mock = mock(cls);
41 injectTestDependency(cls, mock);
42 return mock;
43 }
44
45 public <T> void injectTestDependency(DependencyKey<T> key, T obj) {
46 mObjs.put(key, obj);
47 }
48
49 public <T> void injectTestDependency(Class<T> key, T obj) {
Jason Monk297c04e2018-08-23 17:16:59 -040050 if (mInstantiatedObjects.contains(key)) {
51 throw new IllegalStateException(key + " was already initialized");
52 }
Jason Monk340b0e52017-03-08 14:57:56 -050053 mObjs.put(key, obj);
54 }
55
56 @Override
57 protected <T> T createDependency(Object key) {
58 if (mObjs.containsKey(key)) return (T) mObjs.get(key);
Eliot Courtney012fae92018-01-10 18:22:55 +090059 mInstantiatedObjects.add(key);
Jason Monk340b0e52017-03-08 14:57:56 -050060 return super.createDependency(key);
61 }
Eliot Courtney012fae92018-01-10 18:22:55 +090062
63 public <T> boolean hasInstantiatedDependency(Class<T> key) {
64 return mObjs.containsKey(key) || mInstantiatedObjects.contains(key);
65 }
Jason Monk340b0e52017-03-08 14:57:56 -050066}