Files
packages_apps_Settings/src/com/android/settings/widget/TintDrawable.java
Paul Duffin ad48f03f53 Fully qualify @attr reference to android.R field
Currently, Metalava has some special handling of '@attr ref R.<field>`
references to make sure that they are fully qualified, i.e.
`@attr ref android.R.<field>`. That special handling complicates
Metalava and is blocking some flagged API work so will be removed.
Before that can be done, the existing incorrect documentation needs to
be cleaned up.

This change cleans up those cases in this repo.

Bug: 371997321
Test: Run `m offline-sdk-docs` before and after to make sure that
      there are no differences.
Flag: DOCS_ONLY
Change-Id: Ic97f01b90193d058d65e6d3c6d0a04ce5e55d7c7
2024-10-07 17:10:02 +01:00

103 lines
3.2 KiB
Java

/*
* Copyright (C) 2019 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.settings.widget;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
import android.graphics.drawable.DrawableWrapper;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.settings.R;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
/**
* A Drawable that tints a contained Drawable, overriding the existing tint specified in the
* underlying drawable. This class should only be used in XML.
*
* @attr ref android.R.styleable#DrawableWrapper_drawable
* @attr ref android.R.styleable#TintDrawable_tint
*/
public class TintDrawable extends DrawableWrapper {
private ColorStateList mTint;
private int[] mThemeAttrs;
/** No-arg constructor used by drawable inflation. */
public TintDrawable() {
super(null);
}
@Override
public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Theme theme)
throws XmlPullParserException, IOException {
final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.TintDrawable);
super.inflate(r, parser, attrs, theme);
mThemeAttrs = a.extractThemeAttrs();
updateStateFromTypedArray(a);
a.recycle();
applyTint();
}
@Override
public void applyTheme(Theme t) {
super.applyTheme(t);
if (mThemeAttrs != null) {
final TypedArray a = t.resolveAttributes(mThemeAttrs, R.styleable.TintDrawable);
updateStateFromTypedArray(a);
a.recycle();
}
// Ensure tint is reapplied after applying the theme to ensure this drawables'
// tint overrides the underlying drawables' tint.
applyTint();
}
@Override
public boolean canApplyTheme() {
return (mThemeAttrs != null && mThemeAttrs.length > 0) || super.canApplyTheme();
}
private void updateStateFromTypedArray(@NonNull TypedArray a) {
if (a.hasValue(R.styleable.TintDrawable_android_drawable)) {
setDrawable(a.getDrawable(R.styleable.TintDrawable_android_drawable));
}
if (a.hasValue(R.styleable.TintDrawable_android_tint)) {
mTint = a.getColorStateList(R.styleable.TintDrawable_android_tint);
}
}
private void applyTint() {
if (getDrawable() != null && mTint != null) {
getDrawable().mutate().setTintList(mTint);
}
}
}