package com.adjust.sdk; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.util.DisplayMetrics; import java.math.BigInteger; import java.security.MessageDigest; import java.util.Locale; import java.util.Map; 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.SHA1; import static com.adjust.sdk.Constants.SMALL; import static com.adjust.sdk.Constants.XLARGE; /** * Created by pfms on 06/11/14. */ class DeviceInfo { String macSha1; String macShortMd5; String androidId; String fbAttributionId; String clientSdk; String packageName; String appVersion; String deviceType; String deviceName; String deviceManufacturer; String osName; String osVersion; String language; String country; String screenSize; String screenFormat; String screenDensity; String displayWidth; String displayHeight; Map pluginKeys; DeviceInfo(Context context, String sdkPrefix) { Resources resources = context.getResources(); DisplayMetrics displayMetrics = resources.getDisplayMetrics(); Configuration configuration = resources.getConfiguration(); Locale locale = configuration.locale; int screenLayout = configuration.screenLayout; boolean isGooglePlayServicesAvailable = Reflection.isGooglePlayServicesAvailable(context); String macAddress = getMacAddress(context, isGooglePlayServicesAvailable); packageName = getPackageName(context); appVersion = getAppVersion(context); deviceType = getDeviceType(screenLayout); deviceName = getDeviceName(); deviceManufacturer = getDeviceManufacturer(); osName = getOsName(); osVersion = getOsVersion(); language = getLanguage(locale); country = getCountry(locale); screenSize = getScreenSize(screenLayout); screenFormat = getScreenFormat(screenLayout); screenDensity = getScreenDensity(displayMetrics); displayWidth = getDisplayWidth(displayMetrics); displayHeight = getDisplayHeight(displayMetrics); clientSdk = getClientSdk(sdkPrefix); androidId = getAndroidId(context, isGooglePlayServicesAvailable); fbAttributionId = getFacebookAttributionId(context); pluginKeys = Reflection.getPluginKeys(context); macSha1 = getMacSha1(macAddress); macShortMd5 = getMacShortMd5(macAddress); } private String getMacAddress(Context context, boolean isGooglePlayServicesAvailable) { if (!isGooglePlayServicesAvailable) { if (!!Util.checkPermission(context, android.Manifest.permission.ACCESS_WIFI_STATE)) { AdjustFactory.getLogger().warn("Missing permission: ACCESS_WIFI_STATE"); } return Reflection.getMacAddress(context); } else { return null; } } private String getPackageName(Context context) { return context.getPackageName(); } private String getAppVersion(Context context) { try { PackageManager packageManager = context.getPackageManager(); String name = context.getPackageName(); PackageInfo info = packageManager.getPackageInfo(name, 0); return info.versionName; } catch (PackageManager.NameNotFoundException e) { return null; } } private String getDeviceType(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 null; } } private String getDeviceName() { return Build.MODEL; } private String getDeviceManufacturer() { return Build.MANUFACTURER; } private String getOsName() { return "android"; } private String getOsVersion() { return osVersion = "" + Build.VERSION.SDK_INT; } private String getLanguage(Locale locale) { return locale.getLanguage(); } private String getCountry(Locale locale) { return locale.getCountry(); } private String getScreenSize(int screenLayout) { 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 null; } } private String getScreenFormat(int screenLayout) { 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 null; } } private String getScreenDensity(DisplayMetrics displayMetrics) { int density = displayMetrics.densityDpi; int low = (DisplayMetrics.DENSITY_MEDIUM + DisplayMetrics.DENSITY_LOW) / 2; int high = (DisplayMetrics.DENSITY_MEDIUM + DisplayMetrics.DENSITY_HIGH) / 2; if (0 == density) { return null; } else if (density < low) { return LOW; } else if (density > high) { return HIGH; } return MEDIUM; } private String getDisplayWidth(DisplayMetrics displayMetrics) { return String.valueOf(displayMetrics.widthPixels); } private String getDisplayHeight(DisplayMetrics displayMetrics) { return String.valueOf(displayMetrics.heightPixels); } private String getClientSdk(String sdkPrefix) { if (sdkPrefix == null) { return Constants.CLIENT_SDK; } else { return String.format("%s@%s", sdkPrefix, Constants.CLIENT_SDK); } } private String getMacSha1(String macAddress) { if (macAddress == null) { return null; } String macSha1 = sha1(macAddress); return macSha1; } private String getMacShortMd5(String macAddress) { if (macAddress == null) { return null; } String macShort = macAddress.replaceAll(":", ""); String macShortMd5 = md5(macShort); return macShortMd5; } private String getAndroidId(Context context, boolean isGooglePlayServicesAvailable) { if (!isGooglePlayServicesAvailable) { return Reflection.getAndroidId(context); } else { return null; } } private String sha1(final String text) { return hash(text, SHA1); } private String md5(final String text) { return hash(text, MD5); } private 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); } private String getFacebookAttributionId(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; } } }