package oraculum.droid.ui; import oraculum.droid.R; import oraculum.droid.provider.DroidHDContract; import oraculum.droid.provider.DroidHDContract.Clientes; import oraculum.droid.util.NotifyingAsyncQueryHandler; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.BaseColumns; import android.support.v4.app.ListFragment; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class ClientesFragment extends ListFragment implements NotifyingAsyncQueryHandler.AsyncQueryListener { private static final String STATE_CHECKED_POSITION = "checkedPosition"; private Cursor mCursor; private CursorAdapter mAdapter; private NotifyingAsyncQueryHandler mHandler; private int mCheckedPosition = -1; private boolean mHasSetEmptyText = false; private Bundle arguments; public ClientesFragment(Bundle arg) { arguments = arg; } public ClientesFragment(){ } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler = new NotifyingAsyncQueryHandler(getActivity().getContentResolver(), this); setHasOptionsMenu(true); if (arguments == null) reloadFromArguments(getArguments()); else reloadFromArguments(arguments); } public void reloadFromArguments(Bundle arguments) { // Teardown from previous arguments if (mCursor != null) { getActivity().stopManagingCursor(mCursor); mCursor = null; } mCheckedPosition = -1; setListAdapter(null); mHandler.cancelOperation(SearchQuery._TOKEN); // Load new arguments final Intent intent = BaseActivity.fragmentArgumentsToIntent(arguments); final Uri clienteUri = intent.getData(); final int clienteQueryToken; if (clienteUri == null) { return; } String[] projection; if (!DroidHDContract.Clientes.isSearchUri(clienteUri)) { mAdapter = new ClienteAdapter(getActivity()); projection = ClientesQuery.PROJECTION; clienteQueryToken = ClientesQuery._TOKEN; } else { mAdapter = new SearchAdapter(getActivity()); projection = SearchQuery.PROJECTION; clienteQueryToken = SearchQuery._TOKEN; } setListAdapter(mAdapter); // Start background query to load enderecos mHandler.startQuery(clienteQueryToken, null, clienteUri, projection, null, null, DroidHDContract.Clientes.DEFAULT_SORT); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.clientes_menu_items, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_add_cliente) { if (mHasSetEmptyText) { Toast.makeText(getActivity(), R.string.btn_add_cliente, Toast.LENGTH_SHORT).show(); createNewCliente(); } else { Toast.makeText(getActivity(), R.string.btn_add_cliente, Toast.LENGTH_SHORT).show(); } return true; } return super.onOptionsItemSelected(item); } private void createNewCliente() { final Uri clienteUri = Clientes.buildClienteUri(DroidHDContract.PATH_NEW); final Intent intent = new Intent(Intent.ACTION_VIEW, clienteUri); ((BaseActivity) getActivity()).openActivityOrFragment(intent); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); if (savedInstanceState != null) { mCheckedPosition = savedInstanceState.getInt(STATE_CHECKED_POSITION, -1); } if (!mHasSetEmptyText) { setEmptyText(getString(R.string.empty_clientes)); mHasSetEmptyText = true; } } /** {@inheritDoc} */ public void onQueryComplete(int token, Object cookie, Cursor cursor) { if ( mCursor != null ) { // In case cancelOperation() doesn't work and we end up with consecutive calls to this // callback. getActivity().stopManagingCursor(mCursor); mCursor = null; } mCursor = cursor; getActivity().startManagingCursor(mCursor); mAdapter.changeCursor(cursor); if ( mCheckedPosition >= 0 && getView() != null ) { getListView().setItemChecked(mCheckedPosition, true); } } /** {@inheritDoc} */ @Override public void onListItemClick(ListView listView, View view, int position, long id) { final Cursor cursor = (Cursor) mAdapter.getItem(position); final String clienteId = cursor.getString(ClientesQuery.CLIENTE_ID); final Uri clienteUri = DroidHDContract.Clientes.buildClienteUri(clienteId); final Intent intent = new Intent(Intent.ACTION_VIEW, clienteUri); ((BaseActivity) getActivity()).openActivityOrFragment(intent); getListView().setItemChecked(position, true); mCheckedPosition = position; } public class ClienteAdapter extends CursorAdapter { private Activity mActivity; public ClienteAdapter(Activity activity) { super(activity, null); mActivity = activity; } /** {@inheritDoc} */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mActivity.getLayoutInflater().inflate(R.layout.list_item_clientes_link, parent, false); } @Override public void bindView(View view, Context context, Cursor cursor) { final TextView titleView = (TextView) view.findViewById(R.id.cliente_title); final TextView subtitleView = (TextView) view.findViewById(R.id.cliente_subtitle); titleView.setText(cursor.getString(ClientesQuery.NOME)); subtitleView.setText(cursor.getString(ClientesQuery.TEL)); } } /** * {@link CursorAdapter} that renders a {@link SearchQuery}. */ private class SearchAdapter extends CursorAdapter { public SearchAdapter(Context context) { super(context, null); } /** {@inheritDoc} */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return getActivity().getLayoutInflater().inflate(R.layout.list_item_clientes_link, parent, false); } /** {@inheritDoc} */ @Override public void bindView(View view, Context context, Cursor cursor) { final TextView titleView = (TextView) view.findViewById(R.id.cliente_title); final TextView subtitleView = (TextView) view.findViewById(R.id.cliente_subtitle); titleView.setText(cursor.getString(SearchQuery.NOME)); subtitleView.setText(cursor.getString(SearchQuery.TEL)); } } /** {@link oraculum.droid.provider.DroidHDContract.Clientes} query parameters. */ public interface ClientesQuery { int _TOKEN = 0x1; String[] PROJECTION = { BaseColumns._ID, DroidHDContract.Clientes.cliente_id, DroidHDContract.Clientes.cliente_nome, DroidHDContract.Clientes.cliente_tel, }; int _ID = 0; int CLIENTE_ID = 1; int NOME = 2; int TEL = 3; } /** {@link oraculum.droid.provider.DroidHDContract.Clientes} search query * parameters. */ private interface SearchQuery { int _TOKEN = 0x3; String[] PROJECTION = { BaseColumns._ID, DroidHDContract.Clientes.cliente_id, DroidHDContract.Clientes.cliente_nome, DroidHDContract.Clientes.cliente_tel, }; @SuppressWarnings("unused") int _ID = 0; @SuppressWarnings("unused") int CLIENTE_ID = 1; int NOME = 2; int TEL = 3; } }