Android: Added an installer class that lets the user select default plugins to install and it will install the example.ini files.
Android: Added menu option to retry the MCServer install routine git-svn-id: http://mc-server.googlecode.com/svn/trunk@1050 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
8ad7747902
commit
6aa243a953
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.mcserver"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
android:versionCode="2"
|
||||
android:versionName="r1049" >
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
2
Android/assets/basedir/Plugins/README.txt
Normal file
2
Android/assets/basedir/Plugins/README.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Put all pre-packaged plugins in here such as Core.
|
||||
The user will be able to install each plugin in here separately.
|
10
Android/assets/basedir/README.txt
Normal file
10
Android/assets/basedir/README.txt
Normal file
@ -0,0 +1,10 @@
|
||||
Put all pre-packaged settings/preferences and license files in here.
|
||||
Such as:
|
||||
|
||||
settings.example.ini
|
||||
groups.example.ini
|
||||
users.example.ini
|
||||
webadmin.example.ini
|
||||
Lua-LICENSE.txt
|
||||
MersenneTwister-LICENSE.txt
|
||||
etc.etc
|
1
Android/assets/basedir/webadmin/README.txt
Normal file
1
Android/assets/basedir/webadmin/README.txt
Normal file
@ -0,0 +1 @@
|
||||
Put pre-packaged webadmin template in here
|
@ -16,6 +16,8 @@ import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
@ -31,13 +33,17 @@ public class MCServerActivity extends Activity {
|
||||
ArrayList<String> mLogList = new ArrayList<String>();
|
||||
ArrayAdapter<String> mAdapter;
|
||||
|
||||
MCServerInstaller mInstaller = null;
|
||||
|
||||
final private int MENU_REINSTALL = 0;
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.main);
|
||||
|
||||
Log.e("MCServer", "p id: " + android.os.Process.myPid() );
|
||||
//Log.e("MCServer", "p id: " + android.os.Process.myPid() );
|
||||
|
||||
|
||||
((Button)findViewById(R.id.start_server)).setOnClickListener( new View.OnClickListener() {
|
||||
@ -135,12 +141,14 @@ public class MCServerActivity extends Activity {
|
||||
});
|
||||
loggerThread.start();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
((TextView)findViewById(R.id.ip_address)).setText("Connect to: " + getLocalIpAddress());
|
||||
|
||||
|
||||
mInstaller = new MCServerInstaller(this);
|
||||
if( mInstaller.NeedsUpdate() )
|
||||
{
|
||||
mInstaller.ShowFirstRunDialog();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -234,9 +242,26 @@ public class MCServerActivity extends Activity {
|
||||
|
||||
|
||||
|
||||
public void Testtt()
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
menu.add(0, MENU_REINSTALL, 0, "Reinstall MCServer" );
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
|
||||
switch( item.getItemId() )
|
||||
{
|
||||
//Log.d("MCServer", "in Testtt");
|
||||
case MENU_REINSTALL:
|
||||
mInstaller.ShowPluginInstallDialog(true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
432
Android/src/com/mcserver/MCServerInstaller.java
Normal file
432
Android/src/com/mcserver/MCServerInstaller.java
Normal file
@ -0,0 +1,432 @@
|
||||
package com.mcserver;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.res.AssetManager;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Environment;
|
||||
import android.util.Log;
|
||||
|
||||
public class MCServerInstaller {
|
||||
private MCServerActivity mContext;
|
||||
final private String BaseDirectory = "basedir";
|
||||
final private String PluginDirectory = "Plugins";
|
||||
|
||||
final public String SHARED_PREFS_NAME = "MCSERVER_PREFS";
|
||||
final public String PREF_IS_INSTALLED = "IS_INSTALLED";
|
||||
final public String PREF_LAST_VERSION = "LAST_VERSION";
|
||||
private SharedPreferences mSettings = null;
|
||||
|
||||
int thisVersion;
|
||||
|
||||
MCServerInstaller( MCServerActivity activity )
|
||||
{
|
||||
mContext = activity;
|
||||
|
||||
mSettings = mContext.getSharedPreferences( SHARED_PREFS_NAME, 0);
|
||||
|
||||
try {
|
||||
this.thisVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
|
||||
} catch (NameNotFoundException e) {
|
||||
Log.e("MCServer", "Could not read version code from manifest!");
|
||||
e.printStackTrace();
|
||||
this.thisVersion = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean IsInstalled()
|
||||
{
|
||||
return mSettings.getBoolean(PREF_IS_INSTALLED, false);
|
||||
}
|
||||
|
||||
|
||||
public boolean NeedsUpdate()
|
||||
{
|
||||
Log.i("MCServer", "thisVersion: " + this.thisVersion + " pref: " + mSettings.getInt(PREF_LAST_VERSION, 0));
|
||||
return mSettings.getInt(PREF_LAST_VERSION, 0) != this.thisVersion;
|
||||
}
|
||||
|
||||
|
||||
public ArrayList<String> FindFoldersInPath(String path)
|
||||
{
|
||||
ArrayList<String> allFolders = new ArrayList<String>();
|
||||
AssetManager am = mContext.getAssets();
|
||||
try {
|
||||
String[] allPlugins = am.list(path);
|
||||
for(String pluginName : allPlugins)
|
||||
{
|
||||
InputStream istr = null;
|
||||
try
|
||||
{
|
||||
istr = am.open(path + "/" + pluginName);
|
||||
} catch( java.io.FileNotFoundException e ) {
|
||||
// It seems to be a folder :D
|
||||
allFolders.add(pluginName);
|
||||
continue;
|
||||
}
|
||||
istr.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return allFolders;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void ExpandAssets( String path )
|
||||
{
|
||||
AssetManager am = mContext.getAssets();
|
||||
try {
|
||||
String[] getAssets = am.list(path);
|
||||
for(String assetName : getAssets)
|
||||
{
|
||||
//Log.e("MCServer", path + "/" + imgName);
|
||||
|
||||
InputStream istr = null;
|
||||
try
|
||||
{
|
||||
istr = am.open(path + "/" + assetName);
|
||||
} catch( java.io.FileNotFoundException e ) {
|
||||
//Log.e("MCServer", "Could not open" + path + "/" + imgName );
|
||||
ExpandAssets(path + "/" + assetName);
|
||||
continue;
|
||||
}
|
||||
|
||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + assetName;
|
||||
//Log.e("MCServer", "outPath: " + outPath );
|
||||
File f = new File( outPath );
|
||||
|
||||
f.getParentFile().mkdirs();
|
||||
f.createNewFile();
|
||||
OutputStream ostr = new FileOutputStream(f);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = istr.read(buffer))>0)
|
||||
{
|
||||
ostr.write(buffer, 0, length);
|
||||
}
|
||||
ostr.flush();
|
||||
ostr.close();
|
||||
istr.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ShowFirstRunDialog()
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||
//builder.setTitle("blaa");
|
||||
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
builder.setMessage("It seems this is the first time you are running MCServer on your Android device or it has been updated! This app comes with a couple of pre-packaged plugins, please take a moment to select the plugins you would like to install.");
|
||||
builder.setCancelable(false);
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
|
||||
dialog.setOnDismissListener( new DialogInterface.OnDismissListener(){
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
ShowPluginInstallDialog(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public void ShowPluginInstallDialog(boolean bCancelable)
|
||||
{
|
||||
final ArrayList<String> allPlugins = FindFoldersInPath( BaseDirectory + "/" + PluginDirectory );
|
||||
final CharSequence[] items = allPlugins.toArray(new CharSequence[allPlugins.size()]);
|
||||
final boolean[] selected = new boolean[items.length];
|
||||
for( int i = 0; i < items.length; ++i )
|
||||
{
|
||||
if( items[i].toString().contains("Core") )
|
||||
{ // Select the core plugin by default
|
||||
selected[i] = true;
|
||||
items[i] = items[i] + " (Recommended)";
|
||||
}
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||
builder.setTitle("Plugins to install");
|
||||
builder.setCancelable(bCancelable);
|
||||
builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
|
||||
selected[which] = isChecked;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton("Install", new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
ArrayList<String> toInstall = new ArrayList<String>();
|
||||
for( int i = 0; i < selected.length; ++i )
|
||||
{
|
||||
if( selected[i] )
|
||||
{
|
||||
toInstall.add(allPlugins.get(i));
|
||||
}
|
||||
}
|
||||
InstallPlugins(toInstall);
|
||||
}
|
||||
});
|
||||
|
||||
AlertDialog dialog2 = builder.create();
|
||||
dialog2.show();
|
||||
}
|
||||
|
||||
|
||||
void InstallPlugins( final ArrayList<String> plugins )
|
||||
{
|
||||
new AsyncTask<Void, Integer, Boolean>()
|
||||
{
|
||||
ProgressDialog progressDialog;
|
||||
|
||||
@Override
|
||||
protected void onPreExecute()
|
||||
{
|
||||
/*
|
||||
* This is executed on UI thread before doInBackground(). It is
|
||||
* the perfect place to show the progress dialog.
|
||||
*/
|
||||
progressDialog = ProgressDialog.show(mContext, "", "Installing...");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... params)
|
||||
{
|
||||
if (params == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
/*
|
||||
* This is run on a background thread, so we can sleep here
|
||||
* or do whatever we want without blocking UI thread. A more
|
||||
* advanced use would download chunks of fixed size and call
|
||||
* publishProgress();
|
||||
*/
|
||||
for( int i = 0; i < plugins.size(); ++i )
|
||||
{
|
||||
this.publishProgress((int)(i / (float)plugins.size() * 100), i);
|
||||
InstallSinglePlugin(PluginDirectory + "/" + plugins.get(i));
|
||||
}
|
||||
|
||||
this.publishProgress( 100, -1 );
|
||||
InstallExampleSettings();
|
||||
|
||||
this.publishProgress( 100, -2 );
|
||||
InstallWebAdmin();
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.e("tag", e.getMessage());
|
||||
/*
|
||||
* The task failed
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* The task succeeded
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void onProgressUpdate(Integer... progress)
|
||||
{
|
||||
progressDialog.setProgress(progress[0]);
|
||||
if( progress[1] > -1 )
|
||||
{
|
||||
progressDialog.setMessage("Installing " + plugins.get(progress[1]) + "..." );
|
||||
}
|
||||
else if( progress[1] == -1 )
|
||||
{
|
||||
progressDialog.setMessage("Installing default settings...");
|
||||
}
|
||||
else if( progress[1] == -2 )
|
||||
{
|
||||
progressDialog.setMessage("Installing WebAdmin...");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Boolean result)
|
||||
{
|
||||
progressDialog.dismiss();
|
||||
/*
|
||||
* Update here your view objects with content from download. It
|
||||
* is save to dismiss dialogs, update views, etc., since we are
|
||||
* working on UI thread.
|
||||
*/
|
||||
AlertDialog.Builder b = new AlertDialog.Builder(mContext);
|
||||
b.setTitle(android.R.string.dialog_alert_title);
|
||||
if (result)
|
||||
{
|
||||
b.setMessage("Install succeeded");
|
||||
|
||||
SharedPreferences.Editor editor = mSettings.edit();
|
||||
editor.putBoolean(PREF_IS_INSTALLED, true);
|
||||
editor.putInt(PREF_LAST_VERSION, thisVersion);
|
||||
editor.commit();
|
||||
}
|
||||
else
|
||||
{
|
||||
b.setMessage("Install failed");
|
||||
}
|
||||
b.setPositiveButton(android.R.string.ok,
|
||||
new DialogInterface.OnClickListener()
|
||||
{
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
b.create().show();
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
|
||||
|
||||
void InstallExampleSettings()
|
||||
{
|
||||
AssetManager am = mContext.getAssets();
|
||||
try {
|
||||
String[] allFiles = am.list(BaseDirectory);
|
||||
for(String fileName : allFiles)
|
||||
{
|
||||
InputStream istr = null;
|
||||
try
|
||||
{
|
||||
istr = am.open(BaseDirectory + "/" + fileName);
|
||||
} catch( java.io.FileNotFoundException e ) {
|
||||
// Must be a folder :D
|
||||
continue;
|
||||
}
|
||||
|
||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + fileName;
|
||||
Log.i("MCServer", "outPath: " + outPath );
|
||||
File f = new File( outPath );
|
||||
|
||||
f.getParentFile().mkdirs();
|
||||
f.createNewFile();
|
||||
OutputStream ostr = new FileOutputStream(f);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = istr.read(buffer))>0)
|
||||
{
|
||||
ostr.write(buffer, 0, length);
|
||||
}
|
||||
ostr.flush();
|
||||
ostr.close();
|
||||
istr.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void InstallWebAdmin()
|
||||
{
|
||||
AssetManager am = mContext.getAssets();
|
||||
try {
|
||||
String[] allFiles = am.list(BaseDirectory + "/webadmin");
|
||||
for(String fileName : allFiles)
|
||||
{
|
||||
InputStream istr = null;
|
||||
try
|
||||
{
|
||||
istr = am.open(BaseDirectory + "/webadmin/" + fileName);
|
||||
} catch( java.io.FileNotFoundException e ) {
|
||||
// Must be a folder :D
|
||||
continue;
|
||||
}
|
||||
|
||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/webadmin/" + fileName;
|
||||
Log.i("MCServer", "outPath: " + outPath );
|
||||
File f = new File( outPath );
|
||||
|
||||
f.getParentFile().mkdirs();
|
||||
f.createNewFile();
|
||||
OutputStream ostr = new FileOutputStream(f);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = istr.read(buffer))>0)
|
||||
{
|
||||
ostr.write(buffer, 0, length);
|
||||
}
|
||||
ostr.flush();
|
||||
ostr.close();
|
||||
istr.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void InstallSinglePlugin( String path )
|
||||
{
|
||||
AssetManager am = mContext.getAssets();
|
||||
try {
|
||||
String[] getImages = am.list(BaseDirectory + "/" + path);
|
||||
for(String imgName : getImages)
|
||||
{
|
||||
Log.i("MCServer", path + "/" + imgName);
|
||||
|
||||
InputStream istr = null;
|
||||
try
|
||||
{
|
||||
istr = am.open(BaseDirectory + "/" + path + "/" + imgName);
|
||||
} catch( java.io.FileNotFoundException e ) {
|
||||
Log.i("MCServer", "Could not open" + path + "/" + imgName );
|
||||
InstallSinglePlugin(path + "/" + imgName);
|
||||
continue;
|
||||
}
|
||||
|
||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + imgName;
|
||||
Log.i("MCServer", "outPath: " + outPath );
|
||||
File f = new File( outPath );
|
||||
|
||||
f.getParentFile().mkdirs();
|
||||
f.createNewFile();
|
||||
OutputStream ostr = new FileOutputStream(f);
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = istr.read(buffer))>0)
|
||||
{
|
||||
ostr.write(buffer, 0, length);
|
||||
}
|
||||
ostr.flush();
|
||||
ostr.close();
|
||||
istr.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user