Multiple singletons depend on Plugin which can cause deadlock if PluginManager is initialized on main thread Test: presubmit Bug: 361850561 Bug: 373557167 Flag: EXEMPT dagger Change-Id: I79f17ac6b78a2ce60df2d27a6e794b9e4eba1b51
125 lines
4.9 KiB
Java
125 lines
4.9 KiB
Java
/*
|
|
* Copyright (C) 2024 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.launcher3.uioverrides.plugins;
|
|
|
|
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
|
|
|
|
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
|
|
|
|
import android.app.NotificationManager;
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.pm.ResolveInfo;
|
|
|
|
import com.android.launcher3.BuildConfig;
|
|
import com.android.launcher3.dagger.ApplicationContext;
|
|
import com.android.launcher3.dagger.LauncherAppSingleton;
|
|
import com.android.launcher3.util.PluginManagerWrapper;
|
|
import com.android.systemui.plugins.Plugin;
|
|
import com.android.systemui.plugins.PluginListener;
|
|
import com.android.systemui.shared.plugins.PluginActionManager;
|
|
import com.android.systemui.shared.plugins.PluginInstance;
|
|
import com.android.systemui.shared.plugins.PluginManagerImpl;
|
|
import com.android.systemui.shared.plugins.PluginPrefs;
|
|
|
|
import java.io.PrintWriter;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import javax.inject.Inject;
|
|
|
|
@LauncherAppSingleton
|
|
public class PluginManagerWrapperImpl extends PluginManagerWrapper {
|
|
|
|
private final Context mContext;
|
|
private final PluginManagerImpl mPluginManager;
|
|
private final PluginEnablerImpl mPluginEnabler;
|
|
|
|
@Inject
|
|
public PluginManagerWrapperImpl(@ApplicationContext Context c) {
|
|
mContext = c;
|
|
mPluginEnabler = new PluginEnablerImpl(c);
|
|
List<String> privilegedPlugins = Collections.emptyList();
|
|
PluginInstance.Factory instanceFactory = new PluginInstance.Factory(
|
|
getClass().getClassLoader(), new PluginInstance.InstanceFactory<>(),
|
|
new PluginInstance.VersionCheckerImpl(), privilegedPlugins,
|
|
BuildConfig.IS_DEBUG_DEVICE);
|
|
PluginActionManager.Factory instanceManagerFactory = new PluginActionManager.Factory(
|
|
c, c.getPackageManager(), c.getMainExecutor(), MODEL_EXECUTOR,
|
|
c.getSystemService(NotificationManager.class), mPluginEnabler,
|
|
privilegedPlugins, instanceFactory);
|
|
|
|
// Use null preHandlerManager, as the handler is never unregistered which can cause leaks
|
|
// when using multiple dagger graphs.
|
|
mPluginManager = new PluginManagerImpl(c, instanceManagerFactory,
|
|
BuildConfig.IS_DEBUG_DEVICE,
|
|
null /* preHandlerManager */, mPluginEnabler,
|
|
new PluginPrefs(c), privilegedPlugins);
|
|
}
|
|
|
|
public PluginEnablerImpl getPluginEnabler() {
|
|
return mPluginEnabler;
|
|
}
|
|
|
|
@Override
|
|
public <T extends Plugin> void addPluginListener(
|
|
PluginListener<T> listener, Class<T> pluginClass, boolean allowMultiple) {
|
|
mPluginManager.addPluginListener(listener, pluginClass, allowMultiple);
|
|
}
|
|
|
|
@Override
|
|
public void removePluginListener(PluginListener<? extends Plugin> listener) {
|
|
mPluginManager.removePluginListener(listener);
|
|
}
|
|
|
|
public Set<String> getPluginActions() {
|
|
return new PluginPrefs(mContext).getPluginList();
|
|
}
|
|
|
|
/** Notifies that a plugin state has changed */
|
|
public void notifyChange(Intent intent) {
|
|
mPluginManager.onReceive(mContext, intent);
|
|
}
|
|
|
|
@Override
|
|
public void dump(PrintWriter pw) {
|
|
final List<ComponentName> enabledPlugins = new ArrayList<>();
|
|
final List<ComponentName> disabledPlugins = new ArrayList<>();
|
|
for (String action : getPluginActions()) {
|
|
for (ResolveInfo resolveInfo : mContext.getPackageManager().queryIntentServices(
|
|
new Intent(action), MATCH_DISABLED_COMPONENTS)) {
|
|
ComponentName installedPlugin = new ComponentName(
|
|
resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
|
|
if (mPluginEnabler.isEnabled(installedPlugin)) {
|
|
enabledPlugins.add(installedPlugin);
|
|
} else {
|
|
disabledPlugins.add(installedPlugin);
|
|
}
|
|
}
|
|
}
|
|
|
|
pw.println("PluginManager:");
|
|
pw.println(" numEnabledPlugins=" + enabledPlugins.size());
|
|
pw.println(" numDisabledPlugins=" + disabledPlugins.size());
|
|
pw.println(" enabledPlugins=" + enabledPlugins);
|
|
pw.println(" disabledPlugins=" + disabledPlugins);
|
|
}
|
|
}
|