package com.kedzie.vbox.server; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceManager; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.kedzie.vbox.R; import com.kedzie.vbox.app.Utils; import com.kedzie.vbox.task.ActionBarTask; /** * Show list of VirtualBox servers * @apiviz.stereotype fragment */ public class ServerListFragment extends SherlockFragment { static final int REQUEST_CODE_ADD = 0xF000; static final int REQUEST_CODE_EDIT = 0x0F00; static final int RESULT_CODE_SAVE = 0x00F0; static final int RESULT_CODE_DELETE = 0x000F; private static final String FIRST_RUN_PREFERENCE = "first_run"; /** * Handle Server selection */ public static interface OnSelectServerListener { /** * @param server the selected {@link Server} */ public void onSelectServer(Server server); } /** * Load Servers from DB */ class LoadServersTask extends ActionBarTask<Void, List<Server>> { public LoadServersTask() { super(getSherlockActivity(), null); } @Override protected List<Server> work(Void... params) throws Exception { return _db.query(); } @Override protected void onSuccess(List<Server> result) { _listView.setAdapter(new ServerListAdapter(getSherlockActivity(), result)); if(result.isEmpty()) showAddNewServerPrompt(); else checkIfFirstRun(result.get(0)); } } /** * Server list adapter */ class ServerListAdapter extends ArrayAdapter<Server> { private LayoutInflater _inflater; public ServerListAdapter(Context context, List<Server> servers) { super(context, 0, servers); _inflater = LayoutInflater.from(context); } @Override public boolean hasStableIds() { return true; } @Override public long getItemId(int position) { return getItem(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView==null) { convertView = _inflater.inflate(R.layout.simple_selectable_list_item, parent, false); convertView.setTag((TextView)convertView.findViewById(android.R.id.text1)); } TextView text1 = (TextView)convertView.getTag(); text1.setText(getItem(position).toString()); text1.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_list_vbox, 0, 0, 0); return convertView; } } private OnSelectServerListener _listener; private ServerSQlite _db; private ListView _listView; private boolean _dualPane; @Override public void onAttach(Activity activity) { super.onAttach(activity); if(activity instanceof OnSelectServerListener) _listener = (OnSelectServerListener)activity; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _listView = (ListView)inflater.inflate(R.layout.list, container, false); _dualPane = getActivity().findViewById(R.id.details)!=null; _listView.setChoiceMode(_dualPane ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE); _listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(_dualPane) _listView.setSelection(position); _listener.onSelectServer(getAdapter().getItem(position)); } }); registerForContextMenu(_listView); return _listView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); _db = new ServerSQlite(getActivity()); } @Override public void onStart() { super.onStart(); new LoadServersTask().execute(); } @Override public void onDestroy() { super.onDestroy(); _db.close(); } protected void checkIfFirstRun(Server s) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); if(!prefs.contains(FIRST_RUN_PREFERENCE)) { Editor editor = prefs.edit(); editor.putBoolean(FIRST_RUN_PREFERENCE, false); editor.commit(); new AlertDialog.Builder(getActivity()) .setTitle(R.string.firstrun_welcome) .setMessage(getString(R.string.firstrun_message, s.getHost(), s.getPort())) .setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .show(); } } protected void showAddNewServerPrompt() { new AlertDialog.Builder(getActivity()) .setTitle(R.string.add_server_title) .setMessage(R.string.add_server_question) .setIcon(android.R.drawable.ic_dialog_alert) .setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); addServer(); } }) .show(); } protected ServerListAdapter getAdapter() { return (ServerListAdapter)_listView.getAdapter(); } @Override public void onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu, MenuInflater inflater) { if(!_dualPane) inflater.inflate(R.menu.server_list_actions, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_add: addServer(); return true; case R.id.menu_help: Utils.startActivity(getActivity(), new Intent(getActivity(), HelpActivity.class)); return true; } return false; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(Menu.NONE, R.id.server_list_context_menu_select, Menu.NONE, R.string.server_connect); menu.add(Menu.NONE, R.id.server_list_context_menu_edit, Menu.NONE, R.string.edit); menu.add(Menu.NONE, R.id.server_list_context_menu_delete, Menu.NONE, R.string.delete); } @Override public boolean onContextItemSelected(android.view.MenuItem item) { int position = ((AdapterContextMenuInfo)item.getMenuInfo()).position; final Server s = getAdapter().getItem(position); switch (item.getItemId()) { case R.id.server_list_context_menu_select: _listener.onSelectServer(getAdapter().getItem(position)); return true; case R.id.server_list_context_menu_edit: Utils.startActivity(getActivity(), new Intent(getActivity(), EditServerActivity.class).putExtra(EditServerActivity.INTENT_SERVER, (Parcelable)s)); return true; case R.id.server_list_context_menu_delete: _db.delete(s.getId()); getAdapter().remove(s); getAdapter().notifyDataSetChanged(); return true; } return false; } /** * Launch activity to create a new Server */ private void addServer() { Utils.startActivity(getActivity(), new Intent(getActivity(), EditServerActivity.class).putExtra(EditServerActivity.INTENT_SERVER, (Parcelable)new Server())); } }