From 94b59b159f4c2f413c5b19ae6194042ac4a12e86 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 18:21:09 -0300 Subject: [PATCH 01/10] Improve XRay implementation --- .../kotlin/com/uber/rib/core/ViewRouter.kt | 4 +- .../src/main/kotlin/com/uber/rib/core/XRay.kt | 73 +++++++++++-------- .../kotlin/com/uber/rib/core/XRayConfig.kt | 11 +++ .../test/kotlin/com/uber/rib/core/XRayTest.kt | 47 ++++++++++-- .../main/kotlin/com/uber/rib/core/Router.kt | 15 +++- 5 files changed, 107 insertions(+), 43 deletions(-) create mode 100644 android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt index b73659c3d..1da26459a 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt @@ -34,7 +34,7 @@ abstract class ViewRouter> : Router { ) : super(interactor, component) { this.view = view if (XRay.isEnabled()) { - XRay.apply(this, view) + XRay.apply(getName(), view) } } @@ -44,7 +44,7 @@ abstract class ViewRouter> : Router { ) : super(null, interactor, RibRefWatcher.getInstance(), getMainThread()) { this.view = view if (XRay.isEnabled()) { - XRay.apply(this, view) + XRay.apply(getName(), view) } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 3e545702e..0da8f650d 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -23,58 +23,60 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.view.Gravity import android.view.View +import androidx.annotation.VisibleForTesting /** Utility class that shows riblets name in its background. */ class XRay private constructor() { - private var isEnabled = false - private var textPaint: Paint? = null - private fun writeOnBitmap(bitmap: Bitmap, text: String) { - val canvas = Canvas(bitmap) - val textPaint = getTextPaint() - val xStartPoint = (bitmap.width - textPaint.measureText(text)) / 2f - val yStartPoint = bitmap.height / 2f - canvas.drawText(text, xStartPoint, yStartPoint, textPaint) + private var config = XRayConfig() + private val textPaint: Paint by lazy { + Paint().apply { + textSize = TEXT_SIZE.toFloat() + color = TEXT_COLOR + } } - private fun getTextPaint(): Paint { - if (textPaint == null) { - textPaint = - Paint().apply { - textSize = TEXT_SIZE.toFloat() - color = TEXT_COLOR - } + private fun writeOnBitmap(bitmap: Bitmap, text: String) { + Canvas(bitmap).run { + val xStartPoint = (bitmap.width - textPaint.measureText(text)) / 2f + val yStartPoint = bitmap.height / 2f + drawText(text, xStartPoint, yStartPoint, textPaint) } - return textPaint!! } companion object { private val INSTANCE = XRay() private const val FRAME_WIDTH = 500 private const val FRAME_HEIGHT = 150 - private const val XRAY_ALFA = 0.9f + private const val XRAY_ALPHA = 0.9f private const val TEXT_SIZE = 30 private const val TEXT_COLOR = Color.RED - /** Toggles state of XRay. */ + /** Setup XRay using a [XRayConfig] */ @JvmStatic - fun toggle() { - INSTANCE.isEnabled = !INSTANCE.isEnabled + public fun setup(config: XRayConfig) { + INSTANCE.config = config + } + + /** Toggles state of XRay. */ + public fun toggle() { + val config = INSTANCE.config + setup(config.copy(enabled = !config.enabled)) } /** @return `true` if XRay is enabled, `false` otherwise. */ @JvmStatic - fun isEnabled(): Boolean { - return INSTANCE.isEnabled + public fun isEnabled(): Boolean { + return INSTANCE.config.enabled } /** * Puts [ViewBuilder]s riblet name in the background of the [View] * - * @param viewRouter a [ViewRouter] which riblets name should be written. + * @param routerName the riblets name to be written. * @param view a [View] to put the name behind. */ @JvmStatic - fun apply(viewRouter: ViewRouter<*, *>, view: View) { + internal fun apply(routerName: String, view: View) { val oldBackground = view.background val bitmap: Bitmap = if (oldBackground != null) { @@ -82,11 +84,15 @@ class XRay private constructor() { } else { Bitmap.createBitmap(FRAME_WIDTH, FRAME_HEIGHT, Bitmap.Config.ARGB_8888) } - INSTANCE.writeOnBitmap(bitmap, getRibletName(viewRouter)) - val newBackground = BitmapDrawable(view.context.resources, bitmap) - newBackground.gravity = Gravity.CENTER - view.background = newBackground - view.alpha = XRAY_ALFA + INSTANCE.writeOnBitmap(bitmap, getShortRibletName(routerName)) + view.background = + BitmapDrawable(view.context.resources, bitmap).apply { + gravity = Gravity.CENTER + } + + if (INSTANCE.config.alphaEnabled) { + view.alpha = XRAY_ALPHA + } } private fun drawableToBitmap(drawable: Drawable): Bitmap { @@ -110,8 +116,13 @@ class XRay private constructor() { return bitmap } - private fun getRibletName(viewRouter: ViewRouter<*, *>): String { - return viewRouter.javaClass.simpleName.replace("Router", "") + @VisibleForTesting + internal fun getShortRibletName(originalName: String): String { + return if (originalName != "Router") { + originalName.replace("Router", "") + } else { + originalName + } } } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt new file mode 100644 index 000000000..e7c31054b --- /dev/null +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt @@ -0,0 +1,11 @@ +package com.uber.rib.core + +/** + * Configuration for XRay. + * @property enabled `true` to enable XRay. By default it is disabled. + * @property alphaEnabled `true` to enable alpha changes when XRay is enabled. + */ +public data class XRayConfig( + val enabled: Boolean = false, + val alphaEnabled: Boolean = true, +) diff --git a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt index b54bfcc28..a8ca20540 100644 --- a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt +++ b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt @@ -16,27 +16,62 @@ package com.uber.rib.core import android.view.View -import com.uber.rib.core.XRay.Companion.apply +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment @RunWith(RobolectricTestRunner::class) class XRayTest { + @Before + fun setup() { + XRay.setup(XRayConfig(enabled = true)) + } + + @Test + fun test_initial_value() { + XRay.setup(XRayConfig()) + assertFalse("XRay must be disabled by default", XRay.isEnabled()) + } @Test fun apply_changesViewBackground() { - XRay.toggle() - val viewRouter: ViewRouter<*, *> = mock() val view: View = mock { on { context } doReturn (RuntimeEnvironment.application.baseContext) } - apply(viewRouter, view) + XRay.apply("Test", view) + verify(view).background = any() + verify(view).alpha = 0.9f + } + + @Test + fun apply_changesViewBackground_alphaDisabled() { + XRay.setup(XRayConfig(enabled = true, alphaEnabled = false)) + val view: View = mock { on { context } doReturn (RuntimeEnvironment.application.baseContext) } + XRay.apply("Test", view) verify(view).background = any() - verifyNoMoreInteractions(viewRouter) + verify(view, never()).alpha = any() + } + + @Test + fun getShortRibletName_mustShortRouterName() { + assertEquals("Test", XRay.getShortRibletName("TestRouter")) + assertEquals("Router", XRay.getShortRibletName("Router")) + } + + @Test + fun xray_toggle() { + XRay.toggle() + assertFalse(XRay.isEnabled()) + + XRay.toggle() + assertTrue(XRay.isEnabled()) } } diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt index 0e381bbc6..935f67923 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt @@ -62,6 +62,13 @@ protected constructor( interactorGeneric.setRouterInternal(this) } + /** + * @return the name of the router. This is used for logging and debugging purposes. + */ + protected fun getName(): String { + return javaClass.simpleName + } + /** * Dispatch back press to the associated interactor. Do not override this. * @@ -125,8 +132,8 @@ protected constructor( ribRefWatcher.logBreadcrumb( "ATTACHED", - childRouter.javaClass.simpleName, - this.javaClass.simpleName, + childRouter.getName(), + this.getName(), ) RibEvents.emitRouterEvent(RibEventType.ATTACHED, childRouter, this) var childBundle: Bundle? = null @@ -153,8 +160,8 @@ protected constructor( ribRefWatcher.watchDeletedObject(interactor) ribRefWatcher.logBreadcrumb( "DETACHED", - childRouter.javaClass.simpleName, - this.javaClass.simpleName, + childRouter.getName(), + this.getName(), ) if (savedInstanceState != null) { val childrenBundles = savedInstanceState?.getBundleExtra(KEY_CHILD_ROUTERS) From 3054784e3b8a50338d792674b144ccab2c1d10c6 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 18:46:24 -0300 Subject: [PATCH 02/10] Fix lint and add UBER License header --- .../src/main/kotlin/com/uber/rib/core/XRay.kt | 2 +- .../kotlin/com/uber/rib/core/XRayConfig.kt | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 0da8f650d..d63e0e38d 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -54,7 +54,7 @@ class XRay private constructor() { /** Setup XRay using a [XRayConfig] */ @JvmStatic public fun setup(config: XRayConfig) { - INSTANCE.config = config + INSTANCE.config = config } /** Toggles state of XRay. */ diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt index e7c31054b..a09b8b75a 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2017. Uber Technologies + * + * 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.uber.rib.core /** @@ -6,6 +21,6 @@ package com.uber.rib.core * @property alphaEnabled `true` to enable alpha changes when XRay is enabled. */ public data class XRayConfig( - val enabled: Boolean = false, - val alphaEnabled: Boolean = true, + val enabled: Boolean = false, + val alphaEnabled: Boolean = true, ) From 4516ba44ba6d370d06df2641da5a4ab005c37d6a Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 18:47:24 -0300 Subject: [PATCH 03/10] Update UBER License header --- .../rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt index a09b8b75a..c759d0596 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017. Uber Technologies + * Copyright (C) 2013. Uber Technologies * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From a332eff601fa47cfa63b879a975e90908f66bdad Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 18:55:36 -0300 Subject: [PATCH 04/10] Fix format --- .../rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt | 4 +--- .../src/main/kotlin/com/uber/rib/core/XRayConfig.kt | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index d63e0e38d..d534ae963 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -86,9 +86,7 @@ class XRay private constructor() { } INSTANCE.writeOnBitmap(bitmap, getShortRibletName(routerName)) view.background = - BitmapDrawable(view.context.resources, bitmap).apply { - gravity = Gravity.CENTER - } + BitmapDrawable(view.context.resources, bitmap).apply { gravity = Gravity.CENTER } if (INSTANCE.config.alphaEnabled) { view.alpha = XRAY_ALPHA diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt index c759d0596..3c6988ef5 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt @@ -17,6 +17,7 @@ package com.uber.rib.core /** * Configuration for XRay. + * * @property enabled `true` to enable XRay. By default it is disabled. * @property alphaEnabled `true` to enable alpha changes when XRay is enabled. */ From 160f0b75bef6541e95bada7c2e8b669393249312 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 19:10:07 -0300 Subject: [PATCH 05/10] Fix format --- .../rib-base/src/main/kotlin/com/uber/rib/core/Router.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt index 935f67923..0bbb95851 100644 --- a/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt +++ b/android/libraries/rib-base/src/main/kotlin/com/uber/rib/core/Router.kt @@ -62,9 +62,7 @@ protected constructor( interactorGeneric.setRouterInternal(this) } - /** - * @return the name of the router. This is used for logging and debugging purposes. - */ + /** @return the name of the router. This is used for logging and debugging purposes. */ protected fun getName(): String { return javaClass.simpleName } From 7574b868e7f5f5b7133b04328bc8831783e8faff Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 6 Sep 2023 19:54:15 -0300 Subject: [PATCH 06/10] Update UBER License header --- .../rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt index 3c6988ef5..204d3962d 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013. Uber Technologies + * Copyright (C) 2023. Uber Technologies * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 39d3ae012792345e75462f16d9c779e09819fec4 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Tue, 12 Sep 2023 20:20:40 -0300 Subject: [PATCH 07/10] Apply code review requests by @psteiger --- .../kotlin/com/uber/rib/core/ViewRouter.kt | 1 + .../src/main/kotlin/com/uber/rib/core/XRay.kt | 144 +++++++++--------- .../kotlin/com/uber/rib/core/XRayConfig.kt | 27 ---- .../test/kotlin/com/uber/rib/core/XRayTest.kt | 18 ++- 4 files changed, 87 insertions(+), 103 deletions(-) delete mode 100644 android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt index 1da26459a..65384e258 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/ViewRouter.kt @@ -34,6 +34,7 @@ abstract class ViewRouter> : Router { ) : super(interactor, component) { this.view = view if (XRay.isEnabled()) { + XRay.toggle() XRay.apply(getName(), view) } } diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index d534ae963..1e24a6cea 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -26,7 +26,7 @@ import android.view.View import androidx.annotation.VisibleForTesting /** Utility class that shows riblets name in its background. */ -class XRay private constructor() { +public object XRay { private var config = XRayConfig() private val textPaint: Paint by lazy { Paint().apply { @@ -43,84 +43,90 @@ class XRay private constructor() { } } - companion object { - private val INSTANCE = XRay() - private const val FRAME_WIDTH = 500 - private const val FRAME_HEIGHT = 150 - private const val XRAY_ALPHA = 0.9f - private const val TEXT_SIZE = 30 - private const val TEXT_COLOR = Color.RED - - /** Setup XRay using a [XRayConfig] */ - @JvmStatic - public fun setup(config: XRayConfig) { - INSTANCE.config = config - } - - /** Toggles state of XRay. */ - public fun toggle() { - val config = INSTANCE.config - setup(config.copy(enabled = !config.enabled)) - } + /** Setup XRay using a [XRayConfig] */ + @JvmStatic + public fun setup(config: XRayConfig) { + this.config = config + } - /** @return `true` if XRay is enabled, `false` otherwise. */ - @JvmStatic - public fun isEnabled(): Boolean { - return INSTANCE.config.enabled - } + /** Toggles state of XRay. */ + @Deprecated( + message = "toggle() may lead to switch-on-switch-off behavior. Use setup() instead.", + replaceWith = ReplaceWith("setup(XRayConfig(enabled = !config.enabled))") + ) + @JvmStatic + public fun toggle() { + setup(config.copy(enabled = !config.enabled)) + } - /** - * Puts [ViewBuilder]s riblet name in the background of the [View] - * - * @param routerName the riblets name to be written. - * @param view a [View] to put the name behind. - */ - @JvmStatic - internal fun apply(routerName: String, view: View) { - val oldBackground = view.background - val bitmap: Bitmap = - if (oldBackground != null) { - drawableToBitmap(oldBackground) - } else { - Bitmap.createBitmap(FRAME_WIDTH, FRAME_HEIGHT, Bitmap.Config.ARGB_8888) - } - INSTANCE.writeOnBitmap(bitmap, getShortRibletName(routerName)) - view.background = - BitmapDrawable(view.context.resources, bitmap).apply { gravity = Gravity.CENTER } + /** @return `true` if XRay is enabled, `false` otherwise. */ + @JvmStatic + public fun isEnabled(): Boolean { + return this.config.enabled + } - if (INSTANCE.config.alphaEnabled) { - view.alpha = XRAY_ALPHA + /** + * Puts [ViewBuilder]s riblet name in the background of the [View] + * + * @param routerName the riblets name to be written. + * @param view a [View] to put the name behind. + */ + @JvmStatic + internal fun apply(routerName: String, view: View) { + val oldBackground = view.background + val bitmap: Bitmap = + if (oldBackground != null) { + drawableToBitmap(oldBackground) + } else { + Bitmap.createBitmap(FRAME_WIDTH, FRAME_HEIGHT, Bitmap.Config.ARGB_8888) } + writeOnBitmap(bitmap, getShortRibletName(routerName)) + view.background = + BitmapDrawable(view.context.resources, bitmap).apply { gravity = Gravity.CENTER } + + if (config.alphaEnabled) { + view.alpha = XRAY_ALPHA } + } - private fun drawableToBitmap(drawable: Drawable): Bitmap { - if (drawable is BitmapDrawable) { - if (drawable.bitmap != null) { - return drawable.bitmap - } + private fun drawableToBitmap(drawable: Drawable): Bitmap { + if (drawable is BitmapDrawable) { + if (drawable.bitmap != null) { + return drawable.bitmap } - val bitmap: Bitmap = - if (drawable.intrinsicWidth <= 0 || drawable.intrinsicHeight <= 0) { - Bitmap.createBitmap(FRAME_WIDTH, FRAME_HEIGHT, Bitmap.Config.ARGB_8888) - } else { - Bitmap.createBitmap( - drawable.intrinsicWidth, - drawable.intrinsicHeight, - Bitmap.Config.ARGB_8888, - ) - } - val canvas = Canvas(bitmap) - drawable.draw(canvas) - return bitmap } - - @VisibleForTesting - internal fun getShortRibletName(originalName: String): String { - return if (originalName != "Router") { - originalName.replace("Router", "") + val bitmap: Bitmap = + if (drawable.intrinsicWidth <= 0 || drawable.intrinsicHeight <= 0) { + Bitmap.createBitmap(FRAME_WIDTH, FRAME_HEIGHT, Bitmap.Config.ARGB_8888) } else { - originalName + Bitmap.createBitmap( + drawable.intrinsicWidth, + drawable.intrinsicHeight, + Bitmap.Config.ARGB_8888, + ) } + val canvas = Canvas(bitmap) + drawable.draw(canvas) + return bitmap + } + + @VisibleForTesting + internal fun getShortRibletName(originalName: String): String { + return if (originalName != "Router") { + originalName.replace("Router", "") + } else { + originalName } } + + private const val FRAME_WIDTH = 500 + private const val FRAME_HEIGHT = 150 + private const val XRAY_ALPHA = 0.9f + private const val TEXT_SIZE = 30 + private const val TEXT_COLOR = Color.RED } + +public data class XRayConfig( + val enabled: Boolean = false, + val alphaEnabled: Boolean = true, +) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt deleted file mode 100644 index 204d3962d..000000000 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRayConfig.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2023. Uber Technologies - * - * 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.uber.rib.core - -/** - * Configuration for XRay. - * - * @property enabled `true` to enable XRay. By default it is disabled. - * @property alphaEnabled `true` to enable alpha changes when XRay is enabled. - */ -public data class XRayConfig( - val enabled: Boolean = false, - val alphaEnabled: Boolean = true, -) diff --git a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt index a8ca20540..057d985a1 100644 --- a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt +++ b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt @@ -38,36 +38,40 @@ class XRayTest { } @Test - fun test_initial_value() { + fun `test initial value`() { XRay.setup(XRayConfig()) assertFalse("XRay must be disabled by default", XRay.isEnabled()) } @Test - fun apply_changesViewBackground() { - val view: View = mock { on { context } doReturn (RuntimeEnvironment.application.baseContext) } + fun `apply function changes view background`() { + val view: View = mock { + on { context } doReturn RuntimeEnvironment.application.baseContext + } XRay.apply("Test", view) verify(view).background = any() verify(view).alpha = 0.9f } @Test - fun apply_changesViewBackground_alphaDisabled() { + fun `apply function changes view background but with alpha disabled`() { XRay.setup(XRayConfig(enabled = true, alphaEnabled = false)) - val view: View = mock { on { context } doReturn (RuntimeEnvironment.application.baseContext) } + val view: View = mock { + on { context } doReturn RuntimeEnvironment.application.baseContext + } XRay.apply("Test", view) verify(view).background = any() verify(view, never()).alpha = any() } @Test - fun getShortRibletName_mustShortRouterName() { + fun `getShortRibletName must short router name`() { assertEquals("Test", XRay.getShortRibletName("TestRouter")) assertEquals("Router", XRay.getShortRibletName("Router")) } @Test - fun xray_toggle() { + fun `xray toggle`() { XRay.toggle() assertFalse(XRay.isEnabled()) From 3a4b8d1ab0380d654b01af1990a115fe3196c9fd Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Tue, 12 Sep 2023 20:55:07 -0300 Subject: [PATCH 08/10] Fix format --- .../rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt | 2 +- .../src/test/kotlin/com/uber/rib/core/XRayTest.kt | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 1e24a6cea..2209d7c17 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -52,7 +52,7 @@ public object XRay { /** Toggles state of XRay. */ @Deprecated( message = "toggle() may lead to switch-on-switch-off behavior. Use setup() instead.", - replaceWith = ReplaceWith("setup(XRayConfig(enabled = !config.enabled))") + replaceWith = ReplaceWith("setup(XRayConfig(enabled = !config.enabled))"), ) @JvmStatic public fun toggle() { diff --git a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt index 057d985a1..0aec62c03 100644 --- a/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt +++ b/android/libraries/rib-android/src/test/kotlin/com/uber/rib/core/XRayTest.kt @@ -45,9 +45,7 @@ class XRayTest { @Test fun `apply function changes view background`() { - val view: View = mock { - on { context } doReturn RuntimeEnvironment.application.baseContext - } + val view: View = mock { on { context } doReturn RuntimeEnvironment.application.baseContext } XRay.apply("Test", view) verify(view).background = any() verify(view).alpha = 0.9f @@ -56,9 +54,7 @@ class XRayTest { @Test fun `apply function changes view background but with alpha disabled`() { XRay.setup(XRayConfig(enabled = true, alphaEnabled = false)) - val view: View = mock { - on { context } doReturn RuntimeEnvironment.application.baseContext - } + val view: View = mock { on { context } doReturn RuntimeEnvironment.application.baseContext } XRay.apply("Test", view) verify(view).background = any() verify(view, never()).alpha = any() From c738a5f6d3a09f87bd00a253a57869d5b75f18ce Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Tue, 19 Sep 2023 22:49:41 -0300 Subject: [PATCH 09/10] Remove lazy init --- .../rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 2209d7c17..6418768fc 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -28,11 +28,9 @@ import androidx.annotation.VisibleForTesting /** Utility class that shows riblets name in its background. */ public object XRay { private var config = XRayConfig() - private val textPaint: Paint by lazy { - Paint().apply { - textSize = TEXT_SIZE.toFloat() - color = TEXT_COLOR - } + private val textPaint = Paint().apply { + textSize = TEXT_SIZE.toFloat() + color = TEXT_COLOR } private fun writeOnBitmap(bitmap: Bitmap, text: String) { From b9acc28bbd6af20956afb5b657d24ee27c4eb28b Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 20 Sep 2023 10:26:43 -0300 Subject: [PATCH 10/10] Fix format --- .../src/main/kotlin/com/uber/rib/core/XRay.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt index 6418768fc..39a236680 100644 --- a/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt +++ b/android/libraries/rib-android/src/main/kotlin/com/uber/rib/core/XRay.kt @@ -28,10 +28,11 @@ import androidx.annotation.VisibleForTesting /** Utility class that shows riblets name in its background. */ public object XRay { private var config = XRayConfig() - private val textPaint = Paint().apply { - textSize = TEXT_SIZE.toFloat() - color = TEXT_COLOR - } + private val textPaint = + Paint().apply { + textSize = TEXT_SIZE.toFloat() + color = TEXT_COLOR + } private fun writeOnBitmap(bitmap: Bitmap, text: String) { Canvas(bitmap).run {