summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabián Kozynski <kozynski@google.com> 2023-03-24 14:38:16 -0400
committer Fabián Kozynski <kozynski@google.com> 2023-03-28 10:17:27 -0400
commita56d656bcee339311f4bb71546e3906c19817c5a (patch)
treed1715f027df757e38c06cdb192ccba996e53c3d9
parent0bbf3f59891b2b8c2f7b385bd6fe699d7b00774b (diff)
Add a TileSpec data type
Test: atest TileSpecTest Bug: 274108007 Change-Id: I8ddb7bdf89431cfedd6fb6d88a19f1cf3231eec7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt85
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt89
2 files changed, 174 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
new file mode 100644
index 000000000000..c691c2f668ad
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/TileSpec.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2023 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.pipeline.shared
+
+import android.content.ComponentName
+import android.text.TextUtils
+import com.android.systemui.qs.external.CustomTile
+
+/**
+ * Container for the spec that identifies a tile.
+ *
+ * A tile's [spec] is one of two options:
+ * * `custom(<componentName>)`: A [ComponentName] surrounded by [CustomTile.PREFIX] and terminated
+ * by `)`, represents a tile provided by an app, corresponding to a `TileService`.
+ * * a string not starting with [CustomTile.PREFIX], representing a tile provided by SystemUI.
+ */
+sealed class TileSpec private constructor(open val spec: String) {
+
+ /** Represents a spec that couldn't be parsed into a valid type of tile. */
+ object Invalid : TileSpec("") {
+ override fun toString(): String {
+ return "TileSpec.INVALID"
+ }
+ }
+
+ /** Container for the spec of a tile provided by SystemUI. */
+ data class PlatformTileSpec
+ internal constructor(
+ override val spec: String,
+ ) : TileSpec(spec)
+
+ /**
+ * Container for the spec of a tile provided by an app.
+ *
+ * [componentName] indicates the associated `TileService`.
+ */
+ data class CustomTileSpec
+ internal constructor(
+ override val spec: String,
+ val componentName: ComponentName,
+ ) : TileSpec(spec)
+
+ companion object {
+ /** Create a [TileSpec] from the string [spec]. */
+ fun create(spec: String): TileSpec {
+ return if (TextUtils.isEmpty(spec)) {
+ Invalid
+ } else if (!spec.isCustomTileSpec) {
+ PlatformTileSpec(spec)
+ } else {
+ spec.componentName?.let { CustomTileSpec(spec, it) } ?: Invalid
+ }
+ }
+
+ private val String.isCustomTileSpec: Boolean
+ get() = startsWith(CustomTile.PREFIX)
+
+ private val String.componentName: ComponentName?
+ get() =
+ if (!isCustomTileSpec) {
+ null
+ } else {
+ if (endsWith(")")) {
+ val extracted = substring(CustomTile.PREFIX.length, length - 1)
+ ComponentName.unflattenFromString(extracted)
+ } else {
+ null
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
new file mode 100644
index 000000000000..d880172c1ba6
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2023 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.pipeline.shared
+
+import android.content.ComponentName
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class TileSpecTest : SysuiTestCase() {
+
+ @Test
+ fun platformTile() {
+ val spec = "spec"
+
+ val tileSpec = TileSpec.create(spec)
+
+ assertThat(tileSpec is TileSpec.PlatformTileSpec).isTrue()
+ assertThat(tileSpec.spec).isEqualTo(spec)
+ }
+
+ @Test
+ fun customTile() {
+ val componentName = ComponentName("test_pkg", "test_cls")
+ val spec = CUSTOM_TILE_PREFIX + componentName.flattenToString() + ")"
+
+ val tileSpec = TileSpec.create(spec)
+
+ assertThat(tileSpec is TileSpec.CustomTileSpec).isTrue()
+ assertThat(tileSpec.spec).isEqualTo(spec)
+ assertThat((tileSpec as TileSpec.CustomTileSpec).componentName).isEqualTo(componentName)
+ }
+
+ @Test
+ fun emptyCustomTile_invalid() {
+ val spec = CUSTOM_TILE_PREFIX + ")"
+
+ val tileSpec = TileSpec.create(spec)
+
+ assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+ }
+
+ @Test
+ fun invalidCustomTileSpec_invalid() {
+ val spec = CUSTOM_TILE_PREFIX + "invalid)"
+
+ val tileSpec = TileSpec.create(spec)
+
+ assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+ }
+
+ @Test
+ fun customTileNotEndsWithParenthesis_invalid() {
+ val componentName = ComponentName("test_pkg", "test_cls")
+ val spec = CUSTOM_TILE_PREFIX + componentName.flattenToString()
+
+ val tileSpec = TileSpec.create(spec)
+
+ assertThat(tileSpec).isEqualTo(TileSpec.Invalid)
+ }
+
+ @Test
+ fun emptySpec_invalid() {
+ assertThat(TileSpec.create("")).isEqualTo(TileSpec.Invalid)
+ }
+
+ companion object {
+ private const val CUSTOM_TILE_PREFIX = "custom("
+ }
+}