mx.klozz.xperience.tweaker.fragments.VoltageControlSettings.java Source code

Java tutorial

Introduction

Here is the source code for mx.klozz.xperience.tweaker.fragments.VoltageControlSettings.java

Source

/*
 * XPerience Kernel Tweaker - An Android CPU Control application
 * Copyright (C) 2011-2015 Carlos "Klozz" Jesus <TeamMEX@XDA-Developers>
 *
 * 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 mx.klozz.xperience.tweaker.fragments;

import android.app.*;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.SeekBar.OnSeekBarChangeListener;

import mx.klozz.xperience.tweaker.R;
import mx.klozz.xperience.tweaker.activities.Settings;
import mx.klozz.xperience.tweaker.util.Constants;
import mx.klozz.xperience.tweaker.helpers.Helpers;
import mx.klozz.xperience.tweaker.util.Voltage;

import java.util.ArrayList;
import java.util.List;

public class VoltageControlSettings extends Fragment implements Constants {
    private List<Voltage> mVoltages;
    private ListAdapter mAdapter;
    SharedPreferences mPreferences;
    private Voltage mVoltage;
    private Context context;
    private int vstep = 25;
    private int mstep = 25;
    private int vmin = 600;
    private int nvsteps = 40;
    private String um = " mV";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();
        mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        mVoltages = getVolts(mPreferences);
        mAdapter = new ListAdapter(context);

        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.voltage_settings, root, false);

        final ListView listView = (ListView) view.findViewById(R.id.ListView);
        final Switch setOnBoot = (Switch) view.findViewById(R.id.applyAtBoot);

        if (mVoltages.isEmpty()) {
            (view.findViewById(R.id.emptyList)).setVisibility(View.VISIBLE);
            (view.findViewById(R.id.BottomBar)).setVisibility(View.GONE);
        }

        setOnBoot.setChecked(mPreferences.getBoolean(VOLTAGE_SOB, false));
        setOnBoot.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mPreferences.edit().putBoolean(VOLTAGE_SOB, isChecked).apply();
                if (isChecked) {
                    String warningMessage = getString(R.string.volt_info);

                    new AlertDialog.Builder(context).setMessage(warningMessage)
                            .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    setOnBoot.setChecked(false);
                                }
                            }).setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                }
                            }).create().show();
                }

            }
        });

        (view.findViewById(R.id.applyBtn)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                final StringBuilder sb = new StringBuilder();
                final String vdd = Helpers.getVoltagePath();
                if (vdd.equals(VDD_PATH)) {
                    for (final Voltage volt : mVoltages) {
                        if (!volt.getSavedMV().equals(volt.getCurrentMv())) {
                            for (int i = 0; i < Helpers.getNumOfCPUS(); i++) {
                                sb.append("busybox echo \"").append(volt.getFreq()).append(" ")
                                        .append(volt.getSavedMV()).append("\" > ")
                                        .append(vdd.replace("cpu0", "cpu" + i)).append(";\n");
                            }
                        }
                    }
                } else if (vdd.equals(VDD_TABLE)) {
                    for (final Voltage volt : mVoltages) {
                        if (!volt.getSavedMV().equals(volt.getCurrentMv())) {
                            sb.append("busybox echo \"").append(volt.getFreq()).append(" ")
                                    .append(volt.getSavedMV()).append("\" > ").append(vdd).append(";\n");
                        }
                    }
                } else {
                    final StringBuilder b = new StringBuilder();
                    for (final Voltage volt : mVoltages) {
                        b.append(volt.getSavedMV()).append(" ");
                    }
                    if (vdd.equals(COMMON_VDD_PATH)) {
                        sb.append("busybox echo \"").append(b.toString()).append("\" > ").append(vdd).append(";\n");
                    } else {
                        for (int i = 0; i < Helpers.getNumOfCPUS(); i++) {
                            sb.append("busybox echo \"").append(b.toString()).append("\" > ")
                                    .append(vdd.replace("cpu0", "cpu" + i)).append(";\n");
                        }
                    }
                }
                Helpers.shExec(sb, context, true);

                final List<Voltage> volts = getVolts(mPreferences);
                mVoltages.clear();
                mVoltages.addAll(volts);
                mAdapter.notifyDataSetChanged();
            }
        });

        mAdapter.setListItems(mVoltages);
        listView.setAdapter(mAdapter);
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                mVoltage = mVoltages.get(position);
                showDialog(vmin, vstep, nvsteps);
            }
        });

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.voltaje_control, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.tablist:
            Helpers.getTabList(getString(R.string.menu_tab), (ViewPager) getView().getParent(), getActivity());
            break;
        case R.id.app_settings:
            Intent intent = new Intent(context, Settings.class);
            startActivity(intent);
            break;
        case R.id.volt_increase:
            IncreasebyStep(mstep);
            break;
        case R.id.volt_decrease:
            IncreasebyStep(-1 * mstep);
            break;
        case R.id.reset:
            new AlertDialog.Builder(getActivity()).setTitle(getString(R.string.mt_reset))
                    .setMessage(getString(R.string.reset_msg))
                    .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }).setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ResetVolt();
                        }
                    }).create().show();
            break;
        }
        return true;
    }

    private void ResetVolt() {
        for (final Voltage volt : mVoltages) {
            SharedPreferences.Editor editor = mPreferences.edit();
            editor.remove(volt.getFreq()).commit();
        }
        final List<Voltage> volts = getVolts(mPreferences);
        mVoltages.clear();
        mVoltages.addAll(volts);
        mAdapter.notifyDataSetChanged();
    }

    private void IncreasebyStep(final int pas) {
        for (final Voltage volt : mVoltages) {
            String value = Integer.toString(Integer.parseInt(volt.getSavedMV()) + pas);
            SharedPreferences.Editor editor = mPreferences.edit();
            editor.putString(volt.getFreq(), value).commit();
        }
        final List<Voltage> volts = getVolts(mPreferences);
        mVoltages.clear();
        mVoltages.addAll(volts);
        mAdapter.notifyDataSetChanged();
    }

    private List<Voltage> getVolts(final SharedPreferences preferences) {
        final List<Voltage> volts = new ArrayList<Voltage>();
        final String vddpath = Helpers.getVoltagePath();
        boolean ismicro = false;
        try {
            final String tablevdd = Helpers.readFileViashell(vddpath, false);
            if (tablevdd != null) {
                for (final String line : tablevdd.split("\n")) {
                    if (line != null && line.contains(":")) {
                        final String[] values = line.split(":");
                        String freq = values[0].trim();
                        if (freq.contains("mhz")) {
                            freq = values[0].replace("mhz", "").trim();
                            freq = String.valueOf(Integer.parseInt(freq) * 1000);
                        }

                        final String currentMv = values[1].replace("mV", "").trim();
                        if (currentMv.length() > 5) {
                            ismicro = true;
                        }
                        final String savedMv = preferences.getString(freq, currentMv);
                        final Voltage voltage = new Voltage();
                        voltage.setFreq(freq);
                        voltage.setCurrentMV(currentMv);
                        voltage.setSavedMV(savedMv);
                        volts.add(voltage);
                    }
                }
                if (ismicro) {
                    vstep = 12500;
                    mstep = 25000;
                    nvsteps = 80;
                    vmin = 600000;
                    um = " V";
                }
            }
        } catch (Exception e) {
            Log.d(TAG, vddpath + " error reading");
        }

        return volts;
    }

    public static List<Voltage> bootgetVolts(final SharedPreferences preferences) {
        final List<Voltage> volts = new ArrayList<Voltage>();
        final String vddpath = Helpers.getVoltagePath();
        try {
            final String tablevdd = Helpers.readFileViashell(vddpath, false);
            if (tablevdd != null) {
                for (final String line : tablevdd.split("\n")) {

                    if (line != null && line.contains(":")) {
                        final String[] values = line.split(":");
                        String freq = values[0].trim();
                        if (freq.contains("mhz")) {
                            freq = values[0].replace("mhz", "").trim();
                            freq = String.valueOf(Integer.parseInt(freq) * 1000);
                        }

                        final String currentMv = values[1].replace("mV", "").trim();

                        final String savedMv = preferences.getString(freq, currentMv);
                        final Voltage voltage = new Voltage();
                        voltage.setFreq(freq);
                        voltage.setCurrentMV(currentMv);
                        voltage.setSavedMV(savedMv);
                        volts.add(voltage);
                    }
                }
            }
        } catch (Exception e) {
            Log.d(TAG, vddpath + " error reading");
        }

        return volts;
    }

    private int getNearestStepIndex(final int value, final int min, final int step, final int total) {
        int index = 0;
        for (int k = 0; k < total; k++) {
            if (value > (k * step + min))
                index++;
            else
                break;
        }
        return index;
    }

    private void showDialog(final int min, final int step, final int total) {
        final LayoutInflater factory = LayoutInflater.from(context);
        final View voltageDialog = factory.inflate(R.layout.voltage_dialog, null);

        final SeekBar voltageSeek = (SeekBar) voltageDialog.findViewById(R.id.voltageSeek);
        final TextView voltageMeter = (TextView) voltageDialog.findViewById(R.id.voltageMeter);

        final String savedMv = mVoltage.getSavedMV();
        final int savedVolt = Integer.parseInt(savedMv);

        voltageMeter.setText(savedMv + um);
        voltageSeek.setMax(total);
        voltageSeek.setProgress(getNearestStepIndex(savedVolt, vmin, vstep, nvsteps));
        voltageSeek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
                if (fromUser) {
                    final String volt = Integer.toString(progress * step + min);
                    voltageMeter.setText(volt + um);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });
        new AlertDialog.Builder(context).setTitle(mVoltage.getFreq() + " kHz").setView(voltageDialog)
                .setPositiveButton(getResources().getString(R.string.ps_volt_save),
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.cancel();
                                final String value = Integer.toString(voltageSeek.getProgress() * step + min);
                                SharedPreferences.Editor editor = mPreferences.edit();
                                editor.putString(mVoltage.getFreq(), value).commit();
                                mVoltage.setSavedMV(value);
                                mAdapter.notifyDataSetChanged();
                            }
                        })
                .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.cancel();
                    }
                }).create().show();
    }

    public class ListAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private List<Voltage> results;

        public ListAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return results.size();
        }

        @Override
        public Object getItem(int position) {
            return results.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            final ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_volt, null);
                holder = new ViewHolder();
                holder.mFreq = (TextView) convertView.findViewById(R.id.Freq);
                holder.mCurrentMV = (TextView) convertView.findViewById(R.id.mVCurrent);
                holder.mSavedMV = (TextView) convertView.findViewById(R.id.mVSaved);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            final Voltage voltage = mVoltages.get(position);
            holder.setFreq(voltage.getFreq());
            holder.setCurrentMV(voltage.getCurrentMv());
            holder.setSavedMV(voltage.getSavedMV());
            return convertView;
        }

        public void setListItems(List<Voltage> mVoltages) {
            results = mVoltages;
        }

        public class ViewHolder {
            private TextView mFreq;
            private TextView mCurrentMV;
            private TextView mSavedMV;

            public void setFreq(final String freq) {
                mFreq.setText(freq + " kHz");
            }

            public void setCurrentMV(final String currentMv) {
                mCurrentMV.setText(getResources().getString(R.string.ps_volt_current_voltage) + currentMv + um);
            }

            public void setSavedMV(final String savedMv) {
                mSavedMV.setText(getResources().getString(R.string.ps_volt_setting_to_apply) + savedMv + um);
            }
        }
    }
}