/* * #%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.activity; import org.mapsforge.android.maps.GeoPoint; import org.wheelmap.android.fragment.ErrorDialogFragment; import org.wheelmap.android.fragment.ErrorDialogFragment.OnErrorDialogListener; import org.wheelmap.android.fragment.POIDetailFragment; import org.wheelmap.android.fragment.POIDetailFragment.OnPOIDetailListener; import org.wheelmap.android.fragment.WheelchairAccessibilityStateFragment; import org.wheelmap.android.fragment.WheelchairToiletStateFragment; import org.wheelmap.android.model.Extra; import org.wheelmap.android.model.PrepareDatabaseHelper; import org.wheelmap.android.model.WheelchairFilterState; import org.wheelmap.android.model.Wheelmap.POIs; import org.wheelmap.android.online.R; 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.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentManager; import android.view.MenuItem; import android.view.Window; import de.akquinet.android.androlog.Log; public class POIDetailActivity extends MapActivity implements OnPOIDetailListener, OnErrorDialogListener, Receiver { private final static String TAG = POIDetailActivity.class.getSimpleName(); // Definition of the one requestCode we use for receiving resuls. static final private int SELECT_WHEELCHAIRSTATE = 0; POIDetailFragment mFragment; private DetachableResultReceiver mReceiver; private String wmID; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); getSupportActionBar().setDisplayShowTitleEnabled(false); setSupportProgressBarIndeterminateVisibility(false); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); FragmentManager fm = getSupportFragmentManager(); mFragment = (POIDetailFragment) fm .findFragmentByTag(POIDetailFragment.TAG); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.d(TAG, "onNewIntent"); setIntent(intent); } @Override protected void onResume() { super.onResume(); if (getIntent() != null) { executeIntent(getIntent()); setIntent(null); } } private void executeIntent(Intent intent) { if (intent == null) { return; } // check if this intent is started via custom scheme link if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri uri = intent.getData(); if (uri == null) { Log.d(TAG, "uri has no data - cant extract wmID"); showErrorMessage(getString(R.string.error_noid_title), getString(R.string.error_noid_message)); return; } wmID = uri.getLastPathSegment(); try { Long.parseLong(wmID); } catch (NumberFormatException e) { Log.e(TAG, " wmID = " + wmID, e); finish(); return; } showDetailForWmId(wmID); return; } Long poiId = intent.getLongExtra(Extra.POI_ID, Extra.ID_UNKNOWN); showDetailFragment(poiId); setIntent(null); } private void showDetailForWmId(String wmId) { long poiId = PrepareDatabaseHelper.getRowIdForWMId( getContentResolver(), wmId, POIs.TAG_RETRIEVED); if (poiId != Extra.ID_UNKNOWN) { long copyPoiId = PrepareDatabaseHelper.createCopyIfNotExists( getContentResolver(), poiId, false); showDetailFragment(copyPoiId); return; } mReceiver = new DetachableResultReceiver(new Handler()); mReceiver.setReceiver(this); RestServiceHelper.retrieveNode(this, wmId, mReceiver); } private void showDetailFragment(long id) { if (id == Extra.ID_UNKNOWN) { return; } FragmentManager fm = getSupportFragmentManager(); mFragment = POIDetailFragment.newInstance(id); fm.beginTransaction() .replace(android.R.id.content, mFragment, POIDetailFragment.TAG) .commit(); } @Override public void onEditWheelchairState(WheelchairFilterState wState) { // Start the activity whose result we want to retrieve. The // result will come back with request code GET_CODE. Intent intent = new Intent(this, WheelchairStateActivity.class); intent.putExtra(Extra.WHEELCHAIR_STATE, wState.getId()); startActivityForResult(intent, SELECT_WHEELCHAIRSTATE); } @Override public void onEditWheelchairToiletState(WheelchairFilterState wState) { // Start the activity whose result we want to retrieve. The // result will come back with request code GET_CODE. Intent intent = new Intent(this, WheelchairStateActivity.class); intent.putExtra(Extra.WHEELCHAIR_TOILET_STATE, wState.getId()); startActivityForResult(intent, SELECT_WHEELCHAIRSTATE); } /** * This method is called when the sending activity has finished, with the result it supplied. * * @param requestCode The original request code as given to startActivity(). * @param resultCode From sending activity as per setResult(). * @param data From sending activity as per setResult(). */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SELECT_WHEELCHAIRSTATE && resultCode == RESULT_OK && data != null) { long poiID = mFragment.getPoiId(); if (data.hasExtra(WheelchairAccessibilityStateFragment.TAG)) { WheelchairFilterState state = WheelchairFilterState .valueOf(data.getIntExtra(WheelchairAccessibilityStateFragment.TAG, Extra.UNKNOWN)); if (state != null) { updateDatabase(poiID, POIs.WHEELCHAIR, state); } } else if (data.hasExtra(WheelchairToiletStateFragment.TAG)) { WheelchairFilterState state = WheelchairFilterState .valueOf(data.getIntExtra(WheelchairToiletStateFragment.TAG, Extra.UNKNOWN)); if (state != null) { updateDatabase(poiID, POIs.WHEELCHAIR_TOILET, state); } } else { return; } RestServiceHelper.executeUpdateServer(this, null); } } private void updateDatabase(long id, String poiColumnName, WheelchairFilterState state) { if (id == Extra.ID_UNKNOWN || state == null) { return; } ContentValues values = new ContentValues(); values.put(poiColumnName, state.getId()); values.put(POIs.DIRTY, POIs.DIRTY_STATE); PrepareDatabaseHelper.editCopy(getContentResolver(), id, values); } @Override public void onShowLargeMapAt(GeoPoint point) { Intent intent = new Intent(this, MainSinglePaneActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.putExtra(Extra.SELECTED_TAB, MyTabListener.TAB_MAP); intent.putExtra(Extra.CENTER_MAP, true); intent.putExtra(Extra.LATITUDE, point.getLatitude()); intent.putExtra(Extra.LONGITUDE, point.getLongitude()); intent.putExtra(Extra.REQUEST, true); startActivity(intent); } @Override public void dismissDetailView() { //not used finish(); } @Override public void onEdit(long poiId, int focus) { Intent intent = new Intent(this, POIDetailEditableActivity.class); intent.putExtra(Extra.POI_ID, poiId); intent.putExtra("Focus", focus); startActivity(intent); } public void showErrorMessage(String title, String message) { FragmentManager fm = getSupportFragmentManager(); ErrorDialogFragment errorDialog = ErrorDialogFragment.newInstance( title, message, Extra.UNKNOWN); if (errorDialog == null) { return; } errorDialog.show(fm, ErrorDialogFragment.TAG); } public void showErrorDialog(RestServiceException e) { FragmentManager fm = getSupportFragmentManager(); ErrorDialogFragment errorDialog = ErrorDialogFragment.newInstance(e, Extra.UNKNOWN); if (errorDialog == null) { return; } errorDialog.show(fm, ErrorDialogFragment.TAG); } /** * {@inheritDoc} */ public void onReceiveResult(int resultCode, Bundle resultData) { Log.d(TAG, "onReceiveResult in list resultCode = " + resultCode); switch (resultCode) { case RestService.STATUS_RUNNING: { setSupportProgressBarIndeterminateVisibility(true); break; } case RestService.STATUS_FINISHED: { long id = PrepareDatabaseHelper.getRowIdForWMId( getContentResolver(), wmID, POIs.TAG_COPY); setSupportProgressBarIndeterminateVisibility(false); showDetailFragment(id); break; } case RestService.STATUS_ERROR: { setSupportProgressBarIndeterminateVisibility(false); final RestServiceException e = resultData .getParcelable(Extra.EXCEPTION); showErrorDialog(e); break; } } } @Override public void onErrorDialogClose(int id) { finish(); } }