blob: 4dd63be477359828bb975f47a53817037c0cd82c [file] [log] [blame]
/*
* Copyright (C) 2020 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.systemui.statusbar.policy;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.core.graphics.ColorUtils;
import com.android.keyguard.KeyguardConstants;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.qs.tiles.UserDetailItemView;
/**
* Displays a user on the keyguard user switcher.
*/
public class KeyguardUserDetailItemView extends UserDetailItemView {
private static final String TAG = "KeyguardUserDetailItemView";
private static final boolean DEBUG = KeyguardConstants.DEBUG;
private static final int ANIMATION_DURATION_FADE_NAME = 240;
private float mDarkAmount;
private int mTextColor;
public KeyguardUserDetailItemView(Context context) {
this(context, null);
}
public KeyguardUserDetailItemView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public KeyguardUserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public KeyguardUserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected int getFontSizeDimen() {
return R.dimen.kg_user_switcher_text_size;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mTextColor = mName.getCurrentTextColor();
updateDark();
}
/**
* Update visibility of this view.
*
* @param showItem If true, this item is visible on the screen to the user. Generally this
* means that the item would be clickable. If false, item visibility will be
* set to GONE and hidden entirely.
* @param showTextName Whether or not the name should be shown next to the icon. If false,
* only the icon is shown.
* @param animate Whether the transition should be animated. Note, this only applies to
* animating the text name. The item itself will not animate (i.e. fade in/out).
* Instead, we delegate that to the parent view.
*/
void updateVisibilities(boolean showItem, boolean showTextName, boolean animate) {
if (DEBUG) {
Log.d(TAG, String.format("updateVisibilities itemIsShown=%b nameIsShown=%b animate=%b",
showItem, showTextName, animate));
}
getBackground().setAlpha((showItem && showTextName) ? 255 : 0);
if (showItem) {
if (showTextName) {
mName.setVisibility(View.VISIBLE);
if (animate) {
mName.setAlpha(0f);
mName.animate()
.alpha(1f)
.setDuration(ANIMATION_DURATION_FADE_NAME)
.setInterpolator(Interpolators.ALPHA_IN);
} else {
mName.setAlpha(1f);
}
} else {
if (animate) {
mName.setVisibility(View.VISIBLE);
mName.setAlpha(1f);
mName.animate()
.alpha(0f)
.setDuration(ANIMATION_DURATION_FADE_NAME)
.setInterpolator(Interpolators.ALPHA_OUT)
.withEndAction(() -> {
mName.setVisibility(View.GONE);
mName.setAlpha(1f);
});
} else {
mName.setVisibility(View.GONE);
mName.setAlpha(1f);
}
}
setVisibility(View.VISIBLE);
setAlpha(1f);
} else {
// If item isn't shown, don't animate. The parent class will animate the view instead
setVisibility(View.GONE);
setAlpha(1f);
mName.setVisibility(showTextName ? View.VISIBLE : View.GONE);
mName.setAlpha(1f);
}
}
/**
* Set the amount (ratio) that the device has transitioned to doze.
*
* @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake.
*/
public void setDarkAmount(float darkAmount) {
if (mDarkAmount == darkAmount) {
return;
}
mDarkAmount = darkAmount;
updateDark();
}
private void updateDark() {
final int blendedTextColor = ColorUtils.blendARGB(mTextColor, Color.WHITE, mDarkAmount);
mName.setTextColor(blendedTextColor);
}
}