package com.seafile.seadroid2.ui.dialog;
import java.util.List;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
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.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.common.collect.Lists;
import com.seafile.seadroid2.R;
/**
* Choose an app from a list of apps or custom actions
*/
public class AppChoiceDialog extends DialogFragment {
private List<ResolveInfo> mAppInfos = Lists.newArrayList();
private OnItemSelectedListener mListener;
private String mTitle;
private List<CustomAction> customActions = Lists.newArrayList();
public interface OnItemSelectedListener {
void onAppSelected(ResolveInfo appInfo);
void onCustomActionSelected(CustomAction action);
}
public void init(String title, List<ResolveInfo> appInfos, OnItemSelectedListener listener) {
mAppInfos = appInfos;
mListener = listener;
mTitle = title;
}
public void addCustomAction(int id, Drawable icon, String description) {
customActions.add(new CustomAction(id, icon, description));
}
private void onAppSelected(int index) {
dismiss();
if (index < customActions.size()) {
CustomAction action = customActions.get(index);
if (mListener != null) {
mListener.onCustomActionSelected(action);
}
} else {
ResolveInfo info = mAppInfos.get(index - customActions.size());
if (mListener != null) {
mListener.onAppSelected(info);
}
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(mTitle);
builder.setSingleChoiceItems(new AppsListAdapter(), 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
onAppSelected(i);
}
});
return builder.create();
}
private class AppsListAdapter extends BaseAdapter {
@Override
public int getCount() {
return customActions.size() + mAppInfos.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
if (position < customActions.size()) {
return customActions.get(position);
}
return mAppInfos.get(position - customActions.size());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
Viewholder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getActivity()).inflate(R.layout.app_list_item, null);
ImageView icon = (ImageView)view.findViewById(R.id.app_icon);
TextView desc = (TextView)view.findViewById(R.id.app_desc);
viewHolder = new Viewholder(icon, desc);
view.setTag(viewHolder);
} else {
viewHolder = (Viewholder)convertView.getTag();
}
if (position < customActions.size()) {
setCustomAction(viewHolder, customActions.get(position));
} else {
setAppInfo(viewHolder, mAppInfos.get(position - customActions.size()));
}
return view;
}
private void setCustomAction(Viewholder viewHolder, CustomAction customAction) {
viewHolder.icon.setImageDrawable(customAction.icon);
viewHolder.desc.setText(customAction.description);
}
private void setAppInfo(Viewholder viewHolder, ResolveInfo info) {
PackageManager pm = getActivity().getPackageManager();
CharSequence appDesc = info.activityInfo.loadLabel(pm);
Drawable appIcon = info.activityInfo.loadIcon(pm);
viewHolder.icon.setImageDrawable(appIcon);
viewHolder.desc.setText(appDesc);
}
private class Viewholder {
ImageView icon;
TextView desc;
Viewholder(ImageView icon, TextView desc) {
this.icon = icon;
this.desc = desc;
}
}
}
public static class CustomAction {
public final int id;
public final Drawable icon;
public final String description;
public CustomAction(int id, Drawable icon, String description) {
this.id = id;
this.icon = icon;
this.description = description;
}
}
}