use std::collections::HashMap;
use std::fs::{self, File};
use std::io::Write;
use std::path::Path;
use configparser::ini::Ini;
use protobuf::{RepeatedField, SingularField, SingularPtrField};
use googleplay_protobuf::{AndroidBuildProto, AndroidCheckinProto, DeviceConfigurationProto};
fn main() {
if !Path::new("src/device_properties.bin").exists()
|| !Path::new("src/android_checkins.bin").exists()
{
let mut config = Ini::new();
config
.read(fs::read_to_string("device.properties").unwrap())
.unwrap();
let mut device_configurations = HashMap::new();
let mut android_checkins = HashMap::new();
for section in config.sections() {
let mut android_build = AndroidBuildProto::new();
android_build.id = SingularField::from(config.get(§ion, "Build.FINGERPRINT"));
android_build.product = SingularField::from(config.get(§ion, "Build.HARDWARE"));
android_build.carrier = SingularField::from(config.get(§ion, "Build.BRAND"));
android_build.radio = SingularField::from(config.get(§ion, "Build.RADIO"));
android_build.bootloader =
SingularField::from(config.get(§ion, "Build.BOOTLOADER"));
android_build.device = SingularField::from(config.get(§ion, "Build.DEVICE"));
android_build.sdkVersion = config
.getint(§ion, "Build.VERSION.SDK_INT")
.unwrap()
.map(|v| v as i32);
android_build.model = SingularField::from(config.get(§ion, "Build.MODEL"));
android_build.manufacturer =
SingularField::from(config.get(§ion, "Build.MANUFACTURER"));
android_build.buildProduct = SingularField::from(config.get(§ion, "Build.PRODUCT"));
android_build.client = SingularField::from(config.get(§ion, "Client"));
android_build.otaInstalled = Some(false);
android_build.googleServices = config
.getint(§ion, "GSF.version")
.unwrap()
.map(|v| v as i32);
let mut android_checkin = AndroidCheckinProto::new();
android_checkin.build = SingularPtrField::from(Some(android_build));
android_checkin.lastCheckinMsec = Some(0);
android_checkin.cellOperator =
SingularField::from(config.get(§ion, "CellOperator"));
android_checkin.simOperator = SingularField::from(config.get(§ion, "SimOperator"));
android_checkin.roaming = SingularField::from(config.get(§ion, "Roaming"));
android_checkin.userNumber = Some(0);
android_checkins.insert(section.clone(), android_checkin);
let mut device_configuration = DeviceConfigurationProto::new();
device_configuration.touchScreen = config
.getint(§ion, "TouchScreen")
.unwrap()
.map(|v| v as i32);
device_configuration.keyboard = config
.getint(§ion, "Keyboard")
.unwrap()
.map(|v| v as i32);
device_configuration.navigation = config
.getint(§ion, "Navigation")
.unwrap()
.map(|v| v as i32);
device_configuration.screenLayout = config
.getint(§ion, "ScreenLayout")
.unwrap()
.map(|v| v as i32);
device_configuration.hasHardKeyboard =
config.getbool(§ion, "HasHardKeyboard").unwrap();
device_configuration.hasFiveWayNavigation =
config.getbool(§ion, "HasFiveWayNavigation").unwrap();
device_configuration.screenDensity = config
.getint(§ion, "Screen.Density")
.unwrap()
.map(|v| v as i32);
device_configuration.glEsVersion = config
.getint(§ion, "GL.Version")
.unwrap()
.map(|v| v as i32);
device_configuration.systemSharedLibrary = RepeatedField::from_vec(
config
.get(§ion, "SharedLibraries")
.unwrap()
.split(",")
.map(|s| String::from(s))
.collect(),
);
device_configuration.systemAvailableFeature = RepeatedField::from_vec(
config
.get(§ion, "Features")
.unwrap()
.split(",")
.map(|s| String::from(s))
.collect(),
);
device_configuration.nativePlatform = RepeatedField::from_vec(
config
.get(§ion, "Platforms")
.unwrap()
.split(",")
.map(|s| String::from(s))
.collect(),
);
device_configuration.screenWidth = config
.getint(§ion, "Screen.Width")
.unwrap()
.map(|v| v as i32);
device_configuration.systemSupportedLocale = RepeatedField::from_vec(
config
.get(§ion, "Locales")
.unwrap()
.split(",")
.map(|s| String::from(s))
.collect(),
);
device_configuration.glExtension = RepeatedField::from_vec(
config
.get(§ion, "GL.Extensions")
.unwrap()
.split(",")
.map(|s| String::from(s))
.collect(),
);
device_configurations.insert(section, device_configuration);
}
let devices_encoded: Vec<u8> = bincode::serialize(&device_configurations).unwrap();
let mut file = File::create("src/device_properties.bin").unwrap();
file.write_all(&devices_encoded).unwrap();
let checkins_encoded: Vec<u8> = bincode::serialize(&android_checkins).unwrap();
let mut file = File::create("src/android_checkins.bin").unwrap();
file.write_all(&checkins_encoded).unwrap();
}
}