package com.google.code.appsorganizer.chooseicon;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import com.google.code.appsorganizer.R;
import com.google.code.appsorganizer.dialogs.ListActivityWithDialog;
import com.google.code.appsorganizer.utils.ArrayAdapterSmallRow;
public class IconPackActivity extends ListActivityWithDialog {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
retrieveList();
getListView().setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
Intent intent = new Intent(IconPackActivity.this, ChooseIconFromPackActivity.class);
AppBinding item = (AppBinding) getListAdapter().getItem(pos);
intent.putExtra("apkName", item.apkName);
startActivityForResult(intent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Intent res = new Intent();
res.putExtra("image", data.getByteArrayExtra("image"));
setResult(RESULT_OK, res);
finish();
}
}
private ProgressDialog pd;
private final List<AppBinding> iconPacks = new ArrayList<AppBinding>();
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == -3) {
pd.hide();
setListAdapter(new ArrayAdapterSmallRow<AppBinding>(IconPackActivity.this, android.R.layout.simple_list_item_1, iconPacks));
} else {
pd.incrementProgressBy(1);
}
}
};
private void retrieveList() {
final List<PackageInfo> installedPackages = getPackageManager().getInstalledPackages(0);
createProgressDialog(installedPackages.size());
Thread t = new Thread() {
@Override
public void run() {
String abcPackageName = getPackageName();
for (PackageInfo p : installedPackages) {
String packageName = p.packageName;
if (!packageName.startsWith("com.android") && !abcPackageName.equals(packageName) && p.applicationInfo.enabled) {
String dir = p.applicationInfo.publicSourceDir;
ZipFile z = null;
try {
z = new ZipFile(dir);
Enumeration<? extends ZipEntry> entries = z.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
if (ChooseIconFromPackActivity.isAssetImage(zipEntry.getName())) {
iconPacks.add(new AppBinding(dir, p.applicationInfo.loadLabel(getPackageManager())));
break;
}
}
} catch (Throwable e) {
} finally {
if (z != null) {
try {
z.close();
} catch (IOException e) {
}
}
}
}
handler.sendEmptyMessage(-1);
}
Collections.sort(iconPacks);
handler.sendEmptyMessage(-3);
}
};
t.start();
}
private void createProgressDialog(int size) {
pd = new ProgressDialog(this);
pd.setTitle(getText(R.string.looking_for_icons));
pd.setMessage(getText(R.string.please_wait_loading));
pd.setIndeterminate(false);
pd.setCancelable(false);
pd.setMax(size);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
}
private static class AppBinding implements Comparable<AppBinding> {
String apkName;
CharSequence name;
public AppBinding(String apkName, CharSequence name) {
super();
this.apkName = apkName;
this.name = name;
}
@Override
public String toString() {
return name.toString();
}
public int compareTo(AppBinding another) {
return name.toString().compareToIgnoreCase(another.name.toString());
}
}
}