/* * Copyright (C) 2011-2012 sakuramilk <c.sakuramilk@gmail.com> * * 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 net.sakuramilk.TweakGS2.GpuControl; import java.util.ArrayList; import net.sakuramilk.TweakGS2.R; import net.sakuramilk.util.Misc; import net.sakuramilk.widget.ApplyButtonPreferenceActivity; import net.sakuramilk.widget.SeekBarPreference; import net.sakuramilk.widget.SeekBarPreference.OnSeekBarPreferenceDoneListener; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.preference.Preference.OnPreferenceChangeListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; public class GpuControlPreferenceActivity extends ApplyButtonPreferenceActivity implements OnSeekBarPreferenceDoneListener, OnClickListener, OnPreferenceChangeListener { private GpuControlSetting mSetting; private Integer mCurFreqs[] = null; private Integer mCurVolts[] = null; private Integer mCurThresholds[] = null; private Integer mSavedFreqs[] = null; private Integer mSavedVolts[] = null; private Integer mSavedThresholds[] = null; private int mFreqStep; private int mThresholdStep; private ArrayList<SeekBarPreference> mFreqPrefList; private ArrayList<SeekBarPreference> mThresholdPrefList; private ArrayList<SeekBarPreference> mVoltPrefList; private CheckBoxPreference mSetOnBoot; private boolean mSetOnBootChecked; private void setMaxMinValue() { if (mFreqPrefList != null) { for (int i = 0; i < mFreqPrefList.size(); i++) { SeekBarPreference pref = mFreqPrefList.get(i); pref.setSummary(Misc.getCurrentAndSavedValueText( this, String.valueOf(mCurFreqs[i]) + "MHz", String.valueOf(mSavedFreqs[i]) + "MHz")); if (i == 0) { pref.setValue(mSavedFreqs[i+1], GpuControlSetting.FREQ_MIN, mSavedFreqs[i]); } else if (i == (mFreqPrefList.size() - 1)) { pref.setValue(GpuControlSetting.FREQ_MAX, mSavedFreqs[i-1], mSavedFreqs[i]); } else { pref.setValue(mSavedFreqs[i+1], mSavedFreqs[i-1], mSavedFreqs[i]); } } } if (mThresholdPrefList != null) { for (int i = 0; i < mThresholdPrefList.size(); i++) { SeekBarPreference pref = mThresholdPrefList.get(i); pref.setSummary(Misc.getCurrentAndSavedValueText( this, String.valueOf(mCurThresholds[i]) + "%", String.valueOf(mSavedThresholds[i]) + "%")); pref.setValue(GpuControlSetting.THRESHOLD_MAX, GpuControlSetting.THRESHOLD_MIN, mSavedThresholds[i]); } } if (mVoltPrefList != null) { for (int i = 0; i < mVoltPrefList.size(); i++) { SeekBarPreference pref = mVoltPrefList.get(i); pref.setSummary(Misc.getCurrentAndSavedValueText( this, String.valueOf(mCurVolts[i]) + "mV", String.valueOf(mSavedVolts[i]) + "mV")); if (i == 0) { pref.setValue(mSavedVolts[i+1], GpuControlSetting.VOLT_MIN, mSavedVolts[i]); } else if (i == (mVoltPrefList.size() - 1)) { pref.setValue(GpuControlSetting.VOLT_MAX, mCurVolts[i-1], mSavedVolts[i]); } else { pref.setValue(mSavedVolts[i+1], mSavedVolts[i-1], mSavedVolts[i]); } } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.gpu_control_pref); PreferenceManager prefManager = getPreferenceManager(); PreferenceScreen rootPref = (PreferenceScreen)prefManager.findPreference(GpuControlSetting.KEY_ROOT_PREF); mSetting = new GpuControlSetting(this); if (mSetting.isEnableFreqCtrl()) { mCurFreqs = mSetting.getFreqs(); mSavedFreqs = mSetting.loadFreqs(); if (mSavedFreqs == null) { mSavedFreqs = mCurFreqs.clone(); } if (mCurFreqs.length != mSavedFreqs.length) { mSetting.reset(); mSavedFreqs = mCurFreqs.clone(); } mFreqPrefList = new ArrayList<SeekBarPreference>(); for (int i = 0; i < mCurFreqs.length; i++) { SeekBarPreference pref = new SeekBarPreference(this, null); pref.setKey(GpuControlSetting.KEY_GPU_FREQ_BASE + i); pref.setTitle(R.string.frequency); pref.setDialogTitle(R.string.frequency); pref.setOnPreferenceDoneListener(this); mFreqPrefList.add(pref); } mFreqStep = mCurFreqs.length; mCurThresholds = mSetting.getThresholds(); if (mCurThresholds != null && mCurThresholds.length != 0) { mSavedThresholds = mSetting.loadThresholds(); if (mSavedThresholds == null) { mSavedThresholds = mCurThresholds.clone(); } mThresholdPrefList = new ArrayList<SeekBarPreference>(); for (int i = 0; i < mCurThresholds.length; i++) { SeekBarPreference pref = new SeekBarPreference(this, null); pref.setKey(GpuControlSetting.KEY_GPU_THRESHOLD_BASE + i); pref.setOnPreferenceDoneListener(this); mThresholdPrefList.add(pref); } mThresholdStep = mCurThresholds.length; } } if (mSetting.isEnableVoltageCtrl()) { mCurVolts = mSetting.getVolts(); mSavedVolts = mSetting.loadVolts(); if (mSavedVolts == null) { mSavedVolts = mCurVolts.clone(); } mVoltPrefList = new ArrayList<SeekBarPreference>(); for (int i = 0; i < mCurVolts.length; i++) { SeekBarPreference pref = new SeekBarPreference(this, null); pref.setKey(GpuControlSetting.KEY_GPU_VOLT_BASE + i); pref.setTitle(R.string.voltage); pref.setDialogTitle(R.string.voltage); pref.setOnPreferenceDoneListener(this); mVoltPrefList.add(pref); } } int j = 0; for (int i = 0; i < mFreqStep; i++) { PreferenceCategory categoryPref = new PreferenceCategory(this); categoryPref.setTitle("Step" + i); rootPref.addPreference(categoryPref); if (mFreqPrefList != null) { rootPref.addPreference(mFreqPrefList.get(i)); } if (mVoltPrefList != null) { rootPref.addPreference(mVoltPrefList.get(i)); } if (mThresholdPrefList != null) { if (j == 0) { SeekBarPreference pref = mThresholdPrefList.get(j++); pref.setTitle(R.string.up_threshold); pref.setDialogTitle(R.string.up_threshold); rootPref.addPreference(pref); } else if (j == mThresholdStep - 1) { SeekBarPreference pref = mThresholdPrefList.get(j++); pref.setTitle(R.string.down_threshold); pref.setDialogTitle(R.string.down_threshold); rootPref.addPreference(pref); } else { SeekBarPreference pref = mThresholdPrefList.get(j++); pref.setTitle(R.string.up_threshold); pref.setDialogTitle(R.string.up_threshold); rootPref.addPreference(pref); pref = mThresholdPrefList.get(j++); pref.setTitle(R.string.down_threshold); pref.setDialogTitle(R.string.down_threshold); rootPref.addPreference(pref); } } } if (mFreqStep > 0) { PreferenceCategory categoryPref = new PreferenceCategory(this); categoryPref.setTitle(R.string.option); mSetOnBoot = new CheckBoxPreference(this); mSetOnBoot.setTitle(R.string.set_on_boot); rootPref.addPreference(mSetOnBoot); mSetOnBootChecked = mSetting.loadSetOnBoot(); mSetOnBoot.setOnPreferenceChangeListener(this); mSetOnBoot.setChecked(mSetOnBootChecked); } mApplyButton.setOnClickListener(this); setMaxMinValue(); } @Override public boolean onPreferenceDone(Preference preference, String newValue) { int value = Integer.parseInt((String)newValue); if (mFreqPrefList != null) { int index = mFreqPrefList.indexOf(preference); if (index != -1) { if (mSavedFreqs[index] != value) { mSavedFreqs[index] = value; setMaxMinValue(); mApplyButton.setEnabled(true); } return false; // don't return true } } if (mThresholdPrefList != null) { int index = mThresholdPrefList.indexOf(preference); if (index != -1) { if (mSavedThresholds[index] != value) { mSavedThresholds[index] = value; setMaxMinValue(); mApplyButton.setEnabled(true); } return false; // don't return true } } if (mVoltPrefList != null) { int index = mVoltPrefList.indexOf(preference); if (index != -1) { if (mSavedVolts[index] != value) { mSavedVolts[index] = value; setMaxMinValue(); mApplyButton.setEnabled(true); } return false; // don't return true } } return false; } @Override public void onClick(View v) { mApplyButton.setEnabled(false); mSetOnBootChecked = mSetOnBoot.isChecked(); mSetting.saveSetOnBoot(mSetOnBootChecked); // NOTICE: set first volt, next freq if (mSavedVolts != null) { mSetting.saveVolts(mSavedVolts); mSetting.setVolts(mSavedVolts); mCurVolts = mSavedVolts.clone(); } if (mSavedFreqs != null) { mSetting.saveFreqs(mSavedFreqs); mSetting.setFreqs(mSavedFreqs); mCurFreqs = mSavedFreqs.clone(); } if (mSavedThresholds != null) { mSetting.saveThresholds(mSavedThresholds); mSetting.setThresholds(mSavedThresholds); mCurThresholds = mSavedThresholds.clone(); } setMaxMinValue(); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { mApplyButton.setEnabled(true); return true; } @Override protected void onPause() { super.onPause(); if (mApplyButton.isEnabled()) { mSetting.saveSetOnBoot(mSetOnBootChecked); } } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean ret = super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.reset_menu, menu); return ret; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_reset: mSetting.reset(); Misc.confirmReboot(this, R.string.reboot_reflect_comfirm); return true; default: return super.onOptionsItemSelected(item); } } }