package net.pocketmine.server;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.pocketmine.server.R;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
public class VersionManagerActivity extends SherlockActivity {
public ArrayAdapter<CharSequence> adapter;
private Boolean install = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
install = getIntent().getBooleanExtra("install", false);
setContentView(R.layout.version_manager);
start();
}
public String getPageContext(String url) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(new URL(
url).openStream()));
StringBuilder sb = new StringBuilder();
String str;
while ((str = in.readLine()) != null) {
sb.append(str);
}
in.close();
return sb.toString();
}
private void start() {
final ProgressBar pbar = (ProgressBar) findViewById(R.id.loadingBar);
final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
final Button skip = (Button) findViewById(R.id.skipBtn);
skip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
pbar.setVisibility(View.VISIBLE);
scrollView.setVisibility(View.GONE);
skip.setVisibility(View.GONE);
new Thread(new Runnable() {
@Override
public void run() {
try {
JSONObject softObj = (JSONObject) JSONValue
.parse(getPageContext("http://pocketmine.net/api/?channel=soft"));
final String softVersion = (String) softObj
.get("version");
final String softAPI = (String) softObj
.get("api_version");
Long date = (Long) softObj.get("date");
Date d = new Date(date * 1000);
final String softDate = SimpleDateFormat
.getDateInstance().format(d);
final String softDownloadURL = (String) softObj.get("download_url");
JSONObject stableObj = (JSONObject) JSONValue
.parse(getPageContext("http://pocketmine.net/api/?channel=stable"));
final String stableVersion = (String) stableObj
.get("version");
final String stableAPI = (String) stableObj
.get("api_version");
date = (Long) stableObj.get("date");
d = new Date(date * 1000);
final String stableDate = SimpleDateFormat
.getDateInstance().format(d);
final String stableDownloadURL = (String) stableObj.get("download_url");
JSONObject betaObj = (JSONObject) JSONValue
.parse(getPageContext("http://pocketmine.net/api/?channel=beta"));
final String betaVersion = (String) betaObj.get("version");
final String betaAPI = (String) betaObj.get("api_version");
date = (Long) betaObj.get("date");
d = new Date(date * 1000);
final String betaDate = SimpleDateFormat.getDateInstance()
.format(d);
final String betaDownloadURL = (String) betaObj.get("download_url");
JSONObject devObj = (JSONObject) JSONValue
.parse(getPageContext("http://pocketmine.net/api/?channel=development"));
final String devVersion = (String) devObj.get("version");
final String devAPI = (String) devObj.get("api_version");
date = (Long) devObj.get("date");
d = new Date(date * 1000);
final String devDate = SimpleDateFormat.getDateInstance()
.format(d);
final String devDownloadURL = (String) devObj.get("download_url");
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView softVersionView = (TextView) findViewById(R.id.soft_version);
TextView softDateView = (TextView) findViewById(R.id.soft_date);
Button softDownload = (Button) findViewById(R.id.download_soft);
TextView stableVersionView = (TextView) findViewById(R.id.stable_version);
TextView stableDateView = (TextView) findViewById(R.id.stable_date);
Button stableDownload = (Button) findViewById(R.id.download_stable);
TextView betaVersionView = (TextView) findViewById(R.id.beta_version);
TextView betaDateView = (TextView) findViewById(R.id.beta_date);
Button betaDownload = (Button) findViewById(R.id.download_beta);
TextView devVersionView = (TextView) findViewById(R.id.dev_version);
TextView devDateView = (TextView) findViewById(R.id.dev_date);
Button devDownload = (Button) findViewById(R.id.download_dev);
softVersionView.setText("Version: "
+ softVersion + " (API: " + softAPI
+ ")");
softDateView.setText(softDate);
softDownload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
download(softDownloadURL, softVersion);
}
});
stableVersionView.setText("Version: "
+ stableVersion + " (API: " + stableAPI
+ ")");
stableDateView.setText(stableDate);
stableDownload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
download(stableDownloadURL, stableVersion);
}
});
betaVersionView.setText("Version: " + betaVersion
+ " (API: " + betaAPI + ")");
betaDateView.setText(betaDate);
betaDownload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
download(betaDownloadURL, betaVersion);
}
});
devVersionView.setText("Version: " + devVersion
+ " (API: " + devAPI + ")");
devDateView.setText(devDate);
devDownload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
download(devDownloadURL, devVersion);
}
});
pbar.setVisibility(View.GONE);
scrollView.setVisibility(View.VISIBLE);
if (install) {
skip.setVisibility(ServerUtils
.checkIfInstalled() ? View.VISIBLE
: View.GONE);
}
}
});
} catch (Exception err) {
err.printStackTrace();
if (install) {
showToast("Cannot load version list. Retrying in 5 seconds...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
finish();
}
});
return;
}
start();
} else {
showToast("Cannot load version list.");
runOnUiThread(new Runnable() {
@Override
public void run() {
finish();
}
});
}
}
}
}).start();
}
private void download(final String address, final String fver) {
File vdir = new File(ServerUtils.getDataDirectory()
+ "/versions/");
if(!vdir.exists()){
vdir.mkdirs();
}
final VersionManagerActivity ctx = this;
runOnUiThread(new Runnable() {
@Override
public void run() {
final ProgressDialog dlDialog = new ProgressDialog(ctx);
dlDialog.setMax(100);
dlDialog.setTitle("Downloading this version...");
dlDialog.setMessage("Please wait...");
dlDialog.setIndeterminate(false);
dlDialog.setCancelable(false);
dlDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dlDialog.show();
dlDialog.setProgress(0);
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(address);
URLConnection connection = url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
InputStream input = new BufferedInputStream(url
.openStream());
OutputStream output = new FileOutputStream(
ServerUtils.getDataDirectory()
+ "/versions/" + fver + ".phar");
byte data[] = new byte[1024];
long total = 0;
int count;
int lastProgress = 0;
while ((count = input.read(data)) != -1) {
total += count;
int progress = (int) (total * 100 / fileLength);
if (progress != lastProgress) {
dlDialog.setProgress(progress);
lastProgress = progress;
}
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
showToast("Failed to download this version.");
dlDialog.dismiss();
return;
}
dlDialog.dismiss();
install(fver);
// dlDialog.setTitle("Installing this version...");
// dlDialog.show();
}
}).start();
}
});
}
private void install(CharSequence ver) {
final VersionManagerActivity ctx = this;
final CharSequence fver = ver;
runOnUiThread(new Runnable() {
@Override
public void run() {
final ProgressDialog iDialog = new ProgressDialog(ctx);
iDialog.setMax(100);
iDialog.setTitle("Installing this version...");
iDialog.setMessage("Please wait...");
iDialog.setIndeterminate(false);
iDialog.setCancelable(false);
iDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
iDialog.show();
iDialog.setProgress(0);
new Thread(new Runnable() {
@Override
public void run() {
try {
new File(ServerUtils.getDataDirectory()
+ "/PocketMine-MP.php").delete();
} catch (Exception e) {
}
try {
delete(new File(ServerUtils.getDataDirectory()
+ "/src/"));
} catch (Exception e) {
}
try {
new File(ServerUtils.getDataDirectory()
+ "/PocketMine-MP.phar").delete();
} catch (Exception e) {
}
try {
FileInputStream in = new FileInputStream(
ServerUtils.getDataDirectory()
+ "/versions/" + fver + ".phar");
FileOutputStream out = new FileOutputStream(
ServerUtils.getDataDirectory()
+ "/PocketMine-MP.phar");
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (install) {
Intent ver = new Intent(
VersionManagerActivity.this,
ConfigActivity.class);
ver.putExtra("install", true);
startActivity(ver);
}
ctx.finish();
}
});
} catch (Exception e) {
showToast("Failed to install this version.");
e.printStackTrace();
}
}
}).start();
}
});
}
public void delete(File f) {
if (f.isDirectory()) {
File[] files = f.listFiles();
for (File file : files) {
delete(file);
}
}
f.delete();
}
public void showToast(String msg) {
final String fmsg = msg;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), fmsg,
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && install) {
return true;
}
return super.onKeyDown(keyCode, event);
}
}