diff --git a/DeviceSettings/res/layout/preference_dialog_vibrator_tuning.xml b/DeviceSettings/res/layout/preference_dialog_vibrator_tuning.xml
new file mode 100644
index 0000000..1cf116b
--- /dev/null
+++ b/DeviceSettings/res/layout/preference_dialog_vibrator_tuning.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DeviceSettings/res/values-da/strings.xml b/DeviceSettings/res/values-da/strings.xml
index d6ea38d..2405c89 100644
--- a/DeviceSettings/res/values-da/strings.xml
+++ b/DeviceSettings/res/values-da/strings.xml
@@ -34,11 +34,6 @@
Kalibrering fuldført
Accelerometeret er kalibreret.
- Haptik
- Vibrator
- Vibrator-styrke
- Indstil vibratorens intensitet
-
Radio
HSPA
Slå HSDPA/HSUPA til/fra
diff --git a/DeviceSettings/res/values-de/strings.xml b/DeviceSettings/res/values-de/strings.xml
index 054a949..8262eb8 100644
--- a/DeviceSettings/res/values-de/strings.xml
+++ b/DeviceSettings/res/values-de/strings.xml
@@ -2,6 +2,8 @@
Erweiterte Einstellungen
+ Zurücksetzen
+
Bildschirm
Farben
mDNIe-Szenario
@@ -34,10 +36,14 @@
Kalibrierung beendet
Der Beschleunigungssensor wurde kalibriert
+
Haptik
- Vibration
- Intensität
- Vibrations-Intensität
+
+
+ Vibrator
+ Vibrationsstärke
+ Stärke des Vibrationseffektes einstellen
+ Vorsicht: Höhere Werte als %1$d werden nicht empfohlen
Mobilfunk
HSPA
diff --git a/DeviceSettings/res/values-es/strings.xml b/DeviceSettings/res/values-es/strings.xml
index 8d54bfc..8896755 100644
--- a/DeviceSettings/res/values-es/strings.xml
+++ b/DeviceSettings/res/values-es/strings.xml
@@ -30,9 +30,10 @@
Calibración realizada
El sensor ha sido calibrado satisfactoriamente
Háptica
- Vibración
- Intensidad de vibración
- Establecer la intensidad de vibración
+ Vibración
+ Intensidad de vibración
+ Establecer la intensidad de vibración
+ No son recomendables valores mayores de %1$d
Radio
HSPA
Habilitar HSDPA/HSUPA
diff --git a/DeviceSettings/res/values-fi/strings.xml b/DeviceSettings/res/values-fi/strings.xml
index 6e7ce2a..9fd0615 100644
--- a/DeviceSettings/res/values-fi/strings.xml
+++ b/DeviceSettings/res/values-fi/strings.xml
@@ -34,11 +34,6 @@
Kalibrointi valmis
Sensori kalibroitu onnistuneesti
- Haptinen
- Värinä
- Värinän voimakkuus
- Säädä värinän voimakkuutta
-
Radio
HSPA
Ota HSDPA/HSUPA käyttöön
diff --git a/DeviceSettings/res/values-fr/strings.xml b/DeviceSettings/res/values-fr/strings.xml
index 38c5e55..4c846ce 100644
--- a/DeviceSettings/res/values-fr/strings.xml
+++ b/DeviceSettings/res/values-fr/strings.xml
@@ -44,9 +44,10 @@
Calibrage terminé
Le capteur a été correctement calibré.
Haptique
- Vibreur
- Intensité du vibreur
- Définir l\'intensité du vibreur
+ Vibreur
+ Intensité du vibreur
+ Définir l\'intensité du vibreur
+ Les valeurs supérieurs à %1$d ne sont pas recommandées
Radio
HSPA
Activer HSDPA/HSUPA
diff --git a/DeviceSettings/res/values-hu/strings.xml b/DeviceSettings/res/values-hu/strings.xml
index 8c5f2c2..7843201 100644
--- a/DeviceSettings/res/values-hu/strings.xml
+++ b/DeviceSettings/res/values-hu/strings.xml
@@ -34,11 +34,6 @@
Kalibrálás befejezve
Az érzékelő sikeresen bekalibrálva.
- Érintési visszajelzés
- Rezgés
- Rezgés erőssége
- Rezgés erősségének beállítása
-
GSM Rádió
HSPA
HSDPA/HSUPA engedélyezése
diff --git a/DeviceSettings/res/values-it/strings.xml b/DeviceSettings/res/values-it/strings.xml
index 831f12e..7e46438 100644
--- a/DeviceSettings/res/values-it/strings.xml
+++ b/DeviceSettings/res/values-it/strings.xml
@@ -29,10 +29,11 @@
Posizionare il telefono su una superficie orizzontale piana e premere per effettuare la calibrazione
Calibrazione effettuata
Il sensore è stato correttamente calibrato.
- Feedback tattile
- Vibratore
- Intensità vibrazione
- Imposta l\'intensità della vibrazione
+ Aptico
+ Vibrazione
+ Intensità vibrazione
+ Modifica l\'intensità della vibrazione del feedback aptico
+ Valori superiori a %1$d non sono raccomandati
Radio
HSPA
Abilita HSDPA/HSUPA
diff --git a/DeviceSettings/res/values-nl/strings.xml b/DeviceSettings/res/values-nl/strings.xml
index 2872d3a..708e963 100644
--- a/DeviceSettings/res/values-nl/strings.xml
+++ b/DeviceSettings/res/values-nl/strings.xml
@@ -49,9 +49,10 @@
De sensor is succesvol gekalibreerd.
Trillen
- Trillen
- Trilintensiteit
- Trilintensiteit instellen
+ Trilapparaat
+ Trilintensiteit
+ Trilintensiteit instellen
+ Waarden hoger dan %1$d worden niet aangeraden
Radio
HSPA
diff --git a/DeviceSettings/res/values-pl/strings.xml b/DeviceSettings/res/values-pl/strings.xml
index e10b92c..a03881b 100644
--- a/DeviceSettings/res/values-pl/strings.xml
+++ b/DeviceSettings/res/values-pl/strings.xml
@@ -34,11 +34,6 @@
Skalibrowano
Akcelerometr został poprawnie skalibrowany.
- Dotyk
- Wibracje
- Intensywność wibracji
- Ustaw intensywność wibracji
-
Radio
HSPA
Aktywuj HSDPA/HSUPA
diff --git a/DeviceSettings/res/values-pt-rBR/strings.xml b/DeviceSettings/res/values-pt-rBR/strings.xml
index 1748a7b..8a3a85a 100644
--- a/DeviceSettings/res/values-pt-rBR/strings.xml
+++ b/DeviceSettings/res/values-pt-rBR/strings.xml
@@ -21,10 +21,11 @@
Tempo limite da luz de fundo
Quanto tempo a luz de fundo irá ficar acesa depois do botão ser pressionado
Sensores
- Resposta Tátil
- Vibração
- Intensidade da Vibração
- Define a intensidade da vibração
+ Resposta tátil
+ Vibração
+ Intensidade da vibração
+ Ajusar a intensidade da resposta por vibração
+ Valores maiores que %1$d não são recomendados
Rádio
HSPA
Ativa HSDPA/HSUPA
@@ -40,4 +41,4 @@
Áudio
Usar áudio USB do dock
Usar a saída de áudio passiva no dock
-
\ No newline at end of file
+
diff --git a/DeviceSettings/res/values-ru/strings.xml b/DeviceSettings/res/values-ru/strings.xml
index 85fa4e1..027f0c2 100644
--- a/DeviceSettings/res/values-ru/strings.xml
+++ b/DeviceSettings/res/values-ru/strings.xml
@@ -34,10 +34,14 @@
Калибровка выполнена
Датчик успешно откалиброван
+
Отклик
- Вибрация
- Интенсивность вибрации
- Установка интенсивности вибрации
+
+
+ Вибрация
+ Интенсивность вибрации
+ Установка интенсивности вибрации
+ Не рекомендуется установка значения выше %1$d
Модем
HSPA
diff --git a/DeviceSettings/res/values-zh-rCN/strings.xml b/DeviceSettings/res/values-zh-rCN/strings.xml
index df08dd2..93cf747 100644
--- a/DeviceSettings/res/values-zh-rCN/strings.xml
+++ b/DeviceSettings/res/values-zh-rCN/strings.xml
@@ -49,11 +49,6 @@
校准完成
感应器已被成功的校准。
- 振动
- 振动器
- 振动器强度
- 设置振动器强度
-
无线电
HSPA
启用 HSDPA/HSUPA
diff --git a/DeviceSettings/res/values/arrays.xml b/DeviceSettings/res/values/arrays.xml
index 6a659f8..eedeead 100644
--- a/DeviceSettings/res/values/arrays.xml
+++ b/DeviceSettings/res/values/arrays.xml
@@ -86,22 +86,6 @@
- 100
-
- - 0%
- - 25%
- - 50% (Default)
- - 75%
- - 100%
-
-
-
- - 0
- - 25
- - 50
- - 75
- - 100
-
-
- UMTS Only
- HSDPA Only
@@ -115,23 +99,23 @@
- - Never
- - 1 second
- - 2 seconds
- - 3 seconds (Default)
- - 4 seconds
- - 5 seconds
- - 6 seconds
+ - Never
+ - 1 second
+ - 2 seconds
+ - 3 seconds (Default)
+ - 4 seconds
+ - 5 seconds
+ - 6 seconds
- - 0
- - 1
- - 2
- - 3
- - 4
- - 5
- - 6
+ - 0
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
diff --git a/DeviceSettings/res/values/config.xml b/DeviceSettings/res/values/config.xml
new file mode 100644
index 0000000..5667f97
--- /dev/null
+++ b/DeviceSettings/res/values/config.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+ true
+ "/sys/vibrator/pwm_val"
+ 100
+ 75
+ 50
+ 0
+
+
diff --git a/DeviceSettings/res/values/strings.xml b/DeviceSettings/res/values/strings.xml
index a848541..5d0a427 100644
--- a/DeviceSettings/res/values/strings.xml
+++ b/DeviceSettings/res/values/strings.xml
@@ -2,6 +2,8 @@
Advanced settings
+ Reset to default
+
Screen
Colors
Scenario
@@ -34,10 +36,14 @@
Calibration done
The sensor has been successfully calibrated.
+
Haptic
- Vibrator
- Vibrator Intensity
- Set vibrator intensity
+
+
+ Vibrator
+ Vibration strength
+ Adjust the strength of the vibration feedback
+ Values higher than %1$d are not recommended
Radio
HSPA
diff --git a/DeviceSettings/res/xml/haptic_preferences.xml b/DeviceSettings/res/xml/haptic_preferences.xml
index 31c0e21..31070ed 100644
--- a/DeviceSettings/res/xml/haptic_preferences.xml
+++ b/DeviceSettings/res/xml/haptic_preferences.xml
@@ -1,13 +1,10 @@
-
+ android:title="@string/vibrator_title">
+
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java
index 7f7970c..c4ff285 100644
--- a/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java
+++ b/DeviceSettings/src/com/cyanogenmod/settings/device/DeviceSettings.java
@@ -46,7 +46,6 @@ public class DeviceSettings extends FragmentActivity {
public static final String KEY_TOUCHSCREEN_SENSITIVITY = "touchscreen_sensitivity";
public static final String KEY_TOUCHKEY_LIGHT = "touchkey_light";
public static final String KEY_TOUCHKEY_TIMEOUT = "touchkey_timeout";
- public static final String KEY_VIBRATOR_INTENSITY = "vibrator_intensity";
public static final String KEY_USE_DOCK_AUDIO = "dock_audio";
ViewPager mViewPager;
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/HapticFragmentActivity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/HapticFragmentActivity.java
index 176d80a..f55b59e 100644
--- a/DeviceSettings/src/com/cyanogenmod/settings/device/HapticFragmentActivity.java
+++ b/DeviceSettings/src/com/cyanogenmod/settings/device/HapticFragmentActivity.java
@@ -17,9 +17,9 @@
package com.cyanogenmod.settings.device;
import android.content.Context;
+import android.content.res.Resources;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
@@ -32,27 +32,33 @@ import com.cyanogenmod.settings.device.R;
public class HapticFragmentActivity extends PreferenceFragment {
- private static final String PREF_ENABLED = "1";
private static final String TAG = "DeviceSettings_Haptic";
+ public static final String KEY_VIBRATOR_TUNING = "vibrator_tuning";
+
+ private static boolean sVibratorTuning;
+ private VibratorTuningPreference mVibratorTuning;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Resources res = getResources();
+ sVibratorTuning = res.getBoolean(R.bool.has_vibrator_tuning);
+
addPreferencesFromResource(R.xml.haptic_preferences);
- PreferenceScreen prefSet = getPreferenceScreen();
-
+ if (sVibratorTuning) {
+ String vibratorFilePath = res.getString(R.string.vibrator_sysfs_file);
+ mVibratorTuning = (VibratorTuningPreference) findPreference(KEY_VIBRATOR_TUNING);
+ mVibratorTuning.setEnabled(VibratorTuningPreference.isSupported(vibratorFilePath));
+ }
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
String boxValue;
String key = preference.getKey();
-
Log.w(TAG, "key: " + key);
-
return true;
}
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java
index 5296d76..e9c1b49 100644
--- a/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java
+++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Startup.java
@@ -34,6 +34,6 @@ public class Startup extends BroadcastReceiver {
ScreenFragmentActivity.restore(context);
SensorsFragmentActivity.restore(context);
TouchkeyTimeout.restore(context);
- VibratorIntensity.restore(context);
+ VibratorTuningPreference.restore(context);
}
}
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java b/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java
index bd8eb65..4ca2e9e 100644
--- a/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java
+++ b/DeviceSettings/src/com/cyanogenmod/settings/device/Utils.java
@@ -18,9 +18,11 @@ package com.cyanogenmod.settings.device;
import android.util.Log;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FileReader;
import java.io.IOException;
import java.io.SyncFailedException;
import android.app.AlertDialog;
@@ -33,6 +35,25 @@ public class Utils {
private static final String TAG_READ = "DeviceSettings_Utils_Read";
private static final String TAG_WRITE = "DeviceSettings_Utils_Write";
+ // Read value from sysfs interface
+ public static String readOneLine(String sFile) {
+ BufferedReader brBuffer;
+ String sLine = null;
+
+ try {
+ brBuffer = new BufferedReader(new FileReader(sFile), 512);
+ try {
+ sLine = brBuffer.readLine();
+ } finally {
+ Log.w(TAG_READ, "file " + sFile + ": " + sLine);
+ brBuffer.close();
+ }
+ } catch (Exception e) {
+ Log.e(TAG_READ, "IO Exception when reading /sys/ file", e);
+ }
+ return sLine;
+ }
+
/**
* Write a string value to the specified file.
*
@@ -128,7 +149,6 @@ public class Utils {
return new File(filename).exists();
}
-
public static void showDialog(Context ctx, String title, String message) {
final AlertDialog alertDialog = new AlertDialog.Builder(ctx).create();
alertDialog.setTitle(title);
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java b/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java
deleted file mode 100644
index 7a809a5..0000000
--- a/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorIntensity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2012 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.cyanogenmod.settings.device;
-
-import java.io.IOException;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.content.SharedPreferences;
-import android.preference.Preference;
-import android.preference.ListPreference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceManager;
-
-public class VibratorIntensity extends ListPreference implements OnPreferenceChangeListener {
-
- public VibratorIntensity(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.setOnPreferenceChangeListener(this);
- }
-
- private static final String FILE = "/sys/vibrator/pwm_val";
-
- public static boolean isSupported() {
- return Utils.fileExists(FILE);
- }
-
- /**
- * Restore vibrator intensity setting from SharedPreferences. (Write to kernel.)
- * @param context The context to read the SharedPreferences from
- */
- public static void restore(Context context) {
- if (!isSupported()) {
- return;
- }
-
- SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
- Utils.writeValue(FILE, sharedPrefs.getString(DeviceSettings.KEY_VIBRATOR_INTENSITY, "50"));
- }
-
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- Utils.writeValue(FILE, (String) newValue);
- return true;
- }
-
-}
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorTuningPreference.java b/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorTuningPreference.java
new file mode 100644
index 0000000..b9e7bb5
--- /dev/null
+++ b/DeviceSettings/src/com/cyanogenmod/settings/device/VibratorTuningPreference.java
@@ -0,0 +1,219 @@
+/*
+ * 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.cyanogenmod.settings.device;
+
+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 java.lang.Math;
+import java.text.DecimalFormat;
+
+/**
+ * Special preference type that allows configuration of vibrator intensity settings on Sony
+ * Devices
+ */
+public class VibratorTuningPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener {
+ private static final String TAG = "DeviceSettings_Vibrator";
+
+ private static String FILE_PATH = null;
+ private static int MAX_VALUE;
+ private static int WARNING_THRESHOLD;
+ private static int DEFAULT_VALUE;
+ private static int MIN_VALUE;
+
+ private SeekBar mSeekBar;
+ private TextView mValue;
+ private TextView mWarning;
+
+ private String mOriginalValue;
+ private int mOriginalPercent;
+
+ private Drawable mProgressDrawable;
+ private Drawable mProgressThumb;
+ private LightingColorFilter mRedFilter;
+
+ public VibratorTuningPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ FILE_PATH = context.getResources().getString(R.string.vibrator_sysfs_file);
+ MAX_VALUE = Integer.valueOf(context.getResources().getString(R.string.intensity_max_value));
+ WARNING_THRESHOLD = Integer.valueOf(context.getResources().getString(R.string.intensity_warning_threshold));
+ DEFAULT_VALUE = Integer.valueOf(context.getResources().getString(R.string.intensity_default_value));
+ MIN_VALUE = Integer.valueOf(context.getResources().getString(R.string.intensity_min_value));
+
+ setDialogLayoutResource(R.layout.preference_dialog_vibrator_tuning);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ builder.setNeutralButton(R.string.defaults_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(R.id.vibrator_seekbar);
+ mValue = (TextView) view.findViewById(R.id.vibrator_value);
+ mWarning = (TextView) view.findViewById(R.id.textWarn);
+
+ String strWarnMsg = getContext().getResources().getString(R.string.vibrator_warning, strengthToPercent(WARNING_THRESHOLD));
+ mWarning.setText(strWarnMsg);
+
+ 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));
+
+ mOriginalValue = Utils.readOneLine(FILE_PATH);
+ mOriginalPercent = strengthToPercent(Integer.parseInt(mOriginalValue));
+
+ mSeekBar.setOnSeekBarChangeListener(this);
+ mSeekBar.setProgress(Integer.valueOf(mOriginalPercent));
+ }
+
+ @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(strengthToPercent(DEFAULT_VALUE));
+ }
+ });
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+
+ if (positiveResult) {
+ Editor editor = getEditor();
+
+ int strength = percentToStrength(mSeekBar.getProgress());
+ editor.putString(FILE_PATH, String.valueOf(strength));
+ editor.commit();
+ } else {
+ Utils.writeValue(FILE_PATH, String.valueOf(mOriginalPercent));
+ }
+ }
+
+ public static void restore(Context context) {
+ FILE_PATH = context.getResources().getString(R.string.vibrator_sysfs_file);
+
+ if (!isSupported(FILE_PATH)) {
+ return;
+ }
+
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ final String value = prefs.getString(FILE_PATH, null);
+
+ if (value != null) {
+ Log.d(TAG, "Restoring vibration setting: " + value);
+ Utils.writeValue(FILE_PATH, value);
+ }
+ }
+
+ public static boolean isSupported(String filePath) {
+ return Utils.fileExists(filePath);
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ boolean shouldWarn = progress >= strengthToPercent(WARNING_THRESHOLD);
+ if (mProgressDrawable != null) {
+ mProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null);
+ }
+ if (mProgressThumb != null) {
+ mProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null);
+ }
+ Utils.writeValue(FILE_PATH, String.valueOf(percentToStrength(progress)));
+ mValue.setText(String.format("%d%%", progress));
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ // Do nothing
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ Vibrator vib = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
+ vib.vibrate(200);
+ }
+
+ /**
+ * Convert vibrator strength to percent
+ */
+ public static int strengthToPercent(int strength) {
+ double maxValue = MAX_VALUE;
+ double minValue = MIN_VALUE;
+
+ double percent = (strength - minValue) * (100 / (maxValue - minValue));
+
+ if (percent > 100)
+ percent = 100;
+ else if (percent < 0)
+ percent = 0;
+
+ return (int) percent;
+ }
+
+ /**
+ * Convert percent to vibrator strength
+ */
+ public static int percentToStrength(int percent) {
+ int strength = Math.round((((MAX_VALUE - MIN_VALUE) * percent) / 100) + MIN_VALUE);
+
+ if (strength > MAX_VALUE)
+ strength = MAX_VALUE;
+ else if (strength < MIN_VALUE)
+ strength = MIN_VALUE;
+
+ return strength;
+ }
+}