package net.zhuoweizhang.mcpelauncher.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.ipaulpro.afilechooser.FileChooserActivity;
import com.ipaulpro.afilechooser.utils.FileUtils;
import eu.chainfire.libsuperuser.Shell;
import net.zhuoweizhang.mcpelauncher.R;
import net.zhuoweizhang.mcpelauncher.Utils;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import net.zhuoweizhang.mcpelauncher.ScriptManager;
public class ManageTexturepacksActivity extends ListActivity {
protected TexturesAdapter adapter;
public static final File REQUEST_DEMO = new File("/demo/textures");
public static final File REQUEST_ENABLE = new File("/just/enable/textures");
public static final File REQUEST_DISABLE = new File("/just/disable/textures");
protected CompoundButton master = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.manage_textures);
adapter = new TexturesAdapter(this);
setListAdapter(adapter);
getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
File f = adapter.getItem(position);
setTexturepack(f);
finish();
}
});
((Button) findViewById(R.id.manage_textures_select))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent target = FileUtils.createGetContentIntent();
target.setType("application/zip");
target.setClass(ManageTexturepacksActivity.this, FileChooserActivity.class);
startActivityForResult(target,
MainMenuOptionsActivity.REQUEST_MANAGE_TEXTURES);
}
});
((Button) findViewById(R.id.manage_textures_extract))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new ExtractTextureTask().execute();
}
});
setResult(RESULT_CANCELED);
loadHistory();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == MainMenuOptionsActivity.REQUEST_MANAGE_TEXTURES)
&& (resultCode == RESULT_OK)) {
final Uri uri = data.getData();
File file = FileUtils.getFile(uri);
adapter.add(file);
adapter.notifyDataSetChanged();
setTexturepack(file);
finish();
}
}
@Override
protected void onResume() {
super.onResume();
refreshABToggle();
}
@Override
protected void onPause() {
super.onPause();
saveHistory();
refreshABToggle();
}
public void loadHistory() {
adapter.clear();
if (isEnabled()) {
if (canAccessMCPE())
adapter.add(REQUEST_DEMO);
SharedPreferences sh = Utils.getPrefs(0);
String data = sh.getString("textures_history", "");
for (String s : data.split(";")) {
File f = new File(s);
if (!f.exists() || !f.canRead())
continue;
adapter.add(f);
}
adapter.notifyDataSetChanged();
}
}
public void saveHistory() {
if (isEnabled()) {
String out = "";
List<String> res = new ArrayList<String>();
for (int l = 0; l < adapter.getCount(); l++) {
File f = adapter.getItem(l);
if (f.exists() && f.canRead())
res.add(f.getAbsolutePath());
}
out = Utils.join(res, ";");
SharedPreferences.Editor sh = Utils.getPrefs(0).edit();
sh.putString("textures_history", out);
sh.apply();
}
}
protected boolean isEnabled() {
SharedPreferences sh = Utils.getPrefs(0);
return sh.getBoolean("zz_texture_pack_enable", false);
}
public static void setTexturepack(File f, ManageTexturepacksActivity activity) {
SharedPreferences.Editor p1 = Utils.getPrefs(0).edit();
SharedPreferences.Editor p2 = Utils.getPrefs(1).edit();
if (f.getAbsolutePath().equalsIgnoreCase(REQUEST_DISABLE.getAbsolutePath())) {
// Disable texturepacks
p1.putBoolean("zz_texture_pack_enable", false);
p1.putBoolean("zz_texture_pack_demo", false);
} else if (f.getAbsolutePath().equalsIgnoreCase(REQUEST_ENABLE.getAbsolutePath())) {
// Enable texturepacks and set to demo
p1.putBoolean("zz_texture_pack_enable", true);
if (Utils.getPrefs(1).getString("texturePack", "no_pack").equals("no_pack")) {
p1.putBoolean("zz_texture_pack_demo", true);
}
} else if (f.getAbsolutePath().equalsIgnoreCase(REQUEST_DEMO.getAbsolutePath())) {
p1.putBoolean("zz_texture_pack_enable", true);
// Demo
p1.putBoolean("zz_texture_pack_demo", true);
// Don't forget to reset the opposite value!
p2.putString("texturePack", null);
} else {
p1.putBoolean("zz_texture_pack_enable", true);
// Usual
p2.putString("texturePack", f.getAbsolutePath());
// Don't forget to reset the opposite value!
p1.putBoolean("zz_texture_pack_demo", false);
}
p1.apply();
p2.apply();
if (activity != null) {
activity.refreshABToggle();
activity.setResult(RESULT_OK);
}
}
protected void setTexturepack(File f) {
setTexturepack(f, this);
}
CompoundButton.OnCheckedChangeListener ls = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
setTexturepack(REQUEST_ENABLE);
} else {
setTexturepack(REQUEST_DISABLE);
}
loadHistory();
}
};
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getMenuInflater().inflate(R.menu.ab_master, menu);
master = (CompoundButton) menu.findItem(R.id.ab_switch_container).getActionView()
.findViewById(R.id.ab_switch);
if (master != null) {
master.setOnCheckedChangeListener(ls);
refreshABToggle();
} else {
System.err.println("WTF?");
}
}
menu.add(getResources().getString(R.string.textures_clear_script_texture_overrides));
return true;
}
protected void refreshABToggle() {
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) && (master != null)) {
master.setOnCheckedChangeListener(null);
master.setChecked(isEnabled());
master.setOnCheckedChangeListener(ls);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
if (item.getTitle().equals(getResources().getString(R.string.textures_clear_script_texture_overrides))) {
ScriptManager.clearTextureOverrides();
return true;
}
return super.onOptionsItemSelected(item);
}
protected boolean canAccessMCPE() {
try {
ApplicationInfo mcAppInfo = getPackageManager().getApplicationInfo(
"com.mojang.minecraftpe", 0);
return mcAppInfo.sourceDir.equalsIgnoreCase(mcAppInfo.publicSourceDir);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
}
protected class TexturesAdapter extends ArrayAdapter<File> {
private LayoutInflater inflater;
public TexturesAdapter(Context context) {
super(context, android.R.layout.simple_list_item_1, new ArrayList<File>());
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View v, ViewGroup parent) {
if (v == null) {
v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
}
TextView text = (TextView) v.findViewById(android.R.id.text1);
File f = getItem(position);
if (f.getAbsolutePath().equalsIgnoreCase(REQUEST_DEMO.getAbsolutePath())) {
text.setText(R.string.textures_demo);
} else {
text.setText(f.getName());
}
return v;
}
}
private class ExtractTextureTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;
private String mcpeApkLoc;
private File outFile;
private boolean hasSu = true;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(ManageTexturepacksActivity.this);
dialog.setMessage(getResources().getString(R.string.extracting_textures));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(
"com.mojang.minecraftpe", 0);
mcpeApkLoc = appInfo.sourceDir;
} catch (PackageManager.NameNotFoundException impossible) {
}
outFile = new File(getExternalFilesDir(null), "minecraft.apk");
List<String> suResult = Shell.SU.run("cat \"" + mcpeApkLoc + "\" >\""
+ outFile.getAbsolutePath() + "\"");
if (suResult == null) {
hasSu = false;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
dialog.dismiss();
if (outFile.exists()) {
adapter.add(outFile);
adapter.notifyDataSetChanged();
saveHistory();
setTexturepack(outFile);
Toast.makeText(ManageTexturepacksActivity.this, R.string.extract_textures_success,
Toast.LENGTH_SHORT).show();
} else {
new AlertDialog.Builder(ManageTexturepacksActivity.this)
.setMessage(
hasSu ? R.string.extract_textures_error
: R.string.extract_textures_no_root)
.setPositiveButton(android.R.string.ok, null).show();
}
}
}
}