blob: 0617df94409af3e456bf63f03e5b829a9aefd6ec [file] [log] [blame]
/**
* Copyright (C) 2015 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;
import com.android.settings.R;
import com.android.settings.SeekBarPreference;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.service.notification.NotificationListenerService;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.android.settings.Utils;
/**
* A slider preference that controls notification importance.
**/
public class ImportanceSeekBarPreference extends SeekBarPreference implements
SeekBar.OnSeekBarChangeListener {
private static final String TAG = "ImportanceSeekBarPref";
private Callback mCallback;
private int mMinProgress;
private TextView mSummaryTextView;
private String mSummary;
private SeekBar mSeekBar;
private ColorStateList mActiveSliderTint;
private ColorStateList mInactiveSliderTint;
private float mActiveSliderAlpha = 1.0f;
private float mInactiveSliderAlpha;
private boolean mAutoOn;
private Handler mHandler;
public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setLayoutResource(R.layout.preference_importance_slider);
mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(context));
mInactiveSliderTint = ColorStateList.valueOf(
context.getColor(R.color.importance_disabled_slider_color));
mHandler = new Handler();
final TypedArray ta =
context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Theme, 0, 0);
mInactiveSliderAlpha =
ta.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f);
ta.recycle();
}
public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public ImportanceSeekBarPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ImportanceSeekBarPreference(Context context) {
this(context, null);
}
public void setCallback(Callback callback) {
mCallback = callback;
}
public void setMinimumProgress(int minProgress) {
mMinProgress = minProgress;
notifyChanged();
}
@Override
public void setProgress(int progress) {
mSummary = getProgressSummary(progress);
super.setProgress(progress);
}
public void setAutoOn(boolean autoOn) {
mAutoOn = autoOn;
notifyChanged();
}
@Override
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
mSummaryTextView = (TextView) view.findViewById(com.android.internal.R.id.summary);
mSeekBar = (SeekBar) view.findViewById(
com.android.internal.R.id.seekbar);
final ImageView autoButton = (ImageView) view.findViewById(R.id.auto_importance);
applyAutoUi(autoButton);
autoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
applyAuto(autoButton);
}
});
}
private void applyAuto(ImageView autoButton) {
mAutoOn = !mAutoOn;
if (!mAutoOn) {
setProgress(NotificationListenerService.Ranking.IMPORTANCE_DEFAULT);
mCallback.onImportanceChanged(
NotificationListenerService.Ranking.IMPORTANCE_DEFAULT, true);
} else {
mCallback.onImportanceChanged(
NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED, true);
}
applyAutoUi(autoButton);
}
private void applyAutoUi(ImageView autoButton) {
mSeekBar.setEnabled(!mAutoOn);
final float alpha = mAutoOn ? mInactiveSliderAlpha : mActiveSliderAlpha;
final ColorStateList starTint = mAutoOn ? mActiveSliderTint : mInactiveSliderTint;
Drawable icon = autoButton.getDrawable().mutate();
icon.setTintList(starTint);
autoButton.setImageDrawable(icon);
mSeekBar.setAlpha(alpha);
if (mAutoOn) {
setProgress(NotificationListenerService.Ranking.IMPORTANCE_DEFAULT);
mSummary = getProgressSummary(
NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED);
}
mSummaryTextView.setText(mSummary);
}
@Override
public CharSequence getSummary() {
return mSummary;
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
super.onProgressChanged(seekBar, progress, fromTouch);
if (progress < mMinProgress) {
seekBar.setProgress(mMinProgress);
progress = mMinProgress;
}
if (mSummaryTextView != null) {
mSummary = getProgressSummary(progress);
mSummaryTextView.setText(mSummary);
}
mCallback.onImportanceChanged(progress, fromTouch);
}
private String getProgressSummary(int progress) {
switch (progress) {
case NotificationListenerService.Ranking.IMPORTANCE_NONE:
return getContext().getString(R.string.notification_importance_blocked);
case NotificationListenerService.Ranking.IMPORTANCE_MIN:
return getContext().getString(R.string.notification_importance_min);
case NotificationListenerService.Ranking.IMPORTANCE_LOW:
return getContext().getString(R.string.notification_importance_low);
case NotificationListenerService.Ranking.IMPORTANCE_DEFAULT:
return getContext().getString(R.string.notification_importance_default);
case NotificationListenerService.Ranking.IMPORTANCE_HIGH:
return getContext().getString(R.string.notification_importance_high);
case NotificationListenerService.Ranking.IMPORTANCE_MAX:
return getContext().getString(R.string.notification_importance_max);
default:
return getContext().getString(R.string.notification_importance_unspecified);
}
}
@Override
protected void notifyChanged() {
mHandler.post(mNotifyChanged);
}
private void postNotifyChanged() {
super.notifyChanged();
}
private final Runnable mNotifyChanged = new Runnable() {
@Override
public void run() {
postNotifyChanged();
}
};
public interface Callback {
void onImportanceChanged(int progress, boolean fromTouch);
}
}