blob: 7e071ff938a6ffc33b82b96e1b1f91173cb713d9 [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.settings.notification.app;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.Utils;
import com.android.settingslib.R;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedPreferenceHelper;
/**
* A tri-state preference allowing a user to specify what gets to bubble.
*/
public class BubblePreference extends Preference implements View.OnClickListener {
RestrictedPreferenceHelper mHelper;
private int mSelectedPreference;
private Context mContext;
private Drawable mSelectedBackground;
private Drawable mUnselectedBackground;
private ButtonViewHolder mBubbleAllButton;
private ButtonViewHolder mBubbleSelectedButton;
private ButtonViewHolder mBubbleNoneButton;
private boolean mSelectedVisible;
public BubblePreference(Context context) {
this(context, null);
}
public BubblePreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BubblePreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public BubblePreference(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mHelper = new RestrictedPreferenceHelper(context, this, attrs);
mHelper.useAdminDisabledSummary(true);
mContext = context;
mSelectedBackground = mContext.getDrawable(R.drawable.button_border_selected);
mUnselectedBackground = mContext.getDrawable(R.drawable.button_border_unselected);
setLayoutResource(R.layout.bubble_preference);
}
public void setSelectedPreference(int preference) {
mSelectedPreference = preference;
}
public int getSelectedPreference() {
return mSelectedPreference;
}
public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
if (mHelper.setDisabledByAdmin(admin)) {
notifyChanged();
}
}
public void setSelectedVisibility(boolean visible) {
mSelectedVisible = visible;
notifyChanged();
}
@Override
public void onBindViewHolder(final PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
final boolean disabledByAdmin = mHelper.isDisabledByAdmin();
View summary = holder.findViewById(android.R.id.summary);
if (disabledByAdmin) {
mHelper.onBindViewHolder(holder);
summary.setVisibility(View.VISIBLE);
} else {
summary.setVisibility(View.GONE);
}
holder.itemView.setClickable(false);
View bubbleAll = holder.findViewById(R.id.bubble_all);
ImageView bubbleAllImage = (ImageView) holder.findViewById(R.id.bubble_all_icon);
TextView bubbleAllText = (TextView) holder.findViewById(R.id.bubble_all_label);
mBubbleAllButton = new ButtonViewHolder(bubbleAll, bubbleAllImage, bubbleAllText,
BUBBLE_PREFERENCE_ALL);
mBubbleAllButton.setSelected(mContext, mSelectedPreference == BUBBLE_PREFERENCE_ALL);
bubbleAll.setTag(BUBBLE_PREFERENCE_ALL);
bubbleAll.setOnClickListener(this);
bubbleAll.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
View bubbleSelected = holder.findViewById(R.id.bubble_selected);
ImageView bubbleSelectedImage = (ImageView) holder.findViewById(R.id.bubble_selected_icon);
TextView bubbleSelectedText = (TextView) holder.findViewById(R.id.bubble_selected_label);
mBubbleSelectedButton = new ButtonViewHolder(bubbleSelected, bubbleSelectedImage,
bubbleSelectedText, BUBBLE_PREFERENCE_SELECTED);
mBubbleSelectedButton.setSelected(mContext,
mSelectedPreference == BUBBLE_PREFERENCE_SELECTED);
bubbleSelected.setTag(BUBBLE_PREFERENCE_SELECTED);
bubbleSelected.setOnClickListener(this);
bubbleSelected.setVisibility((!mSelectedVisible || disabledByAdmin)
? View.GONE : View.VISIBLE);
View bubbleNone = holder.findViewById(R.id.bubble_none);
ImageView bubbleNoneImage = (ImageView) holder.findViewById(R.id.bubble_none_icon);
TextView bubbleNoneText = (TextView) holder.findViewById(R.id.bubble_none_label);
mBubbleNoneButton = new ButtonViewHolder(bubbleNone, bubbleNoneImage, bubbleNoneText,
BUBBLE_PREFERENCE_NONE);
mBubbleNoneButton.setSelected(mContext, mSelectedPreference == BUBBLE_PREFERENCE_NONE);
bubbleNone.setTag(BUBBLE_PREFERENCE_NONE);
bubbleNone.setOnClickListener(this);
bubbleNone.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
}
@Override
public void onClick(View v) {
final int selected = (int) v.getTag();
callChangeListener(selected);
mBubbleAllButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_ALL);
mBubbleSelectedButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_SELECTED);
mBubbleNoneButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_NONE);
}
private class ButtonViewHolder {
private View mView;
private ImageView mImageView;
private TextView mTextView;
private int mId;
ButtonViewHolder(View v, ImageView iv, TextView tv, int identifier) {
mView = v;
mImageView = iv;
mTextView = tv;
mId = identifier;
}
void setSelected(Context context, boolean selected) {
mView.setBackground(selected ? mSelectedBackground : mUnselectedBackground);
mView.setSelected(selected);
ColorStateList stateList = selected
? Utils.getColorAccent(context)
: Utils.getColorAttr(context, android.R.attr.textColorPrimary);
mImageView.setImageTintList(stateList);
mTextView.setTextColor(stateList);
}
}
}