/** * 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; /** * 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( context.getColor(R.color.importance_slider_color)); 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); } }