/* * #%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.app.WheelmapApp; import org.wheelmap.android.fragment.SearchDialogFragment.OnSearchDialogListener; import org.wheelmap.android.manager.MyLocationManager; import org.wheelmap.android.model.Extra; import org.wheelmap.android.model.Extra.What; import org.wheelmap.android.model.POIsCursorWrapper; import org.wheelmap.android.model.PrefKey; import org.wheelmap.android.model.UserQueryHelper; import org.wheelmap.android.model.Wheelmap.POIs; import org.wheelmap.android.service.RestService; import org.wheelmap.android.service.RestServiceException; import org.wheelmap.android.service.RestServiceHelper; import org.wheelmap.android.utils.DetachableResultReceiver; import org.wheelmap.android.utils.DetachableResultReceiver.Receiver; import org.wheelmap.android.utils.GeoMath; import android.app.Activity; import android.app.SearchManager; import android.content.SharedPreferences; import android.database.Cursor; import android.location.Location; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import de.akquinet.android.androlog.Log; import de.greenrobot.event.EventBus; /* CombinedWorkerFragment instead */ @Deprecated public class POIsListWorkerFragment extends Fragment implements WorkerFragment, Receiver, LoaderCallbacks<Cursor>, OnSearchDialogListener { public static final String TAG = POIsListWorkerFragment.class .getSimpleName(); private final static int LOADER_ID_LIST = 0; private final static float QUERY_DISTANCE_DEFAULT = 0.8f; private final static float DISTANCE_TO_RELOAD = 1l; private DisplayFragment mDisplayFragment; private WorkerFragmentListener mListener; private DetachableResultReceiver mReceiver; private boolean mRefreshStatus = false; private float mDistance; private Cursor mCursor; private EventBus mBus; private Location mLocation; private Location mLastLocation; private String mQuery; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof WorkerFragmentListener) { mListener = (WorkerFragmentListener) activity; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); setRetainInstance(true); mDistance = getDistanceFromPreferences(); mReceiver = new DetachableResultReceiver(new Handler()); mReceiver.setReceiver(this); mBus = EventBus.getDefault(); retrieveInitialLocation(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(LOADER_ID_LIST, null, this); } @Override public void onStart() { super.onStart(); mBus.registerSticky(this); mBus.post(MyLocationManager.RegisterEvent.INSTANCE); } @Override public void onStop() { super.onStop(); mBus.post(MyLocationManager.UnregisterEvent.INSTANCE); mBus.unregister(this); } @Override public void onDestroy() { super.onDestroy(); mReceiver.clearReceiver(); } private void retrieveInitialLocation() { MyLocationManager.LocationEvent event = (MyLocationManager.LocationEvent) mBus .getStickyEvent(MyLocationManager.LocationEvent.class); mLocation = event.location; } @Override public void onSaveInstanceState(Bundle outState) { outState.putBoolean(Extra.IS_RESTARTED, true); } /** * {@inheritDoc} */ public void onReceiveResult(int resultCode, Bundle resultData) { Log.d(TAG, "onReceiveResult resultCode = " + resultCode); switch (resultCode) { case RestService.STATUS_RUNNING: { setRefreshStatus(true); break; } case RestService.STATUS_FINISHED: { setRefreshStatus(false); break; } case RestService.STATUS_ERROR: { setRefreshStatus(false); final RestServiceException e = resultData .getParcelable(Extra.EXCEPTION); if (mListener != null) { mListener.onError(e); } break; } } } private void setRefreshStatus(boolean refreshState) { mRefreshStatus = refreshState; update(); } private void resetCursorLoaderUri() { Loader<Cursor> loader = getLoaderManager().getLoader(LOADER_ID_LIST); if (loader == null) { return; } CursorLoader cl = (CursorLoader) loader; cl.setUri(POIs.createUriSorted(mLocation)); loader.forceLoad(); } private float getDistanceFromPreferences() { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(getActivity().getApplicationContext()); float prefDist = prefs.getFloat(PrefKey.LIST_DISTANCE, QUERY_DISTANCE_DEFAULT); return prefDist; } private boolean isNewDistanceFar() { float distance = GeoMath.calculateDistance(mLastLocation, mLocation); if (distance > DISTANCE_TO_RELOAD) { return true; } else { return false; } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Log.d(TAG, "onCreateLoader"); return new CursorLoader(getActivity(), POIs.createUriSorted(mLocation), POIs.PROJECTION, mQuery, null, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { Cursor wrappingCursor = new POIsCursorWrapper(cursor, mLocation); Log.d(TAG, "cursorloader - new cursor - cursor size = " + wrappingCursor.getCount()); mCursor = wrappingCursor; update(); } @Override public void onLoaderReset(Loader<Cursor> arg0) { Log.d(TAG, "onLoaderReset - need to set it to null"); mCursor = null; update(); } @Override public void onSearch(Bundle bundle) { requestSearch(bundle); } public void update() { if (mDisplayFragment != null) { mDisplayFragment.onUpdate(this); } } @Override public void registerDisplayFragment(DisplayFragment fragment) { mDisplayFragment = fragment; } @Override public void unregisterDisplayFragment(DisplayFragment fragment) { mDisplayFragment = null; } @Override public void requestUpdate(Bundle bundle) { Log.d(TAG, "requestUpdate mLocation = " + mLocation + " mDistance = " + mDistance); RestServiceHelper.retrieveNodesByDistance(getActivity(), mLocation, mDistance, mReceiver); } @Override public void requestSearch(Bundle bundle) { if (!bundle.containsKey(SearchManager.QUERY) && !bundle.containsKey(Extra.CATEGORY) && !bundle.containsKey(Extra.NODETYPE) && !bundle.containsKey(Extra.WHEELCHAIR_STATE)) { return; } if (bundle.getInt(Extra.CATEGORY) == Extra.UNKNOWN) { bundle.remove(Extra.CATEGORY); } if (!bundle.containsKey(Extra.WHAT)) { int what; if (bundle.containsKey(Extra.CATEGORY) || bundle.containsKey(Extra.NODETYPE)) { what = What.RETRIEVE_NODES; } else { what = What.SEARCH_NODES; } bundle.putInt(Extra.WHAT, what); } if (bundle.containsKey(Extra.DISTANCE_LIMIT)) { bundle.putParcelable(Extra.LOCATION, mLocation); } bundle.putParcelable(Extra.STATUS_RECEIVER, mReceiver); RestServiceHelper.executeRequest(WheelmapApp.getApp(), bundle); } @Override public Cursor getCursor(int id) { return mCursor; } @Override public boolean isRefreshing() { return mRefreshStatus; } @Override public boolean isSearchMode() { return false; } @Override public void setSearchMode(boolean isSearchMode) { } public void onEventMainThread(UserQueryHelper.UserQueryUpdateEvent e) { Log.d(TAG, "onUserQueryChanged: received event"); mQuery = e.query; if (mLocation != null) { getLoaderManager().restartLoader(LOADER_ID_LIST, null, this); } } public void onEventMainThread(MyLocationManager.LocationEvent event) { Log.d(TAG, "updateLocation: location = " + event.location); mLastLocation = mLocation; mLocation = event.location; resetCursorLoaderUri(); if (isNewDistanceFar()) { Log.d(TAG, "updateLocation: isNewDistanceFar results true"); requestUpdate(null); } } }