Remove View Injection entirely.

Fixes: 149942775
Test: manual && atest SystemUITests
Change-Id: Ib0a21aad64ab141fc4d16a181e8fba64014ea16f
This commit is contained in:
Dave Mankoff
2021-10-20 13:24:36 -04:00
parent 9fe67af49a
commit 940a1d267a
15 changed files with 13 additions and 190 deletions

View File

@@ -37,9 +37,6 @@
-keep class com.android.systemui.fragments.FragmentService$FragmentCreator {
*;
}
-keep class com.android.systemui.util.InjectionInflationController$ViewInstanceCreator {
*;
}
-keep class androidx.core.app.CoreComponentFactory
-keep public class * extends com.android.systemui.SystemUI {

View File

@@ -41,7 +41,6 @@ import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.settings.CurrentUserObservable;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.InjectionInflationController;
import java.util.ArrayList;
import java.util.Collection;
@@ -125,16 +124,16 @@ public final class ClockManager {
private final int mHeight;
@Inject
public ClockManager(Context context, InjectionInflationController injectionInflater,
public ClockManager(Context context, LayoutInflater layoutInflater,
PluginManager pluginManager, SysuiColorExtractor colorExtractor,
@Nullable DockManager dockManager, BroadcastDispatcher broadcastDispatcher) {
this(context, injectionInflater, pluginManager, colorExtractor,
this(context, layoutInflater, pluginManager, colorExtractor,
context.getContentResolver(), new CurrentUserObservable(broadcastDispatcher),
new SettingsWrapper(context.getContentResolver()), dockManager);
}
@VisibleForTesting
ClockManager(Context context, InjectionInflationController injectionInflater,
ClockManager(Context context, LayoutInflater layoutInflater,
PluginManager pluginManager, SysuiColorExtractor colorExtractor,
ContentResolver contentResolver, CurrentUserObservable currentUserObservable,
SettingsWrapper settingsWrapper, DockManager dockManager) {
@@ -147,7 +146,6 @@ public final class ClockManager {
mPreviewClocks = new AvailableClocks();
Resources res = context.getResources();
LayoutInflater layoutInflater = injectionInflater.injectable(LayoutInflater.from(context));
addBuiltinClock(() -> new DefaultClockController(res, layoutInflater, colorExtractor));

View File

@@ -25,7 +25,6 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardSliceProvider;
import com.android.systemui.people.PeopleProvider;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.util.InjectionInflationController;
import com.android.wm.shell.ShellCommandHandler;
import com.android.wm.shell.TaskViewFactory;
import com.android.wm.shell.apppairs.AppPairs;
@@ -146,11 +145,6 @@ public interface SysUIComponent {
@SysUISingleton
InitController getInitController();
/**
* ViewInstanceCreator generates all Views that need injection.
*/
InjectionInflationController.ViewInstanceCreator.Factory createViewInstanceCreatorFactory();
/**
* Member injection into the supplied argument.
*/

View File

@@ -76,7 +76,6 @@ import com.android.systemui.statusbar.policy.dagger.SmartRepliesInflationModule;
import com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule;
import com.android.systemui.tuner.dagger.TunerModule;
import com.android.systemui.user.UserModule;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.concurrency.SysUIConcurrencyModule;
import com.android.systemui.util.dagger.UtilModule;
import com.android.systemui.util.sensors.SensorModule;
@@ -218,11 +217,9 @@ public abstract class SystemUIModule {
@Provides
@SysUISingleton
static StatusBarWindowView providesStatusBarWindowView(Context context,
InjectionInflationController injectionInflationController) {
static StatusBarWindowView providesStatusBarWindowView(LayoutInflater layoutInflater) {
StatusBarWindowView view =
(StatusBarWindowView) injectionInflationController.injectable(
LayoutInflater.from(context)).inflate(R.layout.super_status_bar,
(StatusBarWindowView) layoutInflater.inflate(R.layout.super_status_bar,
/* root= */ null);
if (view == null) {
throw new IllegalStateException(

View File

@@ -37,7 +37,6 @@ import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.animation.ShadeInterpolation;
@@ -55,7 +54,6 @@ import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.LifecycleFragment;
import com.android.systemui.util.Utils;
@@ -96,7 +94,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
private ImageView mQsDragHandler;
private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
private final InjectionInflationController mInjectionInflater;
private final CommandQueue mCommandQueue;
private final QSDetailDisplayer mQsDetailDisplayer;
private final MediaHost mQsMediaHost;
@@ -146,7 +143,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
@Inject
public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
InjectionInflationController injectionInflater, QSTileHost qsTileHost,
QSTileHost qsTileHost,
StatusBarStateController statusBarStateController, CommandQueue commandQueue,
QSDetailDisplayer qsDetailDisplayer, @Named(QS_PANEL) MediaHost qsMediaHost,
@Named(QUICK_QS_PANEL) MediaHost qqsMediaHost,
@@ -154,7 +151,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
QSFragmentComponent.Factory qsComponentFactory,
FalsingManager falsingManager, DumpManager dumpManager) {
mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
mInjectionInflater = injectionInflater;
mCommandQueue = commandQueue;
mQsDetailDisplayer = qsDetailDisplayer;
mQsMediaHost = qsMediaHost;
@@ -171,9 +167,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
Bundle savedInstanceState) {
inflater = mInjectionInflater.injectable(
inflater.cloneInContext(new ContextThemeWrapper(getContext(),
R.style.Theme_SystemUI_QuickSettings)));
inflater = inflater.cloneInContext(new ContextThemeWrapper(getContext(),
R.style.Theme_SystemUI_QuickSettings));
return inflater.inflate(R.layout.qs_panel, container, false);
}

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.stack;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING;
import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT;
import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import static com.android.systemui.util.Utils.shouldUseSplitNotificationShade;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -121,9 +120,6 @@ import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import javax.inject.Inject;
import javax.inject.Named;
/**
* A layout which handles a dynamic amount of notifications and presents them in a scrollable stack.
*/
@@ -566,9 +562,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
@Nullable
private OnClickListener mManageButtonClickListener;
// TODO(b/149942757): Remove the @Inject
@Inject
public NotificationStackScrollLayout(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs) {
public NotificationStackScrollLayout(Context context, AttributeSet attrs) {
super(context, attrs, 0, 0);
Resources res = getResources();
mSectionsManager = Dependency.get(NotificationSectionsManager.class);
@@ -5261,10 +5255,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mController.getNoticationRoundessManager().setAnimatedChildren(mChildrenToAddAnimated);
}
public NotificationStackScrollLayoutController getController() {
return mController;
}
void addSwipedOutView(View v) {
mSwipedOutViews.add(v);
}

View File

@@ -56,7 +56,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.InjectionInflationController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -68,7 +67,6 @@ import javax.inject.Inject;
*/
public class NotificationShadeWindowViewController {
private static final String TAG = "NotifShadeWindowVC";
private final InjectionInflationController mInjectionInflationController;
private final NotificationWakeUpCoordinator mCoordinator;
private final PulseExpansionHandler mPulseExpansionHandler;
private final DynamicPrivacyController mDynamicPrivacyController;
@@ -116,7 +114,6 @@ public class NotificationShadeWindowViewController {
@Inject
public NotificationShadeWindowViewController(
InjectionInflationController injectionInflationController,
NotificationWakeUpCoordinator coordinator,
PulseExpansionHandler pulseExpansionHandler,
DynamicPrivacyController dynamicPrivacyController,
@@ -141,7 +138,6 @@ public class NotificationShadeWindowViewController {
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
LockIconViewController lockIconViewController) {
mInjectionInflationController = injectionInflationController;
mCoordinator = coordinator;
mPulseExpansionHandler = pulseExpansionHandler;
mDynamicPrivacyController = dynamicPrivacyController;

View File

@@ -1218,7 +1218,7 @@ public class StatusBar extends SystemUI implements
// TODO (b/136993073) Separate notification shade and status bar
mHeadsUpAppearanceController = new HeadsUpAppearanceController(
mNotificationIconAreaController, mHeadsUpManager,
mStackScroller.getController(),
mStackScrollerController,
mStatusBarStateController, mKeyguardBypassController,
mKeyguardStateController, mWakeUpCoordinator, mCommandQueue,
mNotificationPanelViewController, mStatusBarView);

View File

@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.phone.dagger;
import android.annotation.Nullable;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
@@ -33,7 +32,6 @@ import com.android.systemui.statusbar.phone.NotificationPanelView;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
import com.android.systemui.statusbar.phone.TapAgainView;
import com.android.systemui.util.InjectionInflationController;
import javax.inject.Named;
@@ -49,12 +47,9 @@ public abstract class StatusBarViewModule {
@Provides
@StatusBarComponent.StatusBarScope
public static NotificationShadeWindowView providesNotificationShadeWindowView(
InjectionInflationController injectionInflationController,
Context context) {
LayoutInflater layoutInflater) {
NotificationShadeWindowView notificationShadeWindowView = (NotificationShadeWindowView)
injectionInflationController.injectable(
LayoutInflater.from(context)).inflate(R.layout.super_notification_shade,
/* root= */ null);
layoutInflater.inflate(R.layout.super_notification_shade, /* root= */ null);
if (notificationShadeWindowView == null) {
throw new IllegalStateException(
"R.layout.super_notification_shade could not be properly inflated");

View File

@@ -1,120 +0,0 @@
/*
* Copyright (C) 2018 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.util;
import android.content.Context;
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import javax.inject.Inject;
import javax.inject.Named;
import dagger.BindsInstance;
import dagger.Subcomponent;
/**
* Manages inflation that requires dagger injection.
* See docs/dagger.md for details.
*/
@SysUISingleton
public class InjectionInflationController {
public static final String VIEW_CONTEXT = "view_context";
private final ArrayMap<String, Method> mInjectionMap = new ArrayMap<>();
private final LayoutInflater.Factory2 mFactory = new InjectionFactory();
private final ViewInstanceCreator.Factory mViewInstanceCreatorFactory;
@Inject
public InjectionInflationController(ViewInstanceCreator.Factory viewInstanceCreatorFactory) {
mViewInstanceCreatorFactory = viewInstanceCreatorFactory;
initInjectionMap();
}
/**
* Wraps a {@link LayoutInflater} to support creating dagger injected views.
* See docs/dagger.md for details.
*/
public LayoutInflater injectable(LayoutInflater inflater) {
LayoutInflater ret = inflater.cloneInContext(inflater.getContext());
ret.setPrivateFactory(mFactory);
return ret;
}
private void initInjectionMap() {
for (Method method : ViewInstanceCreator.class.getDeclaredMethods()) {
if (View.class.isAssignableFrom(method.getReturnType())
&& (method.getModifiers() & Modifier.PUBLIC) != 0) {
mInjectionMap.put(method.getReturnType().getName(), method);
}
}
}
/**
* Subcomponent that actually creates injected views.
*/
@Subcomponent
public interface ViewInstanceCreator {
/** Factory for creating a ViewInstanceCreator. */
@Subcomponent.Factory
interface Factory {
ViewInstanceCreator build(
@BindsInstance @Named(VIEW_CONTEXT) Context context,
@BindsInstance AttributeSet attributeSet);
}
/**
* Creates the NotificationStackScrollLayout.
*/
NotificationStackScrollLayout createNotificationStackScrollLayout();
}
private class InjectionFactory implements LayoutInflater.Factory2 {
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
Method creationMethod = mInjectionMap.get(name);
if (creationMethod != null) {
try {
return (View) creationMethod.invoke(
mViewInstanceCreatorFactory.build(context, attrs));
} catch (IllegalAccessException e) {
throw new InflateException("Could not inflate " + name, e);
} catch (InvocationTargetException e) {
throw new InflateException("Could not inflate " + name, e);
}
}
return null;
}
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return onCreateView(name, context, attrs);
}
}
}

View File

@@ -17,7 +17,6 @@ package com.android.keyguard.clock;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
@@ -40,7 +39,6 @@ import com.android.systemui.dock.DockManagerFake;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.settings.CurrentUserObservable;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.InjectionInflationController;
import org.junit.After;
import org.junit.Before;
@@ -69,7 +67,6 @@ public final class ClockManagerTest extends SysuiTestCase {
private ContentObserver mContentObserver;
private DockManagerFake mFakeDockManager;
private MutableLiveData<Integer> mCurrentUser;
@Mock InjectionInflationController mMockInjectionInflationController;
@Mock PluginManager mMockPluginManager;
@Mock SysuiColorExtractor mMockColorExtractor;
@Mock ContentResolver mMockContentResolver;
@@ -83,7 +80,6 @@ public final class ClockManagerTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this);
LayoutInflater inflater = LayoutInflater.from(getContext());
when(mMockInjectionInflationController.injectable(any())).thenReturn(inflater);
mFakeDockManager = new DockManagerFake();
@@ -91,7 +87,7 @@ public final class ClockManagerTest extends SysuiTestCase {
mCurrentUser.setValue(MAIN_USER_ID);
when(mMockCurrentUserObserable.getCurrentUser()).thenReturn(mCurrentUser);
mClockManager = new ClockManager(getContext(), mMockInjectionInflationController,
mClockManager = new ClockManager(getContext(), inflater,
mMockPluginManager, mMockColorExtractor, mMockContentResolver,
mMockCurrentUserObserable, mMockSettingsWrapper, mFakeDockManager);

View File

@@ -39,7 +39,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.keyguard.CarrierText;
import com.android.systemui.Dependency;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager;
@@ -64,7 +63,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.InjectionInflationController;
import com.android.systemui.util.settings.SecureSettings;
import org.junit.Before;
@@ -186,10 +184,6 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
return new QSFragment(
new RemoteInputQuickSettingsDisabler(context, mock(ConfigurationController.class),
commandQueue),
new InjectionInflationController(
SystemUIFactory.getInstance()
.getSysUIComponent()
.createViewInstanceCreatorFactory()),
mock(QSTileHost.class),
mock(StatusBarStateController.class),
commandQueue,

View File

@@ -384,8 +384,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
when(mView.findViewById(R.id.notification_stack_scroller))
.thenReturn(mNotificationStackScrollLayout);
when(mView.findViewById(R.id.communal_host)).thenReturn(mCommunalHostView);
when(mNotificationStackScrollLayout.getController())
.thenReturn(mNotificationStackScrollLayoutController);
when(mNotificationStackScrollLayoutController.getHeight()).thenReturn(1000);
when(mNotificationStackScrollLayoutController.getHeadsUpCallback())
.thenReturn(mHeadsUpCallback);

View File

@@ -34,7 +34,6 @@ import androidx.test.filters.SmallTest;
import com.android.keyguard.LockIconViewController;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingCollectorFake;
import com.android.systemui.dock.DockManager;
@@ -55,7 +54,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.InjectionInflationController;
import org.junit.Before;
import org.junit.Test;
@@ -117,10 +115,6 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase {
when(mDockManager.isDocked()).thenReturn(false);
mController = new NotificationShadeWindowViewController(
new InjectionInflationController(
SystemUIFactory.getInstance()
.getSysUIComponent()
.createViewInstanceCreatorFactory()),
mCoordinator,
mPulseExpansionHandler,
mDynamicPrivacyController,

View File

@@ -314,7 +314,6 @@ public class StatusBarTest extends SysuiTestCase {
mContext.setTheme(R.style.Theme_SystemUI_LightWallpaper);
when(mStackScroller.getController()).thenReturn(mStackScrollerController);
when(mStackScrollerController.getView()).thenReturn(mStackScroller);
when(mStackScrollerController.getNotificationListContainer()).thenReturn(
mNotificationListContainer);