| /* |
| * 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.launcher3.util |
| |
| import com.android.launcher3.Utilities |
| import kotlin.math.max |
| |
| class CellContentDimensions( |
| var iconSizePx: Int, |
| var iconDrawablePaddingPx: Int, |
| var iconTextSizePx: Int |
| ) { |
| /** |
| * This method goes through some steps to reduce the padding between icon and label, icon size |
| * and then label size, until it can fit in the [cellHeightPx]. |
| * |
| * @return the height of the content after being sized down. |
| */ |
| fun resizeToFitCellHeight(cellHeightPx: Int, iconSizeSteps: IconSizeSteps): Int { |
| var cellContentHeight = getCellContentHeight() |
| |
| // Step 1. Decrease drawable padding |
| if (cellContentHeight > cellHeightPx) { |
| val diff = cellContentHeight - cellHeightPx |
| iconDrawablePaddingPx = max(0, iconDrawablePaddingPx - diff) |
| cellContentHeight = getCellContentHeight() |
| } |
| |
| while ( |
| (iconTextSizePx > iconSizeSteps.minimumIconLabelSize || |
| iconSizePx > iconSizeSteps.minimumIconSize()) && cellContentHeight > cellHeightPx |
| ) { |
| // Step 2. Decrease icon size |
| iconSizePx = iconSizeSteps.getNextLowerIconSize(iconSizePx) |
| cellContentHeight = getCellContentHeight() |
| |
| // Step 3. Decrease label size |
| if ( |
| cellContentHeight > cellHeightPx && |
| iconTextSizePx > iconSizeSteps.minimumIconLabelSize |
| ) { |
| iconTextSizePx = |
| max( |
| iconSizeSteps.minimumIconLabelSize, |
| iconTextSizePx - IconSizeSteps.TEXT_STEP |
| ) |
| cellContentHeight = getCellContentHeight() |
| } |
| } |
| |
| // For some cases, depending on the display size, the content might not fit inside the |
| // cell height after considering the minimum icon and label size allowed. |
| // For these extreme cases, we will allow the icon size to be smaller than |
| // [IconSizeSteps.minimumIconSize] to fit inside the cell height without cropping. |
| while ( |
| cellContentHeight > cellHeightPx && iconSizePx > IconSizeSteps.ICON_SIZE_STEP_EXTRA |
| ) { |
| iconSizePx -= IconSizeSteps.ICON_SIZE_STEP_EXTRA |
| cellContentHeight = getCellContentHeight() |
| } |
| |
| return cellContentHeight |
| } |
| |
| /** Calculate new cellContentHeight */ |
| fun getCellContentHeight(): Int { |
| val iconTextHeight = Utilities.calculateTextHeight(iconTextSizePx.toFloat()) |
| return iconSizePx + iconDrawablePaddingPx + iconTextHeight |
| } |
| } |