package be.lukin.android.babble; import java.util.HashMap; import java.util.Map; import be.lukin.android.babble.provider.Phrase; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.text.SpannableString; import android.text.util.Linkify; public class Utils { private Utils() {} private static final String PUNCT = "\\p{Punct}"; private static final String SPACE = "\\p{Space}"; // TODO: scale by string lengths public static int phraseDistance(String s1, String s2) { s1 = s1.toLowerCase().replaceAll(SPACE, "").replaceAll(PUNCT, ""); s2 = s2.toLowerCase().replaceAll(SPACE, "").replaceAll(PUNCT, ""); return computeDistance(s1, s2); } /** * Originates from: http://rosettacode.org/wiki/Levenshtein_distance#Java */ private static int computeDistance(String s1, String s2) { int[] costs = new int[s2.length() + 1]; for (int i = 0; i <= s1.length(); i++) { int lastValue = i; for (int j = 0; j <= s2.length(); j++) { if (i == 0) costs[j] = j; else { if (j > 0) { int newValue = costs[j - 1]; if (s1.charAt(i - 1) != s2.charAt(j - 1)) newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1; costs[j - 1] = lastValue; lastValue = newValue; } } } if (i > 0) costs[s2.length()] = lastValue; } return costs[s2.length()]; } // TODO: add restriction by timestamp // TODO: SELECT Lang,AVG(Dist) FROM Babble GROUP BY Lang public static Map<String, Double> getLangToDist(Context context) { Map<String, Double> langToDist = new HashMap<String, Double>(); Map<String, Integer> langToCount = new HashMap<String, Integer>(); Cursor c = context.getContentResolver().query( Phrase.Columns.CONTENT_URI, new String[] { Phrase.Columns.LANG, Phrase.Columns.DIST }, null, null, null); while (c.moveToNext()) { String lang = c.getString(0); Integer dist = c.getInt(1); Double val = langToDist.get(lang); if (val == null) { val = (double) dist; langToCount.put(lang, 1); } else { val += dist; langToCount.put(lang, 1 + langToCount.get(lang)); } langToDist.put(lang, val); } c.close(); for (String lang : langToDist.keySet()) { double avg = langToDist.get(lang) / langToCount.get(lang); langToDist.put(lang, avg); } return langToDist; } public static AlertDialog getOkDialog(final Context context, String msg) { final SpannableString s = new SpannableString(msg); Linkify.addLinks(s, Linkify.ALL); return new AlertDialog.Builder(context) .setPositiveButton(context.getString(R.string.buttonOk), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }) .setMessage(s) .create(); } public static AlertDialog getYesNoDialog(Context context, String confirmationMessage, final Executable ex) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder .setMessage(confirmationMessage) .setCancelable(false) .setPositiveButton(context.getString(R.string.buttonYes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ex.execute(); } }) .setNegativeButton(context.getString(R.string.buttonNo), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create(); } }