package org.pyload.android.client.fragments; import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; import org.pyload.android.client.R; import org.pyload.android.client.pyLoadApp; import org.pyload.android.client.module.GuiTask; import org.pyload.android.client.module.SeparatedListAdapter; import org.pyload.thrift.ConfigSection; import org.pyload.thrift.Pyload.Client; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class SettingsFragment extends ListFragment { private pyLoadApp app; private SeparatedListAdapter adp; private SettingsAdapter general; private Map<String, ConfigSection> generalData; private SettingsAdapter plugins; private Map<String, ConfigSection> pluginData; private Runnable mUpdateResults = new Runnable() { @Override public void run() { general.setData(generalData); plugins.setData(pluginData); adp.notifyDataSetChanged(); app.setProgress(false); } }; private Runnable mRefresh = new Runnable() { @Override public void run() { SettingsFragment.this.update(); } }; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.settings_list, null, false); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = (pyLoadApp) getActivity().getApplicationContext(); adp = new SeparatedListAdapter(app); general = new SettingsAdapter(app); plugins = new SettingsAdapter(app); adp.addSection(getString(R.string.general_config), general); adp.addSection(getString(R.string.plugin_config), plugins); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setListAdapter(adp); } public void onStart() { super.onStart(); update(); } private void update() { if (!app.hasConnection()) return; app.setProgress(true); GuiTask task = new GuiTask(new Runnable() { public void run() { Client client = app.getClient(); generalData = client.getConfig(); pluginData = client.getPluginConfig(); } }, mUpdateResults); app.addTask(task); } @SuppressWarnings("unchecked") @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Entry<String, ConfigSection> item = (Entry<String, ConfigSection>) adp .getItem(position); FragmentTransaction ft = getFragmentManager().beginTransaction(); Bundle args = new Bundle(); if (position > generalData.size()) args.putString("type", "plugin"); else args.putString("type", "core"); args.putSerializable("section", item.getValue()); Fragment f = new ConfigSectionFragment(mRefresh); f.setArguments(args); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.replace(R.id.layout_root, f); ft.commit(); } } class SettingsAdapter extends BaseAdapter { static class ViewHolder { private TextView name; private TextView desc; } private LayoutInflater layoutInflater; private ArrayList<Entry<String, ConfigSection>> data; public SettingsAdapter(pyLoadApp app) { layoutInflater = (LayoutInflater) app .getSystemService(Context.LAYOUT_INFLATER_SERVICE); data = new ArrayList<Entry<String, ConfigSection>>(); } public void setData(Map<String, ConfigSection> map) { this.data = new ArrayList<Entry<String, ConfigSection>>(map.entrySet()); notifyDataSetChanged(); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int arg0) { return data.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } @Override public View getView(int row, View convertView, ViewGroup viewGroup) { ViewHolder holder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.settings_item, null); holder = new ViewHolder(); holder.name = (TextView) convertView.findViewById(R.id.section); holder.desc = (TextView) convertView .findViewById(R.id.section_desc); convertView.setTag(holder); } ConfigSection section = data.get(row).getValue(); holder = (ViewHolder) convertView.getTag(); holder.name.setText(section.description); if (section.outline != null) { holder.desc.setText(section.outline); holder.desc.setMaxHeight(100); } else { holder.desc.setMaxHeight(0); } return convertView; } }