/* * Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.namelessrom.devicecontrol.modules.device; import android.app.Activity; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import org.namelessrom.devicecontrol.ActivityCallbacks; import org.namelessrom.devicecontrol.DeviceConstants; import org.namelessrom.devicecontrol.R; import org.namelessrom.devicecontrol.models.BootupConfig; import org.namelessrom.devicecontrol.modules.bootup.BootupItem; import org.namelessrom.devicecontrol.utils.ShellOutput; import org.namelessrom.devicecontrol.preferences.AwesomeListPreference; import org.namelessrom.devicecontrol.preferences.AwesomeTogglePreference; import org.namelessrom.devicecontrol.preferences.CustomPreference; import org.namelessrom.devicecontrol.preferences.CustomTogglePreference; import org.namelessrom.devicecontrol.preferences.hardware.DisplayColor; import org.namelessrom.devicecontrol.preferences.hardware.DisplayGamma; import org.namelessrom.devicecontrol.preferences.hardware.VibratorIntensity; import org.namelessrom.devicecontrol.views.CustomPreferenceFragment; import org.namelessrom.devicecontrol.utils.Utils; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class DeviceFeatureGeneralFragment extends CustomPreferenceFragment implements Preference.OnPreferenceClickListener { private static final String FC_PATH = "/sys/kernel/fast_charge"; private static final String[] SOUND_CONTROL_PATHS = new String[]{ "/sys/devices/virtual/misc/soundcontrol" }; //============================================================================================== // Input //============================================================================================== private CustomTogglePreference mGloveMode; private AwesomeListPreference mPanelColor; private CustomPreference mFastCharge; private CustomPreference mSoundControl; private final ShellOutput.OnShellOutputListener mShellOutputListener = new ShellOutput.OnShellOutputListener() { @Override public void onShellOutput(final ShellOutput output) { if (output == null || mGloveMode == null) { return; } mGloveMode.setChecked(output.output.contains(GLOVE_MODE_ENABLE)); mGloveMode.setEnabled(true); } }; //============================================================================================== // Overridden Methods //============================================================================================== @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.device_feature_general); final PreferenceScreen preferenceScreen = getPreferenceScreen(); PreferenceCategory category = (PreferenceCategory) findPreference("input_gestures"); AwesomeTogglePreference mKnockOn = (AwesomeTogglePreference) findPreference("knockon_gesture_enable"); if (mKnockOn.isSupported()) { try { mKnockOn.initValue(); } catch (Exception ignored) { } mKnockOn.setOnPreferenceChangeListener(this); } else { category.removePreference(mKnockOn); } AwesomeTogglePreference sweepToWake = (AwesomeTogglePreference) findPreference("sweep_to_wake"); if (sweepToWake.isSupported()) { sweepToWake.initValue(); sweepToWake.setOnPreferenceChangeListener(this); } else { category.removePreference(sweepToWake); } AwesomeTogglePreference sweepToVolume = (AwesomeTogglePreference) findPreference("sweep_to_volume"); if (sweepToVolume.isSupported()) { sweepToVolume.initValue(); sweepToVolume.setOnPreferenceChangeListener(this); } else { category.removePreference(sweepToVolume); } if (category.getPreferenceCount() == 0) { preferenceScreen.removePreference(category); } category = (PreferenceCategory) findPreference("input_others"); final VibratorIntensity pref = (VibratorIntensity) findPreference("vibrator_tuning"); if (!VibratorIntensity.isSupported()) { category.removePreference(pref); } AwesomeTogglePreference awesomeGloveMode = (AwesomeTogglePreference) findPreference("input_glove_mode_aw"); if (awesomeGloveMode.isSupported()) { awesomeGloveMode.initValue(); awesomeGloveMode.setOnPreferenceChangeListener(this); } else { category.removePreference(awesomeGloveMode); awesomeGloveMode = null; } mGloveMode = (CustomTogglePreference) findPreference("input_glove_mode"); try { // if we have already added a glove mode preference, remove it too if (awesomeGloveMode != null || !isHtsSupported()) { category.removePreference(mGloveMode); } else { final BootupItem bootupItem = BootupConfig.get() .getItemByName(mGloveMode.getKey()); final String value = (bootupItem != null ? bootupItem.value : null); final boolean enableGlove = (value != null && value.equals("1")); enableHts(enableGlove); mGloveMode.setOnPreferenceChangeListener(this); } } catch (Exception exc) { category.removePreference(mGloveMode); } AwesomeTogglePreference resetOnSuspend = (AwesomeTogglePreference) findPreference("input_reset_on_suspend"); if (resetOnSuspend.isSupported()) { resetOnSuspend.initValue(); resetOnSuspend.setOnPreferenceChangeListener(this); } else { category.removePreference(resetOnSuspend); } if (category.getPreferenceCount() == 0) { preferenceScreen.removePreference(category); } // LIGHTS category = (PreferenceCategory) findPreference("touchkey"); AwesomeTogglePreference backlightKey = (AwesomeTogglePreference) findPreference("touchkey_light"); if (backlightKey.isSupported()) { backlightKey.initValue(); backlightKey.setOnPreferenceChangeListener(this); } else { category.removePreference(backlightKey); } AwesomeTogglePreference backlightNotification = (AwesomeTogglePreference) findPreference("touchkey_bln"); if (backlightNotification.isSupported()) { backlightNotification.initValue(); backlightNotification.setOnPreferenceChangeListener(this); } else { category.removePreference(backlightNotification); } AwesomeTogglePreference keyboardBacklight = (AwesomeTogglePreference) findPreference("keyboard_light"); if (keyboardBacklight.isSupported()) { keyboardBacklight.initValue(); keyboardBacklight.setOnPreferenceChangeListener(this); } else { category.removePreference(keyboardBacklight); } if (category.getPreferenceCount() == 0) { preferenceScreen.removePreference(category); } // Display category = (PreferenceCategory) findPreference("graphics"); final DisplayColor displayColor = (DisplayColor) findPreference("display_color_calibration"); if (!DisplayColor.isSupported()) { category.removePreference(displayColor); } final DisplayGamma displayGamma = (DisplayGamma) findPreference("display_gamma_calibration"); if (!DisplayGamma.isSupported()) { category.removePreference(displayGamma); } mPanelColor = (AwesomeListPreference) findPreference("panel_color_temperature"); if (mPanelColor.isSupported()) { mPanelColor.initValue(); mPanelColor.setOnPreferenceChangeListener(this); } else { category.removePreference(mPanelColor); } AwesomeTogglePreference lcdPowerReduce = (AwesomeTogglePreference) findPreference("lcd_power_reduce"); if (lcdPowerReduce.isSupported()) { lcdPowerReduce.initValue(); lcdPowerReduce.setOnPreferenceChangeListener(this); } else { category.removePreference(lcdPowerReduce); } AwesomeTogglePreference lcdSunlightEnhancement = (AwesomeTogglePreference) findPreference("lcd_sunlight_enhancement"); if (lcdSunlightEnhancement.isSupported()) { lcdSunlightEnhancement.initValue(); lcdSunlightEnhancement.setOnPreferenceChangeListener(this); } else { category.removePreference(lcdSunlightEnhancement); } AwesomeTogglePreference lcdColorEnhancement = (AwesomeTogglePreference) findPreference("lcd_color_enhancement"); if (lcdColorEnhancement.isSupported()) { lcdColorEnhancement.initValue(); lcdColorEnhancement.setOnPreferenceChangeListener(this); } else { category.removePreference(lcdColorEnhancement); } if (category.getPreferenceCount() == 0) { preferenceScreen.removePreference(category); } category = (PreferenceCategory) findPreference("extras"); AwesomeTogglePreference loggerMode = (AwesomeTogglePreference) findPreference("logger_mode"); if (loggerMode.isSupported()) { loggerMode.initValue(true); loggerMode.setOnPreferenceChangeListener(this); } else { category.removePreference(loggerMode); } if (category.getPreferenceCount() == 0) { preferenceScreen.removePreference(category); } mFastCharge = (CustomPreference) findPreference("fast_charge"); if (Utils.fileExists(FC_PATH)) { mFastCharge.setOnPreferenceClickListener(this); } else { preferenceScreen.removePreference(mFastCharge); } mSoundControl = (CustomPreference) findPreference("sound_control"); if (Utils.fileExists(SOUND_CONTROL_PATHS)) { mSoundControl.setOnPreferenceClickListener(this); } else { preferenceScreen.removePreference(mSoundControl); } isSupported(preferenceScreen, getActivity()); } @Override public boolean onPreferenceChange(Preference preference, Object o) { if (preference == mGloveMode && mGloveMode.isEnabled()) { final boolean value = (Boolean) o; enableHts(value); BootupConfig.setBootup( new BootupItem(BootupConfig.CATEGORY_DEVICE, mGloveMode.getKey(), mGloveMode.getKey(), (value ? "1" : "0"), true)); return true; } else if (preference instanceof AwesomeTogglePreference) { ((AwesomeTogglePreference) preference).writeValue((Boolean) o); return true; } else if (preference == mPanelColor) { mPanelColor.writeValue(String.valueOf(o)); return true; } return false; } @Override public boolean onPreferenceClick(Preference preference) { final int id; if (mFastCharge == preference) { id = DeviceConstants.ID_FAST_CHARGE; } else if (mSoundControl == preference) { id = DeviceConstants.ID_SOUND_CONTROL; } else { id = Integer.MIN_VALUE; } if (id != Integer.MIN_VALUE) { final Activity activity = getActivity(); if (activity instanceof ActivityCallbacks) { ((ActivityCallbacks) activity).shouldLoadFragment(id); } return true; } return false; } //============================================================================================== // Methods //============================================================================================== public static String restore(BootupConfig config) { final ArrayList<BootupItem> items = config.getItemsByCategory(BootupConfig.CATEGORY_DEVICE); if (items.size() == 0) { return ""; } final StringBuilder sbCmd = new StringBuilder(); for (final BootupItem item : items) { if (!item.enabled) { continue; } if ("input_glove_mode".equals(item.filename)) { String mode = ("1".equals(item.value) ? GLOVE_MODE_ENABLE : GLOVE_MODE_DISABLE); sbCmd.append(Utils.getWriteCommand(COMMAND_PATH, mode)); } else { sbCmd.append(Utils.getWriteCommand(item.filename, item.value)); } } return sbCmd.toString(); } private static final String COMMAND_PATH = "/sys/class/sec/tsp/cmd"; private static final String GLOVE_MODE = "glove_mode"; private static final String GLOVE_MODE_ENABLE = GLOVE_MODE + ",1"; private static final String GLOVE_MODE_DISABLE = GLOVE_MODE + ",0"; private void enableHts(final boolean enable) { if (mGloveMode != null) { mGloveMode.setEnabled(false); } final String mode = (enable ? GLOVE_MODE_ENABLE : GLOVE_MODE_DISABLE); Utils.getCommandResult(mShellOutputListener, Utils.getWriteCommand(COMMAND_PATH, mode) + Utils.getReadCommand("/sys/class/sec/tsp/cmd_result")); } /** * Whether device supports high touch sensitivity. * * @return boolean Supported devices must return always true */ private boolean isHtsSupported() { final File f = new File(COMMAND_PATH); // Check to make sure that the kernel supports glove mode if (f.exists()) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("/sys/class/sec/tsp/cmd_list")); String currentLine; while ((currentLine = reader.readLine()) != null) { if (currentLine.equals(GLOVE_MODE)) { return true; } } } catch (IOException ignored) { // ignored } finally { try { if (reader != null) { reader.close(); } } catch (IOException ignored) { // ignored } } } return false; } }