package eu.ttbox.androgister.ui.admin.user; import android.app.Fragment; import android.app.LoaderManager; import android.app.SearchManager; import android.content.Context; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.SearchView.OnQueryTextListener; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import eu.ttbox.androgister.AndroGisterApplication; import eu.ttbox.androgister.R; import eu.ttbox.androgister.domain.UserDao; import eu.ttbox.androgister.domain.UserDao.Properties; import eu.ttbox.androgister.domain.UserDao.UserCursorHelper; import eu.ttbox.androgister.domain.provider.UserProvider; import eu.ttbox.androgister.widget.AutoScrollListView; public class UserListFragment extends Fragment implements OnQueryTextListener { private static final String TAG = "UserListFragment"; private static final int USER_LIST_LOADER = R.id.config_id_admin_user_list_loader_started; private static final String[] SEARCH_PROJECTION_COLOMN = new String[] { UserDao.Properties.Id.columnName, UserDao.Properties.Lastname.columnName, UserDao.Properties.Firstname.columnName, UserDao.Properties.Login.columnName }; private static final String USER_SORT_DEFAULT = String.format("%s DESC, %s DESC", UserDao.Properties.Lastname.columnName, UserDao.Properties.Firstname.columnName); /** * The id for a delayed message that triggers automatic selection of the * first found contact in search mode. */ private static final int MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT = 1; /** * The delay that is used for automatically selecting the first found * contact. */ private static final int DELAY_AUTOSELECT_FIRST_FOUND_CONTACT_MILLIS = 500; // Dao private UserDao userDao; private UserCursorHelper helper; // Adapter private UserListAdapter listAdapter; // Config private boolean mSelectionToScreenRequested; private boolean mSmoothScrollRequested; // Binding private TextView searchResultTextView; private ListView listView; private EditText searchNameTextView; // Instance Data private Uri selectedEntityUri; private int mLastSelectedPosition = -1; // Listener private OnSelectUserListener onSelectUserListener; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_AUTOSELECT_FIRST_FOUND_CONTACT: selectDefaultContact(); break; } } }; private final AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { onListItemClick((ListView) parent, v, position, id); } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.admin_user_list, container, false); // Dao Context context = getActivity(); AndroGisterApplication app = (AndroGisterApplication) context.getApplicationContext(); userDao = app.getDaoSession().getUserDao(); // Bind listView = (ListView) view.findViewById(android.R.id.list); listView.setOnItemClickListener(mOnClickListener); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setFastScrollEnabled(true); listView.setFastScrollAlwaysVisible(true); listView.setVerticalScrollbarPosition(0); listView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY); // listView.setOnItemSelectedListener(listener) // Search Criteria // searchResultTextView = (TextView) // view.findViewById(R.id.user_search_result); // searchNameTextView = (EditText) // view.findViewById(R.id.user_list_search_name_input); // searchNameTextView.addTextChangedListener(new TextWatcher() { // // @Override // public void onTextChanged(CharSequence s, int start, int before, int // count) { // // } // // @Override // public void beforeTextChanged(CharSequence s, int start, int count, // int after) { // // } // // @Override // public void afterTextChanged(Editable s) { // Log.i(TAG, "On onKeyUp searchNameTextView"); // getLoaderManager().restartLoader(USER_LIST_LOADER, null, // orderLoaderCallback); // } // // }); // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, // android.R.layout.simple_dropdown_item_1line, COUNTRIES); // searchNameTextView.setAdapter(adapter); // List Header // List Adpater listAdapter = new UserListAdapter(getActivity(), R.layout.admin_user_list_item, null, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); listView.setAdapter(listAdapter); // Do Search getLoaderManager().initLoader(USER_LIST_LOADER, null, orderLoaderCallback); return view; } public ListView getListView() { return listView; } protected void requestSelectionToScreen(int selectedPosition) { if (selectedPosition != -1) { AutoScrollListView listView = (AutoScrollListView) getListView(); listView.requestPositionToScreen(selectedPosition + listView.getHeaderViewsCount(), mSmoothScrollRequested); mSelectionToScreenRequested = false; } } protected void selectDefaultContact() { Uri contactUri = null; UserListAdapter adapter = getAdapter(); if (mLastSelectedPosition != -1) { int count = adapter.getCount(); int pos = mLastSelectedPosition; if (pos >= count && count > 0) { pos = count - 1; } contactUri = adapter.getContactUri(pos); } if (contactUri == null) { contactUri = adapter.getFirstEntityUri(); } setSelectedEntityUri(contactUri, false, mSmoothScrollRequested, false, false); } protected void onListItemClick(ListView l, View v, int position, long id) { if (onSelectUserListener != null) { Cursor cursor = (Cursor) l.getAdapter().getItem(position); if (cursor != null) { if (helper == null) { helper = userDao.getCursorHelper(cursor); } String userId = helper.getId(cursor).toString(); Uri uri = Uri.withAppendedPath(UserProvider.Constants.CONTENT_URI, userId); selectedEntityUri = uri; // User user = helper.getEntity(cursor); // Define result // TODO listView.requestFocusFromTouch(); listView.setSelection(position); Log.i(TAG, "listView.setSelection = " + position); listAdapter.setSelectedId(Long.valueOf(userId)); onSelectUserListener.onViewEntityAction(uri); } } } public Uri getSelectedEntityUri() { return selectedEntityUri; } public void doSearch(String query) { Bundle args = new Bundle(); args.putString(SearchManager.QUERY, query); getLoaderManager().restartLoader(USER_LIST_LOADER, args, orderLoaderCallback); } private final LoaderManager.LoaderCallbacks<Cursor> orderLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String sortOrder = USER_SORT_DEFAULT; String selection = null; String[] selectionArgs = null; String queryString = null;// searchNameTextView.getText().toString(); if (args != null) { queryString = args.getString(SearchManager.QUERY, null); } else { // queryString = searchNameTextView.getText().toString(); } if (queryString != null) { queryString = queryString.trim(); if (!queryString.isEmpty()) { queryString = queryString + "*"; selection = String.format("(%s like ? or %s like ?)", UserDao.Properties.Lastname.columnName, UserDao.Properties.Firstname.columnName); selectionArgs = new String[] { queryString, queryString }; } } // Filter // Loader CursorLoader cursorLoader = new CursorLoader(getActivity(), UserProvider.Constants.CONTENT_URI, SEARCH_PROJECTION_COLOMN, selection, selectionArgs, sortOrder); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // Display List listAdapter.changeCursor(cursor); // Display Counter int count = 0; if (cursor != null) { count = cursor.getCount(); } if (count < 1) { // searchResultTextView.setText(R.string.search_no_results); } else { String countString = getResources().getQuantityString(R.plurals.search_results, count, new Object[] { count }); // searchResultTextView.setText(countString); } } @Override public void onLoaderReset(Loader<Cursor> loader) { // searchResultTextView.setText(R.string.search_instructions); listAdapter.changeCursor(null); } }; public void setOnSelectUserListener(OnSelectUserListener onSelectUserListener) { this.onSelectUserListener = onSelectUserListener; } public interface OnSelectUserListener { // void onSelectionChange() ; void onViewEntityAction(Uri entityUri); void onCreateNewEntityAction(); void onEditEntityAction(Uri entityUri); void onDeleteEntityAction(Uri entityUri); void onFinishAction(); // void onSelectUser(User user); } @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { doSearch(newText); return true; } public void setSelectedEntityUri(Uri uri) { setSelectedEntityUri(uri, true, false /* no smooth scroll */, true, false); } private void setSelectedEntityUri(Uri uri, boolean required, boolean smoothScroll, boolean persistent, boolean willReloadData) { mSmoothScrollRequested = smoothScroll; mSelectionToScreenRequested = true; if ((selectedEntityUri == null && uri != null) || (selectedEntityUri != null && !selectedEntityUri.equals(uri))) { selectedEntityUri = uri; long selectedEntityId = parseSelectedEntityUri(uri); if (!willReloadData) { UserListAdapter adapter = getAdapter(); if (adapter != null) { adapter.setSelectedId(selectedEntityId); getListView().invalidateViews(); } } } } private long parseSelectedEntityUri(Uri uri) { String entityId = uri.getLastPathSegment(); return Long.valueOf(entityId).longValue(); } private UserListAdapter getAdapter() { return listAdapter; } }