package ca.canuckcoding.webos;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import java.util.prefs.Preferences;
import org.json.JSONObject;
/**
* @author Jason Robitaille
*/
public class DeviceInfo {
private WebOSConnection webOSCon;
private WebOSDevice device;
private String name;
private String model;
private String os;
private String version;
private String buildName;
private String buildTime;
private String arch;
private boolean legacy;
public DeviceInfo(WebOSConnection wc, WebOSDevice wd) {
webOSCon = wc;
name = null;
device = wd;
model = Model.Unknown.toString();
os = "webOS";
version = "?.?.?";
buildName = "Nova";
buildTime = "????";
arch = null;
legacy = false;
loadBuildInfo();
if(model.equals(Model.Unknown.toString())) {
Model test = Model.determineModel(device.getName());
if(test!=Model.Unknown) {
model = test.toString();
if(arch==null) {
arch = test.getArch();
}
}
}
if(arch==null) {
loadArch();
}
if(arch==null) {
arch = "????";
}
}
private void loadBuildInfo() {
try {
String stdout;
String[] info;
if(webOSCon.fileExists("/etc/palm-build-info")) {
legacy = true;
stdout = webOSCon.runProgram("/bin/cat",
new String[] {"/etc/palm-build-info"});
info = stdout.split("\n");
for(int i=0; i<info.length; i++) {
if(info[i].startsWith("PRODUCT_VERSION_STRING")) {
os = info[i].substring(info[i].indexOf("=")+1);
String[] tokens = os.split(" ");
if(tokens.length>=3) {
version = tokens[2];
}
} else if(info[i].startsWith("BUILDNAME")) {
buildName = info[i].substring(info[i].indexOf("=")+1);
Model test = Model.determineModel(buildName);
if(test!=Model.Unknown) {
model = test.toString();
if(arch==null) {
arch = test.getArch();
}
}
} else if(info[i].startsWith("BUILDTIME")) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date datetime = format.parse(info[i],
new ParsePosition(info[i].indexOf("=")+1));
buildTime = DateFormat.getDateTimeInstance().format(datetime);
}
}
} else {
if(webOSCon.fileExists("/etc/os-release")) {
stdout = webOSCon.runProgram("/bin/cat",
new String[] {"/etc/os-release"});
info = stdout.split("\n");
for(int i=0; i<info.length; i++) {
if(info[i].startsWith("PRETTY_NAME")) {
os = info[i].substring(info[i].indexOf("=")+1);
if(os.toLowerCase().contains("open webos")) {
model = Model.Open_webOS_Device.toString();
}
} else if(info[i].startsWith("VERSION")) {
version = info[i].substring(info[i].indexOf("=")+1);
}
}
}
if(webOSCon.fileExists("/etc/webos-release")) {
stdout = webOSCon.runProgram("/bin/cat",
new String[] {"/etc/webos-release"});
info = stdout.split("\\s+");
if(info.length>=4) {
version = info[2];
int index = version.indexOf("-");
if(index>-1) {
version = version.substring(0, index);
}
buildName = info[3].replace("(", "").replace(")", "");
}
if(stdout.toLowerCase().contains("luneos")) {
os = "LuneOS " + version;
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
private void loadArch() {
try {
String stdout = webOSCon.runProgram("/bin/uname", new String[] {"-a"});
if(stdout.contains("i686")) {
arch = "i686";
} else if(stdout.contains("armv6")) {
arch = "armv6";
} else if(stdout.contains("armv7")) {
arch = "armv7";
} else {
String[] token = stdout.split("\\s+");
arch = token[token.length-2];
}
if(!legacy) {
Model test = Model.determineModel(stdout);
if(test!=Model.Unknown) {
model = test.toString();
if(!test.getArch().equals("all") || arch==null) {
arch = test.getArch();
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
public String name() {
String result = model;
if(Preferences.systemRoot().getBoolean("useDeviceName", false)) {
if(name!=null) {
result = name;
} else {
try {
JSONObject param = new JSONObject("{\"keys\":[\"deviceName\"]}");
List<JSONObject> payload = webOSCon.lunaSend("palm://com.palm.systemservice/getPreferences",
param);
if(payload.size()>0) {
JSONObject response = payload.get(0);
if(response.has("deviceName")) {
name = response.getString("deviceName");
result = name;
}
}
} catch(Exception e) {}
}
}
return result;
}
public String model() { return model; }
public String os() { return os; }
public String version() { return version; }
public String buildName() { return buildName; }
public String buildTime() { return buildTime; }
public String arch() { return arch; }
public static void useDeviceName(boolean use) {
Preferences.systemRoot().putBoolean("useDeviceName", use);
}
public static boolean isUsingDeviceName() {
return Preferences.systemRoot().getBoolean("useDeviceName", false);
}
public enum Model {
Palm_Pre("Palm Pre", "armv7"),
Palm_Pixi("Palm Pixi", "armv6"),
Palm_Pre_Plus("Palm Pre Plus", "armv7"),
Palm_Pixi_Plus("Palm Pixi Plus", "armv6"),
Palm_Pre_2("Palm Pre 2", "armv7"),
HP_Veer("HP Veer", "armv7"),
HP_TouchPad("HP TouchPad", "armv7"),
HP_TouchPad_Go("HP TouchPad Go", "armv7"),
HP_Pre_3("HP Pre 3", "armv7"),
Samsung_Galaxy_Nexus("Samsung Galaxy Nexus", "armv7a"),
LG_Nexus_4("LG Nexus 4", "armv7a"),
Asus_Nexus_7("Asus Nexus 7", "armv7a"),
Open_webOS_Device("Open webOS Device", "all"),
Emulator(ResourceBundle.getBundle("ca/canuckcoding/webos/Locale")
.getString("EMULATOR"), "i686"),
Unknown(ResourceBundle.getBundle("ca/canuckcoding/webos/Locale")
.getString("UNKNOWN_DEVICE"), null);
private String model;
private String arch;
Model(String model, String arch) {
this.model = model;
this.arch = arch;
}
public String getArch() { return arch; }
@Override
public String toString() { return model; }
public static Model determineModel(String test) {
Model result = Unknown;
test = test.toLowerCase();
if(test.contains("verizon") && test.contains("pixie")) {
result = Model.Palm_Pixi_Plus;
} else if(test.contains("castleplus")) {
result = Model.Palm_Pre_Plus;
} else if(test.contains("castle")) {
result = Model.Palm_Pre;
} else if(test.contains("pixie")) {
result = Model.Palm_Pixi;
} else if(test.contains("roadrunner")) {
result = Model.Palm_Pre_2;
} else if(test.contains("broadway")) {
result = Model.HP_Veer;
} else if(test.contains("manta")) {
result = Model.HP_Pre_3;
} else if(test.contains("topaz")) {
result = Model.HP_TouchPad;
} else if(test.contains("tenderloin")) {
result = Model.HP_TouchPad;
} else if(test.contains("opal")) {
result = Model.HP_TouchPad_Go;
} else if(test.contains("maguro")) {
result = Model.Samsung_Galaxy_Nexus;
} else if(test.contains("mako")) {
result = Model.LG_Nexus_4;
} else if(test.contains("grouper")) {
result = Model.Asus_Nexus_7;
} else if(test.contains("qemux86")) {
result = Model.Emulator;
} else if(test.contains("sdk")) {
result = Model.Emulator;
} else if(test.contains("emulator")) {
result = Model.Emulator;
}
return result;
}
}
}