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; + } +}