package com.tomclaw.mandarin.util;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.res.Resources;
import android.database.DatabaseUtils;
import android.text.TextUtils;
import android.util.Base64;
import android.widget.Toast;
import com.tomclaw.mandarin.R;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* Created with IntelliJ IDEA.
* User: Solkin
* Date: 13.10.13
* Time: 20:09
*/
public class StringUtil {
public static final int DEFAULT_ALPHABET_INDEX = '?';
public static final String UTF8_ENCODING = "UTF-8";
private static final String MAPPING_ORIGIN = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
private static final String MAPPING_CP1250 = "ŔÁÂĂÄŨĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺ¸ćçčéęëěíîďđńňóôőö÷řůúűüýţ˙";
private static final String MAPPING_CP1252 = "ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãä叿çèéêëìíîïðñòóôõö÷øùúûüýþÿ";
public static int getAlphabetIndex(String name) {
for (int c = 0; c < name.length(); c++) {
char character = name.charAt(c);
if (Character.isLetterOrDigit(character)) {
return Character.toUpperCase(character);
}
}
return DEFAULT_ALPHABET_INDEX;
}
public static boolean isNumeric(String value) {
return !TextUtils.isEmpty(value) && TextUtils.isDigitsOnly(value);
}
public static String getHmacSha256Base64(String key, String data)
throws NoSuchAlgorithmException, InvalidKeyException {
final String encryptionAlgorithm = "HmacSHA256";
SecretKey secretKey = new SecretKeySpec(data.getBytes(), encryptionAlgorithm);
Mac messageAuthenticationCode = Mac.getInstance(encryptionAlgorithm);
messageAuthenticationCode.init(secretKey);
messageAuthenticationCode.update(key.getBytes());
byte[] digest = messageAuthenticationCode.doFinal();
return Base64.encodeToString(digest, Base64.NO_WRAP);
}
public static String unescapeXml(String string) {
return Entities.XML.unescape(string);
}
public static void copyStringToClipboard(Context context, String string) {
copyStringToClipboard(context, string, 0);
}
public static void copyStringToClipboard(Context context, String string, int toastText) {
ClipboardManager clipboardManager = (ClipboardManager)
context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText("", string));
if (toastText > 0) {
Toast.makeText(context, toastText, Toast.LENGTH_SHORT).show();
}
}
public static String fixCyrillicSymbols(String string) {
String fixed = string;
if (!TextUtils.isEmpty(string)) {
fixed = replaceMappedSymbols(fixed, MAPPING_CP1250, MAPPING_ORIGIN);
fixed = replaceMappedSymbols(fixed, MAPPING_CP1252, MAPPING_ORIGIN);
}
return fixed;
}
private static String replaceMappedSymbols(String string, String mapping, String origin) {
StringBuilder builder = new StringBuilder();
for (int c = 0; c < string.length(); c++) {
char stringChar = string.charAt(c);
for (int i = 0; i < mapping.length(); i++) {
char mappingChar = mapping.charAt(i);
if (stringChar == mappingChar) {
stringChar = origin.charAt(i);
}
}
builder.append(stringChar);
}
return builder.toString();
}
public static String urlEncode(String string) throws UnsupportedEncodingException {
return URLEncoder.encode(string, UTF8_ENCODING).replace("+", "%20");
}
public static String appendIfNotEmpty(String where, String what, String divider) {
if (!StringUtil.isEmptyOrWhitespace(what)) {
if (!StringUtil.isEmptyOrWhitespace(where)) {
where += divider;
}
where += what;
}
return where;
}
public static boolean isEmptyOrWhitespace(String string) {
return TextUtils.isEmpty(string) || TextUtils.isEmpty(string.trim());
}
public static String formatBytes(Resources resources, long bytes) {
if (bytes < 1024) {
return resources.getString(R.string.bytes, bytes);
} else if (bytes < 1024 * 1024) {
return resources.getString(R.string.kibibytes, bytes / 1024.0f);
} else if (bytes < 1024 * 1024 * 1024) {
return resources.getString(R.string.mibibytes, bytes / 1024.0f / 1024.0f);
} else {
return resources.getString(R.string.gigibytes, bytes / 1024.0f / 1024.0f / 1024.0f);
}
}
public static String formatSpeed(float bytesPerSecond) {
float bitsPerSecond = bytesPerSecond * 8;
int unit = 1000;
if (bitsPerSecond < unit) return bitsPerSecond + " bits/sec";
int exp = (int) (Math.log(bitsPerSecond) / Math.log(unit));
String pre = String.valueOf("kmgtpe".charAt(exp - 1));
return String.format("%.1f %sB/sec", bitsPerSecond / Math.pow(unit, exp), pre);
}
public static String escapeSqlWithQuotes(String value) {
return DatabaseUtils.sqlEscapeString(value);
}
public static String escapeSql(String value) {
String escaped = escapeSqlWithQuotes(value);
escaped = escaped.substring(1, escaped.length() - 1);
return escaped;
}
}