Merge "Remove "Device Controls" from Settings" into sc-dev
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index a9b92a3..1381955 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9428,9 +9428,12 @@
          * 0 indicates disabled and 1 indicates enabled. A non existent value should be treated as
          * enabled.
          *
+         * @deprecated Controls are migrated to Quick Settings, rendering this unnecessary and will
+         *             be removed in a future release.
          * @hide
          */
         @Readable
+        @Deprecated
         public static final String CONTROLS_ENABLED = "controls_enabled";
 
         /**
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
index 496741b..ea1ade41 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt
@@ -40,11 +40,6 @@
  */
 interface ControlsController : UserAwareController {
 
-    /**
-     * Whether the controls system is available for the current user.
-     */
-    val available: Boolean
-
     // SERVICE COMMUNICATION
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
index 8c3ef68..5d0127a 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt
@@ -28,7 +28,6 @@
 import android.net.Uri
 import android.os.Environment
 import android.os.UserHandle
-import android.provider.Settings
 import android.service.controls.Control
 import android.service.controls.actions.ControlAction
 import android.util.ArrayMap
@@ -70,15 +69,10 @@
 
     companion object {
         private const val TAG = "ControlsControllerImpl"
-        internal const val CONTROLS_AVAILABLE = Settings.Secure.CONTROLS_ENABLED
-        internal val URI = Settings.Secure.getUriFor(CONTROLS_AVAILABLE)
         private const val USER_CHANGE_RETRY_DELAY = 500L // ms
         private const val DEFAULT_ENABLED = 1
         private const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
         const val SUGGESTED_CONTROLS_PER_STRUCTURE = 6
-
-        private fun isAvailable(userId: Int, cr: ContentResolver) = Settings.Secure.getIntForUser(
-            cr, CONTROLS_AVAILABLE, DEFAULT_ENABLED, userId) != 0
     }
 
     private var userChanging: Boolean = true
@@ -93,8 +87,6 @@
 
     private val contentResolver: ContentResolver
         get() = context.contentResolver
-    override var available = isAvailable(currentUserId, contentResolver)
-        private set
 
     private val persistenceWrapper: ControlsFavoritePersistenceWrapper
     @VisibleForTesting
@@ -126,8 +118,7 @@
                 BackupManager(userStructure.userContext)
         )
         auxiliaryPersistenceWrapper.changeFile(userStructure.auxiliaryFile)
-        available = isAvailable(newUser.identifier, contentResolver)
-        resetFavorites(available)
+        resetFavorites()
         bindingController.changeUser(newUser)
         listingController.changeUser(newUser)
         userChanging = false
@@ -157,7 +148,7 @@
                     Log.d(TAG, "Restore finished, storing auxiliary favorites")
                     auxiliaryPersistenceWrapper.initialize()
                     persistenceWrapper.storeFavorites(auxiliaryPersistenceWrapper.favorites)
-                    resetFavorites(available)
+                    resetFavorites()
                 }
             }
         }
@@ -176,8 +167,7 @@
             if (userChanging || userId != currentUserId) {
                 return
             }
-            available = isAvailable(currentUserId, contentResolver)
-            resetFavorites(available)
+            resetFavorites()
         }
     }
 
@@ -242,7 +232,7 @@
 
     init {
         dumpManager.registerDumpable(javaClass.name, this)
-        resetFavorites(available)
+        resetFavorites()
         userChanging = false
         broadcastDispatcher.registerReceiver(
                 userSwitchReceiver,
@@ -256,23 +246,18 @@
             PERMISSION_SELF,
             null
         )
-        contentResolver.registerContentObserver(URI, false, settingObserver, UserHandle.USER_ALL)
         listingController.addCallback(listingCallback)
     }
 
     fun destroy() {
         broadcastDispatcher.unregisterReceiver(userSwitchReceiver)
         context.unregisterReceiver(restoreFinishedReceiver)
-        contentResolver.unregisterContentObserver(settingObserver)
         listingController.removeCallback(listingCallback)
     }
 
-    private fun resetFavorites(shouldLoad: Boolean) {
+    private fun resetFavorites() {
         Favorites.clear()
-
-        if (shouldLoad) {
-            Favorites.load(persistenceWrapper.readFavorites())
-        }
+        Favorites.load(persistenceWrapper.readFavorites())
     }
 
     private fun confirmAvailability(): Boolean {
@@ -280,10 +265,6 @@
             Log.w(TAG, "Controls not available while user is changing")
             return false
         }
-        if (!available) {
-            Log.d(TAG, "Controls not available")
-            return false
-        }
         return true
     }
 
@@ -577,7 +558,6 @@
 
     override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
         pw.println("ControlsController state:")
