/*
* This file is part of WhereYouGo.
*
* WhereYouGo 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.
*
* WhereYouGo 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 WhereYouGo. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2012 Menion <whereyougo@asamm.cz>
*/
package menion.android.whereyougo.utils;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.security.MessageDigest;
import java.util.List;
import java.util.zip.ZipInputStream;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.util.DisplayMetrics;
/**
* @author menion
* @since 25.1.2010 2010
*/
public class Utils {
private static String TAG = "Utils";
public static boolean isAndroid201OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 6;
}
public static boolean isAndroid21OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 7;
}
public static boolean isAndroid22OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 8;
}
public static boolean isAndroid23OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 9;
}
public static boolean isAndroid30OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 11;
}
public static boolean isAndroidTablet30OrMore() {
return Utils.parseInt(Build.VERSION.SDK) >= 11 &&
getScreenCategory() == Const.SCREEN_SIZE_XLARGE;
}
/*********************************************/
/* PARSE SECTION */
/*********************************************/
public static double parseDouble(Object data) {
return parseDouble(String.valueOf(data));
}
public static double parseDouble(String data) {
try {
return Double.parseDouble(data.trim());
} catch (Exception e) {
//Logger.e("Utils", "parseDouble(" + data + ")", e);
return 0.0;
}
}
public static int parseInt(Object data) {
return parseInt(String.valueOf(data));
}
public static int parseInt(String data) {
try {
return Integer.parseInt(data.trim());
} catch (Exception e) {
return 0;
}
}
public static Integer parseInteger(Object data) {
return parseInteger(String.valueOf(data));
}
public static Integer parseInteger(String data) {
try {
return Integer.valueOf(data.trim());
} catch (Exception e) {
return new Integer(0);
}
}
public static float parseFloat(Object data) {
return parseFloat(String.valueOf(data));
}
public static float parseFloat(String data) {
try {
return Float.parseFloat(data.trim());
} catch (Exception e) {
return 0.0f;
}
}
public static long parseLong(Object data) {
return parseLong(String.valueOf(data));
}
public static long parseLong(String data) {
try {
return Long.parseLong(data.trim());
} catch (Exception e) {
return 0;
}
}
public static boolean parseBoolean(Object data) {
return parseBoolean(String.valueOf(data));
}
public static boolean parseBoolean(String data) {
try {
return data.toLowerCase().contains("true") || data.contains("1");
} catch (Exception e) {
return false;
}
}
/**********************************************/
/* OTHERS SECTION */
/**********************************************/
/**
* Adds '0' chars at the beginning of string of specified length
* Menion: this is one of most memory eating function !!!
* @param s original string
* @param length desired length
* @return string with zeros
*/
public static String addZerosBefore(String s, int length) {
String prefix = "";
for (int i = 0; i < (length - s.length()); i++) {
prefix = prefix.concat("0");
}
return prefix + s;
}
public static void closeStream(Closeable is) {
try {
if (is != null) {
is.close();
is = null;
}
} catch (Exception e) {
Logger.e(TAG, "closeStream(" + is + ")", e);
}
}
private static float density = -1.0f;
private static int densityDpi = 0;
private static int screenCategory = -1;
public static float getDpPixels(Context context, float pixels) {
try {
if (density == -1.0f) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
density = metrics.density;
densityDpi = metrics.densityDpi;
//Logger.i(TAG, "density:" + density);
}
return density * pixels;
} catch (Exception e) {
Logger.e(TAG, "getDpPixels(" + pixels + "), e:" + e);
e.printStackTrace();
return pixels;
}
}
public static float getDpPixels(float pixels) {
return getDpPixels(A.getApp(), pixels);
}
public static float getDensity() {
return getDpPixels(1.0f);
}
public static int getScreenCategory() {
if (screenCategory == -1) {
getDpPixels(1.0f);
if (Const.SCREEN_WIDTH * Const.SCREEN_HEIGHT >= 960 * 720) {
screenCategory = Const.SCREEN_SIZE_XLARGE;
} else if (Const.SCREEN_WIDTH * Const.SCREEN_HEIGHT >= 640 * 480) {
screenCategory = Const.SCREEN_SIZE_LARGE;
} else if (Const.SCREEN_WIDTH * Const.SCREEN_HEIGHT >= 470 * 320) {
screenCategory = Const.SCREEN_SIZE_MEDIUM;
} else {
screenCategory = Const.SCREEN_SIZE_SMALL;
}
}
return screenCategory;
}
public static int getScreenDpi() {
getDpPixels(1.0f);
return densityDpi;
}
private static MessageDigest md;
public synchronized static String hashString(String data) {
try {
if (data == null || data.length() == 0)
return "";
if (md == null) {
md = MessageDigest.getInstance("SHA1");
}
md.update(data.getBytes());
return bytesToHex(md.digest());
} catch (Exception e) {
Logger.e(TAG, "hashString(" + data + ")", e);
}
return new String();
}
private static char[] hexDigit = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static String bytesToHex(byte[] b) {
int length = Math.min(b.length, 5);
StringBuffer buf = new StringBuffer();
for (int j = 0; j < length; j++) {
buf.append(hexDigit[(b[j] >> 4) & 0x0f]);
buf.append(hexDigit[b[j] & 0x0f]);
}
return buf.toString();
}
/*********************************/
/* SECURITY PART */
/*********************************/
public static boolean isIntentAvailable(String action) {
return isIntentAvailable(new Intent(action));
}
public static boolean isIntentAvailable(Intent intent) {
final PackageManager packageManager = A.getApp().getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
//Logger.d(TAG, "isIntentAvailable(" + intent + "), res:" + list.size());
return list.size() > 0;
}
public static boolean isPermissionAllowed(String permission) {
try {
return A.getApp().checkPermission(permission,
android.os.Binder.getCallingPid(),
android.os.Binder.getCallingUid())
== PackageManager.PERMISSION_GRANTED;
} catch (Exception e) {
Logger.e(TAG, "isPermissionAllowed(" + permission + ")", e);
return false;
}
}
}