summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/hardware/VibratorIntensity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/hardware/VibratorIntensity.java')
-rw-r--r--src/com/android/settings/hardware/VibratorIntensity.java216
1 files changed, 216 insertions, 0 deletions
diff --git a/src/com/android/settings/hardware/VibratorIntensity.java b/src/com/android/settings/hardware/VibratorIntensity.java
new file mode 100644
index 0000000..346caa4
--- /dev/null
+++ b/src/com/android/settings/hardware/VibratorIntensity.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2013 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.preference.DialogPreference;
+import android.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.R;
+import org.cyanogenmod.hardware.VibratorHW;
+
+public class VibratorIntensity extends DialogPreference implements
+ SeekBar.OnSeekBarChangeListener {
+ private static final String PREF_NAME = "vibrator_intensity";
+ private SeekBar mSeekBar;
+ private TextView mValue;
+ private TextView mWarning;
+ private int mOriginalValue;
+
+ private Drawable mProgressDrawable;
+ private Drawable mProgressThumb;
+ private LightingColorFilter mRedFilter;
+
+ public VibratorIntensity(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ if (!isSupported()) {
+ return;
+ }
+
+ setDialogLayoutResource(R.layout.vibrator_intensity);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ builder.setNeutralButton(R.string.auto_brightness_reset_button,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+
+ mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
+ mValue = (TextView) view.findViewById(R.id.value);
+ mWarning = (TextView) view.findViewById(R.id.warning_text);
+
+ int warningThreshold = VibratorHW.getWarningThreshold();
+ if (warningThreshold > 0) {
+ String message = getContext().getResources().getString(
+ R.string.vibrator_warning, intensityToPercent(warningThreshold));
+ mWarning.setText(message);
+ } else if (mWarning != null) {
+ mWarning.setVisibility(View.GONE);
+ }
+
+ 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));
+
+ // Read the current value in case user wants to dismiss his changes
+ mOriginalValue = VibratorHW.getCurIntensity();
+
+ // Restore percent value from SharedPreferences object
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
+ int defaultValue = intensityToPercent(VibratorHW.getDefaultIntensity());
+ int percent = prefs.getInt(PREF_NAME, defaultValue);
+
+ mSeekBar.setOnSeekBarChangeListener(this);
+ mSeekBar.setProgress(percent);
+ }
+
+ @Override
+ protected void showDialog(Bundle state) {
+ super.showDialog(state);
+
+ // Can't use onPrepareDialogBuilder for this as we want the dialog
+ // to be kept open on click
+ AlertDialog d = (AlertDialog) getDialog();
+ Button defaultsButton = d.getButton(DialogInterface.BUTTON_NEUTRAL);
+ defaultsButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSeekBar.setProgress(intensityToPercent(VibratorHW.getDefaultIntensity()));
+ }
+ });
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+
+ if (positiveResult) {
+ // Store percent value in SharedPreferences object
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
+ prefs.edit().putInt(PREF_NAME, mSeekBar.getProgress()).commit();
+ } else {
+ VibratorHW.setIntensity(mOriginalValue);
+ }
+ }
+
+ public static boolean isSupported() {
+ try {
+ return VibratorHW.isSupported();
+ } catch (NoClassDefFoundError e) {
+ // Hardware abstraction framework isn't installed
+ return false;
+ }
+ }
+
+ public static void restore(Context context) {
+ if (!isSupported()) {
+ return;
+ }
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ int defaultValue = intensityToPercent(VibratorHW.getDefaultIntensity());
+ int percent = prefs.getInt(PREF_NAME, defaultValue);
+
+ VibratorHW.setIntensity(percentToIntensity(percent));
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ int warningThreshold = VibratorHW.getWarningThreshold();
+ boolean shouldWarn =
+ warningThreshold > 0 && progress >= intensityToPercent(warningThreshold);
+
+ if (mProgressDrawable != null) {
+ mProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null);
+ }
+ if (mProgressThumb != null) {
+ mProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null);
+ }
+
+ VibratorHW.setIntensity(percentToIntensity(progress));
+ mValue.setText(String.format("%d%%", progress));
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ // Do nothing here
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ Vibrator vib = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
+ vib.vibrate(200);
+ }
+
+ private static int intensityToPercent(int value) {
+ double maxValue = VibratorHW.getMaxIntensity();
+ double minValue = VibratorHW.getMinIntensity();
+ double percent = (value - minValue) * (100 / (maxValue - minValue));
+
+ if (percent > 100) {
+ percent = 100;
+ } else if (percent < 0) {
+ percent = 0;
+ }
+
+ return (int) percent;
+ }
+
+ private static int percentToIntensity(int percent) {
+ int maxValue = VibratorHW.getMaxIntensity();
+ int minValue = VibratorHW.getMinIntensity();
+ int value = Math.round((((maxValue - minValue) * percent) / 100) + minValue);
+
+ if (value > maxValue) {
+ value = maxValue;
+ } else if (value < minValue) {
+ value = minValue;
+ }
+
+ return value;
+ }
+}