/** * Copyright (C) 2013-2016 The CyanogenMod 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.hardware; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.graphics.Color; import android.graphics.LightingColorFilter; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.os.Vibrator; import android.support.v7.preference.DialogPreference; import android.support.v7.preference.PreferenceManager; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Button; import com.android.settings.CustomDialogPreference; import com.android.settings.R; import cyanogenmod.hardware.CMHardwareManager; import cyanogenmod.providers.CMSettings; public class VibratorIntensity extends CustomDialogPreference implements SeekBar.OnSeekBarChangeListener { private int mOriginalValue; private int mMinValue; private int mMaxValue; private int mDefaultValue; private int mWarningValue; private SeekBar mSeekBar; private TextView mValueText; private TextView mWarningText; private Drawable mProgressDrawable; private Drawable mProgressThumb; private LightingColorFilter mRedFilter; public VibratorIntensity(final Context context, final AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.vibrator_intensity); } @Override protected void onPrepareDialogBuilder(final AlertDialog.Builder builder, final DialogInterface.OnClickListener listener) { builder.setNeutralButton(R.string.vibrator_intensity_dialog_reset, null); } @Override protected void onBindDialogView(final View view) { super.onBindDialogView(view); mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar); mValueText = (TextView) view.findViewById(R.id.value); mWarningText = (TextView) view.findViewById(R.id.warning_text); // Read the current value in case user wants to dismiss his changes final CMHardwareManager hardware = CMHardwareManager.getInstance(getContext()); mOriginalValue = hardware.getVibratorIntensity(); mWarningValue = hardware.getVibratorWarningIntensity(); mMinValue = hardware.getVibratorMinIntensity(); mMaxValue = hardware.getVibratorMaxIntensity(); mDefaultValue = hardware.getVibratorDefaultIntensity(); final String message = getContext().getResources().getString( R.string.vibrator_intensity_dialog_warning, intensityToPercent(mMinValue, mMaxValue, mWarningValue)); mWarningText.setText(message); if (mWarningValue <= 0) { mWarningText.setVisibility(View.GONE); } final Drawable progressDrawable = mSeekBar.getProgressDrawable(); if (progressDrawable instanceof LayerDrawable) { LayerDrawable ld = (LayerDrawable) progressDrawable; mProgressDrawable = ld.findDrawableByLayerId(android.R.id.progress); } mProgressThumb = mSeekBar.getThumb(); mRedFilter = new LightingColorFilter(Color.BLACK, getContext().getResources().getColor(android.R.color.holo_red_light)); mSeekBar.setOnSeekBarChangeListener(this); mSeekBar.setMax(mMaxValue - mMinValue); mSeekBar.setProgress(mOriginalValue - mMinValue); } @Override protected boolean onDismissDialog(final DialogInterface dialog, final int which) { // Can't use onPrepareDialogBuilder for this as we want the dialog // to be kept open on click if (which == DialogInterface.BUTTON_NEUTRAL) { mSeekBar.setProgress(mDefaultValue - mMinValue); setVibratorIntensity(mDefaultValue); testVibration(); return false; } return true; } @Override protected void onDialogClosed(final boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { // Store percent value in SharedPreferences object final SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getContext()); final int intensity = mSeekBar.getProgress() + mMinValue; final int percent = intensityToPercent(mMinValue, mMaxValue, intensity); prefs.edit().putInt(CMSettings.Secure.VIBRATOR_INTENSITY, percent).commit(); CMSettings.Secure.putInt(getContext().getContentResolver(), CMSettings.Secure.VIBRATOR_INTENSITY, intensity); } else { setVibratorIntensity(mOriginalValue); CMSettings.Secure.putInt(getContext().getContentResolver(), CMSettings.Secure.VIBRATOR_INTENSITY, mOriginalValue); } } @Override public void onProgressChanged( final SeekBar seekBar, final int progress, final boolean fromUser) { final int intensity = progress + mMinValue; final boolean shouldWarn = mWarningValue > 0 && intensity >= mWarningValue; if (mProgressDrawable != null) { mProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null); } if (mProgressThumb != null) { mProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null); } mValueText.setText( String.format("%d%%", intensityToPercent(mMinValue, mMaxValue, intensity))); } @Override public void onStartTrackingTouch(final SeekBar seekBar) { // Do nothing } @Override public void onStopTrackingTouch(final SeekBar seekBar) { setVibratorIntensity(seekBar.getProgress() + mMinValue); testVibration(); } private void setVibratorIntensity(final int intensity) { final CMHardwareManager hardware = CMHardwareManager.getInstance(getContext()); hardware.setVibratorIntensity(intensity); } private void testVibration() { final Vibrator vib = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); vib.vibrate(200); } private static int intensityToPercent(final int min, final int max, final int value) { int percent = Math.round((value - min) * (100.f / (max - min))); if (percent > 100) { percent = 100; } else if (percent < 0) { percent = 0; } return percent; } private static int percentToIntensity(final int min, final int max, final int percent) { int value = Math.round((((max - min) * percent) / 100.f) + min); if (value > max) { value = max; } else if (value < min) { value = min; } return value; } }