/* * 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.performance; import android.app.Activity; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceScreen; import android.text.TextUtils; import org.namelessrom.devicecontrol.ActivityCallbacks; import org.namelessrom.devicecontrol.App; import org.namelessrom.devicecontrol.DeviceConstants; import org.namelessrom.devicecontrol.R; import org.namelessrom.devicecontrol.actions.ActionProcessor; import org.namelessrom.devicecontrol.hardware.IoUtils; import org.namelessrom.devicecontrol.models.TaskerConfig; import org.namelessrom.devicecontrol.preferences.AwesomeTogglePreference; import org.namelessrom.devicecontrol.preferences.CustomListPreference; import org.namelessrom.devicecontrol.preferences.CustomPreference; import org.namelessrom.devicecontrol.preferences.CustomTogglePreference; import org.namelessrom.devicecontrol.utils.AlarmHelper; import org.namelessrom.devicecontrol.utils.Utils; import org.namelessrom.devicecontrol.views.AttachPreferenceFragment; import at.amartinz.execution.BusyBox; import at.amartinz.hardware.Emmc; import timber.log.Timber; public class FilesystemFragment extends AttachPreferenceFragment implements IoUtils.IoSchedulerListener, Preference.OnPreferenceChangeListener { private CustomListPreference mIoScheduler; private CustomPreference mIoSchedulerConfigure; private CustomListPreference mReadAhead; private AwesomeTogglePreference mFsync; private AwesomeTogglePreference mDynFsync; private AwesomeTogglePreference mSoftwareCrc; private CustomTogglePreference mFstrim; private CustomListPreference mFstrimInterval; //---------------------------------------------------------------------------------------------- @Override protected int getFragmentId() { return DeviceConstants.ID_CTRL_FILE_SYSTEM; } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.extras_filesystem); String value; mIoScheduler = (CustomListPreference) findPreference("io"); mIoScheduler.setEnabled(false); IoUtils.get().getIoScheduler(this); // setting listener when "onIoScheduler" arrives mIoSchedulerConfigure = (CustomPreference) findPreference("io_configure"); mIoSchedulerConfigure.setEnabled(false); mReadAhead = (CustomListPreference) findPreference("read_ahead"); value = Utils.readOneLine(IoUtils.READ_AHEAD_PATH[0]); mReadAhead.setValue(value); mReadAhead.setSummary(mapReadAhead(value)); mReadAhead.setOnPreferenceChangeListener(this); mFsync = (AwesomeTogglePreference) findPreference("fsync"); if (mFsync.isSupported()) { mFsync.initValue(); mFsync.setOnPreferenceChangeListener(this); } else { getPreferenceScreen().removePreference(mFsync); } mDynFsync = (AwesomeTogglePreference) findPreference("dyn_fsync"); if (mDynFsync.isSupported()) { mDynFsync.initValue(); mDynFsync.setOnPreferenceChangeListener(this); } else { getPreferenceScreen().removePreference(mDynFsync); } mSoftwareCrc = (AwesomeTogglePreference) findPreference("mmc_software_crc"); if (mSoftwareCrc.isSupported()) { mSoftwareCrc.initValue(); mSoftwareCrc.setOnPreferenceChangeListener(this); } else { getPreferenceScreen().removePreference(mSoftwareCrc); } mFstrim = (CustomTogglePreference) findPreference(TaskerConfig.FSTRIM); mFstrimInterval = (CustomListPreference) findPreference(TaskerConfig.FSTRIM_INTERVAL); if (Emmc.get().canBrick() || !BusyBox.isAvailable()) { mFstrim.setEnabled(false); mFstrimInterval.setEnabled(false); } else { mFstrim.setChecked(TaskerConfig.get().fstrimEnabled); mFstrim.setOnPreferenceChangeListener(this); mFstrimInterval.setValueIndex(getFstrim()); mFstrimInterval.setOnPreferenceChangeListener(this); } } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mIoSchedulerConfigure) { final Activity activity = getActivity(); if (activity instanceof ActivityCallbacks) { ((ActivityCallbacks) activity).shouldLoadFragment(DeviceConstants.ID_IOSCHED_TUNING); } return true; } return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override public boolean onPreferenceChange(final Preference preference, final Object o) { if (preference == mIoScheduler) { final String value = String.valueOf(o); mIoScheduler.setSummary(value); ActionProcessor.processAction(ActionProcessor.ACTION_IO_SCHEDULER, value, true); updateIoSchedulerConfigure(value); return true; } else if (preference == mFsync) { mFsync.writeValue((Boolean) o); return true; } else if (preference == mDynFsync) { mDynFsync.writeValue((Boolean) o); return true; } else if (preference == mSoftwareCrc) { mSoftwareCrc.writeValue((Boolean) o); return true; } else if (preference == mReadAhead) { final String value = String.valueOf(o); mReadAhead.setSummary(mapReadAhead(value)); ActionProcessor.processAction(ActionProcessor.ACTION_READ_AHEAD, value, true); return true; } else if (mFstrim == preference) { final boolean value = (Boolean) o; TaskerConfig.get().fstrimEnabled = value; TaskerConfig.get().save(); if (value) { AlarmHelper.setAlarmFstrim(getActivity(), parseFstrim(mFstrimInterval.getValue())); } else { AlarmHelper.cancelAlarmFstrim(getActivity()); } mFstrim.setChecked(value); Timber.v("mFstrim: %s", value); return true; } else if (mFstrimInterval == preference) { final String value = String.valueOf(o); final int realValue = parseFstrim(value); TaskerConfig.get().fstrimInterval = realValue; TaskerConfig.get().save(); if (mFstrim.isChecked()) { AlarmHelper.setAlarmFstrim(getActivity(), realValue); } Timber.v("mFstrimInterval: %s", value); return true; } return false; } private String mapReadAhead(final String value) { final int val = Utils.parseInt(value); // check the value and return the corresponding string switch (val) { case 128: return App.get().getString(R.string.size_128_kb); case 256: return App.get().getString(R.string.size_256_kb); case 512: return App.get().getString(R.string.size_512_kb); case 1024: return App.get().getString(R.string.size_1024_kb); case 2048: return App.get().getString(R.string.size_2048_kb); case 3072: return App.get().getString(R.string.size_3072_kb); case 4096: return App.get().getString(R.string.size_4096_kb); case 8192: return App.get().getString(R.string.size_8192_kb); // if all fails, we return the value we got at the beginning default: case -1: return value; } } @Override public void onIoScheduler(final IoUtils.IoScheduler ioScheduler) { final Activity activity = getActivity(); if (activity != null && ioScheduler != null) { if (ioScheduler.available != null && ioScheduler.available.length > 0 && !TextUtils.isEmpty(ioScheduler.current)) { mIoScheduler.setEntries(ioScheduler.available); mIoScheduler.setEntryValues(ioScheduler.available); mIoScheduler.setValue(ioScheduler.current); mIoScheduler.setSummary(ioScheduler.current); mIoScheduler.setOnPreferenceChangeListener(this); mIoScheduler.setEnabled(true); updateIoSchedulerConfigure(ioScheduler.current); } } } private void updateIoSchedulerConfigure(final String scheduler) { final String title = getString(R.string.configure_format, scheduler); mIoSchedulerConfigure.setTitle(title); mIoSchedulerConfigure.setEnabled(true); } private int parseFstrim(final String position) { try { return parseFstrim(Utils.parseInt(position)); } catch (Exception exc) { return 480; } } private int parseFstrim(final int position) { int value; switch (position) { case 0: value = 5; break; case 1: value = 10; break; case 2: value = 20; break; case 3: value = 30; break; case 4: value = 60; break; case 5: value = 120; break; case 6: value = 240; break; default: case 7: value = 480; break; } return value; } private int getFstrim() { int position; final int value = TaskerConfig.get().fstrimInterval; switch (value) { case 5: position = 0; break; case 10: position = 1; break; case 20: position = 2; break; case 30: position = 3; break; case 60: position = 4; break; case 120: position = 5; break; case 240: position = 6; break; default: case 480: position = 7; break; } return position; } }