blob: a4f6fef7e8daeb43aa0633b4ae7162d5bae0940d [file] [log] [blame]
/*
* Copyright (C) 2018 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 androidx.core.content.res
import android.content.res.ColorStateList
import android.content.res.TypedArray
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import androidx.annotation.AnyRes
import androidx.annotation.ColorInt
import androidx.annotation.Dimension
import androidx.annotation.RequiresApi
import androidx.annotation.StyleableRes
private fun TypedArray.checkAttribute(@StyleableRes index: Int) {
if (!hasValue(index)) {
throw IllegalArgumentException("Attribute not defined in set.")
}
}
/**
* Retrieve the boolean value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getBoolean
*/
fun TypedArray.getBooleanOrThrow(@StyleableRes index: Int): Boolean {
checkAttribute(index)
return getBoolean(index, false)
}
/**
* Retrieve the color value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getColor
*/
@ColorInt
fun TypedArray.getColorOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getColor(index, 0)
}
/**
* Retrieve the color state list value for the attribute at [index] or throws
* [IllegalArgumentException] if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getColorStateList
*/
fun TypedArray.getColorStateListOrThrow(@StyleableRes index: Int): ColorStateList {
checkAttribute(index)
return checkNotNull(getColorStateList(index)) {
"Attribute value was not a color or color state list."
}
}
/**
* Retrieve the dimension value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getDimension
*/
fun TypedArray.getDimensionOrThrow(@StyleableRes index: Int): Float {
checkAttribute(index)
return getDimension(index, 0f)
}
/**
* Retrieve the dimension pixel offset value for the attribute at [index] or throws
* [IllegalArgumentException] if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getDimensionPixelOffset
*/
@Dimension
fun TypedArray.getDimensionPixelOffsetOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getDimensionPixelOffset(index, 0)
}
/**
* Retrieve the dimension pixel size value for the attribute at [index] or throws
* [IllegalArgumentException] if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getDimensionPixelSize
*/
@Dimension
fun TypedArray.getDimensionPixelSizeOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getDimensionPixelSize(index, 0)
}
/**
* Retrieve the drawable value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getDrawable
*/
fun TypedArray.getDrawableOrThrow(@StyleableRes index: Int): Drawable {
checkAttribute(index)
return getDrawable(index)
}
/**
* Retrieve the float value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getFloat
*/
fun TypedArray.getFloatOrThrow(@StyleableRes index: Int): Float {
checkAttribute(index)
return getFloat(index, 0f)
}
/**
* Retrieve the font value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getFont
*/
@RequiresApi(26)
fun TypedArray.getFontOrThrow(@StyleableRes index: Int): Typeface {
checkAttribute(index)
return getFont(index)
}
/**
* Retrieve the integer value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getInt
*/
fun TypedArray.getIntOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getInt(index, 0)
}
/**
* Retrieve the integer value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getInteger
*/
fun TypedArray.getIntegerOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getInteger(index, 0)
}
/**
* Retrieves the resource identifier for the attribute at [index] or throws
* [IllegalArgumentException] if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getResourceId
*/
@AnyRes
fun TypedArray.getResourceIdOrThrow(@StyleableRes index: Int): Int {
checkAttribute(index)
return getResourceId(index, 0)
}
/**
* Retrieve the string value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getString
*/
fun TypedArray.getStringOrThrow(@StyleableRes index: Int): String {
checkAttribute(index)
return checkNotNull(getString(index)) {
"Attribute value could not be coerced to String."
}
}
/**
* Retrieve the text value for the attribute at [index] or throws [IllegalArgumentException]
* if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getText
*/
fun TypedArray.getTextOrThrow(@StyleableRes index: Int): CharSequence {
checkAttribute(index)
return checkNotNull(getText(index)) {
"Attribute value could not be coerced to CharSequence."
}
}
/**
* Retrieve the text array value for the attribute at [index] or throws
* [IllegalArgumentException] if not defined.
*
* @see TypedArray.hasValue
* @see TypedArray.getTextArray
*/
fun TypedArray.getTextArrayOrThrow(@StyleableRes index: Int): Array<CharSequence> {
checkAttribute(index)
return getTextArray(index)
}
/**
* Executes the given [block] function on this TypedArray and then recycles it.
*
* @see kotlin.io.use
*/
inline fun <R> TypedArray.use(block: (TypedArray) -> R): R {
return block(this).also {
recycle()
}
}