/* * Copyright (C) 2015-2016 Willi Ye <williye97@gmail.com> * * This file is part of Kernel Adiutor. * * Kernel Adiutor 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. * * Kernel Adiutor 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 Kernel Adiutor. If not, see <http://www.gnu.org/licenses/>. * */ package com.grarak.kerneladiutor.fragments.kernel; import com.grarak.kerneladiutor.R; import com.grarak.kerneladiutor.fragments.ApplyOnBootFragment; import com.grarak.kerneladiutor.fragments.RecyclerViewFragment; import com.grarak.kerneladiutor.utils.Device; import com.grarak.kerneladiutor.utils.Utils; import com.grarak.kerneladiutor.utils.kernel.lmk.LMK; import com.grarak.kerneladiutor.views.recyclerview.DescriptionView; import com.grarak.kerneladiutor.views.recyclerview.RecyclerViewItem; import com.grarak.kerneladiutor.views.recyclerview.SeekBarView; import com.grarak.kerneladiutor.views.recyclerview.SwitchView; import com.grarak.kerneladiutor.views.recyclerview.TitleView; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; /** * Created by willi on 29.06.16. */ public class LMKFragment extends RecyclerViewFragment { private final LinkedHashMap<Integer, String> sProfiles = new LinkedHashMap<>(); private List<SeekBarView> mMinFrees = new ArrayList<>(); @Override protected void init() { super.init(); sProfiles.clear(); sProfiles.put(R.string.very_light, getAdjustedSize(1, 2, 3, 4, 5, 6)); sProfiles.put(R.string.light, getAdjustedSize(2, 3, 4, 5, 6, 7)); sProfiles.put(R.string.medium, getAdjustedSize(3, 4, 5, 6, 7, 9)); sProfiles.put(R.string.aggressive, getAdjustedSize(2, 3, 6, 10, 14, 15)); sProfiles.put(R.string.very_aggressive, getAdjustedSize(3, 4, 5, 11, 15, 16)); addViewPagerFragment(ApplyOnBootFragment.newInstance(this)); } private String getAdjustedSize(int... offsets) { long memTotal = Device.MemInfo.getTotalMem() * 1024L / 100L / 4L; StringBuilder stringBuilder = new StringBuilder(); for (int offset : offsets) { stringBuilder.append(String.valueOf((int) memTotal * offset)).append(","); } stringBuilder.setLength(stringBuilder.length() - 1); return stringBuilder.toString(); } @Override protected void addItems(List<RecyclerViewItem> items) { if (LMK.hasAdaptive()) { adaptiveInit(items); } minfreeInit(items); profileInit(items); swapWait(items); } private void adaptiveInit(List<RecyclerViewItem> items) { SwitchView adaptive = new SwitchView(); adaptive.setTitle(getString(R.string.lmk_adaptive)); adaptive.setSummary(getString(R.string.lmk_adaptive_summary)); adaptive.setChecked(LMK.isAdaptiveEnabled()); adaptive.addOnSwitchListener(new SwitchView.OnSwitchListener() { @Override public void onChanged(SwitchView switchView, boolean isChecked) { LMK.enableAdaptive(isChecked, getActivity()); } }); items.add(adaptive); } private void minfreeInit(List<RecyclerViewItem> items) { mMinFrees.clear(); List<String> minfrees = LMK.getMinFrees(); String[] descriptions = getResources().getStringArray(R.array.lmk_names); for (int i = 0; i < minfrees.size(); i++) { if (i == descriptions.length) break; SeekBarView minfree = new SeekBarView(); minfree.setTitle(descriptions[i]); minfree.setUnit(getString(R.string.mb)); minfree.setMax(1024); minfree.setProgress(Math.round(Utils.strToInt(minfrees.get(i)) / 256)); final int minfreeposition = i; minfree.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { @Override public void onStop(SeekBarView seekBarView, int position, String value) { List<String> minfrees = LMK.getMinFrees(); StringBuilder values = new StringBuilder(); for (int i = 0; i < minfrees.size(); i++) { values.append(minfreeposition == i ? position * 256 : minfrees.get(i)).append(","); } values.setLength(values.length() - 1); LMK.setMinFree(values.toString(), getActivity()); refreshMinFree(); } @Override public void onMove(SeekBarView seekBarView, int position, String value) { } }); items.add(minfree); mMinFrees.add(minfree); } } private void profileInit(List<RecyclerViewItem> items) { TitleView profilesTitle = new TitleView(); profilesTitle.setText(getString(R.string.profile)); items.add(profilesTitle); for (int id : sProfiles.keySet()) { DescriptionView profile = new DescriptionView(); profile.setTitle(getString(id)); profile.setSummary(sProfiles.get(id)); profile.setOnItemClickListener(new RecyclerViewItem.OnItemClickListener() { @Override public void onClick(RecyclerViewItem item) { LMK.setMinFree(((DescriptionView) item).getSummary().toString(), getActivity()); refreshMinFree(); } }); items.add(profile); } } private void swapWait(List<RecyclerViewItem> items) { if (LMK.hasSwapWait()) { SwitchView swapWait = new SwitchView(); swapWait.setTitle(getString(R.string.kill_lmk)); swapWait.setSummary(getString(R.string.kill_lmk_summary)); swapWait.setChecked(LMK.isSwapWaitEnabled()); swapWait.addOnSwitchListener(new SwitchView.OnSwitchListener() { @Override public void onChanged(SwitchView switchView, boolean isChecked) { LMK.enableSwapWait(isChecked, getActivity()); } }); items.add(swapWait); } if (LMK.hasSwapWaitPercent()) { Integer[] percentages = {0, 50, 66, 75, 80, 90}; final Integer[] values = {1, 2, 3, 4, 5, 10}; List<String> list = new ArrayList<>(); for (int i : percentages) { list.add(i + "%"); } SeekBarView swapWaitPercent = new SeekBarView(); swapWaitPercent.setTitle(getString(R.string.kill_lmk_threshold)); swapWaitPercent.setSummary(getString(R.string.kill_lmk_threshold_summary)); swapWaitPercent.setItems(list); swapWaitPercent.setProgress(Arrays.asList(values).indexOf(LMK.getSwapWaitPercent())); swapWaitPercent.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { @Override public void onStop(SeekBarView seekBarView, int position, String value) { LMK.setSwapWaitPercent(values[position], getActivity()); } @Override public void onMove(SeekBarView seekBarView, int position, String value) { } }); items.add(swapWaitPercent); } } private void refreshMinFree() { getHandler().postDelayed(new Runnable() { @Override public void run() { final List<String> minfrees = LMK.getMinFrees(); for (int i = 0; i < minfrees.size(); i++) { if (i == mMinFrees.size()) break; mMinFrees.get(i).setProgress(Math.round(Utils.strToInt(minfrees.get(i)) / 256)); } } }, 250); } }