package me.xiaopan.sketchsample.util;
import android.annotation.SuppressLint;
import android.os.Environment;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Locale;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import me.xiaopan.sketch.util.SketchUtils;
/**
* XPK信息包装类
*/
public class XpkInfo implements Serializable {
private static final long serialVersionUID = -6368588590272075114L;
private int versionCode;// 版本号
private long dataSize = 0;// 数据大小
private long apkSize = 0;// apk大小
private String appName;// 应用名
private String packageName; // 包名
private String versionName;// 版本信息
private String destination; // 数据文件夹位置
public boolean isEmpty() {
return destination == null || dataSize == 0 || apkSize == 0;
}
public int getVersionCode() {
return versionCode;
}
public long getDataSize() {
return dataSize;
}
public long getApkSize() {
return apkSize;
}
public String getAppName() {
return appName;
}
public String getPackageName() {
return packageName;
}
public String getVersionName() {
return versionName;
}
public String getDestination() {
return destination;
}
@Override
public String toString() {
return SketchUtils.concat(" ", new Object[]{
"apk(loc|size|pack)", this.apkSize,
this.packageName, "\ndata(loc|size)", this.destination,
this.dataSize, "\nresult(st|suc)"});
}
/**
* 从manifest.xml中获取xpk的信息
*
* @throws ZipException
* @throws XmlPullParserException
* @throws IOException
*/
@SuppressLint("SdCardPath")
public static XpkInfo getXPKManifestDom(ZipFile zipFile) throws ZipException, XmlPullParserException, IOException {
XpkInfo xpkDom = null;
try {
xpkDom = new XpkInfo();
XmlPullParser parser = Xml.newPullParser();
InputStream is = zipFile.getInputStream(zipFile.getEntry("manifest.xml"));
parser.setInput(is, "utf-8");
String defaultStoragePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ? Environment.getExternalStorageDirectory().getPath() : null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
// 数据包大小 long
if (parser.getName().equals("data")) {
xpkDom.dataSize = Long.parseLong(parser
.getAttributeValue(1));
}
// 数据包安装位置
else if (parser.getName().equals("destination")) {
xpkDom.destination = parser.nextText();
if (xpkDom.destination != null && defaultStoragePath != null) {
xpkDom.destination = xpkDom.destination.replace("/sdcard", defaultStoragePath);
}
}
// apk大小 long
else if (parser.getName().equals("apkinfo")) {
xpkDom.apkSize = Long.parseLong(parser
.getAttributeValue(0));
}
// 包名
else if (parser.getName().equals("package")) {
xpkDom.packageName = parser.nextText();
}
// 版本信息
else if (parser.getName().toLowerCase(Locale.getDefault())
.equals("versionname")) {
xpkDom.versionName = parser.nextText();
}
// 版本号
else if (parser.getName().toLowerCase(Locale.getDefault())
.equals("versioncode")) {
xpkDom.versionCode = Integer
.parseInt(parser.nextText());
}
// 游戏名
else if (parser.getName().equals("label")) {
parser.next();
xpkDom.appName = parser.getText();
}
}
eventType = parser.next();
}
} catch (ZipException e) {
throw e;
} catch (XmlPullParserException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (ClassCastException e) {
e.printStackTrace();
xpkDom = null;
}
return xpkDom;
}
}