From cf09511e1612ca0b699e495340056a8ae5a900af Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 9 Jul 2020 11:22:14 +0300 Subject: [PATCH 1/3] Metric extensions --- .../components/utils/MetricExtensions.kt | 55 +++++++++++++++++++ .../roboswag/components/utils/UiUtils.kt | 35 +++++------- 2 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt diff --git a/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt new file mode 100644 index 0000000..16f4772 --- /dev/null +++ b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt @@ -0,0 +1,55 @@ +package ru.touchin.roboswag.components.utils + +import android.app.Application +import android.content.Context +import android.content.res.Resources +import android.util.DisplayMetrics + +private const val MAX_METRICS_TRIES_COUNT = 5 + +/** + * Returns right metrics with non-zero height/width. + * It is common bug when metrics are calling at [Application.onCreate] method and it returns metrics with zero height/width. + * + * @param context [Context] of metrics; + * @return [DisplayMetrics]. + */ +fun Context.getDisplayMetrics(): DisplayMetrics { + var result = resources.displayMetrics + // it is needed to avoid bug with invalid metrics when user restore application from other application + var metricsTryNumber = 0 + while (metricsTryNumber < MAX_METRICS_TRIES_COUNT && (result.heightPixels <= 0 || result.widthPixels <= 0)) { + try { + Thread.sleep(500) + } catch (ignored: InterruptedException) { + return result + } + + result = resources.displayMetrics + metricsTryNumber++ + } + return result +} + +/** + * Simply converts Dp to pixels. + * + * @return Size in pixels. + */ +fun Int.toPixels() = (this * Resources.getSystem().displayMetrics.density).toInt() + + +/** + * Simply converts Dp to pixels. + * + * @return Size in pixels. + */ +fun Float.toPixels() = this * Resources.getSystem().displayMetrics.density + + +/** + * Simply converts pixels to Dp. + * + * @return Size in dp. + */ +fun Int.toDp() = (this / Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file diff --git a/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt b/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt index 7592cc1..ceb7a39 100644 --- a/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt +++ b/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt @@ -25,7 +25,6 @@ import android.content.Context import android.content.Intent import android.os.Build import android.util.DisplayMetrics -import android.util.TypedValue import android.view.KeyCharacterMap import android.view.KeyEvent import android.view.LayoutInflater @@ -85,22 +84,11 @@ object UiUtils { * @param context [Context] of metrics; * @return [DisplayMetrics]. */ - fun getDisplayMetrics(context: Context): DisplayMetrics { - var result = context.resources.displayMetrics - // it is needed to avoid bug with invalid metrics when user restore application from other application - var metricsTryNumber = 0 - while (metricsTryNumber < MAX_METRICS_TRIES_COUNT && (result.heightPixels <= 0 || result.widthPixels <= 0)) { - try { - Thread.sleep(500) - } catch (ignored: InterruptedException) { - return result - } - - result = context.resources.displayMetrics - metricsTryNumber++ - } - return result - } + @Deprecated( + message = "Use extension instead", + replaceWith = ReplaceWith("context.getDisplayMetrics()") + ) + fun getDisplayMetrics(context: Context): DisplayMetrics = context.getDisplayMetrics() /** * Simply converts DP to pixels. @@ -109,10 +97,17 @@ object UiUtils { * @param sizeInDp Size in DP; * @return Size in pixels. */ - fun dpToPixels(context: Context, sizeInDp: Float): Float = - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, sizeInDp, getDisplayMetrics(context)) + @Deprecated( + message = "Use extension instead", + replaceWith = ReplaceWith("sizeInDp.toPixels()") + ) + fun dpToPixels(context: Context, sizeInDp: Float): Float = sizeInDp.toPixels() - fun pixelsToDp(context: Context, pixels: Int): Int = (pixels * getDisplayMetrics(context).density + 0.5f).toInt() + @Deprecated( + message = "Use extension instead", + replaceWith = ReplaceWith("pixels.toDp()") + ) + fun pixelsToDp(context: Context, pixels: Int): Int = pixels.toDp() } From b2084ed4a1347b344956fbde329395ad159780fb Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 9 Jul 2020 11:38:03 +0300 Subject: [PATCH 2/3] fixed review --- .../touchin/roboswag/components/utils/MetricExtensions.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt index 16f4772..5d0ce66 100644 --- a/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt +++ b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt @@ -36,20 +36,18 @@ fun Context.getDisplayMetrics(): DisplayMetrics { * * @return Size in pixels. */ -fun Int.toPixels() = (this * Resources.getSystem().displayMetrics.density).toInt() - +fun Int.toPixels(): Int = (this * Resources.getSystem().displayMetrics.density).toInt() /** * Simply converts Dp to pixels. * * @return Size in pixels. */ -fun Float.toPixels() = this * Resources.getSystem().displayMetrics.density - +fun Float.toPixels(): Float = this * Resources.getSystem().displayMetrics.density /** * Simply converts pixels to Dp. * * @return Size in dp. */ -fun Int.toDp() = (this / Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file +fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file From 4b6fc34979eaea7fd71f5d914e98d0a85c780d5f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 9 Jul 2020 13:43:08 +0300 Subject: [PATCH 3/3] fixed review --- .../roboswag/components/utils/MetricExtensions.kt | 9 ++++++--- .../java/ru/touchin/roboswag/components/utils/UiUtils.kt | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt index 5d0ce66..0f627f3 100644 --- a/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt +++ b/utils/src/main/java/ru/touchin/roboswag/components/utils/MetricExtensions.kt @@ -36,18 +36,21 @@ fun Context.getDisplayMetrics(): DisplayMetrics { * * @return Size in pixels. */ -fun Int.toPixels(): Int = (this * Resources.getSystem().displayMetrics.density).toInt() +val Int.px: Int + get() = (this * Resources.getSystem().displayMetrics.density).toInt() /** * Simply converts Dp to pixels. * * @return Size in pixels. */ -fun Float.toPixels(): Float = this * Resources.getSystem().displayMetrics.density +val Float.px: Float + get() = this * Resources.getSystem().displayMetrics.density /** * Simply converts pixels to Dp. * * @return Size in dp. */ -fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file +val Int.dp: Int + get() = (this / Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file diff --git a/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt b/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt index ceb7a39..9ea02be 100644 --- a/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt +++ b/utils/src/main/java/ru/touchin/roboswag/components/utils/UiUtils.kt @@ -101,13 +101,13 @@ object UiUtils { message = "Use extension instead", replaceWith = ReplaceWith("sizeInDp.toPixels()") ) - fun dpToPixels(context: Context, sizeInDp: Float): Float = sizeInDp.toPixels() + fun dpToPixels(context: Context, sizeInDp: Float): Float = sizeInDp.px @Deprecated( message = "Use extension instead", replaceWith = ReplaceWith("pixels.toDp()") ) - fun pixelsToDp(context: Context, pixels: Int): Int = pixels.toDp() + fun pixelsToDp(context: Context, pixels: Int): Int = pixels.dp }