Java tutorial
// // Util.java // Adjust // // Created by Christian Wellenbrock on 2012-10-11. // Copyright (c) 2012-2014 adjust GmbH. All rights reserved. // See the file MIT-LICENSE for copying permission. // package com.adjust.sdk; import static com.adjust.sdk.Constants.ENCODING; import static com.adjust.sdk.Constants.HIGH; import static com.adjust.sdk.Constants.LARGE; import static com.adjust.sdk.Constants.LONG; import static com.adjust.sdk.Constants.LOW; import static com.adjust.sdk.Constants.MD5; import static com.adjust.sdk.Constants.MEDIUM; import static com.adjust.sdk.Constants.NORMAL; import static com.adjust.sdk.Constants.PLUGINS; import static com.adjust.sdk.Constants.SHA1; import static com.adjust.sdk.Constants.SMALL; import static com.adjust.sdk.Constants.UNKNOWN; import static com.adjust.sdk.Constants.XLARGE; import java.math.BigInteger; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.json.JSONException; import org.json.JSONObject; import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; import com.adjust.sdk.plugin.Plugin; /** * Collects utility functions used by Adjust. */ public class Util { private static SimpleDateFormat dateFormat; private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'Z"; protected static String getUserAgent(final Context context) { final Resources resources = context.getResources(); final DisplayMetrics displayMetrics = resources.getDisplayMetrics(); final Configuration configuration = resources.getConfiguration(); final Locale locale = configuration.locale; final int screenLayout = configuration.screenLayout; final String[] parts = { getPackageName(context), getAppVersion(context), getDeviceType(screenLayout), getDeviceName(), getOsName(), getOsVersion(), getLanguage(locale), getCountry(locale), getScreenSize(screenLayout), getScreenFormat(screenLayout), getScreenDensity(displayMetrics), getDisplayWidth(displayMetrics), getDisplayHeight(displayMetrics) }; return TextUtils.join(" ", parts); } private static String getPackageName(final Context context) { final String packageName = context.getPackageName(); return sanitizeString(packageName); } private static String getAppVersion(final Context context) { try { final PackageManager packageManager = context.getPackageManager(); final String name = context.getPackageName(); final PackageInfo info = packageManager.getPackageInfo(name, 0); final String versionName = info.versionName; return sanitizeString(versionName); } catch (NameNotFoundException e) { return UNKNOWN; } } private static String getDeviceType(final int screenLayout) { int screenSize = screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; switch (screenSize) { case Configuration.SCREENLAYOUT_SIZE_SMALL: case Configuration.SCREENLAYOUT_SIZE_NORMAL: return "phone"; case Configuration.SCREENLAYOUT_SIZE_LARGE: case 4: return "tablet"; default: return UNKNOWN; } } private static String getDeviceName() { final String deviceName = Build.MODEL; return sanitizeString(deviceName); } private static String getOsName() { return "android"; } private static String getOsVersion() { final String osVersion = "" + Build.VERSION.SDK_INT; return sanitizeString(osVersion); } private static String getLanguage(final Locale locale) { final String language = locale.getLanguage(); return sanitizeStringShort(language); } private static String getCountry(final Locale locale) { final String country = locale.getCountry(); return sanitizeStringShort(country); } private static String getScreenSize(final int screenLayout) { final int screenSize = screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; switch (screenSize) { case Configuration.SCREENLAYOUT_SIZE_SMALL: return SMALL; case Configuration.SCREENLAYOUT_SIZE_NORMAL: return NORMAL; case Configuration.SCREENLAYOUT_SIZE_LARGE: return LARGE; case 4: return XLARGE; default: return UNKNOWN; } } private static String getScreenFormat(final int screenLayout) { final int screenFormat = screenLayout & Configuration.SCREENLAYOUT_LONG_MASK; switch (screenFormat) { case Configuration.SCREENLAYOUT_LONG_YES: return LONG; case Configuration.SCREENLAYOUT_LONG_NO: return NORMAL; default: return UNKNOWN; } } private static String getScreenDensity(final DisplayMetrics displayMetrics) { final int density = displayMetrics.densityDpi; final int low = (DisplayMetrics.DENSITY_MEDIUM + DisplayMetrics.DENSITY_LOW) / 2; final int high = (DisplayMetrics.DENSITY_MEDIUM + DisplayMetrics.DENSITY_HIGH) / 2; if (0 == density) { return UNKNOWN; } else if (density < low) { return LOW; } else if (density > high) { return HIGH; } return MEDIUM; } private static String getDisplayWidth(DisplayMetrics displayMetrics) { final String displayWidth = String.valueOf(displayMetrics.widthPixels); return sanitizeString(displayWidth); } private static String getDisplayHeight(DisplayMetrics displayMetrics) { final String displayHeight = String.valueOf(displayMetrics.heightPixels); return sanitizeString(displayHeight); } protected static String createUuid() { return UUID.randomUUID().toString(); } // removes spaces and replaces empty string with "unknown" private static String sanitizeString(final String string) { return sanitizeString(string, UNKNOWN); } private static String sanitizeStringShort(final String string) { return sanitizeString(string, "zz"); } private static String sanitizeString(final String string, final String defaultString) { String result = string; if (TextUtils.isEmpty(result)) { result = defaultString; } result = result.replaceAll("\\s", ""); if (TextUtils.isEmpty(result)) { result = defaultString; } return result; } protected static String getAttributionId(final Context context) { try { final ContentResolver contentResolver = context.getContentResolver(); final Uri uri = Uri.parse("content://com.facebook.katana.provider.AttributionIdProvider"); final String columnName = "aid"; final String[] projection = { columnName }; final Cursor cursor = contentResolver.query(uri, projection, null, null, null); if (null == cursor) { return null; } if (!cursor.moveToFirst()) { cursor.close(); return null; } final String attributionId = cursor.getString(cursor.getColumnIndex(columnName)); cursor.close(); return attributionId; } catch (Exception e) { return null; } } public static String quote(String string) { if (string == null) { return null; } Pattern pattern = Pattern.compile("\\s"); Matcher matcher = pattern.matcher(string); if (!matcher.find()) { return string; } return String.format("'%s'", string); } public static String dateFormat(long date) { if (null == dateFormat) { dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US); } return dateFormat.format(date); } public static JSONObject buildJsonObject(String jsonString) { JSONObject jsonObject = null; try { jsonObject = new JSONObject(jsonString); } catch (JSONException e) { } return jsonObject; } public static String getPlayAdId(Context context) { return Reflection.getPlayAdId(context); } public static Boolean isPlayTrackingEnabled(Context context) { return Reflection.isPlayTrackingEnabled(context); } public static boolean isGooglePlayServicesAvailable(Context context) { return Reflection.isGooglePlayServicesAvailable(context); } public static String getMacAddress(Context context) { return Reflection.getMacAddress(context); } public static String getMacSha1(String macAddress) { if (macAddress == null) { return null; } String macSha1 = sha1(macAddress); return macSha1; } public static String getMacShortMd5(String macAddress) { if (macAddress == null) { return null; } String macShort = macAddress.replaceAll(":", ""); String macShortMd5 = md5(macShort); return macShortMd5; } public static String getAndroidId(Context context) { return Reflection.getAndroidId(context); } public static String sha1(final String text) { return hash(text, SHA1); } private static String md5(final String text) { return hash(text, MD5); } private static String hash(final String text, final String method) { String hashString = null; try { final byte[] bytes = text.getBytes(ENCODING); final MessageDigest mesd = MessageDigest.getInstance(method); mesd.update(bytes, 0, bytes.length); final byte[] hash = mesd.digest(); hashString = convertToHex(hash); } catch (Exception e) { } return hashString; } private static String convertToHex(final byte[] bytes) { final BigInteger bigInt = new BigInteger(1, bytes); final String formatString = "%0" + (bytes.length << 1) + "x"; return String.format(formatString, bigInt); } public static Map<String, String> getPluginKeys(Context context) { Map<String, String> pluginKeys = new HashMap<String, String>(); for (Plugin plugin : getPlugins()) { Map.Entry<String, String> pluginEntry = plugin.getParameter(context); if (pluginEntry != null) { pluginKeys.put(pluginEntry.getKey(), pluginEntry.getValue()); } } if (pluginKeys.size() == 0) { return null; } else { return pluginKeys; } } private static List<Plugin> getPlugins() { List<Plugin> plugins = new ArrayList<Plugin>(PLUGINS.size()); for (String pluginName : PLUGINS) { Object pluginObject = Reflection.createDefaultInstance(pluginName); if (pluginObject != null && pluginObject instanceof Plugin) { plugins.add((Plugin) pluginObject); } } return plugins; } public static Bundle getApplicationBundle(Context context, Logger logger) { final ApplicationInfo applicationInfo; try { String packageName = context.getPackageName(); applicationInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); return applicationInfo.metaData; } catch (NameNotFoundException e) { logger.error("ApplicationInfo not found"); } catch (Exception e) { logger.error("Failed to get ApplicationBundle (%s)", e); } return null; } }