package it.angelic.soulissclient.util; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.location.Criteria; import android.net.Uri; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.util.Calendar; import java.util.Map; import java.util.Set; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.R; import it.angelic.soulissclient.SoulissApp; import it.angelic.soulissclient.model.db.SoulissDB; import it.angelic.soulissclient.model.db.SoulissDBHelper; /** * Created by shine@angelic.it on 10/10/2015. */ public class SoulissUtils { private static Criteria criteria; /** * utility minutes * * @param ref * @return */ public static String getTimeAgo(Calendar ref) { Calendar now = Calendar.getInstance(); long milliseconds1 = ref.getTimeInMillis(); long milliseconds2 = now.getTimeInMillis(); long diff = milliseconds2 - milliseconds1; long diffSeconds = diff / 1000; return getScaledTime(diffSeconds) + SoulissApp.getAppContext().getString(R.string.ago); } public static String getScaledTime(long diffSeconds) { if (diffSeconds < 120) return "" + diffSeconds + " sec."; long diffMinutes = diffSeconds / 60; if (diffMinutes < 120) return "" + diffMinutes + " min."; long diffHours = diffMinutes / (60); if (diffHours < 72) return "" + diffHours + " hr"; long diffDays = diffHours / (24); return "" + diffDays + SoulissApp.getAppContext().getString(R.string.days); } public static String getDuration(long typicalOnDurationMsec) { long secondi = typicalOnDurationMsec / 1000; if (secondi < 60) return "" + secondi + " sec."; long diffMinutes = secondi / 60; secondi = secondi % 60;//resto if (diffMinutes < 120) return "" + diffMinutes + " minuti e " + secondi + " secondi"; long diffHours = diffMinutes / (60); diffMinutes = diffMinutes % 60; return "" + diffHours + " ore e " + diffMinutes + " minuti"; //return null; } public static Float celsiusToFahrenheit(float in) { return Float.valueOf((9.0f / 5.0f) * in + 32); } public static Float fahrenheitToCelsius(float fahrenheit) { return Float.valueOf((5.0f / 9.0f) * (fahrenheit - 32)); } public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16)); } return data; } public static void fileCopy(File src, File dst) throws IOException { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst); // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } public static String getRealPathFromURI(Context ctx, Uri contentUri) { String res = null; String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = ctx.getContentResolver().query(contentUri, proj, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); res = cursor.getString(column_index); } cursor.close(); return res; } public static String getImageUrlWithAuthority(Context context, Uri uri) { InputStream is = null; if (uri.getAuthority() != null) { try { is = context.getContentResolver().openInputStream(uri); Bitmap bmp = BitmapFactory.decodeStream(is); return writeToTempImageAndGetPathUri(context, bmp).toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } public static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); return Uri.parse(path); } public static boolean loadSharedPreferencesFromFile(Context ctx, File src) { boolean res = false; ObjectInputStream input = null; try { input = new ObjectInputStream(new FileInputStream(src)); SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(ctx).edit(); prefEdit.clear(); Map<String, ?> entries = (Map<String, ?>) input.readObject(); for (Map.Entry<String, ?> entry : entries.entrySet()) { Object v = entry.getValue(); String key = entry.getKey(); if (v instanceof Boolean) prefEdit.putBoolean(key, ((Boolean) v).booleanValue()); else if (v instanceof Float) prefEdit.putFloat(key, ((Float) v).floatValue()); else if (v instanceof Integer) prefEdit.putInt(key, ((Integer) v).intValue()); else if (v instanceof Long) prefEdit.putLong(key, ((Long) v).longValue()); else if (v instanceof String) prefEdit.putString(key, ((String) v)); else if (v instanceof Set) prefEdit.putStringSet(key, (Set) v); Log.d(Constants.TAG, "Restored pref:" + key + " Value:" + v); } prefEdit.commit(); SoulissApp.getOpzioni().reload(); res = true; } catch (FileNotFoundException | ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (input != null) { input.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } public static Criteria getGeoCriteria() { if (criteria == null) criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_MEDIUM); criteria.setPowerRequirement(Criteria.POWER_LOW); return criteria; } public static void loadSoulissDbFromFile(Context c, String config, File importDir) throws IOException { File bckDb = new File(importDir, config + "_" + SoulissDB.DATABASE_NAME); SoulissDBHelper db = new SoulissDBHelper(c); SoulissDBHelper.open(); String DbPath = SoulissDBHelper.getDatabase().getPath(); db.close(); File newDb = new File(DbPath); SoulissUtils.fileCopy(bckDb, newDb); Log.w(Constants.TAG, config + " DB loaded: " + bckDb.getPath()); } /* * Esporto tutte le pref utente, non quelle cached * */ public static boolean saveSharedPreferencesToFile(SharedPreferences pref, Context context, File dst) { boolean res = false; ObjectOutputStream output = null; try { output = new ObjectOutputStream(new FileOutputStream(dst)); Log.w(Constants.TAG, "Persisting preferences, size:" + pref.getAll().size()); output.writeObject(pref.getAll()); res = true; } catch (IOException e) { e.printStackTrace(); } finally { try { if (output != null) { output.flush(); output.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } public static String getPath(Context context, Uri uri) throws URISyntaxException { if ("content".equalsIgnoreCase(uri.getScheme())) { String[] projection = {"_data"}; Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow("_data"); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } catch (Exception e) { // Eat it } finally { if (cursor != null) cursor.close(); } } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } }