From 37dfaa61d8bae76215afe0cbc62803c0fe261987 Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 9 Nov 2026 21:04:47 +0000 Subject: [PATCH] chore: Remove unused drawables, strings, and references (#7599) --- .../checklists/ui-refinement.md | 2 +- .../navigation/model/NavigationItem.kt | 18 --- .../util/ParcelableRouteSerializer.kt | 152 ------------------ .../bitwarden/ui/platform/util/RouteUtil.kt | 17 -- ui/src/main/res/drawable/ic_arrow_right.xml | 10 -- ui/src/main/res/drawable/ic_camera.xml | 14 -- ui/src/main/res/drawable/ic_delete_item.xml | 10 -- ui/src/main/res/drawable/ic_edit_item.xml | 10 -- .../main/res/drawable/ic_more_horizontal.xml | 15 -- ui/src/main/res/drawable/ic_navigate_next.xml | 9 -- ui/src/main/res/drawable/ic_pencil_square.xml | 13 -- .../drawable/ic_region_select_dropdown.xml | 12 -- ui/src/main/res/drawable/ic_selected.xml | 10 -- ui/src/main/res/drawable/ic_tooltip.xml | 21 --- ui/src/main/res/drawable/ic_tooltip_small.xml | 20 --- ui/src/main/res/drawable/ic_visibility.xml | 14 -- .../main/res/drawable/ic_visibility_off.xml | 10 -- ui/src/main/res/drawable/ill_vault.xml | 93 ----------- ui/src/main/res/values/strings.xml | 15 -- 19 files changed, 1 insertion(+), 464 deletions(-) delete mode 100644 ui/src/main/kotlin/com/bitwarden/ui/platform/util/ParcelableRouteSerializer.kt delete mode 100644 ui/src/main/kotlin/com/bitwarden/ui/platform/util/RouteUtil.kt delete mode 100644 ui/src/main/res/drawable/ic_arrow_right.xml delete mode 100644 ui/src/main/res/drawable/ic_camera.xml delete mode 100644 ui/src/main/res/drawable/ic_delete_item.xml delete mode 100644 ui/src/main/res/drawable/ic_edit_item.xml delete mode 100644 ui/src/main/res/drawable/ic_more_horizontal.xml delete mode 100644 ui/src/main/res/drawable/ic_navigate_next.xml delete mode 100644 ui/src/main/res/drawable/ic_pencil_square.xml delete mode 100644 ui/src/main/res/drawable/ic_region_select_dropdown.xml delete mode 100644 ui/src/main/res/drawable/ic_selected.xml delete mode 100644 ui/src/main/res/drawable/ic_tooltip.xml delete mode 100644 ui/src/main/res/drawable/ic_tooltip_small.xml delete mode 100644 ui/src/main/res/drawable/ic_visibility.xml delete mode 100644 ui/src/main/res/drawable/ic_visibility_off.xml delete mode 100644 ui/src/main/res/drawable/ill_vault.xml diff --git a/.claude/skills/reviewing-changes/checklists/ui-refinement.md b/.claude/skills/reviewing-changes/checklists/ui-refinement.md index dc8c35ed0f..adc8192b5f 100644 --- a/.claude/skills/reviewing-changes/checklists/ui-refinement.md +++ b/.claude/skills/reviewing-changes/checklists/ui-refinement.md @@ -189,7 +189,7 @@ Would using the existing component maintain consistency? **app/auth/LoginScreen.kt:123** - Add contentDescription ```kotlin Icon( - painter = painterResource(R.drawable.ic_visibility), + painter = painterResource(R.drawable.ic_eye), contentDescription = "Show password", // Add for accessibility modifier = Modifier.clickable { onToggleVisibility() } ) diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/navigation/model/NavigationItem.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/navigation/model/NavigationItem.kt index 0d622b47d8..94e67f0174 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/navigation/model/NavigationItem.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/navigation/model/NavigationItem.kt @@ -20,24 +20,6 @@ interface NavigationItem { * The route of the tab's root destination, which also identifies the tab's back stack. */ val rootRoute: NavKey - // TODO: Remove this default once all modules have been migrated to Navigation3 (PM-45372). - get() = error("rootRoute is not supported by legacy Navigation Compose tabs.") - - /** - * Legacy route of the tab's Navigation Compose graph. - * - * TODO: Remove once all modules have been migrated to Navigation3 (PM-45372). - */ - val graphRoute: Any - get() = rootRoute - - /** - * Legacy route of the tab's Navigation Compose start destination. - * - * TODO: Remove once all modules have been migrated to Navigation3 (PM-45372). - */ - val startDestinationRoute: Any - get() = rootRoute /** * The test tag of the tab. diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/util/ParcelableRouteSerializer.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/util/ParcelableRouteSerializer.kt deleted file mode 100644 index 0f2d6d7174..0000000000 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/util/ParcelableRouteSerializer.kt +++ /dev/null @@ -1,152 +0,0 @@ -package com.bitwarden.ui.platform.util - -import android.os.Parcel -import android.os.Parcelable -import android.util.Base64 -import androidx.core.os.ParcelCompat -import com.bitwarden.annotation.OmitFromCoverage -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.encoding.decodeStructure -import kotlinx.serialization.encoding.encodeStructure -import kotlin.reflect.KClass - -/** - * A custom [KSerializer] for serializing and deserializing [Parcelable] classes. - * - * This serializer is compatible with Jetpack Compose type-safe navigation routes. It allows for - * complex [Parcelable] types to be easily serialized without needing to specify a `NavType` for - * all non-primitive properties and properties nested within those types. - * - * For example: - * - * ``` - * @Parcelize - * @Serializable(with = MyCustomRoute.Serializer::class) - * data class MyCustomRoute( - * val data: Data, - * ): Parcelable { - * class Serializer : ParcelableSerializer(MyCustomRoute::class) - * } - * ``` - * - * Where `Data` is a complex type implementing `Parcelable`. - * - * In addition, this serializer provides support for directly serializing to the parent types of a - * sealed class when using `SavedStateHandle.toRoute()` or `NavBackStackEntry.toRoute()`. In order - * to achieve this while also ensuring each route is unique, a subclass of this serializer should - * be defined for each parent and child type. - * - * Given the following type: - * - * ``` - * @Parcelize - * @Serializable(with = ParentRoute.Serializer::class) - * sealed class ParentRoute : Parcelable { - * class Serializer : ParcelableRouteSerializer(ParentRoute::class) - * - * @Parcelize - * @Serializable(with = Child1.Serializer::class) - * data class Child1( - * val data1: Data1, - * ) : ParentRoute() { - * class Serializer : ParcelableRouteSerializer(Child1::class) - * } - * - * @Parcelize - * @Serializable(with = Child2.Serializer::class) - * data class Child2( - * val data2: Data2, - * ) : ParentRoute() { - * class Serializer : ParcelableRouteSerializer(Child2::class) - * } - * } - * ``` - * - * The route information for a navigation to the `Child1` destination could be derived using both: - * ``` - * savedStateHandle.toRoute() - * ``` - * - * As well as: - * ``` - * when (savedStateHandle.toRoute()) { - * is Child1 -> // ... - * is Child2 -> // ... - * } - * ``` - * - * The latter is useful in cases where the same `ViewModel` is used to handle these routes. - */ -@OmitFromCoverage -open class ParcelableRouteSerializer( - private val kClass: KClass, -) : KSerializer { - - override val descriptor: SerialDescriptor - get() = buildClassSerialDescriptor(serialName = requireNotNull(kClass.qualifiedName)) { - element(elementName = "encodedData") - } - - override fun deserialize(decoder: Decoder): T = - decoder.decodeStructure(descriptor) { - var encodedString: String? = null - while (true) { - when (decodeElementIndex(descriptor)) { - 0 -> encodedString = decodeStringElement(descriptor = descriptor, index = 0) - else -> break - } - } - encodedString - ?.toParcelable() - ?: throw IllegalStateException("Invalid decoding for ${kClass.qualifiedName}.") - } - - override fun serialize(encoder: Encoder, value: T) { - val valueAsString = value.toEncodedString() - encoder.encodeStructure(descriptor = descriptor) { - encodeStringElement(descriptor = descriptor, index = 0, value = valueAsString) - } - } - - // Helpers for encoding Parcelable data - - private fun Parcelable.toBytes(): ByteArray { - val parcel = Parcel.obtain().apply { - writeParcelable(this@toBytes, 0) - } - return parcel - .marshall() - .also { parcel.recycle() } - } - - private fun Parcelable.toEncodedString(): String = - Base64.encodeToString(toBytes(), Base64.URL_SAFE) - - private fun ByteArray.toParcelable(): T? { - val parcel = Parcel.obtain().apply { - unmarshall(this@toParcelable, 0, this@toParcelable.size) - setDataPosition(0) - } - val value = try { - @Suppress("UNCHECKED_CAST") - ParcelCompat.readParcelable( - parcel, - ParcelableRouteSerializer::class.java.classLoader, - kClass.java, - ) as T? - } catch (_: IllegalArgumentException) { - null - } catch (_: IllegalStateException) { - null - } - parcel.recycle() - return value - } - - private fun String.toParcelable(): T? = Base64.decode(this, Base64.URL_SAFE).toParcelable() -} diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/util/RouteUtil.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/util/RouteUtil.kt deleted file mode 100644 index 99163f0e2e..0000000000 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/util/RouteUtil.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.bitwarden.ui.platform.util - -import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.serializer -import kotlin.reflect.KClass - -/** - * Gets the route string for an object. - */ -fun T.toObjectNavigationRoute(): String = this::class.toObjectKClassNavigationRoute() - -/** - * Gets the route string for a [KClass] of an object. - */ -@OptIn(InternalSerializationApi::class) -fun KClass.toObjectKClassNavigationRoute(): String = - this.serializer().descriptor.serialName diff --git a/ui/src/main/res/drawable/ic_arrow_right.xml b/ui/src/main/res/drawable/ic_arrow_right.xml deleted file mode 100644 index 1df294a97a..0000000000 --- a/ui/src/main/res/drawable/ic_arrow_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ic_camera.xml b/ui/src/main/res/drawable/ic_camera.xml deleted file mode 100644 index 435ec163fd..0000000000 --- a/ui/src/main/res/drawable/ic_camera.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/ui/src/main/res/drawable/ic_delete_item.xml b/ui/src/main/res/drawable/ic_delete_item.xml deleted file mode 100644 index f8780ff816..0000000000 --- a/ui/src/main/res/drawable/ic_delete_item.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ic_edit_item.xml b/ui/src/main/res/drawable/ic_edit_item.xml deleted file mode 100644 index 61a5c03a8c..0000000000 --- a/ui/src/main/res/drawable/ic_edit_item.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ic_more_horizontal.xml b/ui/src/main/res/drawable/ic_more_horizontal.xml deleted file mode 100644 index 55d76917de..0000000000 --- a/ui/src/main/res/drawable/ic_more_horizontal.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/ui/src/main/res/drawable/ic_navigate_next.xml b/ui/src/main/res/drawable/ic_navigate_next.xml deleted file mode 100644 index 7ff13e39f2..0000000000 --- a/ui/src/main/res/drawable/ic_navigate_next.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ic_pencil_square.xml b/ui/src/main/res/drawable/ic_pencil_square.xml deleted file mode 100644 index e0ba5293f5..0000000000 --- a/ui/src/main/res/drawable/ic_pencil_square.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/ui/src/main/res/drawable/ic_region_select_dropdown.xml b/ui/src/main/res/drawable/ic_region_select_dropdown.xml deleted file mode 100644 index 48378de39d..0000000000 --- a/ui/src/main/res/drawable/ic_region_select_dropdown.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/ui/src/main/res/drawable/ic_selected.xml b/ui/src/main/res/drawable/ic_selected.xml deleted file mode 100644 index d08dbfd4f4..0000000000 --- a/ui/src/main/res/drawable/ic_selected.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ic_tooltip.xml b/ui/src/main/res/drawable/ic_tooltip.xml deleted file mode 100644 index 70557ae410..0000000000 --- a/ui/src/main/res/drawable/ic_tooltip.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/ui/src/main/res/drawable/ic_tooltip_small.xml b/ui/src/main/res/drawable/ic_tooltip_small.xml deleted file mode 100644 index 149dd5ae8b..0000000000 --- a/ui/src/main/res/drawable/ic_tooltip_small.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/ui/src/main/res/drawable/ic_visibility.xml b/ui/src/main/res/drawable/ic_visibility.xml deleted file mode 100644 index cfd26a1a3a..0000000000 --- a/ui/src/main/res/drawable/ic_visibility.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/ui/src/main/res/drawable/ic_visibility_off.xml b/ui/src/main/res/drawable/ic_visibility_off.xml deleted file mode 100644 index cc86816e6c..0000000000 --- a/ui/src/main/res/drawable/ic_visibility_off.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/main/res/drawable/ill_vault.xml b/ui/src/main/res/drawable/ill_vault.xml deleted file mode 100644 index 57b6eb3977..0000000000 --- a/ui/src/main/res/drawable/ill_vault.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index d1cb1e2d8f..453224a2c8 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -4,7 +4,6 @@ Add folder Add item An error has occurred - Apply Back Cancel Copy @@ -208,7 +207,6 @@ Scanning will happen automatically. Copy TOTP If a login has an authenticator key, copy the TOTP verification code to your clipboard when you autofill the login. Copy TOTP automatically - A Premium membership is required to use this feature. Attachment deleted Attachments are a Premium feature. Your current plan does not include access to this feature. Choose file @@ -471,7 +469,6 @@ Scanning will happen automatically. When accessing the Send, hide the text by default File Deletion date - Deletion time The Send will be permanently deleted on the specified date and time. This date is enforced by your organization Who can view @@ -605,7 +602,6 @@ select Add TOTP to store the key safely Are you sure you want to turn on screen capture? Access requested Account access requested - Are you trying to log in? Are you trying to access your account? Access attempt by %1$s on %2$s Device type @@ -666,7 +662,6 @@ Do you want to switch to this account? No pending requests Enable camera permission to use the scanner Language - The language has been changed to %1$s. Please restart the app to see the change Default (System) Weak Master Password Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password? @@ -978,7 +973,6 @@ Do you want to switch to this account? Passkey operation failed because the request is unsupported. Password operation failed because the selected item does not exist. Password operation failed because the selected item does not have a valid password. - Password operation failed because no item was selected. Credential operation failed because the request is invalid. Credential operation failed because the request is unsupported. Credential operation failed because user verification attempts exceeded. @@ -1059,7 +1053,6 @@ Do you want to switch to this account? Learn more about privileged apps Privileged apps Unrecognized browser - Learn more about using passkeys with Bitwarden. All trusted apps Are you sure you want to stop trusting %s? Installed apps @@ -1076,8 +1069,6 @@ Do you want to switch to this account? Verification code added Refresh period Algorithm - Advanced - Collapse advanced options Number of digits %d second @@ -1160,7 +1151,6 @@ Do you want to switch to this account? Select a card for %s Choose an identity Advanced options - More about match detection Keep your credentials secure Learn more about how to keep credentials secure when using “%1$s”. Are you sure you want to use “%1$s”? @@ -1203,7 +1193,6 @@ Do you want to switch to this account? Import passwords, passkeys, and other item types from your Bitwarden vault. Items to import Exporting items… - Export failed Passwords Passkeys Why is this step required? @@ -1223,7 +1212,6 @@ Do you want to switch to this account? Transfer items to %1$s %1$s is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items. Learn more Decline and leave - Why am I seeing this? Migrating items to %s Failed to migrate items to %s Search archive @@ -1322,7 +1310,6 @@ Do you want to switch to this account? Archive item Once archived, this item will be excluded from search results and autofill suggestions. Pricing unavailable - Current plan Premium Billing amount Storage cost @@ -1398,8 +1385,6 @@ Do you want to switch to this account? Issuing country Issuing state / province License class - Surname - Given name Date of birth Nationality Passport type