blob: 1b70f45170b6f763c5257115fab905c57f0f0805 [file] [log] [blame]
/*
* Copyright (C) 2022 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.permissioncontroller.safetycenter.ui
import android.content.Context
import com.android.permissioncontroller.R
/**
* Determines the correct background drawable for a given element in the Safety Center card list.
*
* This class helps transform a flat list of elements (which are typically Preferences in the
* PreferenceScreen's recycler view) into a visually grouped list of cards by providing the correct
* background drawable for each element based on both its position in the flat list of elements and
* its conceptual position in the card list. While Preferences have a nested XML structure, with
* Preferences nested inside of PreferenceGroups, they are displayed as a flat list of views, with
* the PreferenceGroup's view inserted as a header above its constituent preference's views.
*
* A list is a group conceptually-related of cards. The top card in the list has large top corners
* and the bottom card in the list has large bottom corners. Corners between cards in the list are
* small. In the Safety Center, the entry list is a single list.
*
* A card is a group of one or more elements that appear as a single visual card, without corners
* between its constituent elements. In the Safety Center, a single expanded entry list group is a
* single card composed of a list of separate preferences (one for the header and one for each entry
* in the group).
*/
internal enum class PositionInCardList(val backgroundDrawableResId: Int) {
LIST_START_END(R.drawable.safety_entity_top_large_bottom_large_background),
LIST_START(R.drawable.safety_entity_top_large_bottom_flat_background),
LIST_START_CARD_END(R.drawable.safety_entity_top_large_bottom_small_background),
CARD_START(R.drawable.safety_entity_top_small_bottom_flat_background),
CARD_START_END(R.drawable.safety_entity_top_small_bottom_small_background),
CARD_START_LIST_END(R.drawable.safety_entity_top_small_bottom_large_background),
CARD_ELEMENT(R.drawable.safety_entity_top_flat_bottom_flat_background),
CARD_END(R.drawable.safety_entity_top_flat_bottom_small_background),
LIST_END(R.drawable.safety_entity_top_flat_bottom_large_background);
fun getTopMargin(context: Context): Int =
when (this) {
CARD_START, CARD_START_END, CARD_START_LIST_END ->
context.resources.getDimensionPixelSize(R.dimen.safety_center_card_margin)
LIST_START, LIST_START_CARD_END, LIST_START_END ->
context.resources.getDimensionPixelSize(R.dimen.safety_center_list_margin)
else -> 0
}
companion object {
@JvmStatic
@JvmOverloads
fun calculate(
isListStart: Boolean,
isListEnd: Boolean,
isCardStart: Boolean = !isListStart,
isCardEnd: Boolean = !isListEnd
): PositionInCardList =
if (isListStart && isListEnd) {
LIST_START_END
} else if (isListStart && isCardEnd) {
LIST_START_CARD_END
} else if (isListEnd && isCardStart) {
CARD_START_LIST_END
} else if (isCardStart && isCardEnd) {
CARD_START_END
} else if (isListStart) {
LIST_START
} else if (isListEnd) {
LIST_END
} else if (isCardStart) {
CARD_START
} else if (isCardEnd) {
CARD_END
} else {
CARD_ELEMENT
}
}
}