/* * #%L * Wheelmap - App * %% * Copyright (C) 2011 - 2012 Michal Harakal - Michael Kroez - Sozialhelden e.V. * %% * Wheelmap App based on the Wheelmap Service by Sozialhelden e.V. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS-IS" BASIS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.wheelmap.android.fragment; import org.wheelmap.android.activity.MainSinglePaneActivity; import org.wheelmap.android.adapter.POIsListCursorAdapter; import org.wheelmap.android.fragment.SearchDialogFragment.OnSearchDialogListener; import org.wheelmap.android.manager.SupportManager.DistanceUnitChangedEvent; import org.wheelmap.android.model.DirectionCursorWrapper; import org.wheelmap.android.model.Extra; import org.wheelmap.android.model.POIHelper; import org.wheelmap.android.model.Wheelmap.POIs; import org.wheelmap.android.online.R; import org.wheelmap.android.utils.UtilsMisc; import android.app.Activity; import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.ListFragment; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import de.akquinet.android.androlog.Log; import de.greenrobot.event.EventBus; public class POIsListFragment extends Fragment implements DisplayFragment, OnSearchDialogListener, OnExecuteBundle, AdapterView.OnItemClickListener { public static final String TAG = POIsListFragment.class.getSimpleName(); private WorkerFragment mWorkerFragment; private SwipeRefreshLayout swipeRefreshLayout; private ListView mListView; private int mFirstVisiblePosition = 0; private int mCheckedItem; private boolean mFirstStart; private boolean mRefreshDisabled; public DisplayFragmentListener mListener; private POIsListCursorAdapter mAdapter; private Cursor mCursor; private EventBus mBus; private DirectionCursorWrapper mDirectionCursorWrapper; private boolean mUseAngloDistanceUnit; private String selectedItem_wmID = null; private boolean isRefreshing; public POIsListFragment() { super(); Log.d(TAG, "constructor called " + hashCode()); } public static POIsListFragment newInstance(boolean createWorker, boolean disableSearch) { createWorker = false; POIsListFragment f = new POIsListFragment(); Bundle b = new Bundle(); b.putBoolean(Extra.CREATE_WORKER_FRAGMENT, createWorker); b.putBoolean(Extra.DISABLE_SEARCH, disableSearch); f.setArguments(b); return f; } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof DisplayFragmentListener) { mListener = (DisplayFragmentListener) activity; } Log.d(TAG, "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate " + hashCode()); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView " + hashCode()); View v = inflater.inflate(R.layout.fragment_list, container, false); mListView = (ListView) v.findViewById(android.R.id.list); mAdapter = new POIsListCursorAdapter(getActivity(), null, false, mUseAngloDistanceUnit); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(this); if (UtilsMisc.isTablet(getActivity())) { mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); } if (mListener != null) { mListener.refreshRegisterList(mListView); } attachWorkerFragment(); swipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipeContainer); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (mWorkerFragment != null) { mWorkerFragment.requestUpdate(null); swipeRefreshLayout.setRefreshing(true); } } }); if (getActivity().getIntent().hasExtra(SearchManager.QUERY)) { //showSearch(); Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { Bundle bundle = new Bundle(); String keyword = getActivity().getIntent().getStringExtra(SearchManager.QUERY); if (keyword.length() > 0) { bundle.putString(SearchManager.QUERY, keyword); } bundle.putInt(Extra.CATEGORY, Extra.UNKNOWN); bundle.putBoolean(Extra.ENABLE_BOUNDING_BOX, true); if (getActivity() instanceof MainSinglePaneActivity) { ((MainSinglePaneActivity) getActivity()).onSearchModeChange(true); } onSearch(bundle); } }, 1000); } return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated: started " + hashCode()); executeSavedInstanceState(savedInstanceState); } @Override public void onStart() { super.onStart(); mBus = EventBus.getDefault(); mBus.registerSticky(this); } @Override public void onStop() { super.onStop(); mBus.unregister(this); } @Override public void onDestroyView() { super.onDestroyView(); mWorkerFragment.unregisterDisplayFragment(this); } private void attachWorkerFragment() { Fragment fragment = null; if (getArguments() == null || getArguments() .getBoolean(Extra.CREATE_WORKER_FRAGMENT, true)) { FragmentManager fm = getActivity().getSupportFragmentManager(); fragment = fm.findFragmentByTag(POIsListWorkerFragment.TAG); Log.d(TAG, "Found worker fragment:" + fragment); if (fragment == null) { fragment = new POIsListWorkerFragment(); fm.beginTransaction().add(fragment, POIsListWorkerFragment.TAG) .commit(); } } else if (!getArguments().getBoolean(Extra.CREATE_WORKER_FRAGMENT, false)) { Log.d(TAG, "Connecting to Combined Worker Fragment"); FragmentManager fm = getFragmentManager(); fragment = fm.findFragmentByTag(CombinedWorkerFragment.TAG); } mWorkerFragment = (WorkerFragment) fragment; mWorkerFragment.registerDisplayFragment(this); Log.d(TAG, "result mWorkerFragment = " + mWorkerFragment); } @Override public void onSaveInstanceState(Bundle outState) { mFirstVisiblePosition = mListView.getFirstVisiblePosition(); outState.putInt(Extra.FIRST_VISIBLE_POSITION, mFirstVisiblePosition); super.onSaveInstanceState(outState); } private void executeSavedInstanceState(Bundle savedInstanceState) { mFirstStart = (savedInstanceState == null); if (mFirstStart) { return; } mFirstVisiblePosition = savedInstanceState.getInt( Extra.FIRST_VISIBLE_POSITION, 0); } @Override public void executeBundle(Bundle bundle) { Log.d(TAG, "executeBundle: fragment is visible = " + isVisible()); if (bundle == null) { return; } if (bundle.getBoolean(Extra.REQUEST, false)) { mWorkerFragment.requestUpdate(null); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (!UtilsMisc.isTablet(getActivity())) { inflater.inflate(R.menu.ab_list_fragment, menu); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.menu_search: showSearch(); return true; } return false; } public void onRefreshStarted() { Log.d(TAG, "onRefreshStarted pulled"); mFirstVisiblePosition = 0; if (mWorkerFragment != null) { mWorkerFragment.requestUpdate(null); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Cursor cursor = (Cursor) parent.getAdapter().getItem(position); if (cursor == null) { return; } selectedItem_wmID = POIHelper.getWMId(cursor); ContentValues values = new ContentValues(); DatabaseUtils.cursorRowToContentValues(cursor, values); // save id from values here - - - - - - - - //idOfSelectedListItem = Long.parseLong((String) values.get("_id")); if (mListener != null) { mListener.onShowDetail(this, values); } } private void setCursor(Cursor cursor) { //UtilsMisc.dumpCursorCompare(TAG, mCursor, cursor); if (cursor == mCursor) { return; } mCursor = cursor; if (mCursor != null) { mDirectionCursorWrapper = new DirectionCursorWrapper(mCursor); } else { mDirectionCursorWrapper = null; } mAdapter.swapCursor(mDirectionCursorWrapper); //markItemClear(); //refreshListPosition(); if (selectedItem_wmID != null) { markItem(selectedItem_wmID); } } private void setRefreshStatus(boolean isRefreshing) { this.isRefreshing = isRefreshing; Log.d(TAG, "setRefreshStates: isRefreshing = " + isRefreshing); if (mListener != null) { mListener.onRefreshing(isRefreshing); } if (!isRefreshing) { swipeRefreshLayout.setRefreshing(false); } } private void refreshListPosition() { if (mFirstVisiblePosition != 0) { if (mFirstVisiblePosition >= mAdapter.getCount()) { mFirstVisiblePosition = mAdapter.getCount(); } mListView.setSelection(mFirstVisiblePosition); } } private void showSearch() { FragmentManager fm = getFragmentManager(); SearchDialogFragment searchDialog = SearchDialogFragment.newInstance( true, false); searchDialog.setTargetFragment(this, 0); searchDialog.show(fm, getTag()); } @Override public void onSearch(Bundle bundle) { mWorkerFragment.requestSearch(bundle); } @Override public void onUpdate(WorkerFragment fragment) { Log.d(TAG, "onUpdate"); setCursor(fragment.getCursor(WorkerFragment.LIST_CURSOR)); setRefreshStatus(fragment.isRefreshing()); setRefreshEnabled(fragment.isSearchMode()); if (selectedItem_wmID != null) { markItem(selectedItem_wmID); } // set selected list item here - - - - - - - - //if(idOfSelectedListItem != 0) //markItem(idOfSelectedListItem); } private void setRefreshEnabled(boolean refreshDisabled) { if (mListener != null) { mListener.onRefreshEnabled(!refreshDisabled); } } public void onEventMainThread(DistanceUnitChangedEvent e) { Log.d(TAG, "onDistanceUnitChanged"); mUseAngloDistanceUnit = e.useAngloDistanceUnit; if (mAdapter != null) { mAdapter.changeAdapter(e.useAngloDistanceUnit); } } public void markItem(String wmID) { boolean marked = false; int pos; for (pos = 0; pos < mAdapter.getCount(); pos++) { Cursor c = (Cursor) mAdapter.getItem(pos); if (POIHelper.getWMId(c).equals(wmID)) { mCheckedItem = pos; mListView.setItemChecked( mCheckedItem, true); marked = true; break; } } if (!marked) { Log.d(TAG, "[markItem] deselect all items"); mListView.clearChoices(); mListView.requestLayout(); } else { Log.d(TAG, "[markItem] Mark item: " + wmID); mListView.setSelection(mListView.getCheckedItemPosition()); mListView.requestLayout(); } } @Override public void markItem(ContentValues values, boolean centerToItem) { Long id = values.getAsLong(POIs.POI_ID); String wmID = values.getAsString(POIs.WM_ID); selectedItem_wmID = wmID; markItem(selectedItem_wmID); } public void markItemClear() { mListView.setItemChecked(mCheckedItem, false); } }