-        pw.println("  Available: $available")
         pw.println("  Changing users: $userChanging")
         pw.println("  Current user: ${currentUser.identifier}")
         pw.println("  Favorites:")
diff --git a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
index 6b7a1ac..5557c86 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/dagger/ControlsComponent.kt
@@ -93,7 +93,7 @@
     /**
      * @return true if controls are feature-enabled and the user has the setting enabled
      */
-    fun isEnabled() = featureEnabled && lazyControlsController.get().available
+    fun isEnabled() = featureEnabled
 
     /**
      * Returns one of 3 states:
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
index 4ed6106..f9e7f0e 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestDialog.kt
@@ -71,10 +71,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        if (!controller.available) {
-            Log.w(TAG, "Quick Controls not available for this user ")
-            finish()
-        }
+
         currentUserTracker.startTracking()
         controlsListingController.addCallback(callback)
 
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
index ac13aad..2bbd3cb 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt
@@ -23,8 +23,6 @@
 import android.view.ViewGroup
 
 interface ControlsUiController {
-    val available: Boolean
-
     companion object {
         public const val TAG = "ControlsUiController"
         public const val EXTRA_ANIMATE = "extra_animate"
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index 954bfb3..26be987 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -128,9 +128,6 @@
             reload(parent)
     }
 
-    override val available: Boolean
-        get() = controlsController.get().available
-
     private lateinit var activityContext: Context
     private lateinit var listingCallback: ControlsListingController.ControlsListingCallback
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 3dd4a3b..fa32620 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -16,6 +16,7 @@
 
 import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.Resources;
 import android.hardware.display.ColorDisplayManager;
@@ -294,9 +295,11 @@
     private final DeviceControlsController.Callback mDeviceControlsCallback =
             new DeviceControlsController.Callback() {
         @Override
-        public void onControlsAvailable(int position) {
+        public void onControlsUpdate(@Nullable Integer position) {
             if (mAutoTracker.isAdded(DEVICE_CONTROLS)) return;
-            mHost.addTile(DEVICE_CONTROLS, position);
+            if (position != null) {
+                mHost.addTile(DEVICE_CONTROLS, position);
+            }
             mAutoTracker.setTileAdded(DEVICE_CONTROLS);
             mHandler.post(() -> mDeviceControlsController.removeCallback());
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
index b211898..e2bebbe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
@@ -24,7 +24,7 @@
         /**
          * If controls become available, initiate this callback with the desired position
          */
-        fun onControlsAvailable(position: Int)
+        fun onControlsUpdate(position: Int?)
     }
 
     /** Add callback, supporting only a single callback at once */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
index a4fd647..7563b30 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.SharedPreferences
+import android.provider.Settings
 import android.util.Log
 
 import com.android.systemui.R
@@ -29,6 +30,7 @@
 import com.android.systemui.qs.QSTileHost.POSITION_AT_END
 import com.android.systemui.settings.UserContextProvider
 import com.android.systemui.statusbar.policy.DeviceControlsController.Callback
+import com.android.systemui.util.settings.SecureSettings
 
 import javax.inject.Inject
 
@@ -45,7 +47,8 @@
 public class DeviceControlsControllerImpl @Inject constructor(
     private val context: Context,
     private val controlsComponent: ControlsComponent,
-    private val userContextProvider: UserContextProvider
+    private val userContextProvider: UserContextProvider,
+    private val secureSettings: SecureSettings
 ) : DeviceControlsController {
 
     private var callback: Callback? = null
@@ -73,6 +76,7 @@
         controlsComponent.getControlsController().ifPresent {
             if (!it.getFavorites().isEmpty()) {
                 position = QS_PRIORITY_POSITION
+                fireControlsUpdate()
             }
         }
     }
@@ -80,20 +84,22 @@
     /**
      * This migration logic assumes that something like [AutoTileManager] is tracking state
      * externally, and won't call this method after receiving a response via
-     * [Callback#onControlsAvailable], once per user. Otherwise the calculated position may be
+     * [Callback#onControlsUpdate], once per user. Otherwise the calculated position may be
      * incorrect.
      */
     override fun setCallback(callback: Callback) {
         // Treat any additional call as a reset before recalculating
         removeCallback()
-
-        checkMigrationToQs()
-        controlsComponent.getControlsListingController().ifPresent {
-            it.addCallback(listingCallback)
-        }
-
         this.callback = callback
-        fireControlsAvailable()
+
+        if (secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1) == 0) {
+            fireControlsUpdate()
+        } else {
+            checkMigrationToQs()
+            controlsComponent.getControlsListingController().ifPresent {
+                it.addCallback(listingCallback)
+            }
+        }
     }
 
     override fun removeCallback() {
@@ -104,11 +110,9 @@
         }
     }
 
