Merge "Removes System UI plugin for BC Smartspace." into sc-dev

This commit is contained in:
Andy Wickham
2021-04-16 20:59:37 +00:00
committed by Android (Google) Code Review
4 changed files with 85 additions and 116 deletions

View File

@@ -23,8 +23,6 @@ import android.app.WallpaperManager;
import android.app.smartspace.SmartspaceConfig;
import android.app.smartspace.SmartspaceManager;
import android.app.smartspace.SmartspaceSession;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.text.TextUtils;
@@ -39,14 +37,13 @@ import com.android.internal.graphics.ColorUtils;
import com.android.keyguard.clock.ClockManager;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
@@ -69,14 +66,16 @@ import javax.inject.Inject;
public class KeyguardClockSwitchController extends ViewController<KeyguardClockSwitch> {
private static final boolean CUSTOM_CLOCKS_ENABLED = true;
private final Resources mResources;
private final StatusBarStateController mStatusBarStateController;
private final SysuiColorExtractor mColorExtractor;
private final ClockManager mClockManager;
private final KeyguardSliceViewController mKeyguardSliceViewController;
private final NotificationIconAreaController mNotificationIconAreaController;
private final BroadcastDispatcher mBroadcastDispatcher;
private final Executor mUiExecutor;
private final BatteryController mBatteryController;
private final FeatureFlags mFeatureFlags;
private final SystemUIFactory mSystemUIFactory;
/**
* Clock for both small and large sizes
@@ -86,10 +85,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
private AnimatableClockController mLargeClockViewController;
private FrameLayout mLargeClockFrame;
private PluginManager mPluginManager;
private boolean mIsSmartspaceEnabled;
PluginListener mPluginListener;
private Executor mUiExecutor;
private SmartspaceSession mSmartspaceSession;
private SmartspaceSession.Callback mSmartspaceCallback;
private float mDozeAmount;
@@ -137,31 +132,28 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
@Inject
public KeyguardClockSwitchController(
KeyguardClockSwitch keyguardClockSwitch,
@Main Resources resources,
StatusBarStateController statusBarStateController,
SysuiColorExtractor colorExtractor, ClockManager clockManager,
KeyguardSliceViewController keyguardSliceViewController,
NotificationIconAreaController notificationIconAreaController,
ContentResolver contentResolver,
BroadcastDispatcher broadcastDispatcher,
PluginManager pluginManager,
FeatureFlags featureFlags,
@Main Executor uiExecutor,
BatteryController batteryController,
ConfigurationController configurationController) {
ConfigurationController configurationController,
SystemUIFactory systemUIFactory) {
super(keyguardClockSwitch);
mResources = resources;
mStatusBarStateController = statusBarStateController;
mColorExtractor = colorExtractor;
mClockManager = clockManager;
mKeyguardSliceViewController = keyguardSliceViewController;
mNotificationIconAreaController = notificationIconAreaController;
mBroadcastDispatcher = broadcastDispatcher;
mPluginManager = pluginManager;
mIsSmartspaceEnabled = featureFlags.isSmartspaceEnabled();
mFeatureFlags = featureFlags;
mUiExecutor = uiExecutor;
mBatteryController = batteryController;
mConfigurationController = configurationController;
mSystemUIFactory = systemUIFactory;
}
/**
@@ -206,75 +198,45 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
mStatusBarStateController.addCallback(mStatusBarStateListener);
mConfigurationController.addCallback(mConfigurationListener);
// If a smartspace plugin is detected, replace the existing smartspace
// (keyguard_status_area), and initialize a new session
mPluginListener = new PluginListener<BcSmartspaceDataPlugin>() {
BcSmartspaceDataPlugin smartspaceDataPlugin = mSystemUIFactory.getSmartspaceDataProvider();
if (mFeatureFlags.isSmartspaceEnabled() && smartspaceDataPlugin != null) {
View ksa = mView.findViewById(R.id.keyguard_status_area);
int ksaIndex = mView.indexOfChild(ksa);
ksa.setVisibility(View.GONE);
@Override
public void onPluginConnected(BcSmartspaceDataPlugin plugin, Context pluginContext) {
if (!mIsSmartspaceEnabled) return;
mSmartspaceView = smartspaceDataPlugin.getView(mView);
mSmartspaceView.registerDataProvider(smartspaceDataPlugin);
updateSmartspaceColor();
View asView = (View) mSmartspaceView;
View ksa = mView.findViewById(R.id.keyguard_status_area);
int ksaIndex = mView.indexOfChild(ksa);
ksa.setVisibility(View.GONE);
// Place smartspace view below normal clock...
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view);
mSmartspaceView = plugin.getView(mView);
mSmartspaceView.registerDataProvider(plugin);
updateSmartspaceColor();
View asView = (View) mSmartspaceView;
mView.addView(asView, ksaIndex, lp);
int padding = getContext().getResources()
.getDimensionPixelSize(R.dimen.below_clock_padding_start);
asView.setPadding(padding, 0, padding, 0);
// Place plugin view below normal clock...
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
MATCH_PARENT, WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, R.id.lockscreen_clock_view);
// ... but above the large clock
lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, asView.getId());
mLargeClockFrame.setLayoutParams(lp);
mView.addView(asView, ksaIndex, lp);
int padding = getContext().getResources()
.getDimensionPixelSize(R.dimen.below_clock_padding_start);
asView.setPadding(padding, 0, padding, 0);
View nic = mView.findViewById(
R.id.left_aligned_notification_icon_container);
lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, asView.getId());
nic.setLayoutParams(lp);
// ... but above the large clock
lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, asView.getId());
mLargeClockFrame.setLayoutParams(lp);
View nic = mView.findViewById(
com.android.systemui.R.id.left_aligned_notification_icon_container);
lp = (RelativeLayout.LayoutParams) nic.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, asView.getId());
nic.setLayoutParams(lp);
createSmartspaceSession(plugin);
}
@Override
public void onPluginDisconnected(BcSmartspaceDataPlugin plugin) {
if (!mIsSmartspaceEnabled) return;
mView.removeView((View) mSmartspaceView);
mView.findViewById(R.id.keyguard_status_area).setVisibility(View.VISIBLE);
View nic = mView.findViewById(
com.android.systemui.R.id.left_aligned_notification_icon_container);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)
nic.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.keyguard_status_area);
nic.setLayoutParams(lp);
mLargeClockFrame.setLayoutParams(lp);
mSmartspaceView = null;
}
private void createSmartspaceSession(BcSmartspaceDataPlugin plugin) {
mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
.createSmartspaceSession(
new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
mSmartspaceCallback = targets -> plugin.onTargetsAvailable(targets);
mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
mSmartspaceSession.requestSmartspaceUpdate();
}
};
mPluginManager.addPluginListener(mPluginListener, BcSmartspaceDataPlugin.class, false);
mSmartspaceSession = getContext().getSystemService(SmartspaceManager.class)
.createSmartspaceSession(
new SmartspaceConfig.Builder(getContext(), "lockscreen").build());
mSmartspaceCallback = targets -> smartspaceDataPlugin.onTargetsAvailable(targets);
mSmartspaceSession.registerSmartspaceUpdates(mUiExecutor, mSmartspaceCallback);
mSmartspaceSession.requestSmartspaceUpdate();
}
}
private void updateWallpaperColor() {
@@ -303,7 +265,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
mSmartspaceSession.destroy();
mSmartspaceSession = null;
}
mPluginManager.removePluginListener(mPluginListener);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mConfigurationController.removeCallback(mConfigurationListener);
}

View File

@@ -29,6 +29,7 @@ import com.android.systemui.dagger.GlobalRootComponent;
import com.android.systemui.dagger.SysUIComponent;
import com.android.systemui.dagger.WMComponent;
import com.android.systemui.navigationbar.gestural.BackGestureTfClassifierProvider;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider;
import com.android.wm.shell.transition.Transitions;
@@ -209,4 +210,8 @@ public class SystemUIFactory {
AssetManager am, String modelName) {
return new BackGestureTfClassifierProvider();
}
public BcSmartspaceDataPlugin getSmartspaceDataProvider() {
return null;
}
}

View File

@@ -26,6 +26,7 @@ import com.android.keyguard.clock.ClockModule;
import com.android.keyguard.dagger.KeyguardBouncerComponent;
import com.android.systemui.BootCompleteCache;
import com.android.systemui.BootCompleteCacheImpl;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.appops.dagger.AppOpsModule;
import com.android.systemui.assist.AssistModule;
import com.android.systemui.classifier.FalsingModule;
@@ -159,6 +160,11 @@ public abstract class SystemUIModule {
@Binds
abstract SystemClock bindSystemClock(SystemClockImpl systemClock);
@Provides
static SystemUIFactory getSystemUIFactory() {
return SystemUIFactory.getInstance();
}
// TODO: This should provided by the WM component
/** Provides Optional of BubbleManager */
@SysUISingleton

View File

@@ -16,16 +16,15 @@
package com.android.keyguard;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.test.suitebuilder.annotation.SmallTest;
@@ -38,13 +37,13 @@ import android.widget.RelativeLayout;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.keyguard.clock.ClockManager;
import com.android.systemui.R;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
@@ -87,12 +86,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
@Mock
NotificationIconAreaController mNotificationIconAreaController;
@Mock
ContentResolver mContentResolver;
@Mock
BroadcastDispatcher mBroadcastDispatcher;
@Mock
private PluginManager mPluginManager;
@Mock
private FeatureFlags mFeatureFlags;
@Mock
private Executor mExecutor;
@@ -106,6 +101,12 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
BatteryController mBatteryController;
@Mock
ConfigurationController mConfigurationController;
@Mock
BcSmartspaceDataPlugin mSmartspaceDataProvider;
@Mock
SmartspaceView mSmartspaceView;
@Mock
SystemUIFactory mSystemUIFactory;
private KeyguardClockSwitchController mController;
private View mStatusArea;
@@ -129,27 +130,28 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
when(mView.isAttachedToWindow()).thenReturn(true);
when(mResources.getString(anyInt())).thenReturn("h:mm");
when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(mSmartspaceDataProvider);
mController = new KeyguardClockSwitchController(
mView,
mResources,
mStatusBarStateController,
mColorExtractor,
mClockManager,
mKeyguardSliceViewController,
mNotificationIconAreaController,
mContentResolver,
mBroadcastDispatcher,
mPluginManager,
mFeatureFlags,
mExecutor,
mBatteryController,
mConfigurationController);
mConfigurationController,
mSystemUIFactory
);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors);
mStatusArea = mock(View.class);
mStatusArea = new View(getContext());
when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView);
}
@@ -210,43 +212,37 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
}
@Test
public void testSmartspacePluginConnectedRemovesKeyguardStatusArea() {
public void testSmartspaceEnabledRemovesKeyguardStatusArea() {
when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
mController.init();
BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
TestView view = mock(TestView.class);
when(plugin.getView(any())).thenReturn(view);
mController.mPluginListener.onPluginConnected(plugin, mContext);
verify(mStatusArea).setVisibility(View.GONE);
assertEquals(View.GONE, mStatusArea.getVisibility());
}
@Test
public void testSmartspacePluginDisconnectedShowsKeyguardStatusArea() {
public void testSmartspaceEnabledNoDataProviderShowsKeyguardStatusArea() {
when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(null);
mController.init();
BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
TestView view = mock(TestView.class);
when(plugin.getView(any())).thenReturn(view);
assertEquals(View.VISIBLE, mStatusArea.getVisibility());
}
mController.mPluginListener.onPluginConnected(plugin, mContext);
mController.mPluginListener.onPluginDisconnected(plugin);
verify(mStatusArea).setVisibility(View.VISIBLE);
@Test
public void testSmartspaceDisabledShowsKeyguardStatusArea() {
when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(false);
mController.init();
assertEquals(View.VISIBLE, mStatusArea.getVisibility());
}
@Test
public void testThemeChangeNotifiesSmartspace() {
mController.init();
verify(mSmartspaceView).setPrimaryTextColor(anyInt());
BcSmartspaceDataPlugin plugin = mock(BcSmartspaceDataPlugin.class);
TestView view = mock(TestView.class);
when(plugin.getView(any())).thenReturn(view);
mController.mPluginListener.onPluginConnected(plugin, mContext);
reset(view);
mController.getConfigurationListener().onThemeChanged();
verify(view).setPrimaryTextColor(anyInt());
verify(mSmartspaceView, times(2)).setPrimaryTextColor(anyInt());
}
private void verifyAttachment(VerificationMode times) {
@@ -257,8 +253,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
verify(mView, times).updateColors(mGradientColors);
}
private static class TestView extends View implements BcSmartspaceDataPlugin.SmartspaceView {
TestView(Context context, AttributeSet attrs) {
private static class SmartspaceView extends View
implements BcSmartspaceDataPlugin.SmartspaceView {
SmartspaceView(Context context, AttributeSet attrs) {
super(context, attrs);
}