package com.hokolinks.model; import android.Manifest; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import com.hokolinks.utils.Utils; import com.hokolinks.utils.log.HokoLog; import org.json.JSONException; import org.json.JSONObject; /** * Device is a helper class to get all the necessary information of the user's Device. */ public class Device { // Platform name private static final String PLATFORM = "Android"; // Shared preferences keys private static final String UUID_KEY = "UUID"; // String values for connectivity state private static final String CONNECTIVITY_WIFI = "Wifi"; private static final String CONNECTIVITY_CELLULAR = "Cellular"; private static final String CONNECTIVITY_NO_CONNECTIVITY = "No Connectivity"; private static final String CONNECTIVITY_NO_PERMISSION = "No Permission"; /** * Returns the vendor of the device Hoko is being run on. * * @return The vendor of the device. */ public static String getVendor() { return android.os.Build.MANUFACTURER; } /** * Returns the Android platform. * * @return The Android platform. */ public static String getPlatform() { return PLATFORM; } /** * Returns the model of the device Hoko is being run on. * * @return The model of the device. */ public static String getModel() { return android.os.Build.MODEL; } /** * Returns the Android version of the device Hoko is being run on. * * @return The Android version. */ public static String getSystemVersion() { return String.valueOf(android.os.Build.VERSION.SDK_INT); } /** * Returns the Android release version (like 5.1) of the device Hoko is being run on. * * @return The Android release version. */ public static String getSystemReleaseVersion() { return android.os.Build.VERSION.RELEASE; } /** * Returns the Android build number of the device Hoko is being run on. * * @return The Android build number in case it has been found, "HOKO" otherwise. */ public static String getBuildNumber() { String buildNumber = "HOKO"; if (Build.FINGERPRINT != null) { String[] fingerPrintSplit = Build.FINGERPRINT.split("/"); if (fingerPrintSplit.length > 3) { buildNumber = fingerPrintSplit[3]; } } return buildNumber; } /** * Returns the current internet connectivity of the device Hoko is being run on. * * @param context A context object. * @return The current internet connectivity of the device. */ public static String getInternetConnectivity(Context context) { try { if (Utils.hasPermission(Manifest.permission.ACCESS_NETWORK_STATE, context)) { ConnectivityManager connManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mNetwork = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (mWifi != null && mWifi.isConnected()) { return CONNECTIVITY_WIFI; } else if (mNetwork != null && mNetwork.isConnected()) { return CONNECTIVITY_CELLULAR; } else { return CONNECTIVITY_NO_CONNECTIVITY; } } else { return CONNECTIVITY_NO_PERMISSION; } } catch (Exception e) { return CONNECTIVITY_NO_CONNECTIVITY; } } /** * Checks if the device has internet connectivity regardless how it is connected. * * @param context A context object. * @return true if the device has internet connectivity and false otherwise. */ public static boolean hasInternetConnectivity(Context context) { String internetConnectivity = getInternetConnectivity(context); return internetConnectivity.equals(CONNECTIVITY_CELLULAR) || internetConnectivity.equals(CONNECTIVITY_WIFI) || internetConnectivity.equals(CONNECTIVITY_NO_PERMISSION); } /** * Returns a one-time generated device ID which is saved in the shared preferences for later * usage. This guarantees it is unique but will not persist when the application is reinstalled. * * @param context A context object. * @return The one-time generated device ID. */ public static synchronized String getDeviceID(Context context) { String uid = Utils.getString(UUID_KEY, context); if (uid == null) { uid = Utils.generateUUID(); Utils.saveString(uid, UUID_KEY, context); } return uid; } /** * Converts all the Device information into a JSONObject to be sent to the Hoko backend * service. * * @param context A context object. * @return The JSONObject representation of Device. */ public static JSONObject json(Context context) { try { JSONObject jsonObject = new JSONObject(); jsonObject.putOpt("vendor", getVendor()); jsonObject.putOpt("platform", getPlatform()); jsonObject.putOpt("model", getModel()); jsonObject.putOpt("system_version", getSystemVersion()); jsonObject.putOpt("uid", getDeviceID(context)); return jsonObject; } catch (JSONException e) { HokoLog.e(e); } return null; } }