Smartspace - Support Do Not Disturb

Add support for systemui to inform smartspace about do not disturb
settings. Address some minor spacing issues. Fix how smartspace loads
through dagger.

Fixes: 185970916
Test: atest KeyguardClockSwitchControllerTest
Change-Id: Id19244ceb45fb70a28d780fa5edefab35a5e42c4
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index 9bb2dde..69ce275 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -20,10 +20,13 @@
 import android.app.smartspace.SmartspaceAction;
 import android.app.smartspace.SmartspaceTarget;
 import android.content.Intent;
+import android.graphics.drawable.Icon;
 import android.os.Parcelable;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.Nullable;
+
 import com.android.systemui.plugins.annotations.ProvidesInterface;
 
 import java.util.List;
@@ -50,6 +53,11 @@
         return null;
     }
 
+    /**
+     * As the smartspace view becomes available, allow listeners to receive an event.
+     */
+    default void addOnAttachStateChangeListener(View.OnAttachStateChangeListener listener) { }
+
     /** Updates Smartspace data and propagates it to any listeners. */
     void onTargetsAvailable(List<SmartspaceTarget> targets);
 
@@ -83,6 +91,11 @@
          * When on the lockscreen, use the FalsingManager to help detect errant touches
          */
         void setFalsingManager(com.android.systemui.plugins.FalsingManager falsingManager);
+
+        /**
+         * Set or clear any Do Not Disturb information.
+         */
+        void setDnd(@Nullable Icon dndIcon, @Nullable String description);
     }
 
     /** Interface for launching Intents, which can differ on the lockscreen */
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
index 1cef44b..7c5459c1 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -80,6 +80,6 @@
         android:layout_width="match_parent"
         android:layout_height="@dimen/notification_shelf_height"
         android:layout_below="@id/keyguard_status_area"
-        android:paddingStart="@dimen/below_clock_padding_start"
+        android:paddingStart="@dimen/below_clock_padding_start_extra"
     />
 </com.android.keyguard.KeyguardClockSwitch>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 9b8035d..a166b09 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -94,4 +94,5 @@
     <!-- additional offset for clock switch area items -->
     <dimen name="clock_padding_start">28dp</dimen>
     <dimen name="below_clock_padding_start">32dp</dimen>
+    <dimen name="below_clock_padding_start_extra">36dp</dimen>
 </resources>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index e92cae4..dfe035d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -45,7 +45,6 @@
 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;
@@ -69,6 +68,7 @@
 import com.android.systemui.util.settings.SecureSettings;
 
 import java.util.Locale;
+import java.util.Optional;
 import java.util.TimeZone;
 import java.util.concurrent.Executor;
 
@@ -89,7 +89,6 @@
     private final Executor mUiExecutor;
     private final BatteryController mBatteryController;
     private final FeatureFlags mFeatureFlags;
