/*
* #%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.model.Extra;
import org.wheelmap.android.model.Extra.What;
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 android.app.Activity;
import android.app.SearchManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
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 POIsMapWorkerFragment extends Fragment implements
WorkerFragment, Receiver, LoaderCallbacks<Cursor> {
public final static String TAG = POIsMapWorkerFragment.class
.getSimpleName();
private final static int LOADER_ID = 0;
private DisplayFragment mDisplayFragment;
private WorkerFragmentListener mListener;
private DetachableResultReceiver mReceiver;
private Cursor mCursor;
boolean isSearchMode;
private boolean mRefreshStatus;
private EventBus mBus;
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);
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
mBus = EventBus.getDefault();
setQueryFromStickyEvent();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
public void onStart() {
super.onStart();
mBus.registerSticky(this);
}
@Override
public void onStop() {
super.onStop();
mBus.unregister(this);
}
@Override
public void onDestroy() {
super.onDestroy();
mReceiver.clearReceiver();
}
private void setQueryFromStickyEvent() {
mQuery = ((UserQueryHelper.UserQueryUpdateEvent) mBus
.getStickyEvent(UserQueryHelper.UserQueryUpdateEvent.class)).query;
}
/**
* {@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);
RestServiceException e = resultData.getParcelable(Extra.EXCEPTION);
if (mListener != null) {
mListener.onError(e);
}
break;
}
}
}
private void setRefreshStatus(boolean refreshState) {
mRefreshStatus = refreshState;
}
private void update() {
if (mDisplayFragment != null) {
mDisplayFragment.onUpdate(this);
}
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
Log.d(TAG, "onCreateLoader");
Uri uri = POIs.CONTENT_URI_RETRIEVED;
return new CursorLoader(getActivity(), uri, POIs.PROJECTION,
mQuery, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Log.d(TAG,
"cursorloader - switching cursors in adapter - cursor size = "
+ cursor.getCount());
mCursor = cursor;
update();
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
Log.d(TAG, "onLoaderReset - need to set it to null");
mCursor = null;
update();
}
@Override
public void requestSearch(Bundle bundle) {
if (!bundle.containsKey(SearchManager.QUERY)
&& !bundle.containsKey(Extra.CATEGORY)
&& !bundle.containsKey(Extra.NODETYPE)
&& !bundle.containsKey(Extra.WHEELCHAIR_STATE)
&& !bundle.containsKey(Extra.WHEELCHAIR_TOILET_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_IN_BOX;
}
bundle.putInt(Extra.WHAT, what);
}
bundle.putParcelable(Extra.STATUS_RECEIVER, mReceiver);
RestServiceHelper.executeRequest(getActivity(), bundle);
setSearchModeInt(true);
}
@Override
public void requestUpdate(Bundle bundle) {
if (isSearchMode || getActivity() == null) {
return;
}
bundle.putInt(Extra.WHAT, What.RETRIEVE_NODES);
bundle.putParcelable(Extra.STATUS_RECEIVER, mReceiver);
RestServiceHelper.executeRequest(getActivity(), bundle);
}
@Override
public void registerDisplayFragment(DisplayFragment fragment) {
mDisplayFragment = fragment;
}
@Override
public void unregisterDisplayFragment(DisplayFragment fragment) {
mDisplayFragment = null;
}
@Override
public Cursor getCursor(int id) {
return mCursor;
}
@Override
public boolean isRefreshing() {
return mRefreshStatus;
}
@Override
public boolean isSearchMode() {
return isSearchMode;
}
private void setSearchModeInt(boolean searchMode) {
Log.d(TAG, "setSearchMode: " + searchMode);
isSearchMode = searchMode;
if (mListener != null) {
mListener.onSearchModeChange(isSearchMode);
}
}
@Override
public void setSearchMode(boolean searchMode) {
Log.d(TAG, "setSearchMode: " + isSearchMode);
isSearchMode = searchMode;
}
public void onEventMainThread(UserQueryHelper.UserQueryUpdateEvent e) {
Log.d(TAG, "onUserQueryChanged: received event");
mQuery = e.query;
getLoaderManager().restartLoader(LOADER_ID, null, this);
}
}