RM6785: init: Cleanup and refactor code

Change-Id: Id1df5f0ae453561892dd0530742313b063e7f1de
diff --git a/init/init_RM6785.cpp b/init/init_RM6785.cpp
index 1b088d6..610fe12 100644
--- a/init/init_RM6785.cpp
+++ b/init/init_RM6785.cpp
@@ -1,173 +1,153 @@
-/*
-   Copyright (c) 2020, The LineageOS Project
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions are
-   met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-   ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <fcntl.h>
 #include <fstream>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <android-base/file.h>
+#include <tuple>
 #include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <android-base/strings.h>
 
 #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
 #include <sys/_system_properties.h>
 
 #include "vendor_init.h"
-#include "property_service.h"
 
-#define PROC_NFC_CHIPSET "/proc/oppo_nfc/chipset"
+#define PROC_NFC "/proc/oppo_nfc/chipset"
+#define PROC_OPERATOR "/proc/oppoVersion/operatorName"
 
-using android::base::ReadFileToString;
-using android::base::Trim;
-using std::string;
+void property_override(std::string prop, std::string value, bool add = true) {
+    auto pi = (prop_info *)__system_property_find(prop.c_str());
 
-std::vector<std::string> ro_props_default_source_order = {
-    "",
-    "odm.",
-    "product.",
-    "system.",
-    "system_ext.",
-    "vendor.",
-};
-
-void property_override(char const prop[], char const value[], bool add = true) {
-    prop_info *pi;
-
-    pi = (prop_info*) __system_property_find(prop);
-    if (pi)
-        __system_property_update(pi, value, strlen(value));
-    else if (add)
-        __system_property_add(prop, strlen(prop), value, strlen(value));
-}
-
-void set_ro_build_prop(const std::string &prop, const std::string &value, bool product = true) {
-    string prop_name;
-
-    for (const auto &source : ro_props_default_source_order) {
-        if (product)
-            prop_name = "ro.product." + source + prop;
-        else
-            prop_name = "ro." + source + "build." + prop;
-
-        property_override(prop_name.c_str(), value.c_str());
+    if (pi != nullptr) {
+        __system_property_update(pi, value.c_str(), value.size());
+    } else if (add) {
+        __system_property_add(prop.c_str(), prop.size(), value.c_str(),
+                              value.size());
     }
 }
 
-void check_nfc_support()
-{
-    std::ifstream procfile(PROC_NFC_CHIPSET);
+void set_ro_build_prop(const std::string &prop, const std::string &value,
+                       bool product = true) {
+    std::string prop_name;
+    std::string prop_types[] = {
+        "",
+        "bootimage.",
+        "odm.",
+        "odm_dlkm.",
+        "product.",
+        "system.",
+        "system_ext.",
+        "vendor.",
+        "vendor_dlkm.",
+    };
+
+    for (const std::string &source : prop_types) {
+        if (product) {
+            prop_name = "ro.product." + source + prop;
+        } else {
+            prop_name = "ro." + source + "build." + prop;
+        }
+
+        property_override(prop_name, value, false);
+    }
+}
+
+bool nfc_variant() {
+    std::ifstream nfc_file(PROC_NFC);
+    nfc_file.good();
     std::string chipset;
 
-    getline(procfile, chipset);
+    getline(nfc_file, chipset);
 
     LOG(INFO) << "oppo_nfc : chipset " << chipset;
 
-    if (chipset != "NULL") {
-        property_override("ro.boot.product.hardware.sku", "nfc");
+    return (chipset != "NULL");
+}
+
+std::tuple<std::string, std::string> get_device() {
+    std::string device, model, line;
+    std::ifstream operator_file(PROC_OPERATOR);
+    operator_file.good();
+    getline(operator_file, line);
+
+    int operatorName = stoi(line);
+
+    switch (operatorName) {
+        // realme 6
+        case 101:
+        case 102:
+        case 104:
+        case 105:
+            device = "RMX2001L1";
+            model = "RMX2001";
+            break;
+        case 106:
+            device = "RMX2003L1";
+            model = "RMX2003";
+            break;
+        case 113:
+            device = "RMX2005L1";
+            model = "RMX2005";
+            break;
+        // realme 6i/6s/Narzo
+        case 111:
+        case 112:
+        case 114:
+            device = "RMX2002L1";
+            model = "RMX2002";
+            break;
+        // realme 7
+        case 140:
+        case 141:
+        case 146:
+        case 149:
+            device = "RMX2151L1";
+            model = "RMX2151";
+            break;
+        case 142:
+            device = "RMX2153L1";
+            model = "RMX2153";
+            break;
+        case 94:
+        case 148:
+            device = "RMX2155L1";
+            model = "RMX2155";
+            break;
+        // realme Narzo 30 4G
+        case 90:
+        case 92:
+            device = "RMX2156L1";
+            model = "RMX2156";
+            break;
+        // realme Narzo 20 Pro
+        case 143:
+            device = "RMX2161L1";
+            model = "RMX2161";
+        break;
+        case 145:
+        case 147:
+            device = "RMX2163L1";
+            model = "RMX2163";
+            break;
+        default:
+            LOG(ERROR) << "Unable to read operator from " << PROC_OPERATOR;
     }
+    return {device, model};
 }
 
 void vendor_load_properties() {
-    char const *operator_file = "/proc/oppoVersion/operatorName";
-    string operator_name;
-    string device;
-    string model;
-
-    if (ReadFileToString(operator_file, &operator_name)) {
-        // realme 6
-        if (Trim(operator_name) == "101" || Trim(operator_name) == "102"
-               || Trim(operator_name) == "104" || Trim(operator_name) == "105") {
-            device = "RMX2001L1";
-            model = "RMX2001";
-        }
-        else if (Trim(operator_name) == "106") {
-            device = "RMX2003L1";
-            model = "RMX2003";
-        }
-        else if (Trim(operator_name) == "113") {
-            device = "RMX2005L1";
-            model = "RMX2005";
-        }
-        // realme 6i/6s/Narzo
-        else if (Trim(operator_name) == "111" || Trim(operator_name) == "112"
-               || Trim(operator_name) == "114") {
-            device = "RMX2002L1";
-            model = "RMX2002";
-        }
-        // realme 7
-        else if (Trim(operator_name) == "140" || Trim(operator_name) == "141"
-               || Trim(operator_name) == "146" || Trim(operator_name) == "149") {
-            device = "RMX2151L1";
-            model = "RMX2151";
-            property_override("ro.device", "RMX2151");
-        }
-        else if (Trim(operator_name) == "142") {
-            device = "RMX2153L1";
-            model = "RMX2153";
-            property_override("ro.device", "RMX2151");
-        }
-        else if (Trim(operator_name) == "94" || Trim(operator_name) == "148") {
-            device = "RMX2155L1";
-            model = "RMX2155";
-            property_override("ro.device", "RMX2151");
-        }
-        // realme Narzo 30 4G
-        else if (Trim(operator_name) == "90" || Trim(operator_name) == "92") {
-            device = "RMX2156L1";
-            model = "RMX2156";
-            property_override("ro.device", "RMX2151");
-        }
-        // realme Narzo 20 Pro
-        else if (Trim(operator_name) == "143") {
-            device = "RMX2161L1";
-            model = "RMX2161";
-            property_override("ro.device", "RMX2161");
-        }
-        else if (Trim(operator_name) == "147" || Trim(operator_name) == "145") {
-            device = "RMX2163L1";
-            model = "RMX2163";
-            property_override("ro.device", "RMX2161");
-        }
-    }
-    else {
-        LOG(ERROR) << "Unable to read operator from " << operator_file;
-    }
+    auto [device, model] = get_device();
 
     set_ro_build_prop("device", device);
     set_ro_build_prop("model", model);
     set_ro_build_prop("name", model);
     set_ro_build_prop("product", model, false);
 
-    check_nfc_support();
+    // for RRO
+    if (!device.find("RMX215")) {
+        property_override("ro.device", "RMX2151");
+    }
+    if (!device.find("RMX216")) {
+        property_override("ro.device", "RMX2161");
+    }
+
+    // NFC check
+    if (nfc_variant()) {
+        property_override("ro.boot.product.hardware.sku", "nfc");
+    }
 }