-    private final SystemUIFactory mSystemUIFactory;
 
     /**
      * Clock for both small and large sizes
@@ -152,6 +151,7 @@
 
     // If set, will replace keyguard_status_area
     private BcSmartspaceDataPlugin.SmartspaceView mSmartspaceView;
+    private Optional<BcSmartspaceDataPlugin> mSmartspacePlugin;
 
     @Inject
     public KeyguardClockSwitchController(
@@ -165,14 +165,14 @@
             @Main Executor uiExecutor,
             BatteryController batteryController,
             ConfigurationController configurationController,
-            SystemUIFactory systemUIFactory,
             ActivityStarter activityStarter,
             FalsingManager falsingManager,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
             KeyguardBypassController bypassController,
             @Main Handler handler,
             UserTracker userTracker,
-            SecureSettings secureSettings) {
+            SecureSettings secureSettings,
+            Optional<BcSmartspaceDataPlugin> smartspacePlugin) {
         super(keyguardClockSwitch);
         mStatusBarStateController = statusBarStateController;
         mColorExtractor = colorExtractor;
@@ -184,7 +184,6 @@
         mUiExecutor = uiExecutor;
         mBatteryController = batteryController;
         mConfigurationController = configurationController;
-        mSystemUIFactory = systemUIFactory;
         mActivityStarter = activityStarter;
         mFalsingManager = falsingManager;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
@@ -192,6 +191,7 @@
         mHandler = handler;
         mUserTracker = userTracker;
         mSecureSettings = secureSettings;
+        mSmartspacePlugin = smartspacePlugin;
     }
 
     /**
@@ -237,8 +237,8 @@
         mStatusBarStateController.addCallback(mStatusBarStateListener);
         mConfigurationController.addCallback(mConfigurationListener);
 
-        BcSmartspaceDataPlugin smartspaceDataPlugin = mSystemUIFactory.getSmartspaceDataProvider();
-        if (mFeatureFlags.isSmartspaceEnabled() && smartspaceDataPlugin != null) {
+        if (mFeatureFlags.isSmartspaceEnabled() && mSmartspacePlugin.isPresent()) {
+            BcSmartspaceDataPlugin smartspaceDataPlugin = mSmartspacePlugin.get();
             View ksa = mView.findViewById(R.id.keyguard_status_area);
             int ksaIndex = mView.indexOfChild(ksa);
             ksa.setVisibility(View.GONE);
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index af064e1..cc167b9 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -29,7 +29,6 @@
 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;
 
@@ -210,8 +209,4 @@
             AssetManager am, String modelName) {
         return new BackGestureTfClassifierProvider();
     }
-
-    public BcSmartspaceDataPlugin getSmartspaceDataProvider() {
-        return null;
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 126724c..7fa48d4 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -38,6 +38,7 @@
 import com.android.systemui.fragments.FragmentService;
 import com.android.systemui.log.dagger.LogModule;
 import com.android.systemui.model.SysUiState;
+import com.android.systemui.plugins.BcSmartspaceDataPlugin;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.power.dagger.PowerModule;
 import com.android.systemui.recents.Recents;
@@ -151,6 +152,9 @@
     abstract HeadsUpManager optionalHeadsUpManager();
 
     @BindsOptionalOf
+    abstract BcSmartspaceDataPlugin optionalBcSmartspaceDataPlugin();
+
+    @BindsOptionalOf
     abstract Recents optionalRecents();
 
     @BindsOptionalOf
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index d07a8da..495489f 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -32,6 +32,7 @@
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
+import android.graphics.drawable.Icon;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -41,10 +42,11 @@
 import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
 
+import androidx.annotation.Nullable;
+
 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;
@@ -74,6 +76,7 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Executor;
 
 @SmallTest
@@ -117,12 +120,12 @@
     @Mock
     ConfigurationController mConfigurationController;
     @Mock
+    Optional<BcSmartspaceDataPlugin> mOptionalSmartspaceDataProvider;
+    @Mock
     BcSmartspaceDataPlugin mSmartspaceDataProvider;
     @Mock
     SmartspaceView mSmartspaceView;
     @Mock
-    SystemUIFactory mSystemUIFactory;
-    @Mock
     ActivityStarter mActivityStarter;
     @Mock
     FalsingManager mFalsingManager;
@@ -162,7 +165,6 @@
         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,
                 mStatusBarStateController,
@@ -175,14 +177,14 @@
                 mExecutor,
                 mBatteryController,
                 mConfigurationController,
-                mSystemUIFactory,
                 mActivityStarter,
                 mFalsingManager,
                 mKeyguardUpdateMonitor,
                 mBypassController,
                 mHandler,
                 mUserTracker,
-                mSecureSettings
+                mSecureSettings,
+                mOptionalSmartspaceDataProvider
         );
 
         when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
@@ -190,6 +192,8 @@
 
         mStatusArea = new View(getContext());
         when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
+        when(mOptionalSmartspaceDataProvider.isPresent()).thenReturn(true);
+        when(mOptionalSmartspaceDataProvider.get()).thenReturn(mSmartspaceDataProvider);
         when(mSmartspaceDataProvider.getView(any())).thenReturn(mSmartspaceView);
     }
 
@@ -260,7 +264,7 @@
     @Test
     public void testSmartspaceEnabledNoDataProviderShowsKeyguardStatusArea() {
         when(mFeatureFlags.isSmartspaceEnabled()).thenReturn(true);
-        when(mSystemUIFactory.getSmartspaceDataProvider()).thenReturn(null);
+        when(mOptionalSmartspaceDataProvider.isPresent()).thenReturn(false);
         mController.init();
 
         assertEquals(View.VISIBLE, mStatusArea.getVisibility());
@@ -389,5 +393,7 @@
         public void setIntentStarter(IntentStarter intentStarter) { }
 
         public void setFalsingManager(FalsingManager falsingManager) { }
+
+        public void setDnd(@Nullable Icon dndIcon, @Nullable String description) { }
     }
 }