diff --git a/tools/validatekeymaps/Main.cpp b/tools/validatekeymaps/Main.cpp
index 3865076..950473d 100644
--- a/tools/validatekeymaps/Main.cpp
+++ b/tools/validatekeymaps/Main.cpp
@@ -26,15 +26,15 @@
 
 using namespace android;
 
-static const char* kProgName = "validatekeymaps";
+static const char* PROG_NAME = "validatekeymaps";
 static bool gQuiet = false;
 
-enum FileType {
-    FILETYPE_UNKNOWN,
-    FILETYPE_KEYLAYOUT,
-    FILETYPE_KEYCHARACTERMAP,
-    FILETYPE_VIRTUALKEYDEFINITION,
-    FILETYPE_INPUTDEVICECONFIGURATION,
+enum class FileType {
+    UNKNOWN,
+    KEY_LAYOUT,
+    KEY_CHARACTER_MAP,
+    VIRTUAL_KEY_DEFINITION,
+    INPUT_DEVICE_CONFIGURATION,
 };
 
 static void log(const char* fmt, ...) {
@@ -57,33 +57,32 @@
 static void usage() {
     error("Keymap Validation Tool\n\n");
     error("Usage:\n");
-    error(
-        " %s [-q] [*.kl] [*.kcm] [*.idc] [virtualkeys.*] [...]\n"
-        "   Validates the specified key layouts, key character maps, \n"
-        "   input device configurations, or virtual key definitions.\n\n"
-        "   -q Quiet; do not write anything to standard out.\n",
-        kProgName);
+    error(" %s [-q] [*.kl] [*.kcm] [*.idc] [virtualkeys.*] [...]\n"
+          "   Validates the specified key layouts, key character maps, \n"
+          "   input device configurations, or virtual key definitions.\n\n"
+          "   -q Quiet; do not write anything to standard out.\n",
+          PROG_NAME);
 }
 
 static FileType getFileType(const char* filename) {
     const char *extension = strrchr(filename, '.');
     if (extension) {
         if (strcmp(extension, ".kl") == 0) {
-            return FILETYPE_KEYLAYOUT;
+            return FileType::KEY_LAYOUT;
         }
         if (strcmp(extension, ".kcm") == 0) {
-            return FILETYPE_KEYCHARACTERMAP;
+            return FileType::KEY_CHARACTER_MAP;
         }
         if (strcmp(extension, ".idc") == 0) {
-            return FILETYPE_INPUTDEVICECONFIGURATION;
+            return FileType::INPUT_DEVICE_CONFIGURATION;
         }
     }
 
     if (strstr(filename, "virtualkeys.")) {
-        return FILETYPE_VIRTUALKEYDEFINITION;
+        return FileType::VIRTUAL_KEY_DEFINITION;
     }
 
-    return FILETYPE_UNKNOWN;
+    return FileType::UNKNOWN;
 }
 
 static bool validateFile(const char* filename) {
@@ -91,48 +90,49 @@
 
     FileType fileType = getFileType(filename);
     switch (fileType) {
-    case FILETYPE_UNKNOWN:
-        error("Supported file types: *.kl, *.kcm, virtualkeys.*\n\n");
-        return false;
-
-    case FILETYPE_KEYLAYOUT: {
-        base::Result<std::shared_ptr<KeyLayoutMap>> ret = KeyLayoutMap::load(filename);
-        if (!ret) {
-            error("Error %s parsing key layout file.\n\n", ret.error().message().c_str());
+        case FileType::UNKNOWN:
+            error("Supported file types: *.kl, *.kcm, virtualkeys.*\n\n");
             return false;
-        }
-        break;
-    }
 
-    case FILETYPE_KEYCHARACTERMAP: {
-        base::Result<std::shared_ptr<KeyCharacterMap>> ret =
-                KeyCharacterMap::load(filename, KeyCharacterMap::Format::ANY);
-        if (!ret) {
-            error("Error %s parsing key character map file.\n\n", ret.error().message().c_str());
-            return false;
+        case FileType::KEY_LAYOUT: {
+            base::Result<std::shared_ptr<KeyLayoutMap>> ret = KeyLayoutMap::load(filename);
+            if (!ret) {
+                error("Error %s parsing key layout file.\n\n", ret.error().message().c_str());
+                return false;
+            }
+            break;
         }
-        break;
-    }
 
-    case FILETYPE_INPUTDEVICECONFIGURATION: {
-        android::base::Result<std::unique_ptr<PropertyMap>> propertyMap =
-                PropertyMap::load(String8(filename));
-        if (!propertyMap.ok()) {
-            error("Error %d parsing input device configuration file.\n\n",
-                  propertyMap.error().code());
-            return false;
+        case FileType::KEY_CHARACTER_MAP: {
+            base::Result<std::shared_ptr<KeyCharacterMap>> ret =
+                    KeyCharacterMap::load(filename, KeyCharacterMap::Format::ANY);
+            if (!ret) {
+                error("Error %s parsing key character map file.\n\n",
+                      ret.error().message().c_str());
+                return false;
+            }
+            break;
         }
-        break;
-    }
 
-    case FILETYPE_VIRTUALKEYDEFINITION: {
-        std::unique_ptr<VirtualKeyMap> map = VirtualKeyMap::load(filename);
-        if (!map) {
-            error("Error while parsing virtual key definition file.\n\n");
-            return false;
+        case FileType::INPUT_DEVICE_CONFIGURATION: {
+            android::base::Result<std::unique_ptr<PropertyMap>> propertyMap =
+                    PropertyMap::load(String8(filename));
+            if (!propertyMap.ok()) {
+                error("Error %d parsing input device configuration file.\n\n",
+                      propertyMap.error().code());
+                return false;
+            }
+            break;
         }
-        break;
-    }
+
+        case FileType::VIRTUAL_KEY_DEFINITION: {
+            std::unique_ptr<VirtualKeyMap> map = VirtualKeyMap::load(filename);
+            if (!map) {
+                error("Error while parsing virtual key definition file.\n\n");
+                return false;
+            }
+            break;
+        }
     }
 
     return true;
