blob: 8cca0ed308b2d900123495d492b5213053ff4672 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.car.window;
import android.content.Context;
import android.util.Log;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
/**
* Registers {@link OverlayViewMediator}(s) and synchronizes their calls to hide/show {@link
* OverlayViewController}(s) to allow for the correct visibility of system bars.
*/
@Singleton
public class SystemUIOverlayWindowManager extends SystemUI {
private static final String TAG = "SystemUIOverlayWM";
private final Map<Class<?>, Provider<OverlayViewMediator>>
mContentMediatorCreators;
private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
@Inject
public SystemUIOverlayWindowManager(
Context context,
Map<Class<?>, Provider<OverlayViewMediator>> contentMediatorCreators,
OverlayViewGlobalStateController overlayViewGlobalStateController) {
super(context);
mContentMediatorCreators = contentMediatorCreators;
mOverlayViewGlobalStateController = overlayViewGlobalStateController;
}
@Override
public void start() {
String[] names = mContext.getResources().getStringArray(
R.array.config_carSystemUIOverlayViewsMediators);
startServices(names);
}
private void startServices(String[] services) {
for (String clsName : services) {
long ti = System.currentTimeMillis();
try {
OverlayViewMediator obj = resolveContentMediator(clsName);
if (obj == null) {
Constructor constructor = Class.forName(clsName).getConstructor(Context.class);
obj = (OverlayViewMediator) constructor.newInstance(this);
}
mOverlayViewGlobalStateController.registerMediator(obj);
} catch (ClassNotFoundException
| NoSuchMethodException
| IllegalAccessException
| InstantiationException
| InvocationTargetException ex) {
throw new RuntimeException(ex);
}
// Warn if initialization of component takes too long
ti = System.currentTimeMillis() - ti;
if (ti > 200) {
Log.w(TAG, "Initialization of " + clsName + " took " + ti + " ms");
}
}
}
private OverlayViewMediator resolveContentMediator(String className) {
return resolve(className, mContentMediatorCreators);
}
private <T> T resolve(String className, Map<Class<?>, Provider<T>> creators) {
try {
Class<?> clazz = Class.forName(className);
Provider<T> provider = creators.get(clazz);
return provider == null ? null : provider.get();
} catch (ClassNotFoundException e) {
return null;
}
}
}