diff options
| author | 2023-03-24 14:38:16 -0400 | |
|---|---|---|
| committer | 2023-03-28 10:17:27 -0400 | |
| commit | a56d656bcee339311f4bb71546e3906c19817c5a (patch) | |
| tree | d1715f027df757e38c06cdb192ccba996e53c3d9 | |
| parent | 0bbf3f59891b2b8c2f7b385bd6fe699d7b00774b (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.kt | 85 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt | 89 |
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(" + } +} |