Modes tile: open settings on long press
Test: verified that long press works regardless of qs_new_tiles flag,
incl when device is locked
Flag: android.app.modes_ui
Bug: 346519570
Change-Id: I07beea6b3a0a5533b5490414122d7a78aab885ac
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt
new file mode 100644
index 0000000..9b9e584
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractorTest.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.systemui.qs.tiles.impl.modes.domain.interactor
+
+import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject
+import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx
+import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel
+import com.google.common.truth.Truth
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@EnableFlags(android.app.Flags.FLAG_MODES_UI)
+class ModesTileUserActionInteractorTest : SysuiTestCase() {
+ private val inputHandler = FakeQSTileIntentUserInputHandler()
+
+ val underTest = ModesTileUserActionInteractor(inputHandler)
+
+ @Test
+ fun handleLongClick() = runTest {
+ underTest.handleInput(QSTileInputTestKtx.longClick(ModesTileModel(false)))
+
+ QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
+ Truth.assertThat(it.intent.action).isEqualTo(Settings.ACTION_ZEN_MODE_SETTINGS)
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt
index 930a443..b91891c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt
@@ -36,6 +36,7 @@
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.qs.tiles.impl.modes.domain.interactor.ModesTileDataInteractor
+import com.android.systemui.qs.tiles.impl.modes.domain.interactor.ModesTileUserActionInteractor
import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel
import com.android.systemui.qs.tiles.impl.modes.ui.ModesTileMapper
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
@@ -59,6 +60,7 @@
qsTileConfigProvider: QSTileConfigProvider,
dataInteractor: ModesTileDataInteractor,
private val tileMapper: ModesTileMapper,
+ private val userActionInteractor: ModesTileUserActionInteractor,
) :
QSTileImpl<BooleanState>(
host,
@@ -93,10 +95,7 @@
// TODO(b/346519570) open dialog
}
- override fun getLongClickIntent(): Intent? {
- // TODO(b/346519570) open settings
- return null
- }
+ override fun getLongClickIntent(): Intent = userActionInteractor.longClickIntent
override fun handleUpdateState(booleanState: BooleanState?, arg: Any?) {
if (arg is ModesTileModel) {
@@ -108,8 +107,6 @@
label = tileLabel
secondaryLabel = tileState.secondaryLabel
contentDescription = tileState.contentDescription
- // TODO(b/346519570) open settings
- handlesLongClick = false
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt
index e2fea84..fd1f3d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileUserActionInteractor.kt
@@ -16,14 +16,22 @@
package com.android.systemui.qs.tiles.impl.modes.domain.interactor
+import android.content.Intent
+import android.provider.Settings
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler
import com.android.systemui.qs.tiles.base.interactor.QSTileInput
import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel
import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction
import javax.inject.Inject
-class ModesTileUserActionInteractor @Inject constructor() :
- QSTileUserActionInteractor<ModesTileModel> {
+class ModesTileUserActionInteractor
+@Inject
+constructor(
+ private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
+) : QSTileUserActionInteractor<ModesTileModel> {
+ val longClickIntent = Intent(Settings.ACTION_ZEN_MODE_SETTINGS)
+
override suspend fun handleInput(input: QSTileInput<ModesTileModel>) {
with(input) {
when (action) {
@@ -31,7 +39,7 @@
// TODO(b/346519570) open dialog
}
is QSTileUserAction.LongClick -> {
- // TODO(b/346519570) open settings
+ qsTileIntentUserActionHandler.handle(action.expandable, longClickIntent)
}
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ModesTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ModesTileTest.kt
index aa25628..4c77fb8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ModesTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ModesTileTest.kt
@@ -33,7 +33,9 @@
import com.android.systemui.qs.QSHost
import com.android.systemui.qs.QsEventLogger
import com.android.systemui.qs.logging.QSLogger
+import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler
import com.android.systemui.qs.tiles.impl.modes.domain.interactor.ModesTileDataInteractor
+import com.android.systemui.qs.tiles.impl.modes.domain.interactor.ModesTileUserActionInteractor
import com.android.systemui.qs.tiles.impl.modes.ui.ModesTileMapper
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider
import com.android.systemui.qs.tiles.viewmodel.QSTileConfigTestBuilder
@@ -77,6 +79,7 @@
@Mock private lateinit var qsTileConfigProvider: QSTileConfigProvider
+ private val inputHandler = FakeQSTileIntentUserInputHandler()
private val zenModeRepository = FakeZenModeRepository()
private val tileDataInteractor = ModesTileDataInteractor(zenModeRepository)
private val mapper =
@@ -93,6 +96,7 @@
private val testDispatcher = StandardTestDispatcher()
private val testScope = TestScope(testDispatcher)
+ private lateinit var userActionInteractor: ModesTileUserActionInteractor
private lateinit var secureSettings: SecureSettings
private lateinit var testableLooper: TestableLooper
private lateinit var underTest: ModesTile
@@ -118,6 +122,8 @@
}
)
+ userActionInteractor = ModesTileUserActionInteractor(inputHandler)
+
underTest =
ModesTile(
qsHost,
@@ -131,7 +137,8 @@
qsLogger,
qsTileConfigProvider,
tileDataInteractor,
- mapper
+ mapper,
+ userActionInteractor,
)
underTest.initialize()