-    private fun fireControlsAvailable() {
-        position?.let {
-            Log.i(TAG, "Setting DeviceControlsTile position: $it")
-            callback?.onControlsAvailable(it)
-        }
+    private fun fireControlsUpdate() {
+        Log.i(TAG, "Setting DeviceControlsTile position: $position")
+        callback?.onControlsUpdate(position)
     }
 
     /**
@@ -155,7 +159,7 @@
                         if (position == null) {
                             position = QS_DEFAULT_POSITION
                         }
-                        fireControlsAvailable()
+                        fireControlsUpdate()
 
                         controlsComponent.getControlsListingController().ifPresent {
                             it.removeCallback(listingCallback)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
index f6c836a..a80fbbe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt
@@ -24,7 +24,6 @@
 import android.content.Intent
 import android.content.pm.ServiceInfo
 import android.os.UserHandle
-import android.provider.Settings
 import android.service.controls.Control
 import android.service.controls.DeviceTypes
 import android.service.controls.actions.ControlAction
@@ -141,11 +140,6 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
 
-        Settings.Secure.putInt(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 1)
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 1, otherUser)
-
         `when`(userTracker.userHandle).thenReturn(UserHandle.of(user))
 
         delayableExecutor = FakeExecutor(FakeSystemClock())
@@ -172,7 +166,6 @@
         )
         controller.auxiliaryPersistenceWrapper = auxiliaryPersistenceWrapper
 
-        assertTrue(controller.available)
         verify(broadcastDispatcher).registerReceiver(
                 capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL))
 
@@ -527,58 +520,6 @@
         verify(listingController).changeUser(UserHandle.of(otherUser))
         assertTrue(controller.getFavorites().isEmpty())
         assertEquals(otherUser, controller.currentUserId)
-        assertTrue(controller.available)
-    }
-
-    @Test
-    fun testDisableFeature_notAvailable() {
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, user)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, 0)
-        assertFalse(controller.available)
-    }
-
-    @Test
-    fun testDisableFeature_clearFavorites() {
-        controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
-        delayableExecutor.runAllReady()
-
-        assertFalse(controller.getFavorites().isEmpty())
-
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, user)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, user)
-        assertTrue(controller.getFavorites().isEmpty())
-    }
-
-    @Test
-    fun testDisableFeature_noChangeForNotCurrentUser() {
-        controller.replaceFavoritesForStructure(TEST_STRUCTURE_INFO)
-        delayableExecutor.runAllReady()
-
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, otherUser)
-        controller.settingObserver.onChange(false, listOf(ControlsControllerImpl.URI), 0, otherUser)
-
-        assertTrue(controller.available)
-        assertFalse(controller.getFavorites().isEmpty())
-    }
-
-    @Test
-    fun testCorrectUserSettingOnUserChange() {
-        Settings.Secure.putIntForUser(mContext.contentResolver,
-                ControlsControllerImpl.CONTROLS_AVAILABLE, 0, otherUser)
-
-        val intent = Intent(Intent.ACTION_USER_SWITCHED).apply {
-            putExtra(Intent.EXTRA_USER_HANDLE, otherUser)
-        }
-        val pendingResult = mock(BroadcastReceiver.PendingResult::class.java)
-        `when`(pendingResult.sendingUserId).thenReturn(otherUser)
-        broadcastReceiverCaptor.value.pendingResult = pendingResult
-
-        broadcastReceiverCaptor.value.onReceive(mContext, intent)
-
-        assertFalse(controller.available)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
index b8f91b8..c678f46 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/dagger/ControlsComponentTest.kt
@@ -103,7 +103,6 @@
 
     @Test
     fun testFeatureEnabledAfterBootVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_REQUIRED_AFTER_BOOT)
         val component = setupComponent(true)
@@ -113,7 +112,6 @@
 
     @Test
     fun testFeatureEnabledAndCannotShowOnLockScreenVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(false)
@@ -126,7 +124,6 @@
 
     @Test
     fun testFeatureEnabledAndCanShowOnLockScreenVisibility() {
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(false)
@@ -141,7 +138,6 @@
     fun testFeatureEnabledAndCanShowWhileUnlockedVisibility() {
         `when`(secureSettings.getInt(eq(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT), anyInt()))
             .thenReturn(0)
-        `when`(controller.available).thenReturn(true)
         `when`(lockPatternUtils.getStrongAuthForUser(anyInt()))
             .thenReturn(STRONG_AUTH_NOT_REQUIRED)
         `when`(keyguardStateController.isUnlocked()).thenReturn(true)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
index 0122db6..a328d9e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestDialogTest.kt
@@ -110,7 +110,6 @@
         intent.putExtra(ControlsProviderService.EXTRA_CONTROL, control)
 
         `when`(controller.currentUserId).thenReturn(USER_ID)
-        `when`(controller.available).thenReturn(true)
         `when`(listingController.getAppLabel(CONTROL_COMPONENT)).thenReturn(LABEL)
         `when`(controller.getFavoritesForComponent(CONTROL_COMPONENT)).thenReturn(emptyList())
 
@@ -142,4 +141,4 @@
             assertEquals(control.deviceType, it.deviceType)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
index a59f45d..aa76651 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt
@@ -105,7 +105,6 @@
         doNothing().`when`(spiedContext).startActivity(any(Intent::class.java))
         `when`(qsHost.context).thenReturn(spiedContext)
         `when`(qsHost.uiEventLogger).thenReturn(uiEventLogger)
-        `when`(controlsController.available).thenReturn(true)
         `when`(controlsComponent.isEnabled()).thenReturn(true)
         secureSettings.putInt(Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT, 1)
 
@@ -154,14 +153,6 @@
     }
 
     @Test
-    fun testAvailableControlsSettingOff() {
-        `when`(controlsController.available).thenReturn(false)
-
-        tile = createTile()
-        assertThat(tile.isAvailable).isTrue()
-    }
-
-    @Test
     fun testObservingCallback() {
         verify(controlsListingController).observe(
                 any(LifecycleOwner::class.java),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
index 95a363e..e9d16a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt
@@ -19,6 +19,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.pm.ServiceInfo
+import android.provider.Settings
 import android.testing.AndroidTestingRunner
 
 import androidx.test.filters.SmallTest
@@ -37,6 +38,7 @@
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_SEEDING_COMPLETED
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_DEFAULT_POSITION
 import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.QS_PRIORITY_POSITION
+import com.android.systemui.util.settings.SecureSettings
 
 import java.util.Optional
 import java.util.function.Consumer
@@ -55,6 +57,7 @@
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.`when`
 import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyObject
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -76,6 +79,8 @@
     private lateinit var serviceInfo: ServiceInfo
     @Mock
     private lateinit var userContextProvider: UserContextProvider
+    @Mock
+    private lateinit var secureSettings: SecureSettings
     @Captor
     private lateinit var seedCallback: ArgumentCaptor<Consumer<SeedResponse>>
 
@@ -98,7 +103,14 @@
         `when`(controlsComponent.getControlsListingController())
                 .thenReturn(Optional.of(controlsListingController))
 
-        controller = DeviceControlsControllerImpl(mContext, controlsComponent, userContextProvider)
+        controller = DeviceControlsControllerImpl(
+            mContext,
+            controlsComponent,
+            userContextProvider,
+            secureSettings
+        )
+
+        `when`(secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1)).thenReturn(1)
 
         `when`(serviceInfo.componentName).thenReturn(TEST_COMPONENT)
         controlsServiceInfo = ControlsServiceInfo(mContext, serviceInfo)
@@ -116,7 +128,16 @@
 
         verify(controlsListingController).addCallback(capture(listingCallbackCaptor))
         listingCallbackCaptor.value.onServicesUpdated(emptyList())
-        verify(callback, never()).onControlsAvailable(anyInt())
+        verify(callback, never()).onControlsUpdate(anyInt())
+    }
+
+    @Test
+    fun testCallbackWithNullValueWhenSettingIsDisabled() {
+        `when`(secureSettings.getInt(Settings.Secure.CONTROLS_ENABLED, 1)).thenReturn(0)
+        controller.setCallback(callback)
+
+        verify(controlsListingController, never()).addCallback(anyObject())
+        verify(callback).onControlsUpdate(null)
     }
 
     @Test
@@ -126,7 +147,7 @@
 
         verify(controlsListingController).addCallback(capture(listingCallbackCaptor))
         listingCallbackCaptor.value.onServicesUpdated(listOf(controlsServiceInfo))
-        verify(callback).onControlsAvailable(QS_PRIORITY_POSITION)
+        verify(callback).onControlsUpdate(QS_PRIORITY_POSITION)
     }
 
     @Test
@@ -146,6 +167,6 @@
             capture(seedCallback)
         )
         seedCallback.value.accept(SeedResponse(TEST_PKG, true))
-        verify(callback).onControlsAvailable(QS_DEFAULT_POSITION)
+        verify(callback).onControlsUpdate(QS_DEFAULT_POSITION)
     }
 }