/*
* Copyright (C) 2016 The DirtyUnicorns Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Display installed icons packs that we are able to parse and get an icon from
*/
package com.android.settings.du.utils;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.android.settings.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.UserHandle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class IconPickerActivity extends Activity implements DialogInterface.OnCancelListener {
private static final int DIALOG_ICON_PACK = 1;
private static final int ICON_PACK_ICON_RESULT = 69;
public static final String INTENT_ICON_PICKER = "intent_icon_picker";
public static final String ICON_PICK_TYPE_ICONPACK = "iconpack";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createDialog(this, DIALOG_ICON_PACK).show();
}
public Dialog createDialog(final Context context, final int id) {
Dialog dialog;
switch (id) {
case DIALOG_ICON_PACK:
dialog = getIconPackDialog(context);
break;
default:
dialog = getIconPackDialog(context);
}
return dialog;
}
private Dialog getIconPackDialog(Context context) {
final LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.inflate(R.layout.dialog_iconpack, null);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
final IconPackageAdapter adapter = new IconPackageAdapter(this);
final ListView listView = (ListView) view.findViewById(R.id.iconpack_list);
final Dialog dialog;
adapter.load();
dialog = builder.setTitle(getString(R.string.icon_pack_picker_dialog_title))
.setView(view)
.setOnCancelListener(this)
.setNegativeButton(android.R.string.cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onCancel(dialog);
}
})
.create();
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ResolveInfo info = adapter.getItem(position);
String packageName = info.activityInfo.packageName;
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.du.utils.IconPackGridActivity");
intent.putExtra("icon_package_name", packageName);
dialog.dismiss();
startActivityForResult(intent, ICON_PACK_ICON_RESULT);
}
});
return dialog;
}
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
sendCancelResultAndFinish();
}
private void sendCancelResultAndFinish() {
Intent intent = new Intent(INTENT_ICON_PICKER);
intent.putExtra("result", Activity.RESULT_CANCELED);
sendBroadcastAsUser(intent, UserHandle.CURRENT);
setResult(Activity.RESULT_CANCELED);
finish();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ICON_PACK_ICON_RESULT) {
if (resultCode == RESULT_OK) {
String iconType = data.getStringExtra("icon_data_type");
String iconPackage = data.getStringExtra("icon_data_package");
String iconName = data.getStringExtra("icon_data_name");
Intent resultIntent = new Intent();
resultIntent.setAction(INTENT_ICON_PICKER);
resultIntent.putExtra("result", Activity.RESULT_OK);
resultIntent.putExtra("icon_data_type", iconType);
resultIntent.putExtra("icon_data_package", iconPackage);
resultIntent.putExtra("icon_data_name", iconName);
sendBroadcastAsUser(resultIntent, UserHandle.CURRENT);
setResult(RESULT_OK, resultIntent);
finish();
} else {
sendCancelResultAndFinish();
}
}
}
private class IconPackageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private PackageManager mPM;
List<ResolveInfo> mIconPackage = new ArrayList<ResolveInfo>();
public IconPackageAdapter(Context ctx) {
mInflater = LayoutInflater.from(ctx);
mPM = ctx.getPackageManager();
}
public void load() {
List<ResolveInfo> tmpList = new ArrayList<ResolveInfo>();
Intent i = new Intent("org.adw.launcher.THEMES");
i.addCategory(Intent.CATEGORY_DEFAULT);
tmpList.addAll(mPM.queryIntentActivities(i,
PackageManager.GET_META_DATA));
mIconPackage.clear();
mIconPackage.addAll(tmpList);
List<ResolveInfo> toRemove = new ArrayList<ResolveInfo>();
for (ResolveInfo info : mIconPackage) {
String packageName = info.activityInfo.packageName;
Resources packageRes;
try {
packageRes = mPM.getResourcesForApplication(packageName);
InputStream appfilterstream = packageRes.getAssets().open("drawable.xml");
appfilterstream.close();
} catch (Exception e) {
e.printStackTrace();
toRemove.add(info);
}
}
mIconPackage.removeAll(toRemove);
Collections.sort(mIconPackage, new Comparator<ResolveInfo>() {
@Override
public int compare(ResolveInfo lhs, ResolveInfo rhs) {
return (lhs.loadLabel(mPM).toString()).compareTo(rhs.loadLabel(mPM).toString());
}
});
notifyDataSetChanged();
}
@Override
public int getCount() {
return mIconPackage.size();
}
@Override
public ResolveInfo getItem(int position) {
return mIconPackage.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = mInflater.inflate(R.layout.iconpack_view, null, false);
holder = new ViewHolder();
convertView.setTag(holder);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
}
ResolveInfo info = (ResolveInfo) getItem(position);
holder.title.setText(info.loadLabel(mPM).toString());
holder.icon.setImageDrawable(info.loadIcon(mPM));
return convertView;
}
}
private static class ViewHolder {
TextView title;
ImageView icon;
}
}