/** Copyright (C) 2013 Louis Teboul (a.k.a Androguide)
*
* admin@pimpmyrom.org || louisteboul@gmail.com
* http://pimpmyrom.org || http://androguide.fr
* 71 quai Clémenceau, 69300 Caluire-et-Cuire, FRANCE.
*
* 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 2 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
**/
package com.androguide.honamicontrol.helpers;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.androguide.honamicontrol.helpers.CMDProcessor.CMDProcessor;
import com.androguide.honamicontrol.helpers.CMDProcessor.CommandResult;
import com.androguide.honamicontrol.kernel.cpucontrol.CPUInterface;
import com.androguide.honamicontrol.kernel.gpucontrol.GPUInterface;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
public class CPUHelper {
private static final String TAG = "CPUHelper";
private static BufferedReader br;
/**
* Checks device for SuperUser permission
*
* @return If SU was granted or denied
*/
public static boolean checkSu() {
if (!new File("/system/bin/su").exists()
&& !new File("/system/xbin/su").exists()) {
Log.e(TAG, "su does not exist!!!");
return false; // tell caller to bail...
}
try {
new CMDProcessor();
CommandResult commandResult = CMDProcessor.runSuCommand("ls /data/app-private");
if (commandResult.success()) {
Log.i(TAG, " SU exists and we have permission");
return true;
} else {
Log.i(TAG, " SU exists but we dont have permission");
return false;
}
} catch (final NullPointerException e) {
Log.e(TAG, e.getLocalizedMessage().toString());
return false;
}
}
/**
* Checks device for network connectivity
*
* @return If the device has data connectivity
*/
public static boolean isNetworkAvailable(final Context c) {
boolean state = false;
if (c != null) {
ConnectivityManager cm = (ConnectivityManager) c
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
Log.i(TAG, "The device currently has data connectivity");
state = true;
} else {
Log.i(TAG, "The device does not currently have data connectivity");
state = false;
}
}
return state;
}
/**
* Checks to see if Busybox is installed in "/system/"
*
* @return If busybox exists
*/
public static boolean checkBusybox() {
if (!new File("/system/bin/busybox").exists()
&& !new File("/system/xbin/busybox").exists()) {
Log.e(TAG, "Busybox not in xbin or bin!");
return false;
}
try {
new CMDProcessor();
if (!CMDProcessor.runSuCommand("busybox mount").success()) {
Log.e(TAG, " Busybox is there but it is borked! ");
return false;
}
} catch (final NullPointerException e) {
Log.e(TAG, e.getLocalizedMessage().toString());
return false;
}
return true;
}
public static String[] getMounts(final String path) {
try {
br = new BufferedReader(new FileReader("/proc/mounts"), 256);
String line = null;
while ((line = br.readLine()) != null) {
if (line.contains(path)) {
return line.split(" ");
}
}
br.close();
} catch (FileNotFoundException e) {
Log.d(TAG, "/proc/mounts does not exist");
} catch (IOException e) {
Log.d(TAG, "Error reading /proc/mounts");
}
return null;
}
public static boolean getMount(final String mount) {
new CMDProcessor();
final String mounts[] = getMounts("/system");
if (mounts != null
&& mounts.length >= 3) {
final String device = mounts[0];
final String path = mounts[1];
final String point = mounts[2];
if (CMDProcessor.runSuCommand(
"mount -o " + mount + ",remount -t " + point + " " + device + " " + path)
.success()) {
return true;
}
}
return (CMDProcessor.runSuCommand("busybox mount -o remount," + mount + " /system").success());
}
public static String readOneLine(String fname) {
BufferedReader br;
String line = null;
try {
br = new BufferedReader(new FileReader(fname), 512);
try {
line = br.readLine();
} finally {
br.close();
}
} catch (Exception e) {
Log.e(TAG, "IO Exception when reading sys file", e);
// attempt to do magic!
return readFileViaShell(fname, true);
}
return line;
}
public static String readOneLineNotRoot(String fname) {
if (new File(fname).exists()) {
BufferedReader br;
String line = null;
try {
br = new BufferedReader(new FileReader(fname), 512);
try {
line = br.readLine();
} finally {
br.close();
}
} catch (Exception e) {
Log.e(TAG, "IO Exception when reading sys file", e);
// attempt to do magic!
return readFileViaShell(fname, false);
}
return line;
} else {
return "";
}
}
public static String readFileViaShell(String filePath, boolean useSu) {
CommandResult cr;
if (useSu) {
new CMDProcessor();
cr = CMDProcessor.runSuCommand("cat " + filePath);
} else {
new CMDProcessor();
cr = CMDProcessor.runShellCommand("cat " + filePath);
}
if (cr.success())
return cr.getStdout();
return null;
}
public static boolean writeOneLine(String fname, String value) {
try {
FileWriter fw = new FileWriter(fname);
try {
fw.write(value);
} finally {
fw.close();
}
} catch (IOException e) {
String Error = "Error writing to " + fname + ". Exception: ";
Log.e(TAG, Error, e);
return false;
}
return true;
}
public static ArrayList<String> getAvailableIOSchedulers() {
ArrayList<String> schedulers = new ArrayList<String>();
String[] aux = readStringArray("/sys/block/mmcblk0/queue/scheduler");
if (aux != null) {
for (int i = 0; i < aux.length; i++) {
if (aux[i].charAt(0) == '[') {
schedulers.add(i, aux[i].substring(1, aux[i].length() - 1));
} else {
schedulers.add(i, aux[i]);
}
}
}
return schedulers;
}
public static ArrayList<String> getAvailableIOSchedulersSD() {
ArrayList<String> schedulers = new ArrayList<String>();
String[] aux = readStringArray("/sys/block/mmcblk1/queue/scheduler");
if (aux != null) {
for (int i = 0; i < aux.length; i++) {
if (aux[i].charAt(0) == '[') {
schedulers.add(i, aux[i].substring(1, aux[i].length() - 1));
} else {
schedulers.add(i, aux[i]);
}
}
}
return schedulers;
}
public static String getIOScheduler() {
String scheduler = null;
String[] schedulers = readStringArray("/sys/block/mmcblk0/queue/scheduler");
if (schedulers != null) {
for (String s : schedulers) {
if (s.charAt(0) == '[') {
scheduler = s.substring(1, s.length() - 1);
break;
}
}
}
return scheduler;
}
public static String getIOSchedulerSD() {
String scheduler = null;
String[] schedulers = readStringArray("/sys/block/mmcblk1/queue/scheduler");
if (schedulers != null) {
for (String s : schedulers) {
if (s.charAt(0) == '[') {
scheduler = s.substring(1, s.length() - 1);
break;
}
}
}
return scheduler;
}
private static String[] readStringArray(String fname) {
String line = readOneLine(fname);
if (line != null) {
return line.split(" ");
}
return null;
}
/**
* Long toast message
*
* @param c Application Context
* @param msg Message to send
*/
public static void msgLong(final Context c, final String msg) {
if (c != null && msg != null) {
Toast.makeText(c, msg.trim(), Toast.LENGTH_LONG).show();
}
}
/**
* Short toast message
*
* @param c Application Context
* @param msg Message to send
*/
public static void msgShort(final Context c, final String msg) {
if (c != null && msg != null) {
Toast.makeText(c, msg.trim(), Toast.LENGTH_SHORT).show();
}
}
/**
* Long toast message
*
* @param c Application Context
* @param msg Message to send
*/
public static void sendMsg(final Context c, final String msg) {
if (c != null && msg != null) {
msgLong(c, msg);
}
}
/**
* Return a timestamp
*
* @param context Application Context
*/
public static String getTimestamp(final Context context) {
String timestamp;
timestamp = "unknown";
Date now = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);
java.text.DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context);
if (dateFormat != null && timeFormat != null) {
timestamp = dateFormat.format(now) + " " + timeFormat.format(now);
}
return timestamp;
}
public static boolean isPackageInstalled(final String packageName,
final PackageManager pm) {
String mVersion;
try {
mVersion = pm.getPackageInfo(packageName, 0).versionName;
if (mVersion.equals(null)) {
return false;
}
} catch (NameNotFoundException e) {
return false;
}
return true;
}
public static void restartSystemUI() {
new CMDProcessor();
CMDProcessor.runSuCommand("pkill -TERM -f com.android.systemui");
}
public static void setSystemProp(String prop, String val) {
new CMDProcessor();
CMDProcessor.runSuCommand("setprop " + prop + " " + val);
}
public static String getSystemProp(String prop, String def) {
String result = getSystemProp(prop);
return result == null ? def : result;
}
private static String getSystemProp(String prop) {
new CMDProcessor();
CommandResult cr = CMDProcessor.runShellCommand("getprop " + prop);
if (cr.success()) {
return cr.getStdout();
} else {
return null;
}
}
public class asyncReadOneLine extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String fname = params[0];
BufferedReader br;
String line = null;
try {
br = new BufferedReader(new FileReader(fname), 512);
try {
line = br.readLine();
} finally {
br.close();
}
} catch (Exception e) {
Log.e(TAG, "IO Exception when reading sys file", e);
// attempt to do magic!
return readFileViaShell(fname, false);
}
return line;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
public static String[] getAvailableCPUFreqs() {
String[] availableFrequencies = new String[0];
String availableFrequenciesLine;
if (Helpers.doesFileExist(CPUInterface.STEPS)) {
availableFrequenciesLine = CPUHelper.readOneLineNotRoot(CPUInterface.STEPS);
if (availableFrequenciesLine != null) {
availableFrequencies = availableFrequenciesLine.split(" ");
Arrays.sort(availableFrequencies, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
return Integer.valueOf(object1).compareTo(
Integer.valueOf(object2));
}
});
}
}
return availableFrequencies;
}
public static String[] getAvailableGPUFreqs() {
String[] availableFrequencies = new String[0];
String availableFrequenciesLine;
if (Helpers.doesFileExist(GPUInterface.availableFreqs)) {
availableFrequenciesLine = CPUHelper.readOneLineNotRoot(GPUInterface.availableFreqs);
if (availableFrequenciesLine != null) {
availableFrequencies = availableFrequenciesLine.split(" ");
Arrays.sort(availableFrequencies, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
return Integer.valueOf(object1).compareTo(
Integer.valueOf(object2));
}
});
}
}
return availableFrequencies;
}
}