From eb82dbf050b17bbac2fd54cdeed3029b78778abb Mon Sep 17 00:00:00 2001 From: Matt Wagantall Date: Tue, 2 Feb 2016 11:32:18 -0800 Subject: [PATCH] cmsdk: cmhw: Add UniqueDeviceId support It's sometimes useful to know what physical device you're using. CMHW SerialNumber and an "ro.serialno" property already exists, but are not guaranteed to be unique. Different OEM may use overlapping numbering schemes, and sometimes placeholder like "012345ABCDE" are used. Attempt to work around these shortcomings by defining a new UniqueDeviceId class that provides a globally unique device ID that is both deterministic for a given device and designed not to overlap with IDs of any other devices. Change-Id: I3f426972558394ba8e78261273ac8521aa603327 --- api/cm_current.txt | 2 ++ .../platform/internal/CMHardwareService.java | 21 +++++++++++++++++- .../hardware/CMHardwareManager.java | 20 ++++++++++++++++- .../hardware/ICMHardwareService.aidl | 2 ++ system-api/cm_system-current.txt | 2 ++ .../tests/hardware/CMHardwareTest.java | 22 ++++++++++++++++++- 6 files changed, 66 insertions(+), 3 deletions(-) diff --git a/api/cm_current.txt b/api/cm_current.txt index 2118013..bdc7fb7 100644 --- a/api/cm_current.txt +++ b/api/cm_current.txt @@ -420,6 +420,7 @@ package cyanogenmod.hardware { method public java.lang.String getSerialNumber(); method public int getSupportedFeatures(); method public int getThermalState(); + method public java.lang.String getUniqueDeviceId(); method public int getVibratorDefaultIntensity(); method public int getVibratorIntensity(); method public int getVibratorMaxIntensity(); @@ -456,6 +457,7 @@ package cyanogenmod.hardware { field public static final int FEATURE_TAP_TO_WAKE = 512; // 0x200 field public static final int FEATURE_THERMAL_MONITOR = 32768; // 0x8000 field public static final int FEATURE_TOUCH_HOVERING = 2048; // 0x800 + field public static final int FEATURE_UNIQUE_DEVICE_ID = 65536; // 0x10000 field public static final int FEATURE_VIBRATOR = 1024; // 0x400 } diff --git a/cm/lib/main/java/org/cyanogenmod/platform/internal/CMHardwareService.java b/cm/lib/main/java/org/cyanogenmod/platform/internal/CMHardwareService.java index 05ee6c7..7031bd7 100644 --- a/cm/lib/main/java/org/cyanogenmod/platform/internal/CMHardwareService.java +++ b/cm/lib/main/java/org/cyanogenmod/platform/internal/CMHardwareService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The CyanogenMod Project + * Copyright (C) 2015-2016 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,7 @@ import org.cyanogenmod.hardware.TapToWake; import org.cyanogenmod.hardware.ThermalMonitor; import org.cyanogenmod.hardware.ThermalUpdateCallback; import org.cyanogenmod.hardware.TouchscreenHovering; +import org.cyanogenmod.hardware.UniqueDeviceId; import org.cyanogenmod.hardware.VibratorHW; /** @hide */ @@ -83,6 +84,7 @@ public class CMHardwareService extends SystemService implements ThermalUpdateCal public long getLtoDownloadInterval(); public String getSerialNumber(); + public String getUniqueDeviceId(); public boolean requireAdaptiveBacklightForSunlightEnhancement(); public boolean isSunlightEnhancementSelfManaged(); @@ -133,6 +135,8 @@ public class CMHardwareService extends SystemService implements ThermalUpdateCal mSupportedFeatures |= CMHardwareManager.FEATURE_PERSISTENT_STORAGE; if (ThermalMonitor.isSupported()) mSupportedFeatures |= CMHardwareManager.FEATURE_THERMAL_MONITOR; + if (UniqueDeviceId.isSupported()) + mSupportedFeatures |= CMHardwareManager.FEATURE_UNIQUE_DEVICE_ID; } public int getSupportedFeatures() { @@ -295,6 +299,10 @@ public class CMHardwareService extends SystemService implements ThermalUpdateCal return SerialNumber.getSerialNumber(); } + public String getUniqueDeviceId() { + return UniqueDeviceId.getUniqueDeviceId(); + } + public boolean requireAdaptiveBacklightForSunlightEnhancement() { return SunlightEnhancement.isAdaptiveBacklightRequired(); } @@ -523,6 +531,17 @@ public class CMHardwareService extends SystemService implements ThermalUpdateCal return mCmHwImpl.getSerialNumber(); } + @Override + public String getUniqueDeviceId() { + mContext.enforceCallingOrSelfPermission( + cyanogenmod.platform.Manifest.permission.HARDWARE_ABSTRACTION_ACCESS, null); + if (!isSupported(CMHardwareManager.FEATURE_UNIQUE_DEVICE_ID)) { + Log.e(TAG, "Unique device ID is not supported"); + return null; + } + return mCmHwImpl.getUniqueDeviceId(); + } + @Override public boolean requireAdaptiveBacklightForSunlightEnhancement() { mContext.enforceCallingOrSelfPermission( diff --git a/src/java/cyanogenmod/hardware/CMHardwareManager.java b/src/java/cyanogenmod/hardware/CMHardwareManager.java index 4425873..7d97df6 100644 --- a/src/java/cyanogenmod/hardware/CMHardwareManager.java +++ b/src/java/cyanogenmod/hardware/CMHardwareManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The CyanogenMod Project + * Copyright (C) 2015-2016 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -124,6 +124,11 @@ public final class CMHardwareManager { */ public static final int FEATURE_THERMAL_MONITOR = 0x8000; + /** + * Unique device ID + */ + public static final int FEATURE_UNIQUE_DEVICE_ID = 0x10000; + private static final List BOOLEAN_FEATURES = Arrays.asList( FEATURE_ADAPTIVE_BACKLIGHT, FEATURE_COLOR_ENHANCEMENT, @@ -699,6 +704,19 @@ public final class CMHardwareManager { return null; } + /** + * @return an id that's both unique and deterministic for the device + */ + public String getUniqueDeviceId() { + try { + if (checkService()) { + return sService.getUniqueDeviceId(); + } + } catch (RemoteException e) { + } + return null; + } + /** * @return true if adaptive backlight should be enabled when sunlight enhancement * is enabled. diff --git a/src/java/cyanogenmod/hardware/ICMHardwareService.aidl b/src/java/cyanogenmod/hardware/ICMHardwareService.aidl index 54dd152..a1ae65b 100644 --- a/src/java/cyanogenmod/hardware/ICMHardwareService.aidl +++ b/src/java/cyanogenmod/hardware/ICMHardwareService.aidl @@ -56,4 +56,6 @@ interface ICMHardwareService { boolean registerThermalListener(IThermalListenerCallback callback); boolean unRegisterThermalListener(IThermalListenerCallback callback); boolean isSunlightEnhancementSelfManaged(); + + String getUniqueDeviceId(); } diff --git a/system-api/cm_system-current.txt b/system-api/cm_system-current.txt index 2118013..bdc7fb7 100644 --- a/system-api/cm_system-current.txt +++ b/system-api/cm_system-current.txt @@ -420,6 +420,7 @@ package cyanogenmod.hardware { method public java.lang.String getSerialNumber(); method public int getSupportedFeatures(); method public int getThermalState(); + method public java.lang.String getUniqueDeviceId(); method public int getVibratorDefaultIntensity(); method public int getVibratorIntensity(); method public int getVibratorMaxIntensity(); @@ -456,6 +457,7 @@ package cyanogenmod.hardware { field public static final int FEATURE_TAP_TO_WAKE = 512; // 0x200 field public static final int FEATURE_THERMAL_MONITOR = 32768; // 0x8000 field public static final int FEATURE_TOUCH_HOVERING = 2048; // 0x800 + field public static final int FEATURE_UNIQUE_DEVICE_ID = 65536; // 0x10000 field public static final int FEATURE_VIBRATOR = 1024; // 0x400 } diff --git a/tests/src/org/cyanogenmod/tests/hardware/CMHardwareTest.java b/tests/src/org/cyanogenmod/tests/hardware/CMHardwareTest.java index 0204d4f..a65f632 100644 --- a/tests/src/org/cyanogenmod/tests/hardware/CMHardwareTest.java +++ b/tests/src/org/cyanogenmod/tests/hardware/CMHardwareTest.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015, The CyanogenMod Project + * Copyright (c) 2015-2016, The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,6 +118,16 @@ public class CMHardwareTest extends TestActivity { } } + private boolean uniqueDeviceIdSupported() { + if (mHardwareManager.isSupported(CMHardwareManager.FEATURE_UNIQUE_DEVICE_ID)) { + return true; + } else { + Toast.makeText(CMHardwareTest.this, "Unique device ID not supported", + Toast.LENGTH_SHORT).show(); + return false; + } + } + private boolean displayModesSupported() { if (mHardwareManager.isSupported(CMHardwareManager.FEATURE_DISPLAY_MODES)) { return true; @@ -312,6 +322,16 @@ public class CMHardwareTest extends TestActivity { } } }, + new Test("Test Get Unique Device ID") { + @Override + protected void run() { + if (uniqueDeviceIdSupported()) { + Toast.makeText(CMHardwareTest.this, "Unique Device ID " + + mHardwareManager.getUniqueDeviceId(), + Toast.LENGTH_SHORT).show(); + } + } + }, new Test("Test Get Display Modes") { @Override protected void run() {